SIM-Karten: Checkbox "eSIM" zwischen Hauptkarte und Multisim
Hardware-Plastikkarte vs. eSIM-Profil ist eigene Eigenschaft – eSIM kann sowohl Hauptkarte als auch Multisim sein, deshalb dritter Toggle statt entweder/oder. - Schema: SimCard.isEsim Boolean default false, Migration mit IF NOT EXISTS. - Backend: vier SimCard-Schreibpfade in contract.service.ts (Create, Update, Follow-Up, Renewal). - UI: dritte Checkbox in ContractForm zwischen Hauptkarte und Multisim. ContractDetail zeigt blauen eSIM-Badge.
This commit is contained in:
@@ -138,6 +138,7 @@ function SimCardDisplay({ simCard }: { simCard: SimCard }) {
|
||||
<div className="p-3 bg-gray-50 rounded-lg border">
|
||||
<div className="flex items-center gap-2 mb-2 flex-wrap">
|
||||
{simCard.isMain && <Badge variant="success">Hauptkarte</Badge>}
|
||||
{simCard.isEsim && <Badge variant="info">eSIM</Badge>}
|
||||
{simCard.isMultisim && <Badge variant="warning">Multisim</Badge>}
|
||||
{simCard.cardUser && (
|
||||
<span className="text-sm text-gray-700">
|
||||
|
||||
@@ -192,6 +192,7 @@ export default function ContractForm() {
|
||||
hasExistingPuk?: boolean; // Zeigt an ob PUK bereits in DB vorhanden
|
||||
isMultisim: boolean;
|
||||
isMain: boolean;
|
||||
isEsim: boolean;
|
||||
cardUser: string;
|
||||
}
|
||||
const [simCards, setSimCards] = useState<SimCardInput[]>([]);
|
||||
@@ -384,6 +385,7 @@ export default function ContractForm() {
|
||||
hasExistingPuk: !!sc.puk, // true wenn verschlüsselter Wert vorhanden
|
||||
isMultisim: sc.isMultisim,
|
||||
isMain: sc.isMain,
|
||||
isEsim: sc.isEsim ?? false,
|
||||
cardUser: sc.cardUser || '',
|
||||
})));
|
||||
} else {
|
||||
@@ -650,6 +652,7 @@ export default function ContractForm() {
|
||||
puk: sc.puk || undefined, // Passwort: undefined = nicht ändern
|
||||
isMultisim: sc.isMultisim,
|
||||
isMain: sc.isMain,
|
||||
isEsim: sc.isEsim,
|
||||
cardUser: emptyToNull(sc.cardUser),
|
||||
})) : undefined,
|
||||
};
|
||||
@@ -1517,6 +1520,19 @@ export default function ContractForm() {
|
||||
/>
|
||||
Hauptkarte
|
||||
</label>
|
||||
<label className="flex items-center gap-1 text-sm">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={card.isEsim}
|
||||
onChange={(e) => {
|
||||
const updated = [...simCards];
|
||||
updated[index].isEsim = e.target.checked;
|
||||
setSimCards(updated);
|
||||
}}
|
||||
className="rounded border-gray-300"
|
||||
/>
|
||||
eSIM
|
||||
</label>
|
||||
<label className="flex items-center gap-1 text-sm">
|
||||
<input
|
||||
type="checkbox"
|
||||
@@ -1642,6 +1658,7 @@ export default function ContractForm() {
|
||||
puk: '',
|
||||
isMultisim: false,
|
||||
isMain: simCards.length === 0, // Erste Karte ist Hauptkarte
|
||||
isEsim: false,
|
||||
cardUser: '',
|
||||
}]);
|
||||
}}
|
||||
|
||||
@@ -561,6 +561,7 @@ export interface SimCard {
|
||||
puk?: string; // verschlüsselt
|
||||
isMultisim: boolean;
|
||||
isMain: boolean;
|
||||
isEsim: boolean;
|
||||
// Tatsächlicher Nutzer der Karte (z.B. Mitarbeiter bei Firmenvertrag,
|
||||
// Kind bei Eltern-Vertrag) – optional, kann vom Vertragsinhaber abweichen.
|
||||
cardUser?: string;
|
||||
|
||||
Reference in New Issue
Block a user