/** * Country helpers shared by the carrier-rate import (server) and the price-sheet * page (client). Imported by RELATIVE path from both sides — no Nuxt auto-imports. * * - DHL_COUNTRY_NAME_TO_ISO2: German destination names exactly as printed in the * DHL price annexes (P01 / P02) → ISO-3166 alpha-2 (= C_Country.CountryCode). * The parser fails loudly on a name that is not listed here. * - EU_COUNTRY_CODES: EU-27 — drives the "EU" / "Non-EU" sections of the price * sheet. The DHL zone label is NOT an EU marker (zone 2 / 3 mix EU and non-EU). */ export const EU_COUNTRY_CODES: readonly string[] = [ 'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE' ] export const isEuCountryCode = (code: string | null | undefined): boolean => !!code && EU_COUNTRY_CODES.includes(String(code).toUpperCase()) /** Normalise the odd apostrophes / spacing DHL prints ("Côte d´Ivoire"). */ export const normalizeDhlCountryName = (name: string): string => String(name || '').replace(/[´’`]/g, "'").replace(/\s+/g, ' ').trim() export const DHL_COUNTRY_NAME_TO_ISO2: Record = { 'Afghanistan': 'AF', 'Ägypten': 'EG', 'Åland-Inseln': 'AX', 'Albanien': 'AL', 'Algerien': 'DZ', 'Amerikanisch-Samoa': 'AS', 'Amerikan. Jungferninseln': 'VI', 'Andorra': 'AD', 'Angola': 'AO', 'Anguilla': 'AI', 'Antigua und Barbuda': 'AG', 'Äquatorialguinea': 'GQ', 'Argentinien': 'AR', 'Armenien': 'AM', 'Aruba': 'AW', 'Aserbaidschan': 'AZ', 'Äthiopien': 'ET', 'Australien': 'AU', 'Bahamas': 'BS', 'Bahrain': 'BH', 'Bangladesch': 'BD', 'Barbados': 'BB', 'Belarus': 'BY', 'Belgien': 'BE', 'Belize': 'BZ', 'Benin': 'BJ', 'Bermuda': 'BM', 'Bhutan': 'BT', 'Bolivien': 'BO', 'Bonaire': 'BQ', 'Bosnien-Herzeg.': 'BA', 'Botsuana': 'BW', 'Bouvetinsel': 'BV', 'Brasilien': 'BR', 'Brit Gebiet ind Ozea': 'IO', 'Britische Jungferninseln': 'VG', 'Brunei Darussalam': 'BN', 'Bulgarien': 'BG', 'Burkina Faso': 'BF', 'Burundi': 'BI', 'Chile': 'CL', 'China, Volksrepublik': 'CN', 'Cookinseln': 'CK', 'Costa Rica': 'CR', "Côte d'Ivoire, Republik": 'CI', 'Curaçao': 'CW', 'Dänemark': 'DK', 'Dominica': 'DM', 'Dominik. Rep.': 'DO', 'Dschibuti': 'DJ', 'Ecuador': 'EC', 'El Salvador': 'SV', 'Eritrea': 'ER', 'Estland': 'EE', 'Eswatini': 'SZ', 'Falklandinseln': 'FK', 'Färöer': 'FO', 'Fidschi': 'FJ', 'Finnland': 'FI', 'Frankreich': 'FR', 'Französisch-Guayana': 'GF', 'Französisch-Polynesien': 'PF', 'Franz-Südterritorien': 'TF', 'Gabun': 'GA', 'Gambia': 'GM', 'Georgien': 'GE', 'Ghana': 'GH', 'Gibraltar': 'GI', 'Grenada': 'GD', 'Griechenland': 'GR', 'Grönland': 'GL', 'Großbritannien': 'GB', 'Guadeloupe': 'GP', 'Guam': 'GU', 'Guatemala': 'GT', 'Guernsey': 'GG', 'Guinea': 'GN', 'Guinea-Bissau': 'GW', 'Guyana': 'GY', 'Haiti': 'HT', 'Heard- und McDonaldinseln': 'HM', 'Honduras': 'HN', 'Hongkong': 'HK', 'Indien': 'IN', 'Indonesien': 'ID', 'Irak': 'IQ', 'Iran': 'IR', 'Irland': 'IE', 'Island': 'IS', 'Isle of Man': 'IM', 'Israel': 'IL', 'Italien': 'IT', 'Jamaika': 'JM', 'Japan': 'JP', 'Jemen': 'YE', 'Jersey': 'JE', 'Jordanien': 'JO', 'Kaiman-Inseln': 'KY', 'Kambodscha': 'KH', 'Kamerun': 'CM', 'Kanada': 'CA', 'Kap Verde': 'CV', 'Kasachstan': 'KZ', 'Katar': 'QA', 'Kenia': 'KE', 'Kirgistan': 'KG', 'Kiribati': 'KI', 'Kokosinseln, Keelinginseln': 'CC', 'Kolumbien': 'CO', 'Komoren': 'KM', 'Kongo, Demokratische Republik': 'CD', 'Kongo, Republik': 'CG', 'Kosovo': 'XK', 'Kroatien': 'HR', 'Kuba': 'CU', 'Kuwait': 'KW', 'Laos': 'LA', 'Lesotho': 'LS', 'Lettland': 'LV', 'Libanon': 'LB', 'Liberia': 'LR', 'Libyen': 'LY', 'Liechtenstein': 'LI', 'Litauen': 'LT', 'Luxemburg': 'LU', 'Macau': 'MO', 'Madagaskar': 'MG', 'Malawi': 'MW', 'Malaysia': 'MY', 'Malediven': 'MV', 'Mali': 'ML', 'Malta': 'MT', 'Marokko (inkl. Westsahara)': 'MA', 'Marschallinseln': 'MH', 'Martinique': 'MQ', 'Mauretanien': 'MR', 'Mauritius': 'MU', 'Mayotte': 'YT', 'Mexiko': 'MX', 'Mikronesien': 'FM', 'Moldau, Republik': 'MD', 'Monaco': 'MC', 'Mongolei': 'MN', 'Montenegro': 'ME', 'Montserrat': 'MS', 'Mosambik': 'MZ', 'Myanmar': 'MM', 'Namibia': 'NA', 'Nauru': 'NR', 'Nepal': 'NP', 'Neukaledonien': 'NC', 'Neuseeland': 'NZ', 'Nicaragua': 'NI', 'Niederlande': 'NL', 'Niederländ. Antillen': 'AN', 'Niger': 'NE', 'Nigeria': 'NG', 'Niue': 'NU', 'Nordkorea': 'KP', 'Nordmazedonien (Republik)': 'MK', 'Norfolkinsel': 'NF', 'Norwegen': 'NO', 'Nördliche Marianen': 'MP', 'Oman': 'OM', 'Österreich': 'AT', 'Ost Timor': 'TL', 'Pakistan': 'PK', 'Palau': 'PW', 'Palästinensische Autonomiegebiete': 'PS', 'Panama': 'PA', 'Papua-Neuguinea': 'PG', 'Paraguay': 'PY', 'Peru': 'PE', 'Philippinen': 'PH', 'Pitcairninseln': 'PN', 'Polen': 'PL', 'Portugal': 'PT', 'Puerto Rico': 'PR', 'Réunion': 'RE', 'Ruanda': 'RW', 'Rumänien': 'RO', 'Russische Föderation': 'RU', 'Saint Martin': 'MF', 'Saint-Barthélemy': 'BL', 'Salomonen': 'SB', 'Sambia': 'ZM', 'Samoa': 'WS', 'San Marino': 'SM', 'São Tomé und Príncipe': 'ST', 'Saudi-Arabien, Königreich': 'SA', 'Schweden': 'SE', 'Schweiz': 'CH', 'Senegal': 'SN', 'Serbien, Republik': 'RS', 'Seyschellen': 'SC', 'Sierra Leone': 'SL', 'Simbabwe': 'ZW', 'Singapur': 'SG', 'Sint Maarten': 'SX', 'Slowakei': 'SK', 'Slowenien': 'SI', 'Somalia': 'SO', 'Spanien': 'ES', 'Sri Lanka': 'LK', 'St. Helena': 'SH', 'St. Kitts und Nevis': 'KN', 'St. Lucia': 'LC', 'St. Pierre und Miquelon': 'PM', 'St. Vincent und die Grenadinen': 'VC', 'Südafrika': 'ZA', 'Sudan': 'SD', 'Südkorea': 'KR', 'Südsudan': 'SS', 'Suriname': 'SR', 'Svalbard (Spitzbergen) & Jan Mayen': 'SJ', 'Syrien': 'SY', 'Tadschikistan': 'TJ', 'Taiwan': 'TW', 'Tansania': 'TZ', 'Thailand': 'TH', 'Togo': 'TG', 'Tonga': 'TO', 'Trinidad und Tobago': 'TT', 'Tschad': 'TD', 'Tschechische Republik': 'CZ', 'Tunesien': 'TN', 'Türkei': 'TR', 'Turkmenistan': 'TM', 'Turks- und Caicosinseln': 'TC', 'Tuvalu': 'TV', 'Uganda': 'UG', 'Ukraine': 'UA', 'Ungarn': 'HU', 'Uruguay': 'UY', 'USA': 'US', 'Usbekistan': 'UZ', 'Vanuatu': 'VU', 'Vatikanstadt': 'VA', 'Venezuela': 'VE', 'Vereinigte Arabische Emirate': 'AE', 'Vietnam': 'VN', 'Wallis und Futuna': 'WF', 'Weihnachtsinsel': 'CX', 'Zentralafrikanische Republik': 'CF', 'Zypern': 'CY', 'Zypern, Republik': 'CY' } /** German DHL name → ISO2, or null when unknown (caller decides whether to fail). */ export const dhlCountryToIso2 = (name: string): string | null => { const key = normalizeDhlCountryName(name) if (DHL_COUNTRY_NAME_TO_ISO2[key]) return DHL_COUNTRY_NAME_TO_ISO2[key] const hit = Object.keys(DHL_COUNTRY_NAME_TO_ISO2).find((k) => normalizeDhlCountryName(k) === key) return hit ? DHL_COUNTRY_NAME_TO_ISO2[hit] : null }