export const CountryCurrencies: Readonly> = Object.freeze({ // India "IN": "INR", "IND": "INR", "INDIA": "INR", // United States "US": "USD", "USA": "USD", "UNITED STATES": "USD", // United Kingdom "GB": "GBP", "UK": "GBP", "GBR": "GBP", "UNITED KINGDOM": "GBP", // UAE "AE": "AED", "ARE": "AED", "UAE": "AED", "UNITED ARAB EMIRATES": "AED", // European Union (Euro countries) "EU": "EUR", "DE": "EUR", "DEU": "EUR", "GERMANY": "EUR", "FR": "EUR", "FRA": "EUR", "FRANCE": "EUR", "IT": "EUR", "ITA": "EUR", "ITALY": "EUR", "ES": "EUR", "ESP": "EUR", "SPAIN": "EUR", "NL": "EUR", "NLD": "EUR", "NETHERLANDS": "EUR", "BE": "EUR", "BEL": "EUR", "BELGIUM": "EUR", "AT": "EUR", "AUT": "EUR", "AUSTRIA": "EUR", "PT": "EUR", "PRT": "EUR", "PORTUGAL": "EUR", "IE": "EUR", "IRL": "EUR", "IRELAND": "EUR", "GR": "EUR", "GRC": "EUR", "GREECE": "EUR", "FI": "EUR", "FIN": "EUR", "FINLAND": "EUR", // Asia "JP": "JPY", "JPN": "JPY", "JAPAN": "JPY", "CN": "CNY", "CHN": "CNY", "CHINA": "CNY", "SG": "SGD", "SGP": "SGD", "SINGAPORE": "SGD", "HK": "HKD", "HKG": "HKD", "HONG KONG": "HKD", "KR": "KRW", "KOR": "KRW", "SOUTH KOREA": "KRW", "TH": "THB", "THA": "THB", "THAILAND": "THB", "MY": "MYR", "MYS": "MYR", "MALAYSIA": "MYR", "ID": "IDR", "IDN": "IDR", "INDONESIA": "IDR", "PH": "PHP", "PHL": "PHP", "PHILIPPINES": "PHP", "VN": "VND", "VNM": "VND", "VIETNAM": "VND", // Middle East "SA": "SAR", "SAU": "SAR", "SAUDI ARABIA": "SAR", "QA": "QAR", "QAT": "QAR", "QATAR": "QAR", "OM": "OMR", "OMN": "OMR", "OMAN": "OMR", "KW": "KWD", "KWT": "KWD", "KUWAIT": "KWD", "BH": "BHD", "BHR": "BHD", "BAHRAIN": "BHD", "IL": "ILS", "ISR": "ILS", "ISRAEL": "ILS", "TR": "TRY", "TUR": "TRY", "TURKEY": "TRY", // Americas "CA": "CAD", "CAN": "CAD", "CANADA": "CAD", "MX": "MXN", "MEX": "MXN", "MEXICO": "MXN", "BR": "BRL", "BRA": "BRL", "BRAZIL": "BRL", "AR": "ARS", "ARG": "ARS", "ARGENTINA": "ARS", "CL": "CLP", "CHL": "CLP", "CHILE": "CLP", "CO": "COP", "COL": "COP", "COLOMBIA": "COP", // Oceania "AU": "AUD", "AUS": "AUD", "AUSTRALIA": "AUD", "NZ": "NZD", "NZL": "NZD", "NEW ZEALAND": "NZD", // Europe (non-Euro) "CH": "CHF", "CHE": "CHF", "SWITZERLAND": "CHF", "SE": "SEK", "SWE": "SEK", "SWEDEN": "SEK", "NO": "NOK", "NOR": "NOK", "NORWAY": "NOK", "DK": "DKK", "DNK": "DKK", "DENMARK": "DKK", "PL": "PLN", "POL": "PLN", "POLAND": "PLN", "CZ": "CZK", "CZE": "CZK", "CZECH REPUBLIC": "CZK", "HU": "HUF", "HUN": "HUF", "HUNGARY": "HUF", "RO": "RON", "ROU": "RON", "ROMANIA": "RON", "RU": "RUB", "RUS": "RUB", "RUSSIA": "RUB", // Africa "ZA": "ZAR", "ZAF": "ZAR", "SOUTH AFRICA": "ZAR", "EG": "EGP", "EGY": "EGP", "EGYPT": "EGP", "NG": "NGN", "NGA": "NGN", "NIGERIA": "NGN", "KE": "KES", "KEN": "KES", "KENYA": "KES", }); /** Every currency code the platform can derive. */ const KnownCurrencies: ReadonlySet = new Set(Object.values(CountryCurrencies)); /** * ISO 4217 minor-unit exponent (decimal places of money) for the currencies * whose exponent is not 2. Every other known currency has 2. */ const NonTwoDecimalCurrencies: Readonly> = Object.freeze({ JPY: 0, KRW: 0, VND: 0, CLP: 0, BHD: 3, KWD: 3, OMR: 3, }); /** * Decimal places money carries in a known ISO 4217 currency (INR 2, JPY 0, * KWD 3), or null for a code the platform does not know. This is the * currency's own precision; `BCurr.DPlace` is display configuration and does * not change it. */ export function GetMoneyMinorUnitExponent(currencyCode?: string | null): number | null { const normalized = (currencyCode ?? "").trim().toUpperCase(); if (!KnownCurrencies.has(normalized)) return null; return NonTwoDecimalCurrencies[normalized] ?? 2; } export function ResolveMoneyCurrencyFromEntity(entity: any): string | null { const nonempty = (...values: unknown[]): string | null => { for (const value of values) if (typeof value === "string" && value.trim()) return value.trim().toUpperCase(); return null; }; const explicit = nonempty(entity?.Config?.Common?.BCurr?.CurrencyCode, entity?.Config?.Common?.BCurr?.CCode); if (explicit) return explicit; const country = nonempty(entity?.Config?.Common?.CCode, entity?.Config?.Common?.Country, entity?.CCode, entity?.Country, entity?.BiAdrs?.CCode, entity?.BiAdrs?.Country); return country ? CountryCurrencies[country] ?? null : null; }