Daten aendern: effective date, searchable UN country pickers, 2 more bugfixes

Feature requests from live use:
- "Daten aendern" was missing a "Wirksam ab" field (unlike Versetzen/
  Befoerdern/Karenz, which all have one) - every change was silently
  logged with today's date. Added the field, threaded through
  change_employee_data (defaults to today if omitted).
- Staatsbuergerschaft and Wohnland now use a searchable picker
  (components/ui/CountryPicker) over the full 193-country UN member
  state list (lib/countries.ts) instead of the original ~9/5-value
  picklists. Dropped the now-too-narrow CHECK constraints
  (supabase/schema_2.sql) since the app is the source of truth for
  valid values, same approach used elsewhere for large open-ended
  pickers.

Two more real bugs found via live testing of the above (both in
change_employee_data, supabase/functions.sql + functions_4.sql):
1. `text[] || 'literal'` is ambiguous in Postgres - it can resolve to
   the array||array overload and try to parse the plain word as array
   syntax ('{...}'), failing with "malformed array literal". Hit on
   every single field-diff line the moment a user actually changed
   something (Staatsbuergerschaft first, then Beschaeftigungsausmass
   confirmed the same root cause). Fixed everywhere by switching to the
   unambiguous array_append() function.
2. The contract_end_date diff-check cast an empty string straight to
   date ("invalid input syntax for type date: ''") instead of using the
   same nullif(...,'')::date guard the UPDATE line below it already had.

Verified live end-to-end after both fixes: changed Staatsbuergerschaft
to Brasilien with a backdated effective date, save succeeded, Stammdaten
tab reflects it, and employee_history got the correct event_date
("2026-07-01") and description ("Geänderte Felder: Staatsbürgerschaft,
wirksam ab 2026-07-01"). Reverted the test employee's data back
afterward; seed data is clean again.
This commit is contained in:
2026-07-13 23:30:43 +02:00
parent e27db5f030
commit 131ca7ece7
7 changed files with 389 additions and 35 deletions

199
lib/countries.ts Normal file
View File

@@ -0,0 +1,199 @@
// The 193 UN member states, German names, sorted alphabetically. Used for
// Staatsbürgerschaft and Wohnland — both are searchable pickers over this
// same list (see components/ui/Lookup + DatenAendernPanel).
export const UN_COUNTRIES: string[] = [
"Afghanistan",
"Ägypten",
"Albanien",
"Algerien",
"Andorra",
"Angola",
"Antigua und Barbuda",
"Äquatorialguinea",
"Argentinien",
"Armenien",
"Aserbaidschan",
"Äthiopien",
"Australien",
"Bahamas",
"Bahrain",
"Bangladesch",
"Barbados",
"Belgien",
"Belize",
"Benin",
"Bhutan",
"Bolivien",
"Bosnien und Herzegowina",
"Botsuana",
"Brasilien",
"Brunei",
"Bulgarien",
"Burkina Faso",
"Burundi",
"Chile",
"China",
"Costa Rica",
"Côte d'Ivoire",
"Dänemark",
"Deutschland",
"Dominica",
"Dominikanische Republik",
"Dschibuti",
"Ecuador",
"El Salvador",
"Eritrea",
"Estland",
"Eswatini",
"Fidschi",
"Finnland",
"Frankreich",
"Gabun",
"Gambia",
"Georgien",
"Ghana",
"Grenada",
"Griechenland",
"Guatemala",
"Guinea",
"Guinea-Bissau",
"Guyana",
"Haiti",
"Honduras",
"Indien",
"Indonesien",
"Irak",
"Iran",
"Irland",
"Island",
"Israel",
"Italien",
"Jamaika",
"Japan",
"Jemen",
"Jordanien",
"Kambodscha",
"Kamerun",
"Kanada",
"Kap Verde",
"Kasachstan",
"Katar",
"Kenia",
"Kirgisistan",
"Kiribati",
"Kolumbien",
"Komoren",
"Kongo, Demokratische Republik",
"Kongo, Republik",
"Kosovo",
"Kroatien",
"Kuba",
"Kuwait",
"Laos",
"Lesotho",
"Lettland",
"Libanon",
"Liberia",
"Libyen",
"Liechtenstein",
"Litauen",
"Luxemburg",
"Madagaskar",
"Malawi",
"Malaysia",
"Malediven",
"Mali",
"Malta",
"Marokko",
"Marshallinseln",
"Mauretanien",
"Mauritius",
"Mexiko",
"Mikronesien",
"Moldau",
"Monaco",
"Mongolei",
"Montenegro",
"Mosambik",
"Myanmar",
"Namibia",
"Nauru",
"Nepal",
"Neuseeland",
"Nicaragua",
"Niederlande",
"Niger",
"Nigeria",
"Nordkorea",
"Nordmazedonien",
"Norwegen",
"Oman",
"Österreich",
"Osttimor",
"Pakistan",
"Palau",
"Panama",
"Papua-Neuguinea",
"Paraguay",
"Peru",
"Philippinen",
"Polen",
"Portugal",
"Ruanda",
"Rumänien",
"Russland",
"Salomonen",
"Sambia",
"Samoa",
"San Marino",
"São Tomé und Príncipe",
"Saudi-Arabien",
"Schweden",
"Schweiz",
"Senegal",
"Serbien",
"Seychellen",
"Sierra Leone",
"Simbabwe",
"Singapur",
"Slowakei",
"Slowenien",
"Somalia",
"Spanien",
"Sri Lanka",
"St. Kitts und Nevis",
"St. Lucia",
"St. Vincent und die Grenadinen",
"Südafrika",
"Sudan",
"Südkorea",
"Südsudan",
"Suriname",
"Syrien",
"Tadschikistan",
"Tansania",
"Thailand",
"Togo",
"Tonga",
"Trinidad und Tobago",
"Tschad",
"Tschechien",
"Tunesien",
"Türkei",
"Turkmenistan",
"Tuvalu",
"Uganda",
"Ukraine",
"Ungarn",
"Uruguay",
"Usbekistan",
"Vanuatu",
"Venezuela",
"Vereinigte Arabische Emirate",
"Vereinigte Staaten",
"Vereinigtes Königreich",
"Vietnam",
"Weißrussland",
"Zentralafrikanische Republik",
"Zypern",
].sort((a, b) => a.localeCompare(b, "de"));