diff --git a/backend/prisma/migrations/20260601100000_sim_card_user/migration.sql b/backend/prisma/migrations/20260601100000_sim_card_user/migration.sql new file mode 100644 index 00000000..513bcb8a --- /dev/null +++ b/backend/prisma/migrations/20260601100000_sim_card_user/migration.sql @@ -0,0 +1,9 @@ +-- SIM-Karte bekommt einen optionalen "Kartennutzer" – relevant bei Firmen- +-- und Familienverträgen, wo der Vertragsinhaber (Firma/Eltern) nicht +-- gleich dem tatsächlichen Nutzer (Mitarbeiter/Kind) ist. +-- +-- IF NOT EXISTS macht den Re-Deploy auf Prod sicher, falls jemand schon +-- `prisma db push` gefahren hat. + +ALTER TABLE `SimCard` + ADD COLUMN IF NOT EXISTS `cardUser` VARCHAR(191) NULL; diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 8fcc8ab6..79115da0 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -928,6 +928,9 @@ model SimCard { puk String? // PUK (verschlüsselt gespeichert) isMultisim Boolean @default(false) // Ist dies eine Multisim-Karte? isMain Boolean @default(false) // Ist dies die Hauptkarte? + // Tatsächlicher Nutzer der SIM-Karte (z.B. Mitarbeiter bei Firmenverträgen, + // Kind bei Eltern-Vertrag) – kann vom Vertragsinhaber abweichen. + cardUser String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } diff --git a/backend/src/services/contract.service.ts b/backend/src/services/contract.service.ts index f25dcbf0..13e6bd71 100644 --- a/backend/src/services/contract.service.ts +++ b/backend/src/services/contract.service.ts @@ -275,6 +275,7 @@ interface ContractCreateData { puk?: string; isMultisim?: boolean; isMain?: boolean; + cardUser?: string; }[]; }; tvDetails?: { @@ -378,6 +379,7 @@ export async function createContract(data: ContractCreateData) { puk: sc.puk ? encrypt(sc.puk) : undefined, isMultisim: sc.isMultisim ?? false, isMain: sc.isMain ?? false, + cardUser: sc.cardUser, })), } : undefined, @@ -614,6 +616,7 @@ export async function updateContract( puk: sc.puk ? encrypt(sc.puk) : (existingSc?.puk ?? undefined), isMultisim: sc.isMultisim ?? false, isMain: sc.isMain ?? false, + cardUser: sc.cardUser, }; }), }); @@ -632,6 +635,7 @@ export async function updateContract( puk: sc.puk ? encrypt(sc.puk) : undefined, isMultisim: sc.isMultisim ?? false, isMain: sc.isMain ?? false, + cardUser: sc.cardUser, })), } : undefined, diff --git a/frontend/src/pages/contracts/ContractDetail.tsx b/frontend/src/pages/contracts/ContractDetail.tsx index 1ecd5258..3e3d9ba3 100644 --- a/frontend/src/pages/contracts/ContractDetail.tsx +++ b/frontend/src/pages/contracts/ContractDetail.tsx @@ -134,9 +134,15 @@ function SimCardDisplay({ simCard }: { simCard: SimCard }) { return (