employees.email ist die private Adresse (20260811140000). Sie taugt nicht als Dienstadresse und darf auch nicht als solche benutzt werden: der Honestly-Export geht an einen fremden Anbieter, der damit im Namen des Arbeitgebers einlaedt. Die Spalte "Email" stand dort deshalb seit jeher leer, mit einem Vermerk in lib/honestly.ts, dass die Firmenadresse im Datenmodell fehlt. Jetzt gibt es sie, und die Spalte fuellt sich. Eindeutig, aber freiwillig -- mehrere Personen ohne Adresse stoeren den Index nicht, weil null nie gleich null ist. Geschrieben wird ueber `case when ? then nullif` statt `coalesce`: eine Dienstadresse muss sich auch wieder entfernen lassen. Vier SQL-Funktionen mussten mit, weil `create or replace` die ganze Fassung ersetzt und ein ausgelassenes Feld dort still verschwindet: hire_employee und rehire_employee (beide teilen sich den Schritt "Person" -- das Formular haette das Feld gezeigt und den Wert weggeworfen), change_employee_data (sonst nicht aenderbar), apply_due_pending_changes (sonst verfiele eine auf spaeter datierte Aenderung) und die Feldkarte (sonst waere der Eintrag in der Historie nicht korrigierbar). Die Selbstpruefung am Ende prueft jede einzeln.
119 lines
3.6 KiB
TypeScript
119 lines
3.6 KiB
TypeScript
import { MITARBEITERART_STANDARD } from "@/lib/mitarbeiterart";
|
|
import type { CollectiveAgreement, ContractType, DienstwagenArt, EmploymentType, GenderType, Mitarbeiterart, PaygradeType, RelationshipType, Weekday, WorkerType } from "@/lib/types";
|
|
|
|
// The spec's hire wizard field list (§4.4) omits Geschlecht and Standort even
|
|
// though both are NOT NULL on employees — added here (defaults keep them
|
|
// effectively "free" for the user, same treatment as the karenz-start gap).
|
|
/**
|
|
* Angehörige:r, wie sie im Assistenten gesammelt wird.
|
|
*
|
|
* Eigener Typ statt der Zeile aus der Datenbank: es gibt weder eine Kennung
|
|
* noch eine Person, an der sie hängt — beides entsteht erst mit dem Anlegen.
|
|
*/
|
|
export type HireDraftAngehoerige = {
|
|
firstName: string;
|
|
lastName: string;
|
|
relationship: RelationshipType;
|
|
birthDate: string;
|
|
svNummer: string;
|
|
};
|
|
|
|
export type HireDraftData = {
|
|
/**
|
|
* Eingabe, nicht Vergabe.
|
|
*
|
|
* Muss mit Loga und Interflex übereinstimmen — als Zeichenkette geführt,
|
|
* weil ein leeres Zahlenfeld sonst als 0 im Entwurf landet.
|
|
*/
|
|
personnelNumber: string;
|
|
firstName: string;
|
|
lastName: string;
|
|
titlePrefix: string[];
|
|
titleSuffix: string[];
|
|
gender: GenderType;
|
|
birthDate: string;
|
|
svNummer: string;
|
|
email: string;
|
|
companyEmail: string;
|
|
phone: string;
|
|
locationId: string;
|
|
positionId: string;
|
|
besetzung: "Intern" | "Extern" | "";
|
|
entryDate: string;
|
|
contractType: ContractType;
|
|
contractEndDate: string;
|
|
employmentType: EmploymentType;
|
|
weeklyHours: string;
|
|
paygrade: PaygradeType;
|
|
workerType: WorkerType;
|
|
collectiveAgreement: CollectiveAgreement;
|
|
workDays: Weekday[];
|
|
isBetriebsrat: boolean;
|
|
hasDienstwagen: boolean;
|
|
/** Nur ausgewertet, wenn hasDienstwagen gesetzt ist — so will es der CHECK. */
|
|
dienstwagenArt: DienstwagenArt;
|
|
emergencyContactName: string;
|
|
emergencyContactPhone: string;
|
|
emergencyContactRelation: string;
|
|
angehoerige: HireDraftAngehoerige[];
|
|
isLateraleFuehrung: boolean;
|
|
isCLevel: boolean;
|
|
/** Form der Beschäftigung — zweite Achse neben der Beschäftigtengruppe. */
|
|
mitarbeiterart: Mitarbeiterart;
|
|
hasKuendigungsschutz: boolean;
|
|
/** Freiwillig — leer heisst „bis auf Weiteres". */
|
|
kuendigungsschutzBis: string;
|
|
/** Personenkreis nach dem besonderen Kündigungsschutz; leer heisst „nicht erfasst". */
|
|
kuendigungsschutzGrund: string;
|
|
kuendigungsschutzAb: string;
|
|
istBeguenstigtBehindert: boolean;
|
|
/** Grad in Prozent als Text — ein leeres Zahlenfeld wäre sonst 0. */
|
|
behinderungGrad: string;
|
|
behinderungAb: string;
|
|
behinderungBis: string;
|
|
};
|
|
|
|
export const EMPTY_HIRE_DRAFT: HireDraftData = {
|
|
personnelNumber: "",
|
|
firstName: "",
|
|
lastName: "",
|
|
titlePrefix: [],
|
|
titleSuffix: [],
|
|
gender: "m",
|
|
birthDate: "",
|
|
svNummer: "",
|
|
email: "",
|
|
companyEmail: "",
|
|
phone: "",
|
|
locationId: "",
|
|
positionId: "",
|
|
besetzung: "",
|
|
entryDate: "",
|
|
contractType: "unbefristet",
|
|
contractEndDate: "",
|
|
employmentType: "Vollzeit",
|
|
weeklyHours: "38.5",
|
|
paygrade: "B",
|
|
workerType: "Angestellte:r",
|
|
collectiveAgreement: "Handel",
|
|
workDays: ["Mo", "Di", "Mi", "Do", "Fr"],
|
|
isBetriebsrat: false,
|
|
hasDienstwagen: false,
|
|
dienstwagenArt: "Verbrenner",
|
|
emergencyContactName: "",
|
|
emergencyContactPhone: "",
|
|
emergencyContactRelation: "",
|
|
angehoerige: [],
|
|
isLateraleFuehrung: false,
|
|
isCLevel: false,
|
|
mitarbeiterart: MITARBEITERART_STANDARD,
|
|
hasKuendigungsschutz: false,
|
|
kuendigungsschutzBis: "",
|
|
kuendigungsschutzGrund: "",
|
|
kuendigungsschutzAb: "",
|
|
istBeguenstigtBehindert: false,
|
|
behinderungGrad: "",
|
|
behinderungAb: "",
|
|
behinderungBis: "",
|
|
};
|