From aa162dcad397b5212c1bab293511425e05cb267e Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Mon, 11 May 2026 17:52:59 +0200 Subject: [PATCH] =?UTF-8?q?KI-AGENT:=20Erweitert=20L=C3=A4nderauswahl=20f?= =?UTF-8?q?=C3=BCr=20Lieferanten=20(#157)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Länderauswahl wird beim Laden der Spezialressource um eine vollständige deutschsprachige Standardliste ergänzt. Bestehende Datenbankeinträge bleiben erhalten und überschreiben die Standardwerte. --- backend/src/routes/resourcesSpecial.ts | 19 ++ backend/src/utils/countries.ts | 258 +++++++++++++++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 backend/src/utils/countries.ts diff --git a/backend/src/routes/resourcesSpecial.ts b/backend/src/routes/resourcesSpecial.ts index 8717835..c6855d2 100644 --- a/backend/src/routes/resourcesSpecial.ts +++ b/backend/src/routes/resourcesSpecial.ts @@ -4,6 +4,7 @@ import { sortData } from "../utils/sort" // Schema imports import { accounts, units, countrys, tenants } from "../../db/schema" +import { defaultCountries } from "../utils/countries" const TABLE_MAP: Record = { accounts, @@ -96,6 +97,24 @@ export default async function resourceRoutesSpecial(server: FastifyInstance) { const data = await query + if (resource === "countrys") { + const countryMap = new Map() + + for (const country of defaultCountries) { + countryMap.set(country.toLocaleLowerCase("de"), { id: country, name: country }) + } + + for (const country of data) { + countryMap.set(country.name.toLocaleLowerCase("de"), country) + } + + return sortData( + Array.from(countryMap.values()), + sort || "name", + sort ? ascQuery === "true" : true + ) + } + // Falls sort clientseitig wie früher notwendig ist: const sorted = sortData( data, diff --git a/backend/src/utils/countries.ts b/backend/src/utils/countries.ts new file mode 100644 index 0000000..eaabcb5 --- /dev/null +++ b/backend/src/utils/countries.ts @@ -0,0 +1,258 @@ +const COUNTRY_CODES = [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BQ", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "CV", + "KH", + "CM", + "CA", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "CI", + "HR", + "CU", + "CW", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "SZ", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IR", + "IQ", + "IE", + "IM", + "IL", + "IT", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KP", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MK", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SX", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "SS", + "ES", + "LK", + "SD", + "SR", + "SJ", + "SE", + "CH", + "SY", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "UM", + "US", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW", +] as const + +const countryNames = new Intl.DisplayNames(["de"], { type: "region" }) + +export const defaultCountries = COUNTRY_CODES + .map((code) => countryNames.of(code)) + .filter((name): name is string => Boolean(name)) + .sort((a, b) => a.localeCompare(b, "de"))