Hinweis 03-1: Validierung

Stufe 1 zuerst lesen, dann selbst probieren. Die nächste Stufe erst, wenn du nach zwei Versuchen feststeckst.

Stufe 1: Denkfrage

validateLead bekommt ein Objekt, bei dem jedes Feld fehlen kann (Partial<Lead>). Was ist der Unterschied zwischen "Feld fehlt", "Feld ist leer" und "Feld besteht nur aus Leerzeichen"? Welche davon sollen alle gleich behandelt werden?

Stufe 2: Teilbeispiel

Eine kleine Hilfsfunktion pro Regel macht den Code lesbar:

function isBlank(value: string | undefined): boolean {
  return (value ?? "").trim().length === 0;
}

Dann sammelst du Fehler in einem Objekt und entscheidest am Ende:

const errors: Record<string, string> = {};
if (isBlank(input.company)) errors["company"] = "Firma ist ein Pflichtfeld";
// weitere Regeln
return Object.keys(errors).length === 0 ? VALID : { ok: false, errors };

Stufe 3: Konkrete Erklärung

Die fünf Regeln: Firma und Kontaktname nicht leer; E-Mail hat ein "@" an einer Stelle grösser als 0 und danach noch einen "."; Status ist einer aus LEAD_STATUSES (dafür gibt es isLeadStatus); nextFollowUp ist null, undefined oder passt zu /^\d{4}-\d{2}-\d{2}$/. Für die E-Mail reicht const at = email.indexOf("@"); at > 0 && email.indexOf(".", at) > at + 1. Die Meldungen sind für Menschen: "E-Mail ist ungültig", nicht "regex failed". Wenn das stimmt, wird Kriterium C02-M3-05 von allein grün, weil loadSeedLeads deine Funktion nutzt.

Zurück zu Mission 3: Daten und Regeln beherrschen