contractnumber provider added, old provider number field only if no previous contact exist

This commit is contained in:
2026-02-08 14:34:56 +01:00
parent 55f257fffd
commit 4f588015a4
30 changed files with 2046 additions and 744 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -5,8 +5,8 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OpenCRM</title>
<script type="module" crossorigin src="/assets/index-BUCLPhDH.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BTfzRMgT.css">
<script type="module" crossorigin src="/assets/index-OTeAOPxR.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-B06MVODt.css">
</head>
<body>
<div id="root"></div>
@@ -105,6 +105,39 @@ export default function ContractDetailModal({ contractId, isOpen, onClose }: Con
</dd>
</div>
)}
{c.contractNumberAtProvider && (
<div>
<dt className="text-sm text-gray-500">Vertragsnummer beim Anbieter</dt>
<dd className="font-mono flex items-center gap-1">
{c.contractNumberAtProvider}
<CopyButton value={c.contractNumberAtProvider} />
</dd>
</div>
)}
</div>
</Card>
)}
{/* Zähler (nur bei Strom/Gas) */}
{(c.type === 'ELECTRICITY' || c.type === 'GAS') && c.energyDetails?.meter && (
<Card title="Zähler">
<div className="grid grid-cols-2 gap-4">
<div>
<dt className="text-sm text-gray-500">Zählernummer</dt>
<dd className="font-mono flex items-center gap-1">
{c.energyDetails.meter.meterNumber}
<CopyButton value={c.energyDetails.meter.meterNumber} />
</dd>
</div>
{c.energyDetails.maloId && (
<div>
<dt className="text-sm text-gray-500">MaLo-ID</dt>
<dd className="font-mono flex items-center gap-1">
{c.energyDetails.maloId}
<CopyButton value={c.energyDetails.maloId} />
</dd>
</div>
)}
</div>
</Card>
)}
@@ -1569,6 +1569,12 @@ export default function ContractDetail() {
<dd className="font-mono">{c.previousContract.customerNumberAtProvider}</dd>
</div>
)}
{c.previousContract.contractNumberAtProvider && (
<div>
<dt className="text-sm text-gray-500">Vertragsnummer</dt>
<dd className="font-mono">{c.previousContract.contractNumberAtProvider}</dd>
</div>
)}
{c.previousContract.portalUsername && (
<div>
<dt className="text-sm text-gray-500">Zugangsdaten</dt>
@@ -1579,6 +1585,38 @@ export default function ContractDetail() {
</Card>
)}
{/* Altanbieter-Info (nur wenn KEIN Vorgängervertrag aber Altanbieter-Daten vorhanden) */}
{!c.previousContract && (c.previousProvider || c.previousCustomerNumber || c.previousContractNumber) && (
<Card className="mb-6 border-l-4 border-l-gray-400" title="Altanbieter">
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
{c.previousProvider && (
<div>
<dt className="text-sm text-gray-500">Anbieter</dt>
<dd>{c.previousProvider.name}</dd>
</div>
)}
{c.previousCustomerNumber && (
<div>
<dt className="text-sm text-gray-500">Kundennummer</dt>
<dd className="font-mono flex items-center gap-1">
{c.previousCustomerNumber}
<CopyButton value={c.previousCustomerNumber} />
</dd>
</div>
)}
{c.previousContractNumber && (
<div>
<dt className="text-sm text-gray-500">Vertragsnummer</dt>
<dd className="font-mono flex items-center gap-1">
{c.previousContractNumber}
<CopyButton value={c.previousContractNumber} />
</dd>
</div>
)}
</div>
</Card>
)}
{/* Cancellation Confirmation Warning */}
{c.cancellationConfirmationDate && (
<div className="mb-6 p-4 bg-red-50 border-2 border-red-400 rounded-lg flex items-start gap-3">
@@ -1635,6 +1673,15 @@ export default function ContractDetail() {
</dd>
</div>
)}
{c.contractNumberAtProvider && (
<div>
<dt className="text-sm text-gray-500">Vertragsnummer</dt>
<dd className="font-mono flex items-center gap-1">
{c.contractNumberAtProvider}
<CopyButton value={c.contractNumberAtProvider} />
</dd>
</div>
)}
{c.salesPlatform && (
<div>
<dt className="text-sm text-gray-500">Vertriebsplattform</dt>
+35 -6
View File
@@ -77,6 +77,7 @@ export default function ContractForm() {
const contractType = watch('type') as ContractType;
const customerId = watch('customerId');
const previousContractId = watch('previousContractId');
// Fetch existing contract for edit
const { data: contract } = useQuery({
@@ -255,6 +256,7 @@ export default function ContractForm() {
providerName: c.providerName || '',
tariffName: c.tariffName || '',
customerNumberAtProvider: c.customerNumberAtProvider || '',
contractNumberAtProvider: c.contractNumberAtProvider || '',
priceFirst12Months: c.priceFirst12Months || '',
priceFrom13Months: c.priceFrom13Months || '',
priceAfter24Months: c.priceAfter24Months || '',
@@ -273,8 +275,6 @@ export default function ContractForm() {
basePrice: c.energyDetails?.basePrice || '',
unitPrice: c.energyDetails?.unitPrice || '',
bonus: c.energyDetails?.bonus || '',
previousProviderName: c.energyDetails?.previousProviderName || '',
previousCustomerNumber: c.energyDetails?.previousCustomerNumber || '',
// Internet details
downloadSpeed: c.internetDetails?.downloadSpeed || '',
uploadSpeed: c.internetDetails?.uploadSpeed || '',
@@ -317,6 +317,10 @@ export default function ContractForm() {
wasSpecialCancellation: c.wasSpecialCancellation || false,
// Vorgänger-Vertrag
previousContractId: c.previousContractId?.toString() || '',
// Altanbieter (nur wenn kein Vorgängervertrag)
previousProviderId: c.previousProviderId?.toString() || '',
previousCustomerNumber: c.previousCustomerNumber || '',
previousContractNumber: c.previousContractNumber || '',
});
// Load simCards if available
@@ -473,6 +477,7 @@ export default function ContractForm() {
providerName: emptyToNull(data.providerName),
tariffName: emptyToNull(data.tariffName),
customerNumberAtProvider: emptyToNull(data.customerNumberAtProvider),
contractNumberAtProvider: emptyToNull(data.contractNumberAtProvider),
priceFirst12Months: emptyToNull(data.priceFirst12Months),
priceFrom13Months: emptyToNull(data.priceFrom13Months),
priceAfter24Months: emptyToNull(data.priceAfter24Months),
@@ -490,6 +495,10 @@ export default function ContractForm() {
cancellationConfirmationOptionsDate: data.cancellationConfirmationOptionsDate ? new Date(data.cancellationConfirmationOptionsDate) : null,
wasSpecialCancellation: data.wasSpecialCancellation || false,
previousContractId: safeParseInt(data.previousContractId) ?? null,
// Altanbieter (nur wenn kein Vorgängervertrag)
previousProviderId: data.previousContractId ? null : (safeParseInt(data.previousProviderId) ?? null),
previousCustomerNumber: data.previousContractId ? null : emptyToNull(data.previousCustomerNumber),
previousContractNumber: data.previousContractId ? null : emptyToNull(data.previousContractNumber),
};
// Add type-specific details
@@ -502,8 +511,6 @@ export default function ContractForm() {
basePrice: data.basePrice ? parseFloat(data.basePrice) : null,
unitPrice: data.unitPrice ? parseFloat(data.unitPrice) : null,
bonus: data.bonus ? parseFloat(data.bonus) : null,
previousProviderName: emptyToNull(data.previousProviderName),
previousCustomerNumber: emptyToNull(data.previousCustomerNumber),
};
}
@@ -710,6 +717,29 @@ export default function ContractForm() {
placeholder="Keinen Vorgänger auswählen"
/>
)}
{/* Altanbieter-Daten (nur wenn KEIN Vorgängervertrag ausgewählt) */}
{customerId && !previousContractId && (
<div className="mt-4 p-4 bg-gray-50 rounded-lg border border-gray-200">
<h4 className="text-sm font-medium text-gray-700 mb-3">Altanbieter-Daten</h4>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<Select
label="Altanbieter"
{...register('previousProviderId')}
options={providers.map((p) => ({ value: p.id, label: p.name }))}
placeholder="Bitte wählen..."
/>
<Input
label="Kundennr. beim Altanbieter"
{...register('previousCustomerNumber')}
/>
<Input
label="Vertragsnr. beim Altanbieter"
{...register('previousContractNumber')}
/>
</div>
</div>
)}
</div>
</Card>
@@ -775,6 +805,7 @@ export default function ContractForm() {
disabled={!selectedProviderId}
/>
<Input label="Kundennummer beim Anbieter" {...register('customerNumberAtProvider')} />
<Input label="Vertragsnummer beim Anbieter" {...register('contractNumberAtProvider')} />
<Input label="Provision (€)" type="number" step="0.01" {...register('commission')} />
<Input label="Preis erste 12 Monate" {...register('priceFirst12Months')} placeholder="z.B. 29,99 €/Monat" />
<Input label="Preis ab 13. Monat" {...register('priceFrom13Months')} placeholder="z.B. 39,99 €/Monat" />
@@ -943,8 +974,6 @@ export default function ContractForm() {
{...register('unitPrice')}
/>
<Input label="Bonus (€)" type="number" step="0.01" {...register('bonus')} />
<Input label="Vorversorger" {...register('previousProviderName')} />
<Input label="Kundennr. beim Vorversorger" {...register('previousCustomerNumber')} />
</div>
{/* Hinweis für Zählerstände und Rechnungen */}
+6
View File
@@ -297,6 +297,11 @@ export interface Contract {
salesPlatform?: SalesPlatform;
previousContractId?: number;
previousContract?: Contract;
// Altanbieter (nur wenn kein Vorgängervertrag)
previousProviderId?: number;
previousProvider?: Provider;
previousCustomerNumber?: string;
previousContractNumber?: string;
providerId?: number;
provider?: Provider;
tariffId?: number;
@@ -308,6 +313,7 @@ export interface Contract {
providerName?: string;
tariffName?: string;
customerNumberAtProvider?: string;
contractNumberAtProvider?: string;
priceFirst12Months?: string;
priceFrom13Months?: string;
priceAfter24Months?: string;