Lieferbestätigung: eingegebenes Datum überschreibt Vertragsbeginn

Beim Upload einer Lieferbestätigung mit Datum wurde startDate nur
gesetzt, wenn es noch leer war (if (!contract.startDate)). Hatte der
Vertrag schon ein geschätztes Beginndatum, blieb es trotz
eingetragenem Lieferdatum stehen.

Fix in maybeActivateOnDeliveryConfirmation: ein explizit eingegebenes
Lieferdatum übernimmt jetzt IMMER den Vertragsbeginn (die Liefer-
bestätigung ist das maßgebliche tatsächliche Startdatum), auch
überschreibend. Der Fallback "heute" (kein Datum angegeben) füllt
weiterhin nur ein leeres Feld, damit ein echtes Datum nicht
versehentlich mit heute überschrieben wird. No-op-Guard + Audit-Log
unverändert.

Frontend schickte das Datum bereits mit und lädt den Vertrag nach
dem Upload neu – kein Frontend-Change nötig.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-07-27 12:49:55 +02:00
co-authored by Claude Opus 4.7
parent bc5d639703
commit 8508bdc38e
2 changed files with 37 additions and 6 deletions
@@ -144,7 +144,14 @@ export async function withContractDocumentLock<T>(
* Wird nach einem ContractDocument-Upload aufgerufen. Wenn der Typ eine * Wird nach einem ContractDocument-Upload aufgerufen. Wenn der Typ eine
* Lieferbestätigung ist: * Lieferbestätigung ist:
* - Contract.status von DRAFT auf ACTIVE setzen (falls DRAFT) * - Contract.status von DRAFT auf ACTIVE setzen (falls DRAFT)
* - Contract.startDate auf deliveryDate (oder heute) setzen, falls noch leer * - Contract.startDate auf das Lieferdatum setzen:
* * Explizit eingegebenes deliveryDate → IMMER als Vertragsbeginn
* übernehmen, auch wenn schon ein Datum gesetzt war. Die
* Lieferbestätigung ist das maßgebliche tatsächliche Startdatum
* und korrigiert ein evtl. vorher geschätztes Beginndatum.
* * Kein deliveryDate angegeben → Fallback "heute", aber NUR wenn
* startDate noch leer ist. Ein bestehendes (echtes) Datum darf
* nicht versehentlich mit "heute" überschrieben werden.
* *
* Schreibweise "Lieferbestätigung" stammt aus dem Frontend-Dropdown * Schreibweise "Lieferbestätigung" stammt aus dem Frontend-Dropdown
* (SaveAttachmentModal / ContractDetail). Vergleich case-insensitive + * (SaveAttachmentModal / ContractDetail). Vergleich case-insensitive +
@@ -165,13 +172,12 @@ export async function maybeActivateOnDeliveryConfirmation(
}); });
if (!contract) return; if (!contract) return;
// deliveryDate parsen, Fallback auf heute // Explizit eingegebenes Lieferdatum parsen (null = keins angegeben).
let parsedDate: Date | null = null; let parsedDate: Date | null = null;
if (deliveryDate) { if (deliveryDate) {
const parsed = new Date(deliveryDate); const parsed = new Date(deliveryDate);
if (!isNaN(parsed.getTime())) parsedDate = parsed; if (!isNaN(parsed.getTime())) parsedDate = parsed;
} }
const effectiveDate = parsedDate || new Date();
const updateData: Record<string, unknown> = {}; const updateData: Record<string, unknown> = {};
const changes: Record<string, { vorher: unknown; nachher: unknown }> = {}; const changes: Record<string, { vorher: unknown; nachher: unknown }> = {};
@@ -181,9 +187,21 @@ export async function maybeActivateOnDeliveryConfirmation(
changes.status = { vorher: 'DRAFT', nachher: 'ACTIVE' }; changes.status = { vorher: 'DRAFT', nachher: 'ACTIVE' };
} }
if (!contract.startDate) { const asDay = (d: Date | null | undefined) =>
updateData.startDate = effectiveDate; d ? new Date(d).toISOString().split('T')[0] : null;
changes.startDate = { vorher: null, nachher: effectiveDate.toISOString().split('T')[0] };
if (parsedDate) {
// Explizites Lieferdatum: als Vertragsbeginn übernehmen, auch überschreibend.
// No-op vermeiden, wenn der Tag schon exakt passt.
if (asDay(contract.startDate) !== asDay(parsedDate)) {
updateData.startDate = parsedDate;
changes.startDate = { vorher: asDay(contract.startDate), nachher: asDay(parsedDate) };
}
} else if (!contract.startDate) {
// Kein Datum angegeben → Fallback heute, nur bei leerem Startdatum.
const today = new Date();
updateData.startDate = today;
changes.startDate = { vorher: null, nachher: asDay(today) };
} }
if (Object.keys(updateData).length === 0) return; if (Object.keys(updateData).length === 0) return;
+13
View File
@@ -97,6 +97,19 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt ## ✅ Erledigt
- [x] **🐞 Lieferbestätigung: eingegebenes Datum ändert Vertragsbeginn nicht**
- Beim Upload einer Lieferbestätigung mit Datum wurde `startDate` nur
gesetzt, wenn es noch LEER war (`if (!contract.startDate)`). Hatte
der Vertrag schon ein (geschätztes) Beginndatum, blieb es trotz
eingetragenem Lieferdatum stehen.
- Fix in `maybeActivateOnDeliveryConfirmation`: ein explizit
eingegebenes Lieferdatum überschreibt den Vertragsbeginn jetzt IMMER
(die Lieferbestätigung ist das maßgebliche tatsächliche Startdatum).
Der Fallback „heute" (kein Datum eingegeben) füllt weiterhin nur ein
leeres Feld, um ein echtes Datum nicht versehentlich zu überschreiben.
No-op + Audit-Log unverändert. Frontend schickte das Datum bereits
mit und lädt den Vertrag nach Upload neu kein FE-Change nötig.
- [x] **🎂 Anstehende Geburtstage auch im Dashboard** - [x] **🎂 Anstehende Geburtstage auch im Dashboard**
- Die Geburtstags-Sektion gab es bisher nur im Vertrags-Cockpit. - Die Geburtstags-Sektion gab es bisher nur im Vertrags-Cockpit.
Jetzt 1:1 auch auf dem Dashboard (nur Mitarbeiter/Admin, Jetzt 1:1 auch auf dem Dashboard (nur Mitarbeiter/Admin,