diff --git a/src/app.tsx b/src/app.tsx
index 2fa67f25..4749861c 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -16,6 +16,7 @@ import { TranslationDraftProvider } from "@providers/translation-draft-provider"
import { LayoutProvider, useLayout } from "@providers/layout-provider";
import "react-toastify/dist/ReactToastify.css";
import { Auth } from "./features/auth/auth";
+import { DynamicGenericModuleRoutes } from "@features/dynamic-module-loader";
export const App = () => {
// Define menu categories for breadcrumbs
@@ -56,7 +57,20 @@ export const App = () => {
const firstPath = paths[0];
const breadcrumbs: Breadcrumb[] = [];
let currentBreadcrumb = "";
- if (firstPath && menuCategories[firstPath]) {
+
+ if (paths[0] === "modules" && paths[1]) {
+ const moduleName = paths[1];
+ const displayName = moduleName
+ .split("-")
+ .map((s) => s.charAt(0).toUpperCase() + s.slice(1))
+ .join(" ");
+ breadcrumbs.push({
+ linkText: "DYNAMIC",
+ toRoute: `/modules/${moduleName}`,
+ isCategory: true,
+ });
+ currentBreadcrumb = displayName;
+ } else if (firstPath && menuCategories[firstPath]) {
breadcrumbs.push({
linkText: menuCategories[firstPath].category,
toRoute: `/${firstPath}`,
@@ -124,7 +138,11 @@ export const App = () => {
path={`${coreModuleRoute.template}/*`}
element={}
/>
-
+ }
+ />
+
diff --git a/src/components/app-layout/index.tsx b/src/components/app-layout/index.tsx
index e283539c..a22f0380 100644
--- a/src/components/app-layout/index.tsx
+++ b/src/components/app-layout/index.tsx
@@ -17,15 +17,17 @@ interface AppLayoutProps {
fullWidth?: boolean;
}
-type MenuItem = {
+export type MenuItem = {
id: string;
label: string;
- icon: React.ReactNode;
- onClick: () => void;
+ icon: React.ReactNode | string;
+ entity: string;
+ route: string;
+ onClick: (navigate: (to: string) => void) => void;
isSelected: boolean;
};
-interface SidebarMenuSection {
+export interface SidebarMenuSection {
header: string;
items: MenuItem[];
}
@@ -43,7 +45,11 @@ export const AppLayout = ({
const { moduleName } = useRouteParams(coreModuleRoute);
const { config, loading: configLoading } = useConfig();
- const menuItems = buildMenuItems(config?.entities, moduleName) as SidebarMenuSection[];
+ const menuItems = buildMenuItems(
+ config?.entities,
+ moduleName,
+ config?.modules ?? undefined
+ ) as SidebarMenuSection[];
const menuLoading = configLoading;
// Pass drawer state to Sidebar and update container class
diff --git a/src/components/data-management/index.tsx b/src/components/data-management/index.tsx
index 8df306ba..6aa43db9 100644
--- a/src/components/data-management/index.tsx
+++ b/src/components/data-management/index.tsx
@@ -15,7 +15,11 @@ import {
} from "@mui/material";
import { DeleteButtonContainer } from "./index.styled";
import { Trash2, Edit } from "lucide-react";
-import { useCoreModuleNavigation, useNotificationsService } from "@hooks";
+import {
+ useCoreModuleNavigation,
+ useDynamicModuleNavigation,
+ useNotificationsService,
+} from "@hooks";
import { HttpResponse, ProblemDetails } from "@lib/network/swagger-client";
import { useErrorDetailsModal } from "@providers/error-details-modal-provider";
import { execDeleteWithToast } from "utils/general-helper";
@@ -100,6 +104,7 @@ export const DataManagementBlock = ({
const { notificationsService } = useNotificationsService();
const { Show: showErrorModal } = useErrorDetailsModal();
const handleNavigation = useCoreModuleNavigation();
+ const handleDynamicModuleNavigation = useDynamicModuleNavigation();
const navigate = useNavigate();
const { moduleName } = useRouteParams(coreModuleRoute);
@@ -122,11 +127,13 @@ export const DataManagementBlock = ({
const deleteRecord = async () => {
try {
setIsDeleting(true);
- await handleDeleteAsync(itemId);
- if (onDeleted) {
- onDeleted();
+ await handleDeleteAsync(itemId!);
+ const pathSegments = window.location.pathname.split("/");
+ if (pathSegments[1] === "modules") {
+ handleDynamicModuleNavigation(successNavigationRoute);
+ } else {
+ handleNavigation(successNavigationRoute);
}
- handleNavigation(successNavigationRoute);
} catch (error) {
setIsDeleting(false);
throw error;
@@ -134,7 +141,12 @@ export const DataManagementBlock = ({
};
const editRecord = async () => {
- navigate(`/${moduleName}/${itemId}/edit`);
+ const pathSegments = window.location.pathname.split("/");
+ if (pathSegments[1] === "modules") {
+ navigate(`/modules/${moduleName}/${itemId}/edit`);
+ } else {
+ navigate(`/${moduleName}/${itemId}/edit`);
+ }
};
return (
diff --git a/src/components/generic-components/common.ts b/src/components/generic-components/common.ts
index bd7a1aa4..4b8a5b9c 100644
--- a/src/components/generic-components/common.ts
+++ b/src/components/generic-components/common.ts
@@ -63,7 +63,7 @@ export interface BasicTypeForGeneric {
export const getBreadcrumbLinks = (
moduleName: string,
- modulePath: CoreModule
+ modulePath: CoreModule | string
): BreadcrumbLink[] => {
return [
...dataListBreadcrumbLinks,
diff --git a/src/components/generic-components/edit-components/datetime-edit.tsx b/src/components/generic-components/edit-components/datetime-edit.tsx
index 8535ec52..e108b065 100644
--- a/src/components/generic-components/edit-components/datetime-edit.tsx
+++ b/src/components/generic-components/edit-components/datetime-edit.tsx
@@ -19,7 +19,7 @@ export const DatetimeEdit = ({
size={"small"}
fullWidth
variant="outlined"
- value={dayjs(value)}
+ value={value ? dayjs(value) : null}
onChange={(newValue) => {
onChangeValue && onChangeValue(newValue ? newValue.toDate() : null);
}}
diff --git a/src/components/generic-components/generic-form.tsx b/src/components/generic-components/generic-form.tsx
index 3ba0ff50..1879b940 100644
--- a/src/components/generic-components/generic-form.tsx
+++ b/src/components/generic-components/generic-form.tsx
@@ -21,7 +21,7 @@ import {
import { validate } from "@components/generic-components/edit-components/validator";
import { ArrayEdit } from "./edit-components/array-edit";
import { StyledDivider } from "./index.styled";
-import { useCoreModuleNavigation } from "@hooks";
+import { useCoreModuleNavigation, useDynamicModuleNavigation } from "@hooks";
import { TextView } from "./view-components/text-view";
import { BoolView } from "./view-components/bool-view";
import { DateTimeView } from "./view-components/datetime-view";
@@ -112,6 +112,7 @@ export function GenericForm
}: GenericFormProps) {
const { setBusy, setSaving } = useModuleWrapperContext();
const handleCoreNavigation = useCoreModuleNavigation();
+ const handleDynamicModuleNavigation = useDynamicModuleNavigation();
const [validationResult, setValidationResult] = useState();
const itemId = getItemId();
@@ -195,6 +196,13 @@ export function GenericForm
case "number":
initValues[field.name] = 0;
break;
+ case "string":
+ if (field.format === "date-time") {
+ initValues[field.name] = null;
+ } else {
+ initValues[field.name] = "";
+ }
+ break;
default:
initValues[field.name] = "";
break;
@@ -258,11 +266,22 @@ export function GenericForm
};
const cancel = () => {
- const currentPath = window.location.pathname;
- const modulePath = currentPath.split("/")[1];
- handleCoreNavigation(modulePath);
+ navigateToListView();
};
+ function navigateToListView() {
+ const currentPath = window.location.pathname;
+ const pathSegments = currentPath.split("/");
+ let modulePath;
+ if (pathSegments[1] === "modules") {
+ modulePath = pathSegments[2];
+ handleDynamicModuleNavigation(modulePath);
+ } else {
+ modulePath = pathSegments[1];
+ handleCoreNavigation(modulePath);
+ }
+ }
+
const isValidUpdate = (field: DtoField) => {
if (field.type == "boolean" && (values[field.name] === true || values[field.name] === false))
return true;
diff --git a/src/components/generic-components/generic-module.tsx b/src/components/generic-components/generic-module.tsx
index 8b1d3fa1..1808757d 100644
--- a/src/components/generic-components/generic-module.tsx
+++ b/src/components/generic-components/generic-module.tsx
@@ -61,9 +61,9 @@ interface ExtraActions {
showFiltersPanel?: boolean;
}
-interface GenericModuleProps {
+export interface GenericModuleProps {
moduleName: string;
- modulePath: CoreModule;
+ modulePath: CoreModule | string;
addButtonContent?: string | ReactNode | undefined;
extraActions?: ExtraActions | undefined;
tableProps?: GenericDataGridProps;
diff --git a/src/components/icon-map/icon-fuzzy-search.ts b/src/components/icon-map/icon-fuzzy-search.ts
index b01a7f0d..b3fea1a7 100644
--- a/src/components/icon-map/icon-fuzzy-search.ts
+++ b/src/components/icon-map/icon-fuzzy-search.ts
@@ -1,4 +1,4 @@
-import { iconKeywordMap, defaultIcon } from "./icon-map";
+import { iconKeywordMap, defaultIcon, defaultIconKey } from "./icon-map";
export function getSectionIcon(title: string) {
if (!title) return defaultIcon;
@@ -11,3 +11,14 @@ export function getSectionIcon(title: string) {
}
return defaultIcon;
}
+
+export function getSectionIconKey(title: string): string {
+ if (!title) return defaultIconKey;
+ const lowerTitle = title.toLowerCase();
+ for (const { keywords, key } of iconKeywordMap) {
+ if (keywords.some((kw) => lowerTitle.includes(kw))) {
+ return key;
+ }
+ }
+ return defaultIconKey;
+}
diff --git a/src/components/icon-map/icon-map.ts b/src/components/icon-map/icon-map.ts
index e4550f60..e4c70473 100644
--- a/src/components/icon-map/icon-map.ts
+++ b/src/components/icon-map/icon-map.ts
@@ -1,21 +1,32 @@
-import { User, HelpCircle, MessageCircle, Info, Code2 } from "lucide-react";
+import { User, HelpCircle, MessageCircle, Info, Code2, School } from "lucide-react";
export const iconKeywordMap = [
{
keywords: ["author details", "author", "user", "creator", "writer"],
icon: User,
+ key: "user",
},
{
keywords: ["comment body", "comment", "body", "text", "message"],
icon: MessageCircle,
+ key: "message",
},
{
keywords: ["context", "background", "about", "reference"],
icon: Info,
+ key: "info",
},
{
keywords: ["meta", "metadata", "details", "info"],
icon: Code2,
+ key: "code2",
+ },
+ {
+ keywords: ["student", "school"],
+ icon: School,
+ key: "student",
},
];
export const defaultIcon = HelpCircle;
+
+export const defaultIconKey = "help";
diff --git a/src/components/spreadsheet-import/index.tsx b/src/components/spreadsheet-import/index.tsx
index e33a1201..27b4c55a 100644
--- a/src/components/spreadsheet-import/index.tsx
+++ b/src/components/spreadsheet-import/index.tsx
@@ -3,7 +3,11 @@ import { Fragment, useState } from "react";
import { ReactSpreadsheetImport } from "react-spreadsheet-import";
import { Result } from "react-spreadsheet-import/types/types";
import { StyledBackdrop } from "./index.styled";
-import { useCoreModuleNavigation, useNotificationsService } from "@hooks";
+import {
+ useCoreModuleNavigation,
+ useDynamicModuleNavigation,
+ useNotificationsService,
+} from "@hooks";
import { getImportFields } from "utils/import-file-helper";
interface csvImportPorps {
@@ -16,6 +20,7 @@ interface csvImportPorps {
export const CsvImport = ({ isOpen, onClose, onUpload, object, endRoute }: csvImportPorps) => {
const handleNavigation = useCoreModuleNavigation();
+ const handleDynamicModuleNavigation = useDynamicModuleNavigation();
const { notificationsService } = useNotificationsService();
const [isUploading, setIsUploading] = useState(false);
@@ -37,9 +42,19 @@ export const CsvImport = ({ isOpen, onClose, onUpload, object, endRoute }: csvIm
const handleSuccess = () => {
notificationsService.success("Data import completed.");
- handleNavigation(endRoute);
+ navigateToView();
};
+ function navigateToView() {
+ const currentPath = window.location.pathname;
+ const pathSegments = currentPath.split("/");
+ if (pathSegments[1] === "modules") {
+ handleDynamicModuleNavigation(endRoute);
+ } else {
+ handleNavigation(endRoute);
+ }
+ }
+
return (
Promise;
+type ResponseHandler = (resp: Response) => Promise;
+
+function buildApiFnHttpInternal(
+ fnDef: FnDef,
+ getToken: GetTokenFn,
+ handleResponse: ResponseHandler
+): (data: T, params?: any) => Promise {
+ return async (data, params) => {
+ const BASE_URL = process.env.CORE_API;
+ let url = fnDef.endpoint;
+ if (url.includes("{id}")) {
+ const id = (data as any)?.id ?? data;
+ if (id !== undefined && id !== null) {
+ url = url.replace("{id}", id);
+ }
+ }
+ if (!/^https?:\/\//.test(url)) {
+ const normalizedBaseUrl = BASE_URL!.replace(/\/$/, "");
+ const normalizedEndpoint = url.replace(/^\//, "");
+ url = `${normalizedBaseUrl}/${normalizedEndpoint}`;
+ }
+
+ const token = await getToken();
+ const headers: Record = {
+ "Content-Type": "application/json",
+ };
+ if (token) {
+ headers["Authorization"] = `Bearer ${token}`;
+ }
+ if (params?.headers?.Accept) {
+ headers["Accept"] = params.headers.Accept;
+ }
+
+ let opts: RequestInit = {
+ method: fnDef.method,
+ headers,
+ };
+ if (["POST", "PUT", "PATCH"].includes(fnDef.method)) {
+ opts.body = JSON.stringify(data);
+ }
+ if (fnDef.method === "GET" && data && typeof data === "object") {
+ const qs = new URLSearchParams(data as any).toString();
+ url += (url.includes("?") ? "&" : "?") + qs;
+ }
+
+ const resp = await fetch(url, opts);
+ return handleResponse(resp);
+ };
+}
+
+export function buildExportApiFnHttp(
+ fnDef: FnDef,
+ getToken: GetTokenFn
+): (data: any, params?: any) => Promise {
+ return buildApiFnHttpInternal(fnDef, getToken, async (resp) => resp);
+}
+
+export function buildApiFnHttp(
+ fnDef: FnDef,
+ getToken: GetTokenFn
+): (data: T, params?: any) => Promise> {
+ return buildApiFnHttpInternal(fnDef, getToken, async (resp) => {
+ const contentType = resp.headers.get("Content-Type") || "";
+ let responseData;
+ try {
+ responseData = contentType.includes("application/json")
+ ? await resp.json()
+ : await resp.text();
+ } catch (err) {
+ responseData = undefined;
+ }
+ return {
+ data: resp.ok ? responseData : undefined,
+ error: resp.ok ? undefined : responseData,
+ status: resp.status,
+ ok: resp.ok,
+ redirected: resp.redirected,
+ headers: resp.headers,
+ url: resp.url,
+ type: resp.type,
+ statusText: resp.statusText,
+ } as HttpResponse;
+ });
+}
+
+export function buildUpdateApiFnHttp(
+ fnDef: { endpoint: string; method: string },
+ getToken: () => Promise
+): (id: number | string, data: T, params?: any) => Promise> {
+ const updateFn = buildApiFnHttp(fnDef, getToken);
+ return (id, data, params = {}) => {
+ const payload = { ...data, id };
+ return updateFn(payload, params);
+ };
+}
+
+function wrapExtraActions(
+ extraActionsFromBackend: any,
+ getToken: () => Promise
+) {
+ if (!extraActionsFromBackend) return undefined;
+ return {
+ ...extraActionsFromBackend,
+ export: extraActionsFromBackend.export
+ ? {
+ ...extraActionsFromBackend.export,
+ exportItemsFn: buildExportApiFnHttp(
+ extraActionsFromBackend.export.exportItemsFn,
+ getToken
+ ),
+ }
+ : undefined,
+ import: extraActionsFromBackend.import
+ ? {
+ ...extraActionsFromBackend.import,
+ importItemsFn: wrapApiFn(extraActionsFromBackend.import.importItemsFn, getToken),
+ }
+ : undefined,
+ };
+}
+
+function wrapApiFn(apiDef: any, getToken: () => Promise) {
+ return apiDef && apiDef.endpoint && apiDef.method ? buildApiFnHttp(apiDef, getToken) : undefined;
+}
+
+export function DynamicGenericModuleLoader() {
+ const { getToken } = useAuthState();
+ const navigate = useNavigate();
+ const { moduleName } = useParams();
+ const { config, loading, error } = useConfig();
+
+ if (loading) return ;
+ if (error) return {error};
+
+ const moduleDescriptor = useMemo(() => {
+ if (!config?.modules) return undefined;
+ return config.modules.find(
+ (m: any) => m.moduleName.toLowerCase() === moduleName?.toLowerCase()
+ );
+ }, [config, moduleName]);
+
+ if (!moduleDescriptor) return Module not found;
+
+ function resolveSchema(ref: any) {
+ if (ref && ref["$ref"]) {
+ const path = ref["$ref"].replace(/^#\//, "").split("/");
+ return path.reduce((acc: any, key: string) => acc && acc[key], config);
+ }
+ return ref;
+ }
+
+ const tableProps = {
+ ...moduleDescriptor.tableProps,
+ schema: moduleDescriptor.schemas!.details!,
+ getItemsFn: buildApiFnHttp(moduleDescriptor.tableProps!.getItemsFn!, getToken),
+ detailsNavigate: (item: { id: number }) => {
+ if (item.id) {
+ navigate(`/modules/${moduleDescriptor.modulePath}/${getViewFormRoute(item.id)}`);
+ }
+ },
+ editNavigate: (item: { id: number }) => {
+ if (item.id) {
+ navigate(`/modules/${moduleDescriptor.modulePath}/${getEditFormRoute(item.id)}`);
+ }
+ },
+ key: moduleDescriptor.tableProps!.key,
+ };
+
+ const formFns = moduleDescriptor.formFns || {};
+ const schemas = moduleDescriptor.schemas || {};
+ const modulePath = `/${moduleDescriptor.modulePath}`;
+
+ const commonFormProps = {
+ detailsSchema: resolveSchema(schemas.details),
+ updateSchema: resolveSchema(schemas.update),
+ createSchema: resolveSchema(schemas.create),
+ getItemFn: buildApiFnHttp(formFns.getItemFn!, getToken),
+ updateItemFn: buildUpdateApiFnHttp(formFns.updateItemFn!, getToken),
+ createItemFn: buildApiFnHttp(formFns.createItemFn!, getToken),
+ getItemId: () => undefined,
+ };
+
+ const deleteProps = formFns.deleteItemFn
+ ? {
+ header: "Data Management",
+ description: "Please be aware that what has been deleted can never be brought back.",
+ entity: moduleDescriptor.moduleName?.toLowerCase() || "item",
+ listRoute: moduleDescriptor.modulePath,
+ deleteItemFn: (id: number) => buildApiFnHttp(formFns.deleteItemFn!, getToken)(id, {}),
+ }
+ : undefined;
+
+ const createFormProps = {
+ ...commonFormProps,
+ editable: true,
+ mode: "create" as const,
+ onSaved: () => navigate(`/modules${modulePath}`),
+ };
+
+ const editFormProps = {
+ ...commonFormProps,
+ editable: true,
+ mode: "update" as const,
+ onSaved: () => navigate(`/modules${modulePath}`),
+ getItemId: () => {
+ const params = useParams();
+ return Number(params && params["*"] && params["*"].match(/^(\d+)\/edit$/)?.[1]);
+ },
+ };
+
+ const viewFormProps = {
+ ...commonFormProps,
+ editable: false,
+ mode: "details" as const,
+ onSaved: () => navigate(modulePath),
+ getItemId: () => {
+ const params = useParams();
+ return Number(params && params["*"] && params["*"].match(/^(\d+)\/view$/)?.[1]);
+ },
+ ...(deleteProps && { deleteOptionProps: deleteProps }),
+ };
+
+ const extraActions = wrapExtraActions(moduleDescriptor.extraActions, getToken);
+ if (extraActions && extraActions.import) {
+ extraActions.import.importSchema = moduleDescriptor.schemas?.create;
+ }
+ if (extraActions && moduleDescriptor.extraActions) {
+ if ("showColumnsPanel" in moduleDescriptor.extraActions) {
+ extraActions.showColumnsPanel = moduleDescriptor.extraActions.showColumnsPanel;
+ }
+ if ("showFiltersPanel" in moduleDescriptor.extraActions) {
+ extraActions.showFiltersPanel = moduleDescriptor.extraActions.showFiltersPanel;
+ }
+ }
+
+ return (
+
+
+
+ );
+}
+
+export function DynamicGenericModuleRoutes() {
+ return (
+
+
+
+ );
+}
diff --git a/src/hooks/core-module-navigation-hook.ts b/src/hooks/core-module-navigation-hook.ts
index b88ae705..5f16ef3b 100644
--- a/src/hooks/core-module-navigation-hook.ts
+++ b/src/hooks/core-module-navigation-hook.ts
@@ -1,5 +1,5 @@
import { CoreModule, getCoreModuleRoute } from "@lib/router";
-import { useNavigate } from "react-router-dom";
+import { useLocation, useNavigate } from "react-router-dom";
export const useCoreModuleNavigation = () => {
const navigate = useNavigate();
@@ -15,3 +15,17 @@ export const useCoreModuleNavigation = () => {
return handleNavigation;
};
+
+export const useDynamicModuleNavigation = () => {
+ const navigate = useNavigate();
+ const location = useLocation();
+
+ return (moduleName: string) => {
+ const toRoute = `/modules/${moduleName}`;
+ if (location.pathname === toRoute) {
+ navigate(toRoute, { replace: true });
+ } else {
+ navigate(toRoute);
+ }
+ };
+};
diff --git a/src/lib/network/swagger-client.ts b/src/lib/network/swagger-client.ts
index 722f8155..aad509c0 100644
--- a/src/lib/network/swagger-client.ts
+++ b/src/lib/network/swagger-client.ts
@@ -4347,7 +4347,7 @@ export interface DealCreateDto {
dealValue?: number | null;
/**
* Deal Currency
- * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|XCG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|ZWG||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|XCG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|ZWG|EUR|EUR|INR|NPR|AWG|EUR|USD|XCG|EUR|SRD|XCG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|ZWG|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|MYR|SGD|CNY|HKD|JPY|MOP|MYR|TWD|ZAR)$
+ * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|ANG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|USD||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|ANG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|USD|EUR|EUR|INR|NPR|AWG|EUR|USD|ANG|EUR|SRD|ANG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|USD|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|SGD|CNY|HKD|JPY|MOP|TWD|ZAR)$
* @example "USD"
*/
dealCurrency?: string | null;
@@ -4404,7 +4404,7 @@ export interface DealDetailsDto {
dealValue?: number | null;
/**
* Deal Currency
- * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|XCG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|ZWG||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|XCG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|ZWG|EUR|EUR|INR|NPR|AWG|EUR|USD|XCG|EUR|SRD|XCG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|ZWG|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|MYR|SGD|CNY|HKD|JPY|MOP|MYR|TWD|ZAR)$
+ * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|ANG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|USD||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|ANG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|USD|EUR|EUR|INR|NPR|AWG|EUR|USD|ANG|EUR|SRD|ANG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|USD|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|SGD|CNY|HKD|JPY|MOP|TWD|ZAR)$
* @example "USD"
*/
dealCurrency?: string | null;
@@ -4614,7 +4614,7 @@ export interface DealUpdateDto {
/**
* Deal Currency
* @minLength 1
- * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|XCG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|ZWG||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|XCG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|ZWG|EUR|EUR|INR|NPR|AWG|EUR|USD|XCG|EUR|SRD|XCG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|ZWG|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|MYR|SGD|CNY|HKD|JPY|MOP|MYR|TWD|ZAR)$
+ * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|ANG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|USD||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|ANG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|USD|EUR|EUR|INR|NPR|AWG|EUR|USD|ANG|EUR|SRD|ANG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|USD|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|SGD|CNY|HKD|JPY|MOP|TWD|ZAR)$
* @example "USD"
*/
dealCurrency?: string | null;
@@ -6158,7 +6158,7 @@ export interface OrderItemCreateDto {
/**
* Currency
* @minLength 1
- * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|XCG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|ZWG||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|XCG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|ZWG|EUR|EUR|INR|NPR|AWG|EUR|USD|XCG|EUR|SRD|XCG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|ZWG|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|MYR|SGD|CNY|HKD|JPY|MOP|MYR|TWD|ZAR)$
+ * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|ANG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|USD||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|ANG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|USD|EUR|EUR|INR|NPR|AWG|EUR|USD|ANG|EUR|SRD|ANG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|USD|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|SGD|CNY|HKD|JPY|MOP|TWD|ZAR)$
* @example "USD"
*/
currency: string;
@@ -6199,7 +6199,7 @@ export interface OrderItemDetailsDto {
/**
* Currency
* @minLength 1
- * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|XCG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|ZWG||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|XCG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|ZWG|EUR|EUR|INR|NPR|AWG|EUR|USD|XCG|EUR|SRD|XCG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|ZWG|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|MYR|SGD|CNY|HKD|JPY|MOP|MYR|TWD|ZAR)$
+ * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|ANG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|USD||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|ANG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|USD|EUR|EUR|INR|NPR|AWG|EUR|USD|ANG|EUR|SRD|ANG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|USD|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|SGD|CNY|HKD|JPY|MOP|TWD|ZAR)$
* @example "USD"
*/
currency: string;
@@ -6331,7 +6331,7 @@ export interface OrderItemImportDto {
unitPrice?: number | null;
/**
* Currency
- * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|XCG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|ZWG||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|XCG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|ZWG|EUR|EUR|INR|NPR|AWG|EUR|USD|XCG|EUR|SRD|XCG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|ZWG|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|MYR|SGD|CNY|HKD|JPY|MOP|MYR|TWD|ZAR)$
+ * @pattern ^(NAD|ZAR|XAF|JPY|GHS|ETB|USD||AED|BHD|DJF|DZD|EGP|MAD|ERN|ILS|IQD|JOD|KMF|KWD|LBP|LYD|MAD|MRU|OMR|ILS|QAR|SAR|SDG|SOS|SSP|SYP|XAF|TND|YER|CLP|INR|TZS|EUR|AZN|AZN|RUB|XAF|BYN|ZMW|MAD|MAD|TZS|BGN|INR|INR|XOF|XOF|BDT|INR|CNY|INR|EUR|INR|BAM|BAM|ERN|EUR|EUR|EUR|EUR|BDT|INR|RUB|PHP|UGX|USD|USD|USD|IQD|IRR|EUR|CZK|CAD|RUB|GBP|DKK|DKK|KES|EUR|EUR|CHF|EUR|EUR|CHF|EUR|XOF|INR|EUR|XAF|MVR|XOF|BTN|KES|GHS|XOF|EUR|EUR|||AED|XCD|XCD|ALL|ARS|USD|EUR|AUD|BBD|BDT|EUR|BGN|BIF|BMD|BND|BRL|BSD|BWP|BZD|CAD|AUD|CHF|NZD|CLP|XAF|CNY|COP|CVE|AUD|EUR|CZK|EUR|USD|DKK|XCD|EUR|ERN|EUR|FJD|FKP|USD|EUR|GBP|XCD|GBP|GHS|GIP|GMD|EUR|USD|GYD|HKD|HUF|IDR|EUR|ILS|GBP|INR|USD|GBP|JMD|JPY|KES|AUD|XCD|KRW|KYD|XCD|LRD|ZAR|EUR|EUR|MGA|USD|MMK|MOP|USD|XCD|EUR|MUR|MVR|MWK|MXN|MYR|NAD|AUD|NGN|EUR|NOK|AUD|NZD|NZD|PGK|PHP|PKR|PLN|NZD|USD|EUR|USD|RUB|RWF|SAR|SBD|SCR|SDG|SEK|SGD|SHP|EUR|EUR|SLE|SSP|ANG|SZL|USD|THB|NZD|TOP|TRY|TTD|AUD|TWD|TZS|UAH|UGX|USD|USD|USD|XCD|USD|USD|VUV|WST|ZAR|ZMW|USD||||XCD|ARS|BBD|BMD|BOB|USD|BRL|BSD|BZD|CAD|CLP|COP|CRC|CUP|ANG|XCD|DOP|EUR|USD|EUR|XCD|XAF|GTQ|GYD|HNL|HTG|EUR|XCD|KYD|XCD|MXN|NIO|PAB|PEN|PHP|USD|PYG|USD|USD|TTD|USD|UYU|XCD|VED|USD|USD|EUR|EUR|XAF|AFN|IRR|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|XOF|XAF|GHS|GMD|GNF|XOF|LRD|MRU|XOF|NGN|SLE|XOF|EUR|PHP|DKK|DKK|EUR|XOF|BIF|XOF|EUR|CAD|CDF|XAF|XAF|CHF|XOF|XAF|DJF|DZD|EUR|XAF|EUR|GNF|EUR|XAF|HTG|KMF|EUR|MAD|EUR|EUR|MGA|XOF|EUR|MRU|MUR|XPF|XOF|XPF|EUR|EUR|RWF|SCR|XOF|SYP|XAF|XOF|TND|VUV|XPF|EUR|EUR|EUR|GBP|EUR|GHS|GBP|ERN|ETB|EUR|PYG|CHF|EUR|CHF|INR|KES|GBP|GHS|XOF|NGN|USD|ILS|INR|INR|CNY|BAM|EUR|EUR|HUF|AMD||IDR|EUR|NGN|CNY||ISK|CHF|EUR|EUR|EUR|CAD|JPY||XAF|TZS|IDR|GEL|DZD|NGN|KES|NGN|TZS|CVE|BRL|XOF|KES|KZT|XAF|DKK|KES|KHR|INR|CNY|KPW|KRW|INR|GNF|LRD|INR|INR|INR|TZS|XAF|EUR|TRY|GBP|INR|INR|INR|INR|KGS|TZS|EUR|UGX|EUR|USD|EUR|AOA|CDF|XAF|XAF|LAK|IQD|IRR|EUR|CDF|KES|KES|EUR|INR|KES|TZS|KES|MUR|MGA|MZN|XAF|NZD|CAD|IQD|MKD|INR|MNT|INR|INR|CAD|INR|BND|MYR|BND|IDR|MYR|SGD|EUR|XAF|USD|MMK|RUB|IRR|NAD|NOK|NOK|USD|EUR|EUR|INR|NPR|AWG|EUR|USD|ANG|EUR|SRD|ANG|XAF|NOK|XAF|INR|GNF|ZAR|ZAR|SSP|USD|MWK|UGX|EUR|EUR|ETB|KES|INR|GEL|RUB|USD|PKR|PKR|INR|NGN|PLN|CAD|PLN|AFN|PKR|AOA|BRL|CHF|CVE|EUR|XAF|XOF|EUR|MOP|MZN|EUR|STN|USD|BOB|USD|PEN|INR|IDR|IDR|BDT|MMK|CHF|BIF|MDL|RON|TZS|BYN|KGS|KZT|MDL|RUB|UAH|RWF|TZS|INR|RUB|KES|INR|INR|TZS|EUR|EUR|PKR|INR|EUR|NOK|SEK|MZN|XOF|XAF|MAD|MAD|LKR|EUR|EUR|USD|WST|EUR|USD|DJF|ETB|KES|SOS|ALL|MKD|EUR|BAM|EUR|RSD|EUR|BAM|EUR|RSD|EUR|SZL|ZAR|ZAR|ZAR|IDR|EUR|EUR|SEK|CDF|KES|TZS|UGX|IQD|SYP|PLN|INR|LKR|MYR|SGD|INR|KES|UGX|TJS|THB|ERN|ETB|ERN|TMT|BWP|ZAR|TOP||EUR|TRY|TWD|ZAR|RUB|XOF|MAD|CNY|UAH|INR|PKR|INR|PKR|AFN|UZS|UZS|LRD|LRD|ZAR|EUR|VND|MZN|TZS|EUR|CHF|ETB|XOF|ZAR|INR|UGX|XAF|UAH|XOF|NGN|BRL|COP|VED|CNY|HKD|CNY|MAD|CNY|HKD|JPY|MOP|SGD|CNY|HKD|JPY|MOP|TWD|ZAR)$
* @example "USD"
*/
currency?: string | null;
@@ -6767,46 +6767,6 @@ export interface TaskExecutionDto {
completed?: boolean;
}
-export interface TextGenerationRequest {
- /**
- * User Prompt
- * @minLength 1
- * @example "string"
- */
- userPrompt: string;
- /**
- * System Prompt
- * @example "string"
- */
- systemPrompt?: string;
-}
-
-export interface TextGenerationResponse {
- /**
- * Generated Text
- * @example "string"
- */
- generatedText?: string;
- /**
- * Model
- * @example "string"
- */
- model?: string;
- /**
- * Tokens Used
- * @format int32
- * @example 1
- */
- tokensUsed?: number;
- /**
- * Finish Reason
- * @example "string"
- */
- finishReason?: string;
- /** Metadata */
- metadata?: Record;
-}
-
export interface TopAccountDto {
/**
* Account Id
@@ -8406,71 +8366,6 @@ export class Api<
...params,
}),
- /**
- * No description
- *
- * @tags Content
- * @name ContentAiDraftCreate
- * @request POST:/api/content/ai-draft
- * @secure
- */
- contentAiDraftCreate: (
- data: ContentGenerationRequest,
- params: RequestParams = {},
- ) =>
- this.request({
- path: `/api/content/ai-draft`,
- method: "POST",
- body: data,
- secure: true,
- type: ContentType.Json,
- format: "json",
- ...params,
- }),
-
- /**
- * No description
- *
- * @tags Content
- * @name ContentAiEditCreate
- * @request POST:/api/content/ai-edit
- * @secure
- */
- contentAiEditCreate: (
- data: ContentEditRequest,
- params: RequestParams = {},
- ) =>
- this.request({
- path: `/api/content/ai-edit`,
- method: "POST",
- body: data,
- secure: true,
- type: ContentType.Json,
- format: "json",
- ...params,
- }),
-
- /**
- * No description
- *
- * @tags Content
- * @name ContentAiTranslationDraftDetail
- * @request GET:/api/content/{id}/ai-translation-draft/{language}
- * @secure
- */
- contentAiTranslationDraftDetail: (
- id: number,
- language: string,
- params: RequestParams = {},
- ) =>
- this.request({
- path: `/api/content/${id}/ai-translation-draft/${language}`,
- method: "GET",
- secure: true,
- format: "json",
- ...params,
- }),
-
/**
* No description
*
@@ -12495,28 +12390,6 @@ export class Api<
...params,
}),
- /**
- * No description
- *
- * @tags AIAssistance
- * @name AiImageGenerationCreate
- * @request POST:/api/ai/image-generation
- * @secure
- */
- aiImageGenerationCreate: (
- data: ImageGenerationRequest,
- params: RequestParams = {},
- ) =>
- this.request({
- path: `/api/ai/image-generation`,
- method: "POST",
- body: data,
- secure: true,
- type: ContentType.Json,
- format: "json",
- ...params,
- }),
-
/**
* No description
*
@@ -13888,28 +13761,6 @@ export class Api<
...params,
}),
- /**
- * No description
- *
- * @tags AIAssistance
- * @name AiTextGenerationCreate
- * @request POST:/api/ai/text-generation
- * @secure
- */
- aiTextGenerationCreate: (
- data: TextGenerationRequest,
- params: RequestParams = {},
- ) =>
- this.request({
- path: `/api/ai/text-generation`,
- method: "POST",
- body: data,
- secure: true,
- type: ContentType.Json,
- format: "json",
- ...params,
- }),
-
/**
* No description
*
diff --git a/src/lib/router/index.ts b/src/lib/router/index.ts
index cb0e6973..ff5c54f4 100644
--- a/src/lib/router/index.ts
+++ b/src/lib/router/index.ts
@@ -19,8 +19,8 @@ export const enum CoreModule {
settings = "settings",
}
-const coreModuleParser: Parser = {
- parse: (value) => value as CoreModule,
+const coreModuleParser: Parser = {
+ parse: (value) => value,
serialize: (moduleName) => moduleName,
};
@@ -58,7 +58,8 @@ export const contactInvoicesRoute = route("invoices", {}, {});
export const contactLogsRoute = route("logs", {}, {});
-export const getCoreModuleRoute = (moduleName: CoreModule) => coreModuleRoute({ moduleName }).$;
+export const getCoreModuleRoute = (moduleName: CoreModule | string) =>
+ coreModuleRoute({ moduleName }).$;
export const getEditFormRoute = (id: number) => editFormRoute({ id: id }).$;
diff --git a/src/utils/build-menu-items.ts b/src/utils/build-menu-items.ts
index 7cdeb178..8d1f1c24 100644
--- a/src/utils/build-menu-items.ts
+++ b/src/utils/build-menu-items.ts
@@ -1,10 +1,18 @@
import { MENU_CONFIG } from "./menu-config";
import { getDashboardAvailability } from "@features/dashboard/availability";
+import { getSectionIcon, getSectionIconKey } from "@components/icon-map";
+import { SidebarMenuSection } from "@components/app-layout";
+import React from "react";
+import { DynamicModuleDto } from "@lib/network/swagger-client";
-export function buildMenuItems(availableEntities: string[] | undefined, selectedModule: string) {
+export function buildMenuItems(
+ availableEntities: string[] | undefined,
+ selectedModule: string,
+ dynamicModules?: DynamicModuleDto[]
+) {
const entitySet = new Set((availableEntities || []).map((e) => e.toLowerCase()));
const dash = getDashboardAvailability(availableEntities);
- return MENU_CONFIG.map((section) => {
+ const menuSections = MENU_CONFIG.map((section) => {
const filteredItems = section.items
.filter((item) => {
// For dashboard, also ensure there's at least one tile to show.
@@ -20,4 +28,65 @@ export function buildMenuItems(availableEntities: string[] | undefined, selected
if (filteredItems.length === 0) return null;
return { header: section.header, items: filteredItems };
}).filter(Boolean);
+
+ let dynamicSection;
+ if (dynamicModules && dynamicModules.length > 0) {
+ dynamicSection = buildDynamicMenuSection(
+ availableEntities ?? [],
+ dynamicModules,
+ selectedModule
+ );
+ }
+
+ if (!dynamicSection) return menuSections;
+ const dynamicSectionWithJsxIcons: SidebarMenuSection = {
+ ...dynamicSection,
+ items: dynamicSection.items.map((item) => ({
+ ...item,
+ icon:
+ typeof item.icon === "string"
+ ? React.createElement(getSectionIcon(item.icon), { size: 20 })
+ : item.icon,
+ })),
+ };
+
+ const mainIndex = menuSections.findIndex((section) => section!.header === "MAIN");
+ if (mainIndex !== -1) {
+ return [
+ ...menuSections.slice(0, mainIndex + 1),
+ dynamicSectionWithJsxIcons,
+ ...menuSections.slice(mainIndex + 1),
+ ];
+ } else {
+ return [dynamicSectionWithJsxIcons, ...menuSections];
+ }
+}
+
+export function buildDynamicMenuSection(
+ entities: string[] | undefined,
+ modules: DynamicModuleDto[],
+ selectedModule: string
+): SidebarMenuSection | null {
+ if (!entities || !modules) {
+ return null;
+ }
+ const entitySet = new Set(entities.map((e) => e.toLowerCase()));
+ const matchedModules = modules.filter(
+ (mod) => mod.moduleName && entitySet.has(mod.moduleName.toLowerCase())
+ );
+ if (matchedModules.length === 0) return null;
+
+ return {
+ header: "DYNAMIC",
+ items: matchedModules.map((mod) => ({
+ id: mod.moduleName!,
+ label: mod.moduleName!,
+ icon: getSectionIconKey(mod.moduleName!),
+ entity: mod.moduleName!,
+ route: `/modules/${mod.modulePath || mod.moduleName}`,
+ onClick: (navigate: (to: string) => void) =>
+ navigate(`/modules/${mod.modulePath || mod.moduleName}`),
+ isSelected: selectedModule === (mod.modulePath || mod.moduleName),
+ })),
+ };
}