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
@@ -3387,6 +3387,9 @@ export default function ContractDetail() {
customerId={c.customer.id}
open={showCustomerInfo}
onClose={() => setShowCustomerInfo(false)}
deliveryAddress={c.address}
billingAddress={c.billingAddress}
contractStressfreiEmailId={c.stressfreiEmailId}
/>
)}
@@ -153,7 +153,10 @@ export default function ContractForm() {
// Fetch contracts for same customer (for predecessor selection)
const { data: customerContractsData } = useQuery({
queryKey: ['customer-contracts-for-predecessor', customerId],
queryFn: () => contractApi.getAll({ customerId: parseInt(customerId), limit: 1000 }),
// includeDeactivated: auch deaktivierte Verträge als möglichen Vorgänger
// anbieten sonst geht die Verknüpfung verloren, wenn man einen
// Folgevertrag aus einem deaktivierten Vertrag anlegt/bearbeitet.
queryFn: () => contractApi.getAll({ customerId: parseInt(customerId), limit: 1000, includeDeactivated: true }),
enabled: !!customerId,
});
@@ -965,9 +968,10 @@ export default function ContractForm() {
const parts = buildContractLabelParts(c);
const dateHint = c.startDate ? ` ${formatDate(c.startDate)}` : '';
const suffix = parts.extras.length > 0 ? ` · ${parts.extras.join(' · ')}` : '';
const deact = c.status === 'DEACTIVATED' ? ' · deaktiviert' : '';
return {
value: c.id,
label: `${c.contractNumber} (${c.type}${dateHint})${suffix}`,
label: `${c.contractNumber} (${c.type}${dateHint})${suffix}${deact}`,
};
})}
placeholder="Keinen Vorgänger auswählen"
@@ -1994,6 +1998,9 @@ export default function ContractForm() {
customerId={customer.id}
open={showCustomerInfo}
onClose={() => setShowCustomerInfo(false)}
deliveryAddress={addresses.find((a) => String(a.id) === watch('addressId')) || null}
billingAddress={addresses.find((a) => String(a.id) === watch('billingAddressId')) || null}
contractStressfreiEmailId={selectedStressfreiEmailId ? parseInt(selectedStressfreiEmailId) : null}
/>
)}
</div>