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), + })), + }; }