Spaces:
Runtime error
Runtime error
Delete app/CurrencyMapping/currency_mapping.py
Browse files
app/CurrencyMapping/currency_mapping.py
DELETED
|
@@ -1,538 +0,0 @@
|
|
| 1 |
-
# Currency Mapping Module
|
| 2 |
-
# Contains canonical_currency_map dictionary and convert_currency_symbols_to_iso() function
|
| 3 |
-
|
| 4 |
-
# Canonical currency map for symbol resolution (matches TypeScript version)
|
| 5 |
-
canonical_currency_map = {
|
| 6 |
-
# Standard currency symbols
|
| 7 |
-
"$": "USD",
|
| 8 |
-
"£": "GBP",
|
| 9 |
-
"€": "EUR",
|
| 10 |
-
"¥": "JPY",
|
| 11 |
-
"₹": "INR",
|
| 12 |
-
"₽": "RUB",
|
| 13 |
-
"₩": "KRW",
|
| 14 |
-
"₪": "ILS",
|
| 15 |
-
"₺": "TRY",
|
| 16 |
-
"₴": "UAH",
|
| 17 |
-
"₼": "AZN",
|
| 18 |
-
"₸": "KZT",
|
| 19 |
-
"₾": "GEL",
|
| 20 |
-
"֏": "AMD",
|
| 21 |
-
"₲": "PYG",
|
| 22 |
-
"₡": "CRC",
|
| 23 |
-
"₣": "XPF",
|
| 24 |
-
"₦": "NGN",
|
| 25 |
-
"₵": "GHS",
|
| 26 |
-
"₨": "PKR",
|
| 27 |
-
"₱": "PHP",
|
| 28 |
-
"₫": "VND",
|
| 29 |
-
"₭": "LAK",
|
| 30 |
-
"៛": "KHR",
|
| 31 |
-
"৳": "BDT",
|
| 32 |
-
"؋": "AFN",
|
| 33 |
-
"﷼": "IRR",
|
| 34 |
-
|
| 35 |
-
# Custom symbols
|
| 36 |
-
"‡": "CUSTOM_DAGGER",
|
| 37 |
-
"†": "CUSTOM_DAGGER_SINGLE",
|
| 38 |
-
|
| 39 |
-
# Letter-based currencies
|
| 40 |
-
"R": "ZAR", # South African Rand
|
| 41 |
-
"C$": "CAD", # Canadian Dollar
|
| 42 |
-
"A$": "AUD", # Australian Dollar
|
| 43 |
-
"R$": "BRL", # Brazilian Real
|
| 44 |
-
"S/": "PEN", # Peruvian Sol
|
| 45 |
-
"Bs": "BOB", # Bolivian Boliviano
|
| 46 |
-
"Q": "GTQ", # Guatemalan Quetzal
|
| 47 |
-
"L": "HNL", # Honduran Lempira
|
| 48 |
-
"ƒ": "AWG", # Aruban Florin
|
| 49 |
-
"Vt": "VUV", # Vanuatu Vatu
|
| 50 |
-
"T$": "TOP", # Tongan Pa'anga
|
| 51 |
-
"T": "WST", # Samoan Tala
|
| 52 |
-
"лв": "BGN", # Bulgarian Lev
|
| 53 |
-
"Kč": "CZK", # Czech Koruna
|
| 54 |
-
"kr": "DKK", # Danish Krone
|
| 55 |
-
"Ft": "HUF", # Hungarian Forint
|
| 56 |
-
"zł": "PLN", # Polish Zloty
|
| 57 |
-
"lei": "RON", # Romanian Leu
|
| 58 |
-
"CHF": "CHF", # Swiss Franc
|
| 59 |
-
"KM": "BAM", # Bosnian Marka
|
| 60 |
-
"ден": "MKD", # North Macedonian Denar
|
| 61 |
-
"дин": "RSD", # Serbian Dinar
|
| 62 |
-
"so'm": "UZS", # Uzbekistani Som
|
| 63 |
-
"NT$": "TWD", # Taiwan Dollar
|
| 64 |
-
"HK$": "HKD", # Hong Kong Dollar
|
| 65 |
-
"S$": "SGD", # Singapore Dollar
|
| 66 |
-
"RM": "MYR", # Malaysian Ringgit
|
| 67 |
-
"฿": "THB", # Thai Baht
|
| 68 |
-
"Rp": "IDR", # Indonesian Rupiah
|
| 69 |
-
"K": "MMK", # Myanmar Kyat
|
| 70 |
-
"Rs": "LKR", # Sri Lankan Rupee
|
| 71 |
-
"Nu": "BTN", # Bhutanese Ngultrum
|
| 72 |
-
"MVR": "MVR", # Maldivian Rufiyaa
|
| 73 |
-
|
| 74 |
-
# Middle Eastern currencies
|
| 75 |
-
"ع.د": "IQD", # Iraqi Dinar
|
| 76 |
-
"ل.ل": "LBP", # Lebanese Pound
|
| 77 |
-
"د.ا": "JOD", # Jordanian Dinar
|
| 78 |
-
"ر.س": "SAR", # Saudi Riyal
|
| 79 |
-
"د.إ": "AED", # UAE Dirham
|
| 80 |
-
"ر.ق": "QAR", # Qatari Riyal
|
| 81 |
-
"د.ك": "KWD", # Kuwaiti Dinar
|
| 82 |
-
"د.ب": "BHD", # Bahraini Dinar
|
| 83 |
-
"ر.ع.": "OMR", # Omani Rial
|
| 84 |
-
"ر.ي": "YER", # Yemeni Rial
|
| 85 |
-
"ج.م": "EGP", # Egyptian Pound
|
| 86 |
-
"ل.د": "LYD", # Libyan Dinar
|
| 87 |
-
"د.ت": "TND", # Tunisian Dinar
|
| 88 |
-
"د.ج": "DZD", # Algerian Dinar
|
| 89 |
-
"د.م.": "MAD", # Moroccan Dirham
|
| 90 |
-
"ج.س.": "SDG", # Sudanese Pound
|
| 91 |
-
"SSP": "SSP", # South Sudanese Pound
|
| 92 |
-
|
| 93 |
-
# African currencies
|
| 94 |
-
"KSh": "KES", # Kenyan Shilling
|
| 95 |
-
"USh": "UGX", # Ugandan Shilling
|
| 96 |
-
"TSh": "TZS", # Tanzanian Shilling
|
| 97 |
-
"FRw": "RWF", # Rwandan Franc
|
| 98 |
-
"FBu": "BIF", # Burundian Franc
|
| 99 |
-
"MT": "MZN", # Mozambican Metical
|
| 100 |
-
"P": "BWP", # Botswanan Pula
|
| 101 |
-
"N$": "NAD", # Namibian Dollar
|
| 102 |
-
"Ar": "MGA", # Malagasy Ariary
|
| 103 |
-
"CF": "KMF", # Comorian Franc
|
| 104 |
-
"MK": "MWK", # Malawian Kwacha
|
| 105 |
-
"ZK": "ZMW", # Zambian Kwacha
|
| 106 |
-
"Kz": "AOA", # Angolan Kwanza
|
| 107 |
-
"FC": "CDF", # Congolese Franc
|
| 108 |
-
"FCFA": "XAF", # Central African Franc
|
| 109 |
-
"Db": "STD", # Sao Tomean Dobra
|
| 110 |
-
"D": "GMD", # Gambian Dalasi
|
| 111 |
-
"FG": "GNF", # Guinean Franc
|
| 112 |
-
"CFA": "XOF", # West African Franc
|
| 113 |
-
"Le": "SLL", # Sierra Leonean Leone
|
| 114 |
-
"L$": "LRD", # Liberian Dollar
|
| 115 |
-
"Br": "ETB", # Ethiopian Birr
|
| 116 |
-
"Nfk": "ERN", # Eritrean Nakfa
|
| 117 |
-
"Fdj": "DJF", # Djiboutian Franc
|
| 118 |
-
"S": "SOS", # Somali Shilling
|
| 119 |
-
|
| 120 |
-
# Caribbean & Central American currencies
|
| 121 |
-
"J$": "JMD", # Jamaican Dollar
|
| 122 |
-
"BZ$": "BZD", # Belize Dollar
|
| 123 |
-
"TT$": "TTD", # Trinidad and Tobago Dollar
|
| 124 |
-
"Bds$": "BBD", # Barbadian Dollar
|
| 125 |
-
"EC$": "XCD", # East Caribbean Dollar
|
| 126 |
-
"GY$": "GYD", # Guyanese Dollar
|
| 127 |
-
"SRD": "SRD", # Surinamese Dollar
|
| 128 |
-
"RD$": "DOP", # Dominican Peso
|
| 129 |
-
|
| 130 |
-
# Pacific Island currencies
|
| 131 |
-
"FJ$": "FJD", # Fijian Dollar
|
| 132 |
-
"PGK": "PGK", # Papua New Guinean Kina
|
| 133 |
-
"SI$": "SBD", # Solomon Islands Dollar
|
| 134 |
-
"WS$": "WST", # Samoan Tala
|
| 135 |
-
"VT": "VUV", # Vanuatu Vatu
|
| 136 |
-
|
| 137 |
-
# European currencies
|
| 138 |
-
"ISK": "ISK", # Icelandic Krona
|
| 139 |
-
"Lt": "LTL", # Lithuanian Litas
|
| 140 |
-
"Ls": "LVL", # Latvian Lats
|
| 141 |
-
"EEK": "EEK", # Estonian Kroon
|
| 142 |
-
"NOK": "NOK", # Norwegian Krone
|
| 143 |
-
"SEK": "SEK", # Swedish Krona
|
| 144 |
-
"ALL": "ALL", # Albanian Lek
|
| 145 |
-
|
| 146 |
-
# South American currencies
|
| 147 |
-
"Gs": "PYG", # Paraguayan Guarani
|
| 148 |
-
"Bs.S": "VES", # Venezuelan Bolívar Soberano
|
| 149 |
-
"Bs": "VEF", # Venezuelan Bolívar
|
| 150 |
-
"$U": "UYU", # Uruguayan Peso
|
| 151 |
-
"$a": "ARS", # Argentine Peso
|
| 152 |
-
"$b": "BOB", # Bolivian Boliviano
|
| 153 |
-
"CLP": "CLP", # Chilean Peso
|
| 154 |
-
"COP": "COP", # Colombian Peso
|
| 155 |
-
"MXN": "MXN", # Mexican Peso
|
| 156 |
-
|
| 157 |
-
# Small Island Nations
|
| 158 |
-
"BMD": "BMD", # Bermudian Dollar
|
| 159 |
-
"BSD": "BSD", # Bahamian Dollar
|
| 160 |
-
"KYD": "KYD", # Cayman Islands Dollar
|
| 161 |
-
"TVD": "TVD", # Tuvaluan Dollar
|
| 162 |
-
"ZWL": "ZWL", # Zimbabwean Dollar
|
| 163 |
-
|
| 164 |
-
# Additional African currencies
|
| 165 |
-
"LSL": "LSL", # Lesotho Loti
|
| 166 |
-
"SZL": "SZL", # Swazi Lilangeni
|
| 167 |
-
"CVE": "CVE", # Cape Verdean Escudo
|
| 168 |
-
"MRO": "MRO", # Mauritanian Ouguiya
|
| 169 |
-
"MRU": "MRU", # Mauritanian Ouguiya
|
| 170 |
-
"SCR": "SCR", # Seychellois Rupee
|
| 171 |
-
"SHP": "SHP", # Saint Helena Pound
|
| 172 |
-
|
| 173 |
-
# Additional Asian currencies
|
| 174 |
-
"BND": "BND", # Brunei Dollar
|
| 175 |
-
"MOP": "MOP", # Macanese Pataca
|
| 176 |
-
"NPR": "NPR", # Nepalese Rupee
|
| 177 |
-
|
| 178 |
-
# Additional Pacific currencies
|
| 179 |
-
"NZD": "NZD", # New Zealand Dollar
|
| 180 |
-
|
| 181 |
-
# Alternative $ symbols for countries (context-dependent)
|
| 182 |
-
"$BMD": "BMD", # Bermudian Dollar
|
| 183 |
-
"$BSD": "BSD", # Bahamian Dollar
|
| 184 |
-
"$BZD": "BZD", # Belize Dollar
|
| 185 |
-
"$KYD": "KYD", # Cayman Islands Dollar
|
| 186 |
-
"$FJD": "FJD", # Fijian Dollar
|
| 187 |
-
"$GYD": "GYD", # Guyanese Dollar
|
| 188 |
-
"$JMD": "JMD", # Jamaican Dollar
|
| 189 |
-
"$LRD": "LRD", # Liberian Dollar
|
| 190 |
-
"$NAD": "NAD", # Namibian Dollar
|
| 191 |
-
"$SBD": "SBD", # Solomon Islands Dollar
|
| 192 |
-
"$SRD": "SRD", # Surinamese Dollar
|
| 193 |
-
"$TTD": "TTD", # Trinidad and Tobago Dollar
|
| 194 |
-
"$TVD": "TVD", # Tuvaluan Dollar
|
| 195 |
-
"$VUV": "VUV", # Vanuatu Vatu
|
| 196 |
-
"$WST": "WST", # Samoan Tala
|
| 197 |
-
"$XCD": "XCD", # East Caribbean Dollar
|
| 198 |
-
"$ZWL": "ZWL", # Zimbabwean Dollar
|
| 199 |
-
"$BWP": "BWP", # Botswanan Pula
|
| 200 |
-
"$LSL": "LSL", # Lesotho Loti
|
| 201 |
-
"$SZL": "SZL", # Swazi Lilangeni
|
| 202 |
-
"$ZAR": "ZAR", # South African Rand
|
| 203 |
-
"$HKD": "HKD", # Hong Kong Dollar
|
| 204 |
-
"$SGD": "SGD", # Singapore Dollar
|
| 205 |
-
"$TWD": "TWD", # Taiwan Dollar
|
| 206 |
-
"$CHF": "CHF", # Swiss Franc
|
| 207 |
-
"$DKK": "DKK", # Danish Krone
|
| 208 |
-
"$NOK": "NOK", # Norwegian Krone
|
| 209 |
-
"$SEK": "SEK", # Swedish Krona
|
| 210 |
-
"$ARS": "ARS", # Argentine Peso
|
| 211 |
-
"$BOB": "BOB", # Bolivian Boliviano
|
| 212 |
-
"$CLP": "CLP", # Chilean Peso
|
| 213 |
-
"$COP": "COP", # Colombian Peso
|
| 214 |
-
"$MXN": "MXN", # Mexican Peso
|
| 215 |
-
"$PEN": "PEN", # Peruvian Sol
|
| 216 |
-
"$UYU": "UYU", # Uruguayan Peso
|
| 217 |
-
"$VES": "VES", # Venezuelan Bolívar Soberano
|
| 218 |
-
|
| 219 |
-
# Cryptocurrencies (for modern business plans)
|
| 220 |
-
"₿": "BTC", # Bitcoin
|
| 221 |
-
"Ξ": "ETH", # Ethereum
|
| 222 |
-
"Ł": "LTC", # Litecoin
|
| 223 |
-
|
| 224 |
-
# Special Drawing Rights
|
| 225 |
-
"XDR": "XDR", # Special Drawing Rights
|
| 226 |
-
|
| 227 |
-
# Precious Metals
|
| 228 |
-
"XAU": "XAU", # Gold (troy ounce)
|
| 229 |
-
"XAG": "XAG", # Silver (troy ounce)
|
| 230 |
-
"XPT": "XPT", # Platinum (troy ounce)
|
| 231 |
-
"XPD": "XPD", # Palladium (troy ounce)
|
| 232 |
-
|
| 233 |
-
# Other
|
| 234 |
-
"XTS": "XTS", # Testing Currency Code
|
| 235 |
-
"XXX": "XXX", # No Currency
|
| 236 |
-
|
| 237 |
-
# Missing currencies from canonical_currency_map.py
|
| 238 |
-
"ADP": "ADP", # Andorran Peseta
|
| 239 |
-
"AFA": "AFA", # Afghan Afghani (1927–2002)
|
| 240 |
-
"ALK": "ALK", # Albanian Lek (1946–1965)
|
| 241 |
-
"ANG": "ANG", # Netherlands Antillean Guilder
|
| 242 |
-
"AOK": "AOK", # Angolan Kwanza (1977–1991)
|
| 243 |
-
"AON": "AON", # Angolan New Kwanza (1990–2000)
|
| 244 |
-
"AOR": "AOR", # Angolan Readjusted Kwanza (1995–1999)
|
| 245 |
-
"ARA": "ARA", # Argentine Austral
|
| 246 |
-
"ARL": "ARL", # Argentine Peso Ley (1970–1983)
|
| 247 |
-
"ARM": "ARM", # Argentine Peso (1881–1970)
|
| 248 |
-
"ARP": "ARP", # Argentine Peso (1983–1985)
|
| 249 |
-
"ATS": "ATS", # Austrian Schilling
|
| 250 |
-
"AZM": "AZM", # Azerbaijani Manat (1993–2006)
|
| 251 |
-
"BAD": "BAD", # Bosnia-Herzegovina Dinar (1992–1994)
|
| 252 |
-
"BAN": "BAN", # Bosnia-Herzegovina New Dinar (1994–1997)
|
| 253 |
-
"BEC": "BEC", # Belgian Franc (convertible)
|
| 254 |
-
"BEF": "BEF", # Belgian Franc
|
| 255 |
-
"BEL": "BEL", # Belgian Franc (financial)
|
| 256 |
-
"BGL": "BGL", # Bulgarian Hard Lev
|
| 257 |
-
"BGM": "BGM", # Bulgarian Socialist Lev
|
| 258 |
-
"BGO": "BGO", # Bulgarian Lev (1879–1952)
|
| 259 |
-
"BOL": "BOL", # Bolivian Boliviano (1863–1963)
|
| 260 |
-
"BOP": "BOP", # Bolivian Peso
|
| 261 |
-
"BOV": "BOV", # Bolivian Mvdol
|
| 262 |
-
"BRB": "BRB", # Brazilian New Cruzeiro (1967–1986)
|
| 263 |
-
"BRC": "BRC", # Brazilian Cruzado (1986–1989)
|
| 264 |
-
"BRE": "BRE", # Brazilian Cruzeiro (1990–1993)
|
| 265 |
-
"BRN": "BRN", # Brazilian New Cruzado (1989–1990)
|
| 266 |
-
"BRR": "BRR", # Brazilian Cruzeiro (1993–1994)
|
| 267 |
-
"BRZ": "BRZ", # Brazilian Cruzeiro (1942–1967)
|
| 268 |
-
"BUK": "BUK", # Burmese Kyat
|
| 269 |
-
"BYB": "BYB", # Belarusian Ruble (1994–1999)
|
| 270 |
-
"BYN": "BYN", # Belarusian Ruble
|
| 271 |
-
"BYR": "BYR", # Belarusian Ruble (2000–2016)
|
| 272 |
-
"CA$": "CAD", # Canadian Dollar
|
| 273 |
-
"CHE": "CHE", # WIR Euro
|
| 274 |
-
"CHW": "CHW", # WIR Franc
|
| 275 |
-
"CLE": "CLE", # Chilean Escudo
|
| 276 |
-
"CLF": "CLF", # Chilean Unit of Account (UF)
|
| 277 |
-
"CNH": "CNH", # Chinese Yuan (offshore)
|
| 278 |
-
"CNX": "CNX", # Chinese People's Bank Dollar
|
| 279 |
-
"CN¥": "CNY", # Chinese Yuan
|
| 280 |
-
"COU": "COU", # Colombian Real Value Unit
|
| 281 |
-
"CSD": "CSD", # Serbian Dinar (2002–2006)
|
| 282 |
-
"CSK": "CSK", # Czechoslovak Hard Koruna
|
| 283 |
-
"CUC": "CUC", # Cuban Convertible Peso
|
| 284 |
-
"CUP": "CUP", # Cuban Peso
|
| 285 |
-
"CYP": "CYP", # Cypriot Pound
|
| 286 |
-
"DDM": "DDM", # East German Mark
|
| 287 |
-
"DEM": "DEM", # German Mark
|
| 288 |
-
"ECS": "ECS", # Ecuadorian Sucre
|
| 289 |
-
"ECV": "ECV", # Ecuadorian Unit of Constant Value
|
| 290 |
-
"ESA": "ESA", # Spanish Peseta (A account)
|
| 291 |
-
"ESB": "ESB", # Spanish Peseta (convertible account)
|
| 292 |
-
"ESP": "ESP", # Spanish Peseta
|
| 293 |
-
"FIM": "FIM", # Finnish Markka
|
| 294 |
-
"FKP": "FKP", # Falkland Islands Pound
|
| 295 |
-
"FRF": "FRF", # French Franc
|
| 296 |
-
"GEK": "GEK", # Georgian Kupon Larit
|
| 297 |
-
"GHC": "GHC", # Ghanaian Cedi (1979–2007)
|
| 298 |
-
"GIP": "GIP", # Gibraltar Pound
|
| 299 |
-
"GNS": "GNS", # Guinean Syli
|
| 300 |
-
"GQE": "GQE", # Equatorial Guinean Ekwele
|
| 301 |
-
"GRD": "GRD", # Greek Drachma
|
| 302 |
-
"GWE": "GWE", # Portuguese Guinea Escudo
|
| 303 |
-
"GWP": "GWP", # Guinea-Bissau Peso
|
| 304 |
-
"HRD": "HRD", # Croatian Dinar
|
| 305 |
-
"HRK": "HRK", # Croatian Kuna
|
| 306 |
-
"HTG": "HTG", # Haitian Gourde
|
| 307 |
-
"IEP": "IEP", # Irish Pound
|
| 308 |
-
"ILP": "ILP", # Israeli Pound
|
| 309 |
-
"ILR": "ILR", # Israeli Shekel (1980–1985)
|
| 310 |
-
"ISJ": "ISJ", # Icelandic Króna (1918–1981)
|
| 311 |
-
"ITL": "ITL", # Italian Lira
|
| 312 |
-
"KGS": "KGS", # Kyrgystani Som
|
| 313 |
-
"KPW": "KPW", # North Korean Won
|
| 314 |
-
"KRH": "KRH", # South Korean Hwan (1953–1962)
|
| 315 |
-
"KRO": "KRO", # South Korean Won (1945–1953)
|
| 316 |
-
"LTT": "LTT", # Lithuanian Talonas
|
| 317 |
-
"LUC": "LUC", # Luxembourgian Convertible Franc
|
| 318 |
-
"LUF": "LUF", # Luxembourgian Franc
|
| 319 |
-
"LUL": "LUL", # Luxembourg Financial Franc
|
| 320 |
-
"LVR": "LVR", # Latvian Ruble
|
| 321 |
-
"MAF": "MAF", # Moroccan Franc
|
| 322 |
-
"MCF": "MCF", # Monegasque Franc
|
| 323 |
-
"MDC": "MDC", # Moldovan Cupon
|
| 324 |
-
"MDL": "MDL", # Moldovan Leu
|
| 325 |
-
"MGF": "MGF", # Malagasy Franc
|
| 326 |
-
"MKN": "MKN", # Macedonian Denar (1992–1993)
|
| 327 |
-
"MLF": "MLF", # Malian Franc
|
| 328 |
-
"MNT": "MNT", # Mongolian Tugrik
|
| 329 |
-
"MTL": "MTL", # Maltese Lira
|
| 330 |
-
"MTP": "MTP", # Maltese Pound
|
| 331 |
-
"MUR": "MUR", # Mauritian Rupee
|
| 332 |
-
"MVP": "MVP", # Maldivian Rupee (1947–1981)
|
| 333 |
-
"MX$": "MXN", # Mexican Peso
|
| 334 |
-
"MXP": "MXP", # Mexican Silver Peso (1861–1992)
|
| 335 |
-
"MXV": "MXV", # Mexican Investment Unit
|
| 336 |
-
"MZE": "MZE", # Mozambican Escudo
|
| 337 |
-
"MZM": "MZM", # Mozambican Metical (1980–2006)
|
| 338 |
-
"NIC": "NIC", # Nicaraguan Córdoba (1988–1991)
|
| 339 |
-
"NIO": "NIO", # Nicaraguan Córdoba
|
| 340 |
-
"NLG": "NLG", # Dutch Guilder
|
| 341 |
-
"NZ$": "NZD", # New Zealand Dollar
|
| 342 |
-
"PAB": "PAB", # Panamanian Balboa
|
| 343 |
-
"PEI": "PEI", # Peruvian Inti
|
| 344 |
-
"PES": "PES", # Peruvian Sol (1863–1965)
|
| 345 |
-
"PLZ": "PLZ", # Polish Zloty (1950–1995)
|
| 346 |
-
"PTE": "PTE", # Portuguese Escudo
|
| 347 |
-
"RHD": "RHD", # Rhodesian Dollar
|
| 348 |
-
"ROL": "ROL", # Romanian Leu (1952–2006)
|
| 349 |
-
"RUR": "RUR", # Russian Ruble (1991–1998)
|
| 350 |
-
"SDD": "SDD", # Sudanese Dinar (1992–2007)
|
| 351 |
-
"SDP": "SDP", # Sudanese Pound (1957–1998)
|
| 352 |
-
"SIT": "SIT", # Slovenian Tolar
|
| 353 |
-
"SKK": "SKK", # Slovak Koruna
|
| 354 |
-
"SLE": "SLE", # Sierra Leonean Leone
|
| 355 |
-
"SRG": "SRG", # Surinamese Guilder
|
| 356 |
-
"STN": "STN", # São Tomé & Príncipe Dobra
|
| 357 |
-
"SUR": "SUR", # Soviet Rouble
|
| 358 |
-
"SVC": "SVC", # Salvadoran Colón
|
| 359 |
-
"SYP": "SYP", # Syrian Pound
|
| 360 |
-
"TJR": "TJR", # Tajikistani Ruble
|
| 361 |
-
"TJS": "TJS", # Tajikistani Somoni
|
| 362 |
-
"TMM": "TMM", # Turkmenistani Manat (1993–2009)
|
| 363 |
-
"TMT": "TMT", # Turkmenistani Manat
|
| 364 |
-
"TPE": "TPE", # Timorese Escudo
|
| 365 |
-
"TRL": "TRL", # Turkish Lira (1922–2005)
|
| 366 |
-
"UAK": "UAK", # Ukrainian Karbovanets
|
| 367 |
-
"UGS": "UGS", # Ugandan Shilling (1966–1987)
|
| 368 |
-
"USN": "USN", # US Dollar (Next day)
|
| 369 |
-
"USS": "USS", # US Dollar (Same day)
|
| 370 |
-
"UYI": "UYI", # Uruguayan Peso (Indexed Units)
|
| 371 |
-
"UYP": "UYP", # Uruguayan Peso (1975–1993)
|
| 372 |
-
"UYW": "UYW", # Uruguayan Nominal Wage Index Unit
|
| 373 |
-
"VEB": "VEB", # Venezuelan Bolívar (1871–2008)
|
| 374 |
-
"VED": "VED", # Bolívar Soberano
|
| 375 |
-
"VNN": "VNN", # Vietnamese Dong (1978–1985)
|
| 376 |
-
"XBA": "XBA", # European Composite Unit
|
| 377 |
-
"XBB": "XBB", # European Monetary Unit
|
| 378 |
-
"XBC": "XBC", # European Unit of Account (XBC)
|
| 379 |
-
"XBD": "XBD", # European Unit of Account (XBD)
|
| 380 |
-
"Cg.": "XCG", # Caribbean guilder
|
| 381 |
-
"XEU": "XEU", # European Currency Unit
|
| 382 |
-
"XFO": "XFO", # French Gold Franc
|
| 383 |
-
"XFU": "XFU", # French UIC-Franc
|
| 384 |
-
"F CFA": "XOF", # West African CFA Franc
|
| 385 |
-
"XRE": "XRE", # RINET Funds
|
| 386 |
-
"XSU": "XSU", # Sucre
|
| 387 |
-
"XUA": "XUA", # ADB Unit of Account
|
| 388 |
-
"¤": "XXX", # Unknown Currency
|
| 389 |
-
"YDD": "YDD", # Yemeni Dinar
|
| 390 |
-
"YUD": "YUD", # Yugoslavian Hard Dinar (1966–1990)
|
| 391 |
-
"YUM": "YUM", # Yugoslavian New Dinar (1994–2002)
|
| 392 |
-
"YUN": "YUN", # Yugoslavian Convertible Dinar (1990–1992)
|
| 393 |
-
"YUR": "YUR", # Yugoslavian Reformed Dinar (1992–1993)
|
| 394 |
-
"ZAL": "ZAL", # South African Rand (financial)
|
| 395 |
-
"ZMK": "ZMK", # Zambian Kwacha (1968–2012)
|
| 396 |
-
"ZRN": "ZRN", # Zairean New Zaire (1993–1998)
|
| 397 |
-
"ZRZ": "ZRZ", # Zairean Zaire (1971–1993)
|
| 398 |
-
"ZWD": "ZWD", # Zimbabwean Dollar (1980–2008)
|
| 399 |
-
"ZWG": "ZWG", # Zimbabwean Gold
|
| 400 |
-
"ZWR": "ZWR", # Zimbabwean Dollar (2008)
|
| 401 |
-
"US$": "USD", # US Dollar
|
| 402 |
-
"C$": "NIO", # Nicaraguan Córdoba
|
| 403 |
-
"TT$": "TTD", # Trinidad & Tobago Dollar
|
| 404 |
-
"BD$": "BBD", # Barbadian Dollar
|
| 405 |
-
"B$": "BND", # Brunei Dollar
|
| 406 |
-
"SI$": "SBD", # Solomon Islands Dollar
|
| 407 |
-
"G$": "GYD", # Guyanaese Dollar
|
| 408 |
-
"SR$": "SRD", # Surinamese Dollar
|
| 409 |
-
"CLP$": "CLP", # Chilean Peso
|
| 410 |
-
"Bs.": "VES", # Venezuelan Bolívar
|
| 411 |
-
"Rf": "MVR", # Maldivian Rufiyaa
|
| 412 |
-
"SSh": "SOS", # Somali Shilling
|
| 413 |
-
"GH₵": "GHS", # Ghanaian Cedi
|
| 414 |
-
"Br": "BYN", # Belarusian Ruble
|
| 415 |
-
"CFA F": "XOF", # West African CFA Franc
|
| 416 |
-
"CFAF": "XAF", # Central African CFA Franc
|
| 417 |
-
"JP¥": "JPY", # Japanese Yen
|
| 418 |
-
"元": "TWD", # New Taiwan Dollar
|
| 419 |
-
"TL": "TRY", # Turkish Lira
|
| 420 |
-
"лв.": "BGN", # Bulgarian Lev
|
| 421 |
-
"₮": "MNT", # Mongolian Tugrik
|
| 422 |
-
"﷼": "SAR", # Saudi Riyal
|
| 423 |
-
".د.ب": "BHD", # Bahraini Dinar
|
| 424 |
-
"ل.س": "SYP", # Syrian Pound
|
| 425 |
-
"﷼": "IRR", # Iranian Rial
|
| 426 |
-
"ש״ח": "ILS", # Israeli New Shekel
|
| 427 |
-
"Fr": "CHF", # Swiss Franc
|
| 428 |
-
"CFP": "XPF", # CFP Franc
|
| 429 |
-
"E": "SZL", # Swazi Lilangeni
|
| 430 |
-
"Rf.": "MVR", # Maldivian Rufiyaa
|
| 431 |
-
"QR": "QAR", # Qatari Riyal
|
| 432 |
-
"SR": "SAR", # Saudi Riyal
|
| 433 |
-
"BD": "BHD", # Bahraini Dinar
|
| 434 |
-
"KD": "KWD", # Kuwaiti Dinar
|
| 435 |
-
"₯": "GRD", # Greek Drachma
|
| 436 |
-
"ЅМ": "TJS", # Tajikistani Somoni
|
| 437 |
-
"Br (BYN)": "BYN", # Belarusian Ruble
|
| 438 |
-
"B/.": "PAB", # Panamanian Balboa
|
| 439 |
-
"Gs.": "PYG", # Paraguayan Guarani
|
| 440 |
-
"Afl.": "AWG", # Aruban Florin
|
| 441 |
-
"NAƒ": "ANG", # Netherlands Antillean Guilder
|
| 442 |
-
"lei (MDL)": "MDL", # Moldovan Leu
|
| 443 |
-
"KM (BAM)": "BAM", # Bosnia-Herzegovina Convertible Mark
|
| 444 |
-
"ден (MKD)": "MKD", # Macedonian Denar
|
| 445 |
-
"kn": "HRK", # Croatian Kuna
|
| 446 |
-
"Z$": "ZWL", # Zimbabwean Dollar (2009–2024)
|
| 447 |
-
"RTGS$": "ZWL", # Zimbabwean Dollar (2009–2024)
|
| 448 |
-
"Skr": "SEK", # Swedish Krona
|
| 449 |
-
"Nkr": "NOK", # Norwegian Krone
|
| 450 |
-
"Dkr": "DKK", # Danish Krone
|
| 451 |
-
"Íkr": "ISK", # Icelandic Króna
|
| 452 |
-
"AU$": "AUD", # Australian Dollar
|
| 453 |
-
"SG$": "SGD", # Singapore Dollar
|
| 454 |
-
"BB$": "BBD", # Barbadian Dollar
|
| 455 |
-
"BS$": "BSD", # Bahamian Dollar
|
| 456 |
-
"KY$": "KYD", # Cayman Islands Dollar
|
| 457 |
-
"BM$": "BMD", # Bermudan Dollar
|
| 458 |
-
"JM$": "JMD", # Jamaican Dollar
|
| 459 |
-
}
|
| 460 |
-
|
| 461 |
-
def convert_currency_symbols_to_iso(text: str) -> str:
|
| 462 |
-
"""
|
| 463 |
-
Convert currency symbols to ISO codes for PDF compatibility
|
| 464 |
-
Matches the TypeScript canonicalCurrencyMap logic
|
| 465 |
-
"""
|
| 466 |
-
import re # Import at function level to avoid scope issues
|
| 467 |
-
processed_text = text
|
| 468 |
-
|
| 469 |
-
# Track all conversions for detailed logging
|
| 470 |
-
conversions_made = []
|
| 471 |
-
total_conversions = 0
|
| 472 |
-
|
| 473 |
-
# Process each currency symbol in the canonical map
|
| 474 |
-
for symbol, iso_code in canonical_currency_map.items():
|
| 475 |
-
if symbol in processed_text:
|
| 476 |
-
# Check if it's a single character
|
| 477 |
-
is_single_character = len(symbol) == 1
|
| 478 |
-
is_unicode_currency = is_single_character and ord(symbol) > 127 # Non-ASCII
|
| 479 |
-
is_latin_single_letter = is_single_character and symbol.isalpha() and ord(symbol) < 128
|
| 480 |
-
|
| 481 |
-
# Handle multi-character symbols (like "Le", "KSh", etc.)
|
| 482 |
-
is_multi_char_symbol = len(symbol) > 1
|
| 483 |
-
|
| 484 |
-
# Skip plain Latin single letters (to avoid converting words like "A", "R", etc.)
|
| 485 |
-
# but DO convert single-character Unicode currency symbols like €, £, ¥, ؋, etc.
|
| 486 |
-
if not is_unicode_currency and is_latin_single_letter:
|
| 487 |
-
# Only convert if it's followed by a number (currency context)
|
| 488 |
-
# Pattern: R500, R 500, R500,000 etc.
|
| 489 |
-
pattern = rf'\b{re.escape(symbol)}\s*(\d{{1,3}}(?:,?\d{{3}})*(?:\.\d{{2}})?)\b'
|
| 490 |
-
matches = re.findall(pattern, processed_text)
|
| 491 |
-
|
| 492 |
-
if matches:
|
| 493 |
-
old_text = processed_text
|
| 494 |
-
processed_text = re.sub(pattern, rf'{iso_code} \1', processed_text)
|
| 495 |
-
|
| 496 |
-
if old_text != processed_text:
|
| 497 |
-
conversions_made.append(f"{symbol} → {iso_code} (context: {matches})")
|
| 498 |
-
total_conversions += len(matches)
|
| 499 |
-
continue
|
| 500 |
-
|
| 501 |
-
# For multi-character symbols like "Ar", "Le", etc., be very careful
|
| 502 |
-
# Only convert if they appear as standalone words or in currency contexts
|
| 503 |
-
if is_multi_char_symbol and len(symbol) == 2 and symbol.isalpha():
|
| 504 |
-
# Only convert if it's a standalone word or followed by a number
|
| 505 |
-
# Pattern: \bAr\b or \bAr\s*\d or \bLe\b or \bLe\s*\d
|
| 506 |
-
standalone_pattern = rf'\b{re.escape(symbol)}\b'
|
| 507 |
-
currency_pattern = rf'\b{re.escape(symbol)}\s*(\d{{1,3}}(?:,?\d{{3}})*(?:\.\d{{2}})?)'
|
| 508 |
-
|
| 509 |
-
# Check for standalone occurrences first
|
| 510 |
-
standalone_matches = re.findall(standalone_pattern, processed_text)
|
| 511 |
-
currency_matches = re.findall(currency_pattern, processed_text)
|
| 512 |
-
|
| 513 |
-
if standalone_matches or currency_matches:
|
| 514 |
-
old_text = processed_text
|
| 515 |
-
# Replace standalone occurrences
|
| 516 |
-
processed_text = re.sub(standalone_pattern, iso_code, processed_text)
|
| 517 |
-
# Replace currency context occurrences
|
| 518 |
-
processed_text = re.sub(currency_pattern, rf'{iso_code} \1', processed_text)
|
| 519 |
-
|
| 520 |
-
if old_text != processed_text:
|
| 521 |
-
conversions_made.append(f"{symbol} → {iso_code} (standalone/currency context)")
|
| 522 |
-
total_conversions += len(standalone_matches) + len(currency_matches)
|
| 523 |
-
continue
|
| 524 |
-
|
| 525 |
-
# For all other symbols (Unicode currency symbols, multi-character symbols)
|
| 526 |
-
# Count occurrences before replacement
|
| 527 |
-
old_count = processed_text.count(symbol)
|
| 528 |
-
|
| 529 |
-
# Replace all occurrences
|
| 530 |
-
old_text = processed_text
|
| 531 |
-
processed_text = processed_text.replace(symbol, iso_code)
|
| 532 |
-
|
| 533 |
-
# Check if replacement actually happened
|
| 534 |
-
if old_text != processed_text:
|
| 535 |
-
conversions_made.append(f"{symbol} → {iso_code} ({old_count} instances)")
|
| 536 |
-
total_conversions += old_count
|
| 537 |
-
|
| 538 |
-
return processed_text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|