Vertragslisten: Karteninhaber + Mobilfunknetz + Kuendigung (rot)

Beide Vertragslisten (Kundenakte-Baum + Hauptmenue /contracts) zeigen bei
Mobilfunkvertraegen mit Rufnummer jetzt zusaetzlich Karteninhaber
(SimCard.cardUser der angezeigten SIM, nur wenn gesetzt) und Netz
(mobileNetwork -> Telekom/Vodafone/Telefonica (o2)) inline. Vertraege mit
Kuendigungsbestaetigung (cancellationConfirmationDate) bekommen eine eigene
Zeile in roter, fetter Schrift.

Backend: getContractTreeForCustomer + getAllContracts selektieren nun
mobileNetwork + cardUser (Tree zusaetzlich cancellationConfirmationDate).
Shared-Helper getContractTypeInfo um cardUser/network + mobileNetworkLabel
erweitert. Beide Listen rendern ueber den Tree-Endpoint.

Verifiziert: tsc + vite build gruen, Tree-Service liefert die Felder,
Helper-Mapping getestet (Vodafone/Telekom/o2, leerer Karteninhaber ausgelassen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 12:18:24 +02:00
co-authored by Claude Opus 4.8
parent 8e46dbbfed
commit c5cf2c7416
6 changed files with 72 additions and 7 deletions
@@ -318,6 +318,12 @@ export default function ContractList() {
return typeInfo ? (
<p className={`text-sm text-gray-600 ${isPredecessor ? 'ml-6' : ''}`}>
<span className="font-medium text-gray-700">{typeInfo.label}:</span> {typeInfo.value}
{typeInfo.cardUser && (
<> · <span className="font-medium text-gray-700">Karteninhaber:</span> {typeInfo.cardUser}</>
)}
{typeInfo.network && (
<> · <span className="font-medium text-gray-700">Netz:</span> {typeInfo.network}</>
)}
</p>
) : null;
})()}
@@ -328,6 +334,11 @@ export default function ContractList() {
` | Ende: ${formatDate(contract.endDate)}`}
</p>
)}
{contract.cancellationConfirmationDate && (
<p className={`text-sm font-semibold text-red-600 ${isPredecessor ? 'ml-6' : ''}`}>
Kündigungsbestätigung zum {formatDate(contract.cancellationConfirmationDate)}
</p>
)}
</div>
{/* Vorgänger rekursiv rendern - für Wurzel nur wenn aufgeklappt, für Vorgänger immer */}
@@ -1882,6 +1882,12 @@ function ContractsTab({
return typeInfo ? (
<p className={`text-sm text-gray-600 ${isPredecessor ? 'ml-6' : ''}`}>
<span className="font-medium text-gray-700">{typeInfo.label}:</span> {typeInfo.value}
{typeInfo.cardUser && (
<> · <span className="font-medium text-gray-700">Karteninhaber:</span> {typeInfo.cardUser}</>
)}
{typeInfo.network && (
<> · <span className="font-medium text-gray-700">Netz:</span> {typeInfo.network}</>
)}
</p>
) : null;
})()}
@@ -1892,6 +1898,11 @@ function ContractsTab({
` | Ende: ${formatDate(contract.endDate)}`}
</p>
)}
{contract.cancellationConfirmationDate && (
<p className={`text-sm font-semibold text-red-600 ${isPredecessor ? 'ml-6' : ''}`}>
Kündigungsbestätigung zum {formatDate(contract.cancellationConfirmationDate)}
</p>
)}
</div>
{/* Vorgänger rekursiv rendern - für Wurzel nur wenn aufgeklappt, für Vorgänger immer */}