Fix Folgevertrag aus deaktiviertem Vertrag + Kundendaten-Modal erweitern

1) Folgevertrag-Bug: Backend legt den Folgevertrag korrekt mit
   previousContractId an. Der Verlust passierte im Frontend - das
   Vorgaenger-Dropdown holt Vertraege ueber getAll, das DEACTIVATED
   standardmaessig ausblendet. Beim Bearbeiten des Folgevertrags war der
   deaktivierte Vorgaenger nicht als Option da -> Verknuepfung ging beim
   Speichern verloren.
   Fix: getAllContracts + Controller + contractApi.getAll um
   includeDeactivated erweitert; Vorgaenger-Dropdown nutzt es und markiert
   deaktivierte Vertraege mit '· deaktiviert'. Verifiziert (Flag inkludiert
   deaktivierte; Folgevertrag setzt previousContractId).

2) Kundendaten-Modal: zeigt jetzt zusaetzlich Lieferadresse + (falls
   abweichend) Rechnungsadresse des geoeffneten Vertrags, die Stressfrei-
   Adresse des Vertrags einzeln und darunter alle weiteren Stressfrei-
   Adressen des Kunden. CustomerInfoModal nimmt optionale Vertragskontext-
   Props; ContractDetail + ContractForm uebergeben sie.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-08 22:49:41 +02:00
co-authored by Claude Opus 4.8
parent a6b1dac606
commit 5f06ed9830
7 changed files with 113 additions and 13 deletions
@@ -119,6 +119,7 @@ export async function getContracts(req: AuthRequest, res: Response): Promise<voi
search: search as string,
page: page ? parseInt(page as string) : undefined,
limit: limit ? parseInt(limit as string) : undefined,
includeDeactivated: includeDeactivated === 'true',
});
// Portal-User bekommen die Strict-Variante (ohne commission/notes/
// nextReviewDate/portalPasswordEncrypted), Mitarbeiter die normale.
+7 -4
View File
@@ -12,10 +12,11 @@ export interface ContractFilters {
search?: string;
page?: number;
limit?: number;
includeDeactivated?: boolean; // wenn true: auch DEACTIVATED-Verträge listen
}
export async function getAllContracts(filters: ContractFilters) {
const { customerId, customerIds, type, status, search, page = 1, limit = 20 } = filters;
const { customerId, customerIds, type, status, search, page = 1, limit = 20, includeDeactivated = false } = filters;
const { skip, take } = paginate(page, limit);
const where: Record<string, unknown> = {};
@@ -28,11 +29,13 @@ export async function getAllContracts(filters: ContractFilters) {
}
if (type) where.type = type;
// Status-Filter: Deaktivierte Verträge standardmäßig ausblenden
// Status-Filter: Deaktivierte Verträge standardmäßig ausblenden außer
// ein expliziter Status ist gesetzt oder includeDeactivated=true (z.B. für
// das Vorgängervertrag-Dropdown, das auch deaktivierte Verträge als
// Vorgänger zulassen muss).
if (status) {
where.status = status;
} else {
// Wenn kein Status-Filter gesetzt, alle außer DEACTIVATED anzeigen
} else if (!includeDeactivated) {
where.status = { not: ContractStatus.DEACTIVATED };
}