diff --git a/backend/src/services/contract.service.ts b/backend/src/services/contract.service.ts index 9afbff3f..21c07ec9 100644 --- a/backend/src/services/contract.service.ts +++ b/backend/src/services/contract.service.ts @@ -102,6 +102,22 @@ export async function getAllContracts(filters: ContractFilters) { simCards: { select: { phoneNumber: true, isMain: true } }, }, }, + // 2026-07-04: für Vertragsauswahl-Labels brauchen wir überall + // die Zählernummer (Strom/Gas) und die erste Festnetznummer + // (Internet). Beides light-select, damit das Payload klein bleibt. + energyDetails: { + select: { + meter: { select: { id: true, meterNumber: true } }, + }, + }, + internetDetails: { + select: { + phoneNumbers: { + select: { phoneNumber: true, isMain: true }, + orderBy: { id: 'asc' }, + }, + }, + }, carInsuranceDetails: { select: { licensePlate: true } }, }, }), diff --git a/frontend/src/components/email/AssignToContractModal.tsx b/frontend/src/components/email/AssignToContractModal.tsx index d56f7fb0..2344bcec 100644 --- a/frontend/src/components/email/AssignToContractModal.tsx +++ b/frontend/src/components/email/AssignToContractModal.tsx @@ -4,6 +4,7 @@ import Modal from '../ui/Modal'; import Button from '../ui/Button'; import { contractApi, cachedEmailApi, CachedEmail } from '../../services/api'; import { formatDate } from '../../utils/dateFormat'; +import { buildContractLabelParts } from '../../utils/contractLabel'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; interface AssignToContractModalProps { @@ -147,6 +148,14 @@ export default function AssignToContractModal({ {contract.contractCategory?.name} {contract.provider && ` - ${contract.provider.name}`} + {(() => { + const parts = buildContractLabelParts(contract); + return parts.extras.length > 0 ? ( +
+ {parts.extras.join(' · ')} +
+ ) : null; + })()}
Start: {formatDateOrDash(contract.startDate)}
diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index 4f937733..8f89df43 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -3,6 +3,7 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'; import { Link, useNavigate } from 'react-router-dom'; import { useAuth } from '../context/AuthContext'; import { customerApi, contractApi, contractTaskApi, appSettingsApi } from '../services/api'; +import { buildContractLabelParts } from '../utils/contractLabel'; import Card from '../components/ui/Card'; import Button from '../components/ui/Button'; import Input from '../components/ui/Input'; @@ -572,6 +573,14 @@ function CreateSupportTicketModal({ {contract.providerName || 'Kein Anbieter'} {contract.tariffName && ` - ${contract.tariffName}`} + {(() => { + const parts = buildContractLabelParts(contract); + return parts.extras.length > 0 ? ( +
+ {parts.extras.join(' · ')} +
+ ) : null; + })()} )) ) : ( diff --git a/frontend/src/pages/contracts/ContractForm.tsx b/frontend/src/pages/contracts/ContractForm.tsx index 7da15343..8df2bf6a 100644 --- a/frontend/src/pages/contracts/ContractForm.tsx +++ b/frontend/src/pages/contracts/ContractForm.tsx @@ -11,6 +11,7 @@ import Input from '../../components/ui/Input'; import Select from '../../components/ui/Select'; import CopyButton from '../../components/ui/CopyButton'; import CustomerInfoModal from '../../components/contracts/CustomerInfoModal'; +import { buildContractLabelParts } from '../../utils/contractLabel'; import type { ContractType } from '../../types'; import { formatDate } from '../../utils/dateFormat'; import { useProviderSettings } from '../../hooks/useProviderSettings'; @@ -878,10 +879,15 @@ export default function ContractForm() { -Options: + * `GAS-XYZ · Anbieter · Tarif · Kdnr. 123 · Zähler 1EMH…` + * Trenner: ` · ` (schmale Bullets ohne Sonderzeichen im URL/DOM). + */ +export function formatContractLabel(contract: Contract): string { + const parts = buildContractLabelParts(contract); + const chunks: string[] = [parts.contractNumber]; + if (parts.providerName) chunks.push(parts.providerName); + if (parts.tariffName) chunks.push(parts.tariffName); + chunks.push(...parts.extras); + return chunks.join(' · '); +}