diff --git a/README.md b/README.md index 1c3ef9c3..8ed8c444 100644 --- a/README.md +++ b/README.md @@ -292,76 +292,216 @@ fetch('/api/developer/setup', { method: 'POST' }).then(r => r.json()).then(conso # Danach ausloggen und neu einloggen ``` -## Geplante Features +## Vertragstypen -### E-Mail-Client Integration +### Standard-Vertragstypen -Ein integrierter E-Mail-Client pro Kunde mit den folgenden Funktionen: +Folgende Vertragstypen werden bei Installation/Factory-Reset automatisch angelegt: -#### Konzept +| Code | Name | Icon | Farbe | +|------|------|------|-------| +| ELECTRICITY | Strom | Zap | #FFC107 | +| GAS | Gas | Flame | #FF5722 | +| DSL | DSL | Wifi | #2196F3 | +| FIBER | Glasfaser | Cable | #9C27B0 | +| CABLE | Kabel Internet (Coax) | Cable | #00BCD4 | +| MOBILE | Mobilfunk | Smartphone | #4CAF50 | +| TV | TV | Tv | #E91E63 | +| CAR_INSURANCE | KFZ-Versicherung | Car | #607D8B | -- **E-Mail-Tab in Kundenansicht**: Zeigt alle E-Mails des Kunden via IMAP an -- **Mehrere E-Mail-Konten**: Dropdown zur Auswahl zwischen verschiedenen `@stressfrei-wechseln.de` Adressen des Kunden -- **E-Mails schreiben**: Neue E-Mails verfassen und Antworten auf bestehende E-Mails -- **Versand vom ausgewählten Konto**: SMTP-Versand über die gewählte Stressfrei-Wechseln Adresse -- **Zuordnung zu Verträgen**: Manuelles Zuordnen von E-Mails zu Verträgen -- **E-Mail-Tab in Vertragsansicht**: Zeigt nur dem Vertrag zugeordnete E-Mails (Postfach-Ansicht), mit Antworten/Schreiben-Funktion +> **Hinweis:** Vertragstypen können nur von Benutzern mit **Entwicklerzugriff** geändert werden, da Änderungen auch Anpassungen an den Formularen erfordern. -#### Technische Umsetzung +### Vertragstyp-spezifische Felder -1. **IMAP/SMTP-Zugangsdaten speichern** - - Beim Erstellen einer StressfreiEmail werden die Zugangsdaten vom Email-Provider (Plesk) zurückgegeben - - Diese werden verschlüsselt in der Datenbank gespeichert (wie bereits bei Portal-Zugangsdaten) - - StressfreiEmail-Tabelle erweitern um: `imapServer`, `imapPort`, `smtpServer`, `smtpPort`, `emailPassword` (verschlüsselt) +Je nach Vertragstyp werden unterschiedliche Felder im Formular angezeigt: -2. **Backend: IMAP-Service** - - IMAP-Client zum Abrufen von E-Mails (z.B. `imap-simple` oder `imapflow`) - - Endpunkte: - - `GET /api/customers/:id/emails` - E-Mails für Kunde abrufen - - `GET /api/emails/:id` - Einzelne E-Mail mit Body - - `POST /api/emails/send` - E-Mail senden (SMTP) - - `PUT /api/emails/:id/assign` - E-Mail einem Vertrag zuordnen +#### Strom & Gas (ELECTRICITY, GAS) -3. **Frontend: E-Mail-Tab (Kundenansicht)** - - Neuer Tab in CustomerDetail: "E-Mails" - - Dropdown oben: Auswahl der StressfreiEmail-Adresse - - Liste der E-Mails (Betreff, Absender, Datum) - - Detail-Ansicht beim Klick - - "Neue E-Mail" und "Antworten" Buttons - - "Vertrag zuordnen" Dropdown in E-Mail-Detail +- Zähler-Auswahl +- Jahresverbrauch (kWh/m³) +- Grundpreis, Arbeitspreis +- Bonus +- Vorversorger, Kundennummer beim Vorversorger -4. **Frontend: E-Mail-Tab (Vertragsansicht)** - - Neuer Tab in ContractDetail: "E-Mails" - - Zeigt nur E-Mails die diesem Vertrag zugeordnet sind - - Gleiche Funktionalität wie in Kundenansicht: - - Liste der zugeordneten E-Mails - - Detail-Ansicht beim Klick - - "Neue E-Mail" und "Antworten" Buttons - - Versand erfolgt über die StressfreiEmail-Adresse des Kunden +#### Internet (DSL, CABLE, FIBER) -5. **Datenbank** - ```prisma - model CustomerEmail { - id Int @id @default(autoincrement()) - customerId Int - customer Customer @relation(...) - stressfreiEmailId Int - stressfreiEmail StressfreiEmail @relation(...) - contractId Int? // Optionale Zuordnung zu Vertrag - contract Contract? @relation(...) - messageId String @unique // IMAP Message-ID - subject String - fromAddress String - toAddress String - date DateTime - isRead Boolean @default(false) - folder String // INBOX, Sent, etc. - createdAt DateTime @default(now()) - } - ``` +- Download/Upload (Mbit/s) +- Router Modell, Seriennummer +- Installationsdatum +- Benutzername, Passwort +- Rufnummern mit SIP-Zugangsdaten -#### Status -- [ ] Noch nicht implementiert - Plan für zukünftige Version +| Vertragstyp | Zusatzfeld | +|-------------|------------| +| **Glasfaser (FIBER)** | Home-ID | + +#### Mobilfunk (MOBILE) + +- Datenvolumen (GB) +- Inklusiv-Minuten, Inklusiv-SMS +- Gerät-Modell, IMEI +- Multisim-Checkbox +- SIM-Karten (dynamisch erweiterbar): + - Rufnummer, SIM-Kartennummer (ICCID) + - PIN, PUK (verschlüsselt) + - Multisim-Flag, Hauptkarte-Flag + +> **Hinweis Multisim:** Nicht buchbar bei Klarmobil, Congstar, Otelo. Benötigt Freenet oder vergleichbar. + +#### TV + +- Receiver Modell +- Smartcard-Nummer +- Paket/Angebot + +#### KFZ-Versicherung (CAR_INSURANCE) + +- Kennzeichen, HSN, TSN, FIN/VIN +- Fahrzeugtyp, Erstzulassung +- SF-Klasse (Schadenfreiheitsklasse) +- Versicherungsart (Haftpflicht/Teilkasko/Vollkasko) +- Selbstbeteiligungen (Teilkasko, Vollkasko) +- Versicherungsscheinnummer +- Vorversicherer + +### Standard-Anbieter + +Folgende Anbieter werden bei Installation/Factory-Reset automatisch angelegt: + +| Anbieter | Portal-URL | +|----------|------------| +| Vodafone | https://www.vodafone.de/meinvodafone/account/login | +| Klarmobil | https://www.klarmobil.de/login | +| Otelo | https://www.otelo.de/mein-otelo/login | +| Congstar | https://www.congstar.de/login/ | +| Telekom | https://www.telekom.de/kundencenter/startseite | +| O2 | https://www.o2online.de/ecare/selfcare | +| 1&1 | https://control-center.1und1.de/ | + +### Anbieter-spezifische Felder + +Einige Felder werden nur bei bestimmten Anbietern angezeigt: + +| Anbieter | Vertragstyp | Zusatzfeld | +|----------|-------------|------------| +| **Vodafone** | DSL, Kabel Internet | Aktivierungscode | + +> **Hinweis Multisim:** Bei Klarmobil, Congstar und Otelo ist Multisim **nicht** buchbar. Dafür wird Freenet oder ein vergleichbarer Anbieter benötigt. + +## E-Mail-Client + +Ein vollständig integrierter E-Mail-Client pro Kunde mit IMAP-Empfang und SMTP-Versand. + +### Funktionen + +#### E-Mails lesen & verwalten +- **E-Mail-Tab in Kundenansicht** mit Ordnern: Posteingang, Gesendet, Papierkorb +- **Mehrere E-Mail-Konten** pro Kunde (Dropdown zur Auswahl) +- **E-Mail-Detailansicht** mit HTML/Text-Body, Absender, Empfänger, CC, Datum +- **Gelesen/Ungelesen** markieren +- **Favoriten** (Stern) für wichtige E-Mails +- **Papierkorb** mit Wiederherstellen und endgültigem Löschen + +#### E-Mails schreiben +- **Neue E-Mail verfassen** mit An, CC, Betreff, Text +- **Antworten** mit zitiertem Originaltext +- **Dateianhänge** (max. 10 MB pro Datei, 25 MB gesamt) +- **SMTP-Versand** über die gewählte StressfreiEmail-Adresse + +#### Vertragszuordnung +- **E-Mails zu Verträgen zuordnen** für bessere Nachverfolgung +- **E-Mail-Tab in Vertragsansicht** zeigt nur zugeordnete E-Mails +- **Automatische Zuordnung** bei Versand aus Vertragskontext +- **Manuelle Zuordnung** über Suchfeld und Vertragsauswahl + +#### Anhänge +- **Anhangsliste** in E-Mail-Detail +- **Download** einzelner Anhänge +- **Inline-Ansicht** (im Browser öffnen) + +### Technische Details + +#### Backend-Services +| Service | Beschreibung | +|---------|--------------| +| `imapService.ts` | IMAP-Client (ImapFlow) für E-Mail-Empfang | +| `smtpService.ts` | SMTP-Client (Nodemailer) für E-Mail-Versand | +| `cachedEmail.service.ts` | E-Mail-Caching, Synchronisation, Zuordnung | + +#### API-Endpunkte +``` +GET /api/customers/:id/emails # E-Mails für Kunde +GET /api/contracts/:id/emails # E-Mails für Vertrag +GET /api/emails/:id # Einzelne E-Mail mit Body +POST /api/stressfrei-emails/:id/sync # IMAP-Synchronisation +POST /api/stressfrei-emails/:id/send # E-Mail senden +POST /api/emails/:id/assign # Vertrag zuordnen +DELETE /api/emails/:id/assign # Zuordnung aufheben +PATCH /api/emails/:id/read # Gelesen/Ungelesen +POST /api/emails/:id/star # Favorit umschalten +DELETE /api/emails/:id # In Papierkorb +POST /api/emails/:id/restore # Aus Papierkorb wiederherstellen +DELETE /api/emails/:id/permanent # Endgültig löschen +GET /api/emails/:id/attachments/:filename # Anhang herunterladen +``` + +#### Datenbank-Modell +```prisma +model CachedEmail { + id Int @id @default(autoincrement()) + stressfreiEmailId Int + stressfreiEmail StressfreiEmail @relation(...) + folder String // INBOX, SENT + messageId String // RFC 5322 Message-ID + uid Int // IMAP UID + subject String? + fromAddress String + fromName String? + toAddresses String @db.Text // JSON Array + ccAddresses String? @db.Text + receivedAt DateTime + textBody String? @db.LongText + htmlBody String? @db.LongText + hasAttachments Boolean @default(false) + attachmentNames String? @db.Text // JSON Array + contractId Int? // Vertragszuordnung + assignedAt DateTime? + assignedBy Int? + isAutoAssigned Boolean @default(false) + isRead Boolean @default(false) + isStarred Boolean @default(false) + isDeleted Boolean @default(false) + deletedAt DateTime? + + @@unique([stressfreiEmailId, messageId, folder]) +} +``` + +#### Sicherheit +- **Passwort-Verschlüsselung**: AES-256-GCM für Mailbox-Passwörter +- **Passwort-Reset**: Neues Passwort generieren und beim Provider setzen +- **Verschlüsselungsmodi**: SSL, STARTTLS, oder unverschlüsselt +- **Selbstsignierte Zertifikate**: Konfigurierbar pro Provider + +#### Berechtigungen +| Aktion | Berechtigung | +|--------|--------------| +| E-Mails lesen | `customers:read` | +| E-Mails senden, markieren | `customers:update` | +| Vertrag zuordnen | `contracts:update` | +| Löschen, Papierkorb | `emails:delete` | + +### Frontend-Komponenten + +| Komponente | Beschreibung | +|------------|--------------| +| `EmailClientTab.tsx` | Haupt-Tab mit Konto-Auswahl und Ordnern | +| `EmailList.tsx` | E-Mail-Liste mit Aktionen | +| `EmailDetail.tsx` | E-Mail-Ansicht mit Anhängen | +| `ComposeEmailModal.tsx` | Neue E-Mail / Antworten | +| `TrashEmailList.tsx` | Papierkorb-Verwaltung | +| `AssignToContractModal.tsx` | Vertragszuordnung | +| `ContractEmailsSection.tsx` | E-Mails in Vertragsansicht | ## Lizenz diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 00000000..f47e686a --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,28 @@ +# Dependencies +node_modules/ + +# Build +dist/ + +# Environment +.env +.env.local +.env.*.local + +# Database Backups (can be large, keep folder structure) +prisma/backups/* +!prisma/backups/.gitkeep + +# Logs +*.log +npm-debug.log* + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db diff --git a/backend/dist/controllers/stressfreiEmail.controller.d.ts b/backend/dist/controllers/stressfreiEmail.controller.d.ts index 5da970e8..83dec1ec 100644 --- a/backend/dist/controllers/stressfreiEmail.controller.d.ts +++ b/backend/dist/controllers/stressfreiEmail.controller.d.ts @@ -4,4 +4,5 @@ export declare function getEmail(req: Request, res: Response): Promise; export declare function createEmail(req: Request, res: Response): Promise; export declare function updateEmail(req: Request, res: Response): Promise; export declare function deleteEmail(req: Request, res: Response): Promise; +export declare function resetPassword(req: Request, res: Response): Promise; //# sourceMappingURL=stressfreiEmail.controller.d.ts.map \ No newline at end of file diff --git a/backend/dist/controllers/stressfreiEmail.controller.d.ts.map b/backend/dist/controllers/stressfreiEmail.controller.d.ts.map index 40ef0a5a..6679bbbe 100644 --- a/backend/dist/controllers/stressfreiEmail.controller.d.ts.map +++ b/backend/dist/controllers/stressfreiEmail.controller.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"stressfreiEmail.controller.d.ts","sourceRoot":"","sources":["../../src/controllers/stressfreiEmail.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5C,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpF;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAc5E;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5E;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5E"} \ No newline at end of file +{"version":3,"file":"stressfreiEmail.controller.d.ts","sourceRoot":"","sources":["../../src/controllers/stressfreiEmail.controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5C,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpF;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzE;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAc5E;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5E;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAU5E;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB9E"} \ No newline at end of file diff --git a/backend/dist/controllers/stressfreiEmail.controller.js b/backend/dist/controllers/stressfreiEmail.controller.js index 9fb469df..1dc2e94f 100644 --- a/backend/dist/controllers/stressfreiEmail.controller.js +++ b/backend/dist/controllers/stressfreiEmail.controller.js @@ -38,6 +38,7 @@ exports.getEmail = getEmail; exports.createEmail = createEmail; exports.updateEmail = updateEmail; exports.deleteEmail = deleteEmail; +exports.resetPassword = resetPassword; const stressfreiEmailService = __importStar(require("../services/stressfreiEmail.service.js")); async function getEmailsByCustomer(req, res) { try { @@ -112,4 +113,27 @@ async function deleteEmail(req, res) { }); } } +async function resetPassword(req, res) { + try { + const result = await stressfreiEmailService.resetMailboxPassword(parseInt(req.params.id)); + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + }); + return; + } + res.json({ + success: true, + data: { password: result.password }, + message: 'Passwort wurde zurückgesetzt', + }); + } + catch (error) { + res.status(500).json({ + success: false, + error: error instanceof Error ? error.message : 'Fehler beim Zurücksetzen des Passworts', + }); + } +} //# sourceMappingURL=stressfreiEmail.controller.js.map \ No newline at end of file diff --git a/backend/dist/controllers/stressfreiEmail.controller.js.map b/backend/dist/controllers/stressfreiEmail.controller.js.map index 63eec35e..dfeb4afe 100644 --- a/backend/dist/controllers/stressfreiEmail.controller.js.map +++ b/backend/dist/controllers/stressfreiEmail.controller.js.map @@ -1 +1 @@ -{"version":3,"file":"stressfreiEmail.controller.js","sourceRoot":"","sources":["../../src/controllers/stressfreiEmail.controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"stressfreiEmail.controller.js","sourceRoot":"","sources":["../../src/controllers/stressfreiEmail.controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/backend/dist/index.js b/backend/dist/index.js index bf410ee0..c5860b79 100644 --- a/backend/dist/index.js +++ b/backend/dist/index.js @@ -27,6 +27,7 @@ const contractCategory_routes_js_1 = __importDefault(require("./routes/contractC const contractTask_routes_js_1 = __importDefault(require("./routes/contractTask.routes.js")); const appSetting_routes_js_1 = __importDefault(require("./routes/appSetting.routes.js")); const emailProvider_routes_js_1 = __importDefault(require("./routes/emailProvider.routes.js")); +const cachedEmail_routes_js_1 = __importDefault(require("./routes/cachedEmail.routes.js")); dotenv_1.default.config(); const app = (0, express_1.default)(); const PORT = process.env.PORT || 3001; @@ -56,6 +57,7 @@ app.use('/api/contract-categories', contractCategory_routes_js_1.default); app.use('/api', contractTask_routes_js_1.default); app.use('/api/settings', appSetting_routes_js_1.default); app.use('/api/email-providers', emailProvider_routes_js_1.default); +app.use('/api', cachedEmail_routes_js_1.default); // Health check app.get('/api/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }); diff --git a/backend/dist/index.js.map b/backend/dist/index.js.map index 68dc00b7..7cb95a78 100644 --- a/backend/dist/index.js.map +++ b/backend/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/backend/dist/middleware/auth.d.ts b/backend/dist/middleware/auth.d.ts index 28189a61..fb745a67 100644 --- a/backend/dist/middleware/auth.d.ts +++ b/backend/dist/middleware/auth.d.ts @@ -1,6 +1,6 @@ import { Response, NextFunction } from 'express'; import { AuthRequest } from '../types/index.js'; -export declare function authenticate(req: AuthRequest, res: Response, next: NextFunction): void; +export declare function authenticate(req: AuthRequest, res: Response, next: NextFunction): Promise; export declare function requirePermission(...requiredPermissions: string[]): (req: AuthRequest, res: Response, next: NextFunction) => void; export declare function requireCustomerAccess(req: AuthRequest, res: Response, next: NextFunction): void; //# sourceMappingURL=auth.d.ts.map \ No newline at end of file diff --git a/backend/dist/middleware/auth.d.ts.map b/backend/dist/middleware/auth.d.ts.map index 4175b57f..5a506144 100644 --- a/backend/dist/middleware/auth.d.ts.map +++ b/backend/dist/middleware/auth.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAE5D,wBAAgB,YAAY,CAC1B,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CAoBN;AAED,wBAAgB,iBAAiB,CAAC,GAAG,mBAAmB,EAAE,MAAM,EAAE,IACxD,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CAuBnE;AAGD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CA4BN"} \ No newline at end of file +{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAI5D,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED,wBAAgB,iBAAiB,CAAC,GAAG,mBAAmB,EAAE,MAAM,EAAE,IACxD,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CAuBnE;AAGD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CA4BN"} \ No newline at end of file diff --git a/backend/dist/middleware/auth.js b/backend/dist/middleware/auth.js index c8b3a32c..04d5739f 100644 --- a/backend/dist/middleware/auth.js +++ b/backend/dist/middleware/auth.js @@ -7,15 +7,48 @@ exports.authenticate = authenticate; exports.requirePermission = requirePermission; exports.requireCustomerAccess = requireCustomerAccess; const jsonwebtoken_1 = __importDefault(require("jsonwebtoken")); -function authenticate(req, res, next) { +const client_1 = require("@prisma/client"); +const prisma = new client_1.PrismaClient(); +async function authenticate(req, res, next) { const authHeader = req.headers.authorization; - if (!authHeader || !authHeader.startsWith('Bearer ')) { + // Token aus Header oder Query-Parameter (für Downloads) + let token = null; + if (authHeader && authHeader.startsWith('Bearer ')) { + token = authHeader.split(' ')[1]; + } + else if (req.query.token && typeof req.query.token === 'string') { + // Fallback für Downloads: Token als Query-Parameter + token = req.query.token; + } + if (!token) { res.status(401).json({ success: false, error: 'Nicht authentifiziert' }); return; } - const token = authHeader.split(' ')[1]; try { const decoded = jsonwebtoken_1.default.verify(token, process.env.JWT_SECRET || 'fallback-secret'); + // Prüfen ob Token durch Rechteänderung invalidiert wurde (nur für Mitarbeiter) + if (decoded.userId && decoded.iat) { + const user = await prisma.user.findUnique({ + where: { id: decoded.userId }, + select: { tokenInvalidatedAt: true, isActive: true }, + }); + // Benutzer nicht gefunden oder deaktiviert + if (!user || !user.isActive) { + res.status(401).json({ success: false, error: 'Benutzer nicht mehr aktiv' }); + return; + } + // Token wurde vor der Invalidierung ausgestellt + if (user.tokenInvalidatedAt) { + const tokenIssuedAt = decoded.iat * 1000; // iat ist in Sekunden, Date ist in Millisekunden + if (tokenIssuedAt < user.tokenInvalidatedAt.getTime()) { + res.status(401).json({ + success: false, + error: 'Ihre Berechtigungen wurden geändert. Bitte melden Sie sich erneut an.', + }); + return; + } + } + } req.user = decoded; next(); } diff --git a/backend/dist/middleware/auth.js.map b/backend/dist/middleware/auth.js.map index cf6fecc7..b4058a31 100644 --- a/backend/dist/middleware/auth.js.map +++ b/backend/dist/middleware/auth.js.map @@ -1 +1 @@ -{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/backend/dist/routes/appSetting.routes.d.ts.map b/backend/dist/routes/appSetting.routes.d.ts.map index 0ce58633..7eac622f 100644 --- a/backend/dist/routes/appSetting.routes.d.ts.map +++ b/backend/dist/routes/appSetting.routes.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"appSetting.routes.d.ts","sourceRoot":"","sources":["../../src/routes/appSetting.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAwBxB,eAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"appSetting.routes.d.ts","sourceRoot":"","sources":["../../src/routes/appSetting.routes.ts"],"names":[],"mappings":"AAmBA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAmFxB,eAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/backend/dist/routes/appSetting.routes.js b/backend/dist/routes/appSetting.routes.js index e69a5e15..c0a6a640 100644 --- a/backend/dist/routes/appSetting.routes.js +++ b/backend/dist/routes/appSetting.routes.js @@ -32,10 +32,28 @@ var __importStar = (this && this.__importStar) || (function () { return result; }; })(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = require("express"); +const multer_1 = __importDefault(require("multer")); const appSettingController = __importStar(require("../controllers/appSetting.controller.js")); +const backupController = __importStar(require("../controllers/backup.controller.js")); const auth_js_1 = require("../middleware/auth.js"); +// Multer für Backup-Upload (in Memory speichern) +const backupUpload = (0, multer_1.default)({ + storage: multer_1.default.memoryStorage(), + limits: { fileSize: 500 * 1024 * 1024 }, // 500MB max + fileFilter: (req, file, cb) => { + if (file.mimetype === 'application/zip' || file.originalname.endsWith('.zip')) { + cb(null, true); + } + else { + cb(new Error('Nur ZIP-Dateien sind erlaubt')); + } + }, +}); const router = (0, express_1.Router)(); // Öffentliche Einstellungen (für alle authentifizierten Benutzer, inkl. Kunden) router.get('/public', auth_js_1.authenticate, appSettingController.getPublicSettings); @@ -45,5 +63,20 @@ router.get('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settin router.put('/:key', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), appSettingController.updateSetting); // Mehrere Einstellungen aktualisieren (nur Admin) router.put('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), appSettingController.updateSettings); +// ==================== BACKUP & RESTORE ==================== +// Liste aller Backups +router.get('/backups', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), backupController.listBackups); +// Neues Backup erstellen +router.post('/backup', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), backupController.createBackup); +// Backup wiederherstellen +router.post('/backup/:name/restore', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), backupController.restoreBackup); +// Backup löschen +router.delete('/backup/:name', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), backupController.deleteBackup); +// Backup als ZIP herunterladen +router.get('/backup/:name/download', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), backupController.downloadBackup); +// Backup-ZIP hochladen +router.post('/backup/upload', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), backupUpload.single('backup'), backupController.uploadBackup); +// Werkseinstellungen (alles löschen) +router.post('/factory-reset', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('settings:update'), backupController.factoryReset); exports.default = router; //# sourceMappingURL=appSetting.routes.js.map \ No newline at end of file diff --git a/backend/dist/routes/appSetting.routes.js.map b/backend/dist/routes/appSetting.routes.js.map index 94013a18..4b10f4ba 100644 --- a/backend/dist/routes/appSetting.routes.js.map +++ b/backend/dist/routes/appSetting.routes.js.map @@ -1 +1 @@ -{"version":3,"file":"appSetting.routes.js","sourceRoot":"","sources":["../../src/routes/appSetting.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,8FAAgF;AAChF,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,gFAAgF;AAChF,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,sBAAY,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AAE5E,iCAAiC;AACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,eAAe,CAAC,EAAE,oBAAoB,CAAC,cAAc,CAAC,CAAC;AAEvG,iDAAiD;AACjD,MAAM,CAAC,GAAG,CACR,OAAO,EACP,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,oBAAoB,CAAC,aAAa,CACnC,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,GAAG,CACR,GAAG,EACH,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,oBAAoB,CAAC,cAAc,CACpC,CAAC;AAEF,kBAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"appSetting.routes.js","sourceRoot":"","sources":["../../src/routes/appSetting.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,oDAA4B;AAC5B,8FAAgF;AAChF,sFAAwE;AACxE,mDAAwE;AAExE,iDAAiD;AACjD,MAAM,YAAY,GAAG,IAAA,gBAAM,EAAC;IAC1B,OAAO,EAAE,gBAAM,CAAC,aAAa,EAAE;IAC/B,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,YAAY;IACrD,UAAU,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,iBAAiB,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,gFAAgF;AAChF,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,sBAAY,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;AAE5E,iCAAiC;AACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,eAAe,CAAC,EAAE,oBAAoB,CAAC,cAAc,CAAC,CAAC;AAEvG,iDAAiD;AACjD,MAAM,CAAC,GAAG,CACR,OAAO,EACP,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,oBAAoB,CAAC,aAAa,CACnC,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,GAAG,CACR,GAAG,EACH,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,oBAAoB,CAAC,cAAc,CACpC,CAAC;AAEF,6DAA6D;AAE7D,sBAAsB;AACtB,MAAM,CAAC,GAAG,CACR,UAAU,EACV,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,gBAAgB,CAAC,WAAW,CAC7B,CAAC;AAEF,yBAAyB;AACzB,MAAM,CAAC,IAAI,CACT,SAAS,EACT,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,gBAAgB,CAAC,YAAY,CAC9B,CAAC;AAEF,0BAA0B;AAC1B,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,gBAAgB,CAAC,aAAa,CAC/B,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,CACX,eAAe,EACf,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,gBAAgB,CAAC,YAAY,CAC9B,CAAC;AAEF,+BAA+B;AAC/B,MAAM,CAAC,GAAG,CACR,wBAAwB,EACxB,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,gBAAgB,CAAC,cAAc,CAChC,CAAC;AAEF,uBAAuB;AACvB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC7B,gBAAgB,CAAC,YAAY,CAC9B,CAAC;AAEF,qCAAqC;AACrC,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,sBAAY,EACZ,IAAA,2BAAiB,EAAC,iBAAiB,CAAC,EACpC,gBAAgB,CAAC,YAAY,CAC9B,CAAC;AAEF,kBAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/backend/dist/routes/contractCategory.routes.d.ts.map b/backend/dist/routes/contractCategory.routes.d.ts.map index a088bc71..db522560 100644 --- a/backend/dist/routes/contractCategory.routes.d.ts.map +++ b/backend/dist/routes/contractCategory.routes.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"contractCategory.routes.d.ts","sourceRoot":"","sources":["../../src/routes/contractCategory.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAQxB,eAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"contractCategory.routes.d.ts","sourceRoot":"","sources":["../../src/routes/contractCategory.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAWxB,eAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/backend/dist/routes/contractCategory.routes.js b/backend/dist/routes/contractCategory.routes.js index 490b6575..35f9274b 100644 --- a/backend/dist/routes/contractCategory.routes.js +++ b/backend/dist/routes/contractCategory.routes.js @@ -37,10 +37,12 @@ const express_1 = require("express"); const contractCategoryController = __importStar(require("../controllers/contractCategory.controller.js")); const auth_js_1 = require("../middleware/auth.js"); const router = (0, express_1.Router)(); +// Lesen für alle authentifizierten Benutzer router.get('/', auth_js_1.authenticate, contractCategoryController.getContractCategories); -router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:create'), contractCategoryController.createContractCategory); router.get('/:id', auth_js_1.authenticate, contractCategoryController.getContractCategory); -router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:update'), contractCategoryController.updateContractCategory); -router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('platforms:delete'), contractCategoryController.deleteContractCategory); +// Ändern/Löschen nur mit Entwickler-Berechtigung (Vertragstypen erfordern Formular-Anpassungen) +router.post('/', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('developer:access'), contractCategoryController.createContractCategory); +router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('developer:access'), contractCategoryController.updateContractCategory); +router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('developer:access'), contractCategoryController.deleteContractCategory); exports.default = router; //# sourceMappingURL=contractCategory.routes.js.map \ No newline at end of file diff --git a/backend/dist/routes/contractCategory.routes.js.map b/backend/dist/routes/contractCategory.routes.js.map index 0bb5c22b..b738ce8c 100644 --- a/backend/dist/routes/contractCategory.routes.js.map +++ b/backend/dist/routes/contractCategory.routes.js.map @@ -1 +1 @@ -{"version":3,"file":"contractCategory.routes.js","sourceRoot":"","sources":["../../src/routes/contractCategory.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0GAA4F;AAC5F,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;AAChF,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AACzH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;AACjF,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAC3H,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAE9H,kBAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"contractCategory.routes.js","sourceRoot":"","sources":["../../src/routes/contractCategory.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,0GAA4F;AAC5F,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,4CAA4C;AAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,sBAAY,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;AAChF,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;AAEjF,gGAAgG;AAChG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AACzH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAC3H,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAC;AAE9H,kBAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/backend/dist/routes/stressfreiEmail.routes.d.ts.map b/backend/dist/routes/stressfreiEmail.routes.d.ts.map index 12a5fb47..b02385f0 100644 --- a/backend/dist/routes/stressfreiEmail.routes.d.ts.map +++ b/backend/dist/routes/stressfreiEmail.routes.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"stressfreiEmail.routes.d.ts","sourceRoot":"","sources":["../../src/routes/stressfreiEmail.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAOxB,eAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"stressfreiEmail.routes.d.ts","sourceRoot":"","sources":["../../src/routes/stressfreiEmail.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAUxB,eAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/backend/dist/routes/stressfreiEmail.routes.js b/backend/dist/routes/stressfreiEmail.routes.js index 76e3b072..33d43094 100644 --- a/backend/dist/routes/stressfreiEmail.routes.js +++ b/backend/dist/routes/stressfreiEmail.routes.js @@ -41,5 +41,7 @@ const router = (0, express_1.Router)(); router.get('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:read'), stressfreiEmailController.getEmail); router.put('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), stressfreiEmailController.updateEmail); router.delete('/:id', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:delete'), stressfreiEmailController.deleteEmail); +// Passwort zurücksetzen (generiert neues Passwort und setzt es beim Provider) +router.post('/:id/reset-password', auth_js_1.authenticate, (0, auth_js_1.requirePermission)('customers:update'), stressfreiEmailController.resetPassword); exports.default = router; //# sourceMappingURL=stressfreiEmail.routes.js.map \ No newline at end of file diff --git a/backend/dist/routes/stressfreiEmail.routes.js.map b/backend/dist/routes/stressfreiEmail.routes.js.map index 64b2fe8d..2693b11c 100644 --- a/backend/dist/routes/stressfreiEmail.routes.js.map +++ b/backend/dist/routes/stressfreiEmail.routes.js.map @@ -1 +1 @@ -{"version":3,"file":"stressfreiEmail.routes.js","sourceRoot":"","sources":["../../src/routes/stressfreiEmail.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,wGAA0F;AAC1F,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,sCAAsC;AACtC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;AAC1G,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAC/G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAElH,kBAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"stressfreiEmail.routes.js","sourceRoot":"","sources":["../../src/routes/stressfreiEmail.routes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,wGAA0F;AAC1F,mDAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,sCAAsC;AACtC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,gBAAgB,CAAC,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;AAC1G,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAC/G,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAElH,8EAA8E;AAC9E,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,sBAAY,EAAE,IAAA,2BAAiB,EAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC,aAAa,CAAC,CAAC;AAEjI,kBAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/backend/dist/services/contract.service.d.ts b/backend/dist/services/contract.service.d.ts index ebc7f350..778e7c86 100644 --- a/backend/dist/services/contract.service.d.ts +++ b/backend/dist/services/contract.service.d.ts @@ -247,10 +247,12 @@ export declare function getContractById(id: number, decryptPassword?: boolean): createdAt: Date; updatedAt: Date; notes: string | null; + hasMailbox: boolean; platform: string | null; isProvisioned: boolean; provisionedAt: Date | null; provisionError: string | null; + emailPasswordEncrypted: string | null; } | null; carInsuranceDetails: { id: number; @@ -511,6 +513,11 @@ export declare function getContractById(id: number, decryptPassword?: boolean): portalUsername: string | null; stressfreiEmailId: number | null; }) | null; + followUpContract: { + id: number; + status: import(".prisma/client").$Enums.ContractStatus; + contractNumber: string; + } | null; } & { id: number; customerId: number; @@ -936,10 +943,12 @@ export declare function updateContract(id: number, data: Partial; export declare function getProviderConfigById(id: number): Promise<{ id: number; @@ -28,6 +35,13 @@ export declare function getProviderConfigById(id: number): Promise<{ passwordEncrypted: string | null; domain: string; defaultForwardEmail: string | null; + imapServer: string | null; + imapPort: number | null; + smtpServer: string | null; + smtpPort: number | null; + imapEncryption: import(".prisma/client").$Enums.MailEncryption; + smtpEncryption: import(".prisma/client").$Enums.MailEncryption; + allowSelfSignedCerts: boolean; } | null>; export declare function getDefaultProviderConfig(): Promise<{ id: number; @@ -43,6 +57,13 @@ export declare function getDefaultProviderConfig(): Promise<{ passwordEncrypted: string | null; domain: string; defaultForwardEmail: string | null; + imapServer: string | null; + imapPort: number | null; + smtpServer: string | null; + smtpPort: number | null; + imapEncryption: import(".prisma/client").$Enums.MailEncryption; + smtpEncryption: import(".prisma/client").$Enums.MailEncryption; + allowSelfSignedCerts: boolean; } | null>; export declare function getActiveProviderConfig(): Promise<{ id: number; @@ -58,6 +79,13 @@ export declare function getActiveProviderConfig(): Promise<{ passwordEncrypted: string | null; domain: string; defaultForwardEmail: string | null; + imapServer: string | null; + imapPort: number | null; + smtpServer: string | null; + smtpPort: number | null; + imapEncryption: import(".prisma/client").$Enums.MailEncryption; + smtpEncryption: import(".prisma/client").$Enums.MailEncryption; + allowSelfSignedCerts: boolean; } | null>; export interface CreateProviderConfigData { name: string; @@ -68,6 +96,9 @@ export interface CreateProviderConfigData { password?: string; domain: string; defaultForwardEmail?: string; + imapEncryption?: MailEncryption; + smtpEncryption?: MailEncryption; + allowSelfSignedCerts?: boolean; isActive?: boolean; isDefault?: boolean; } @@ -85,6 +116,13 @@ export declare function createProviderConfig(data: CreateProviderConfigData): Pr passwordEncrypted: string | null; domain: string; defaultForwardEmail: string | null; + imapServer: string | null; + imapPort: number | null; + smtpServer: string | null; + smtpPort: number | null; + imapEncryption: import(".prisma/client").$Enums.MailEncryption; + smtpEncryption: import(".prisma/client").$Enums.MailEncryption; + allowSelfSignedCerts: boolean; }>; export declare function updateProviderConfig(id: number, data: Partial): Promise<{ id: number; @@ -100,6 +138,13 @@ export declare function updateProviderConfig(id: number, data: Partial; export declare function deleteProviderConfig(id: number): Promise<{ id: number; @@ -115,9 +160,32 @@ export declare function deleteProviderConfig(id: number): Promise<{ passwordEncrypted: string | null; domain: string; defaultForwardEmail: string | null; + imapServer: string | null; + imapPort: number | null; + smtpServer: string | null; + smtpPort: number | null; + imapEncryption: import(".prisma/client").$Enums.MailEncryption; + smtpEncryption: import(".prisma/client").$Enums.MailEncryption; + allowSelfSignedCerts: boolean; }>; export declare function checkEmailExists(localPart: string): Promise; export declare function provisionEmail(localPart: string, customerEmail: string): Promise; +export declare function provisionEmailWithMailbox(localPart: string, customerEmail: string, password: string): Promise; +export declare function enableMailboxForExistingEmail(localPart: string, password: string): Promise; +export declare function updateMailboxPassword(localPart: string, password: string): Promise; +export interface ImapSmtpSettings { + imapServer: string; + imapPort: number; + imapEncryption: MailEncryption; + smtpServer: string; + smtpPort: number; + smtpEncryption: MailEncryption; + allowSelfSignedCerts: boolean; + domain: string; +} +export declare function getImapSmtpSettings(): Promise; export declare function deprovisionEmail(localPart: string): Promise; export declare function renameProvisionedEmail(oldLocalPart: string, newLocalPart: string): Promise; export declare function getProviderDomain(): Promise; diff --git a/backend/dist/services/emailProvider/emailProviderService.d.ts.map b/backend/dist/services/emailProvider/emailProviderService.d.ts.map index 2ef1994f..8163bbe3 100644 --- a/backend/dist/services/emailProvider/emailProviderService.d.ts.map +++ b/backend/dist/services/emailProvider/emailProviderService.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"emailProviderService.d.ts","sourceRoot":"","sources":["../../../src/services/emailProvider/emailProviderService.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,iBAAiB,EACjB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAuBpB,wBAAsB,qBAAqB;;;;;;;;;;;;;;KAI1C;AAED,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;UAIrD;AAED,wBAAsB,wBAAwB;;;;;;;;;;;;;;UAI7C;AAED,wBAAsB,uBAAuB;;;;;;;;;;;;;;UAQ5C;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB;;;;;;;;;;;;;;GA2BxE;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,wBAAwB,CAAC;;;;;;;;;;;;;;GAsCxC;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;GAIpD;AAwCD,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQpF;AAGD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAoC/B;AAGD,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAWvF;AAGD,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAGD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGhE;AA8DD,wBAAsB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IACrD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6BhC"} \ No newline at end of file +{"version":3,"file":"emailProviderService.d.ts","sourceRoot":"","sources":["../../../src/services/emailProvider/emailProviderService.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,iBAAiB,EACjB,oBAAoB,EAEpB,cAAc,EACf,MAAM,YAAY,CAAC;AAuBpB,wBAAsB,qBAAqB;;;;;;;;;;;;;;;;;;;;;KAI1C;AAED,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;UAIrD;AAED,wBAAsB,wBAAwB;;;;;;;;;;;;;;;;;;;;;UAI7C;AAED,wBAAsB,uBAAuB;;;;;;;;;;;;;;;;;;;;;UAQ5C;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB;;;;;;;;;;;;;;;;;;;;;GA8BxE;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;;;;GAyCxC;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;GAIpD;AA+CD,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQpF;AAGD,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAoC/B;AAGD,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsCpD;AAGD,wBAAsB,6BAA6B,CACjD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAiB/B;AAGD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAiB/B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA0D5E;AAGD,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAWvF;AAGD,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAGD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGhE;AAqED,wBAAsB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IACrD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6BhC"} \ No newline at end of file diff --git a/backend/dist/services/emailProvider/emailProviderService.js b/backend/dist/services/emailProvider/emailProviderService.js index 8c9138df..91c46ad0 100644 --- a/backend/dist/services/emailProvider/emailProviderService.js +++ b/backend/dist/services/emailProvider/emailProviderService.js @@ -10,6 +10,10 @@ exports.updateProviderConfig = updateProviderConfig; exports.deleteProviderConfig = deleteProviderConfig; exports.checkEmailExists = checkEmailExists; exports.provisionEmail = provisionEmail; +exports.provisionEmailWithMailbox = provisionEmailWithMailbox; +exports.enableMailboxForExistingEmail = enableMailboxForExistingEmail; +exports.updateMailboxPassword = updateMailboxPassword; +exports.getImapSmtpSettings = getImapSmtpSettings; exports.deprovisionEmail = deprovisionEmail; exports.renameProvisionedEmail = renameProvisionedEmail; exports.getProviderDomain = getProviderDomain; @@ -79,6 +83,9 @@ async function createProviderConfig(data) { passwordEncrypted, domain: data.domain, defaultForwardEmail: data.defaultForwardEmail || null, + imapEncryption: data.imapEncryption ?? 'SSL', + smtpEncryption: data.smtpEncryption ?? 'SSL', + allowSelfSignedCerts: data.allowSelfSignedCerts ?? false, isActive: data.isActive ?? true, isDefault: data.isDefault ?? false, }, @@ -107,6 +114,12 @@ async function updateProviderConfig(id, data) { updateData.domain = data.domain; if (data.defaultForwardEmail !== undefined) updateData.defaultForwardEmail = data.defaultForwardEmail || null; + if (data.imapEncryption !== undefined) + updateData.imapEncryption = data.imapEncryption; + if (data.smtpEncryption !== undefined) + updateData.smtpEncryption = data.smtpEncryption; + if (data.allowSelfSignedCerts !== undefined) + updateData.allowSelfSignedCerts = data.allowSelfSignedCerts; if (data.isActive !== undefined) updateData.isActive = data.isActive; if (data.isDefault !== undefined) @@ -159,6 +172,13 @@ async function getProviderInstance() { password, domain: dbConfig.domain, defaultForwardEmail: dbConfig.defaultForwardEmail || undefined, + imapServer: dbConfig.imapServer || undefined, + imapPort: dbConfig.imapPort || undefined, + smtpServer: dbConfig.smtpServer || undefined, + smtpPort: dbConfig.smtpPort || undefined, + imapEncryption: dbConfig.imapEncryption, + smtpEncryption: dbConfig.smtpEncryption, + allowSelfSignedCerts: dbConfig.allowSelfSignedCerts, isActive: dbConfig.isActive, isDefault: dbConfig.isDefault, }; @@ -209,6 +229,136 @@ async function provisionEmail(localPart, customerEmail) { }; } } +// E-Mail mit echter Mailbox erstellen (IMAP/SMTP-Zugang) +async function provisionEmailWithMailbox(localPart, customerEmail, password) { + try { + const provider = await getProviderInstance(); + const config = await getActiveProviderConfig(); + // Weiterleitungsziele zusammenstellen + const forwardTargets = [customerEmail]; + // Unsere eigene Weiterleitungsadresse hinzufügen falls konfiguriert + if (config?.defaultForwardEmail) { + forwardTargets.push(config.defaultForwardEmail); + } + // Prüfen ob existiert + const exists = await provider.emailExists(localPart); + if (exists.exists) { + return { + success: true, + message: `E-Mail ${exists.email} existiert bereits`, + email: exists.email, + }; + } + // Mit Mailbox erstellen + const result = await provider.createEmailWithMailbox({ + localPart, + forwardTargets, + password, + }); + return result; + } + catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + return { + success: false, + error: errorMessage, + }; + } +} +// Mailbox für existierende E-Mail-Weiterleitung aktivieren +async function enableMailboxForExistingEmail(localPart, password) { + try { + const provider = await getProviderInstance(); + const result = await provider.enableMailboxForExisting({ + localPart, + password, + }); + return result; + } + catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + return { + success: false, + error: errorMessage, + }; + } +} +// Mailbox-Passwort beim Provider aktualisieren +async function updateMailboxPassword(localPart, password) { + try { + const provider = await getProviderInstance(); + const result = await provider.updateMailboxPassword({ + localPart, + password, + }); + return result; + } + catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + return { + success: false, + error: errorMessage, + }; + } +} +async function getImapSmtpSettings() { + const config = await getActiveProviderConfig(); + if (!config) + return null; + // Default-Server: Hostname aus der apiUrl extrahieren (z.B. rs001871.fastrootserver.de aus https://rs001871.fastrootserver.de:8443) + // Der Plesk-Server ist gleichzeitig der Mail-Server + let defaultServer; + try { + const url = new URL(config.apiUrl); + defaultServer = url.hostname; + } + catch { + // Fallback falls apiUrl ungültig + defaultServer = `mail.${config.domain}`; + } + // Verschlüsselungs-Einstellungen + const imapEncryption = (config.imapEncryption ?? 'SSL'); + const smtpEncryption = (config.smtpEncryption ?? 'SSL'); + // Ports basierend auf Verschlüsselung berechnen: + // SSL: IMAP 993, SMTP 465 + // STARTTLS: IMAP 143, SMTP 587 + // NONE: IMAP 143, SMTP 25 + // + // Standard-Ports werden IMMER basierend auf Verschlüsselung berechnet. + // Nur benutzerdefinierte Ports (nicht 993/143/465/587/25) werden aus der DB übernommen. + const getImapPort = (enc, storedPort) => { + const standardPorts = [993, 143]; + // Wenn ein nicht-standard Port gespeichert ist, diesen verwenden + if (storedPort && !standardPorts.includes(storedPort)) { + return storedPort; + } + // Sonst basierend auf Verschlüsselung + return enc === 'SSL' ? 993 : 143; + }; + const getSmtpPort = (enc, storedPort) => { + const standardPorts = [465, 587, 25]; + // Wenn ein nicht-standard Port gespeichert ist, diesen verwenden + if (storedPort && !standardPorts.includes(storedPort)) { + return storedPort; + } + // Sonst basierend auf Verschlüsselung + if (enc === 'SSL') + return 465; + if (enc === 'STARTTLS') + return 587; + return 25; // NONE + }; + return { + imapServer: config.imapServer || defaultServer, + imapPort: getImapPort(imapEncryption, config.imapPort), + imapEncryption, + smtpServer: config.smtpServer || defaultServer, + smtpPort: getSmtpPort(smtpEncryption, config.smtpPort), + smtpEncryption, + allowSelfSignedCerts: config.allowSelfSignedCerts ?? false, + domain: config.domain, + }; +} // E-Mail löschen async function deprovisionEmail(localPart) { try { @@ -284,6 +434,13 @@ async function getProviderInstanceById(id) { password, domain: dbConfig.domain, defaultForwardEmail: dbConfig.defaultForwardEmail || undefined, + imapServer: dbConfig.imapServer || undefined, + imapPort: dbConfig.imapPort || undefined, + smtpServer: dbConfig.smtpServer || undefined, + smtpPort: dbConfig.smtpPort || undefined, + imapEncryption: dbConfig.imapEncryption, + smtpEncryption: dbConfig.smtpEncryption, + allowSelfSignedCerts: dbConfig.allowSelfSignedCerts, isActive: dbConfig.isActive, isDefault: dbConfig.isDefault, }; diff --git a/backend/dist/services/emailProvider/emailProviderService.js.map b/backend/dist/services/emailProvider/emailProviderService.js.map index 14d58030..2bf98cb5 100644 --- a/backend/dist/services/emailProvider/emailProviderService.js.map +++ b/backend/dist/services/emailProvider/emailProviderService.js.map @@ -1 +1 @@ -{"version":3,"file":"emailProviderService.js","sourceRoot":"","sources":["../../../src/services/emailProvider/emailProviderService.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"emailProviderService.js","sourceRoot":"","sources":["../../../src/services/emailProvider/emailProviderService.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/backend/dist/services/emailProvider/pleskProvider.d.ts b/backend/dist/services/emailProvider/pleskProvider.d.ts index 98aabb35..558bf181 100644 --- a/backend/dist/services/emailProvider/pleskProvider.d.ts +++ b/backend/dist/services/emailProvider/pleskProvider.d.ts @@ -1,4 +1,4 @@ -import { IEmailProvider, EmailProviderConfig, EmailExistsResult, EmailOperationResult, CreateEmailParams, RenameEmailParams } from './types.js'; +import { IEmailProvider, EmailProviderConfig, EmailExistsResult, EmailOperationResult, CreateEmailParams, CreateEmailWithMailboxParams, CreateEmailWithMailboxResult, EnableMailboxParams, UpdateMailboxPasswordParams, RenameEmailParams } from './types.js'; export declare class PleskEmailProvider implements IEmailProvider { readonly type = "PLESK"; private config; @@ -8,6 +8,9 @@ export declare class PleskEmailProvider implements IEmailProvider { testConnection(): Promise; emailExists(localPart: string): Promise; createEmail(params: CreateEmailParams): Promise; + createEmailWithMailbox(params: CreateEmailWithMailboxParams): Promise; + enableMailboxForExisting(params: EnableMailboxParams): Promise; + updateMailboxPassword(params: UpdateMailboxPasswordParams): Promise; deleteEmail(localPart: string): Promise; renameEmail(params: RenameEmailParams): Promise; updateForwardTargets(localPart: string, targets: string[]): Promise; diff --git a/backend/dist/services/emailProvider/pleskProvider.d.ts.map b/backend/dist/services/emailProvider/pleskProvider.d.ts.map index 1eb64529..d048a748 100644 --- a/backend/dist/services/emailProvider/pleskProvider.d.ts.map +++ b/backend/dist/services/emailProvider/pleskProvider.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pleskProvider.d.ts","sourceRoot":"","sources":["../../../src/services/emailProvider/pleskProvider.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAiBpB,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAKvC,OAAO,KAAK,OAAO,GAGlB;YAGa,OAAO;IAsFf,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8C1D,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuCrE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgC7D,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2CrE,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,oBAAoB,CAAC;CAmCjC"} \ No newline at end of file +{"version":3,"file":"pleskProvider.d.ts","sourceRoot":"","sources":["../../../src/services/emailProvider/pleskProvider.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,4BAA4B,EAC5B,4BAA4B,EAC5B,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAiBpB,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAKvC,OAAO,KAAK,OAAO,GAGlB;YAGa,OAAO;IAsFf,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyD1D,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAwCrE,sBAAsB,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,4BAA4B,CAAC;IA2CnG,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAwCpF,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsCzF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgC7D,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2CrE,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,oBAAoB,CAAC;CAoCjC"} \ No newline at end of file diff --git a/backend/dist/services/emailProvider/pleskProvider.js b/backend/dist/services/emailProvider/pleskProvider.js index 9c2fd8f1..8a88e7b4 100644 --- a/backend/dist/services/emailProvider/pleskProvider.js +++ b/backend/dist/services/emailProvider/pleskProvider.js @@ -137,9 +137,18 @@ class PleskEmailProvider { } // stdout sollte die Mail-Infos enthalten const exists = result.stdout?.toLowerCase().includes(localPart.toLowerCase()); + // Mailbox-Status aus stdout parsen (Format: "Mailbox: true" oder "Mailbox: false") + let hasMailbox; + if (exists && result.stdout) { + const mailboxMatch = result.stdout.match(/Mailbox:\s*(true|false)/i); + if (mailboxMatch) { + hasMailbox = mailboxMatch[1].toLowerCase() === 'true'; + } + } return { exists, email: exists ? email : undefined, + hasMailbox, }; } catch (error) { @@ -169,11 +178,12 @@ class PleskEmailProvider { } // Plesk CLI API: Mail-Account mit Weiterleitung erstellen // Verwendet den CLI-Wrapper unter /api/v2/cli/mail/call + // Format für -forwarding-addresses: "add:email1,email2" oder "set:email1,email2" await this.request('POST', '/api/v2/cli/mail/call', { params: [ '--create', email, '-forwarding', 'true', - '-forwarding-addresses', forwardTargets.join(','), + '-forwarding-addresses', `add:${forwardTargets.join(',')}`, '-mailbox', 'false', ], }); @@ -191,6 +201,118 @@ class PleskEmailProvider { }; } } + async createEmailWithMailbox(params) { + const { localPart, forwardTargets, password } = params; + const email = `${localPart}@${this.config.domain}`; + try { + // Prüfen ob schon existiert + const exists = await this.emailExists(localPart); + if (exists.exists) { + return { + success: false, + error: `E-Mail ${email} existiert bereits`, + }; + } + // Plesk CLI API: Mail-Account mit echter Mailbox erstellen + // -mailbox true: Echte Mailbox (IMAP/SMTP-Zugang) + // -passwd: Passwort für die Mailbox + // -forwarding true: Zusätzlich Weiterleitung aktivieren + await this.request('POST', '/api/v2/cli/mail/call', { + params: [ + '--create', email, + '-mailbox', 'true', + '-passwd', password, + '-forwarding', 'true', + '-forwarding-addresses', `add:${forwardTargets.join(',')}`, + ], + }); + return { + success: true, + message: `E-Mail ${email} mit Mailbox erfolgreich erstellt`, + email, + }; + } + catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + console.error('Plesk createEmailWithMailbox error:', error); + return { + success: false, + error: `Fehler beim Erstellen der E-Mail mit Mailbox: ${errorMessage}`, + }; + } + } + async enableMailboxForExisting(params) { + const { localPart, password } = params; + const email = `${localPart}@${this.config.domain}`; + try { + // Prüfen ob E-Mail existiert + const exists = await this.emailExists(localPart); + if (!exists.exists) { + return { + success: false, + error: `E-Mail ${email} nicht gefunden`, + }; + } + // Plesk CLI API: Mailbox für existierende E-Mail aktivieren + // --update: Existierende E-Mail aktualisieren + // -mailbox true: Mailbox aktivieren + // -passwd: Passwort für die Mailbox setzen + await this.request('POST', '/api/v2/cli/mail/call', { + params: [ + '--update', email, + '-mailbox', 'true', + '-passwd', password, + ], + }); + return { + success: true, + message: `Mailbox für ${email} erfolgreich aktiviert`, + }; + } + catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + console.error('Plesk enableMailboxForExisting error:', error); + return { + success: false, + error: `Fehler beim Aktivieren der Mailbox: ${errorMessage}`, + }; + } + } + async updateMailboxPassword(params) { + const { localPart, password } = params; + const email = `${localPart}@${this.config.domain}`; + try { + // Prüfen ob E-Mail existiert + const exists = await this.emailExists(localPart); + if (!exists.exists) { + return { + success: false, + error: `E-Mail ${email} nicht gefunden`, + }; + } + // Plesk CLI API: Passwort für existierende E-Mail aktualisieren + // --update: Existierende E-Mail aktualisieren + // -passwd: Neues Passwort setzen + await this.request('POST', '/api/v2/cli/mail/call', { + params: [ + '--update', email, + '-passwd', password, + ], + }); + return { + success: true, + message: `Passwort für ${email} erfolgreich aktualisiert`, + }; + } + catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + console.error('Plesk updateMailboxPassword error:', error); + return { + success: false, + error: `Fehler beim Aktualisieren des Passworts: ${errorMessage}`, + }; + } + } async deleteEmail(localPart) { const email = `${localPart}@${this.config.domain}`; try { @@ -271,11 +393,12 @@ class PleskEmailProvider { }; } // Plesk CLI API: Weiterleitungsziele aktualisieren + // Format für -forwarding-addresses: "set:email1,email2" ersetzt alle Adressen await this.request('POST', '/api/v2/cli/mail/call', { params: [ '--update', email, '-forwarding', 'true', - '-forwarding-addresses', targets.join(','), + '-forwarding-addresses', `set:${targets.join(',')}`, ], }); return { diff --git a/backend/dist/services/emailProvider/pleskProvider.js.map b/backend/dist/services/emailProvider/pleskProvider.js.map index 14f46b00..a05a332d 100644 --- a/backend/dist/services/emailProvider/pleskProvider.js.map +++ b/backend/dist/services/emailProvider/pleskProvider.js.map @@ -1 +1 @@ -{"version":3,"file":"pleskProvider.js","sourceRoot":"","sources":["../../../src/services/emailProvider/pleskProvider.ts"],"names":[],"mappings":";AAAA,iEAAiE;;;AAEjE,mCAAqD;AAUrD,0DAA0D;AAC1D,8DAA8D;AAC9D,MAAM,UAAU,GAAG,IAAI,cAAK,CAAC;IAC3B,OAAO,EAAE;QACP,kBAAkB,EAAE,KAAK;QACzB,OAAO,EAAE,KAAK,EAAE,8BAA8B;KAC/C;IACD,WAAW,EAAE,KAAK,EAAE,gCAAgC;IACpD,cAAc,EAAE,KAAK,EAAE,0BAA0B;IACjD,gBAAgB,EAAE,IAAI,EAAE,uCAAuC;IAC/D,mBAAmB,EAAE,IAAI,EAAE,gCAAgC;IAC3D,WAAW,EAAE,CAAC,EAAE,4CAA4C;IAC5D,UAAU,EAAE,CAAC,EAAE,kBAAkB;CAClC,CAAC,CAAC;AAEH,MAAa,kBAAkB;IACpB,IAAI,GAAG,OAAO,CAAC;IAChB,MAAM,CAAsB;IAEpC,YAAY,MAA2B;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,6BAA6B;IAC7B,IAAY,OAAO;QACjB,0CAA0C;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,mCAAmC;IAC3B,KAAK,CAAC,OAAO,CACnB,MAAyC,EACzC,QAAgB,EAChB,IAA8B;QAE9B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QAEzC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,6DAA6D;QAC7D,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,0CAA0C;YAC1C,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5C,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxD,mCAAmC;YACnC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAC5B,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAClD,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrB,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,UAAU,EAAE,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;QACtG,CAAC;QAED,MAAM,OAAO,GAAsC;YACjD,MAAM;YACN,OAAO;YACP,UAAU,EAAE,UAAU;SACvB,CAAC;QAEF,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,cAAW,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEjD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,4BAA4B;YAC5B,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,EAAO,CAAC;YACjB,CAAC;YAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mDAAmD;YACnD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAExC,iBAAiB;gBACjB,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,OAAO,8BAA8B,CAAC,CAAC;gBAC/F,CAAC;gBACD,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC7D,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,OAAO,qBAAqB,CAAC,CAAC;gBACvF,CAAC;gBACD,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBACzD,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,CAAC;gBACD,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7D,CAAC;gBAED,iBAAiB;gBACjB,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC3G,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;gBAC/F,CAAC;gBAED,kDAAkD;gBAClD,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBACjC,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,OAAO,yDAAyD,CAAC,CAAC;gBACzH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,mEAAmE;QACnE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,4BAA4B;gBAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;gBAClG,CAAC;gBACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAChE,CAAC;gBACD,oDAAoD;YACtD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,MAAM,EACN,uBAAuB,EACvB,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAC9B,CAAC;YAEF,kCAAkC;YAClC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5E,mDAAmD;YACnD,yDAAyD;YACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC;gBACjB,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAClD,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBACvD,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBACvD,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAElE,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3B,CAAC;YAED,yCAAyC;YACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9E,OAAO;gBACL,MAAM;gBACN,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aAClC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kCAAkC;YAClC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxC,mCAAmC;gBACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAClG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,4BAA4B;YAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,KAAK,oBAAoB;iBAC3C,CAAC;YACJ,CAAC;YAED,0DAA0D;YAC1D,wDAAwD;YACxD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE;gBAClD,MAAM,EAAE;oBACN,UAAU,EAAE,KAAK;oBACjB,aAAa,EAAE,MAAM;oBACrB,uBAAuB,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;oBACjD,UAAU,EAAE,OAAO;iBACpB;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,UAAU,KAAK,+CAA+C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACnG,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;YACnF,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,qCAAqC,YAAY,EAAE;aAC3D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,KAAK,iBAAiB;iBACxC,CAAC;YACJ,CAAC;YAED,sCAAsC;YACtC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE;gBAClD,MAAM,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC;aAC5B,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,UAAU,KAAK,uBAAuB;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;YACnF,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mCAAmC,YAAY,EAAE;aACzD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;QAC9C,MAAM,QAAQ,GAAG,GAAG,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,GAAG,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAEzD,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACvD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,QAAQ,iBAAiB;iBAC3C,CAAC;YACJ,CAAC;YAED,yCAAyC;YACzC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACvD,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,QAAQ,oBAAoB;iBAC9C,CAAC;YACJ,CAAC;YAED,yCAAyC;YACzC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE;gBAClD,MAAM,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC;aAC1D,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,oCAAoC,QAAQ,OAAO,QAAQ,EAAE;aACvE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;YACnF,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sCAAsC,YAAY,EAAE;aAC5D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,SAAiB,EACjB,OAAiB;QAEjB,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAEnD,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,KAAK,iBAAiB;iBACxC,CAAC;YACJ,CAAC;YAED,mDAAmD;YACnD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,uBAAuB,EAAE;gBAClD,MAAM,EAAE;oBACN,UAAU,EAAE,KAAK;oBACjB,aAAa,EAAE,MAAM;oBACrB,uBAAuB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;iBAC3C;aACF,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,uBAAuB,KAAK,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAC5E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;YACnF,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,kDAAkD,YAAY,EAAE;aACxE,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AA9TD,gDA8TC"} \ No newline at end of file +{"version":3,"file":"pleskProvider.js","sourceRoot":"","sources":["../../../src/services/emailProvider/pleskProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/backend/dist/services/emailProvider/types.d.ts b/backend/dist/services/emailProvider/types.d.ts index cf496d2a..7c3ec4e2 100644 --- a/backend/dist/services/emailProvider/types.d.ts +++ b/backend/dist/services/emailProvider/types.d.ts @@ -1,3 +1,4 @@ +export type MailEncryption = 'SSL' | 'STARTTLS' | 'NONE'; export interface EmailForwardTarget { email: string; } @@ -5,6 +6,22 @@ export interface CreateEmailParams { localPart: string; forwardTargets: string[]; } +export interface CreateEmailWithMailboxParams { + localPart: string; + forwardTargets: string[]; + password: string; +} +export interface CreateEmailWithMailboxResult extends EmailOperationResult { + email?: string; +} +export interface EnableMailboxParams { + localPart: string; + password: string; +} +export interface UpdateMailboxPasswordParams { + localPart: string; + password: string; +} export interface RenameEmailParams { oldLocalPart: string; newLocalPart: string; @@ -12,6 +29,7 @@ export interface RenameEmailParams { export interface EmailExistsResult { exists: boolean; email?: string; + hasMailbox?: boolean; } export interface EmailOperationResult { success: boolean; @@ -23,6 +41,9 @@ export interface IEmailProvider { testConnection(): Promise; emailExists(localPart: string): Promise; createEmail(params: CreateEmailParams): Promise; + createEmailWithMailbox(params: CreateEmailWithMailboxParams): Promise; + enableMailboxForExisting(params: EnableMailboxParams): Promise; + updateMailboxPassword(params: UpdateMailboxPasswordParams): Promise; deleteEmail(localPart: string): Promise; renameEmail(params: RenameEmailParams): Promise; updateForwardTargets(localPart: string, targets: string[]): Promise; @@ -37,6 +58,13 @@ export interface EmailProviderConfig { password?: string; domain: string; defaultForwardEmail?: string; + imapServer?: string; + imapPort?: number; + smtpServer?: string; + smtpPort?: number; + imapEncryption?: MailEncryption; + smtpEncryption?: MailEncryption; + allowSelfSignedCerts?: boolean; isActive: boolean; isDefault: boolean; } diff --git a/backend/dist/services/emailProvider/types.d.ts.map b/backend/dist/services/emailProvider/types.d.ts.map index c40d734e..66b4db2d 100644 --- a/backend/dist/services/emailProvider/types.d.ts.map +++ b/backend/dist/services/emailProvider/types.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/emailProvider/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,cAAc;IAE7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAGtB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAGhC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAG3D,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAGtE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAG9D,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAGtE,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC3F;AAGD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB"} \ No newline at end of file +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/emailProvider/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/backend/dist/services/stressfreiEmail.service.d.ts b/backend/dist/services/stressfreiEmail.service.d.ts index eede81ca..10196618 100644 --- a/backend/dist/services/stressfreiEmail.service.d.ts +++ b/backend/dist/services/stressfreiEmail.service.d.ts @@ -6,10 +6,21 @@ export declare function getEmailsByCustomerId(customerId: number, includeInactiv createdAt: Date; updatedAt: Date; notes: string | null; + hasMailbox: boolean; platform: string | null; isProvisioned: boolean; provisionedAt: Date | null; provisionError: string | null; + emailPasswordEncrypted: string | null; +}[]>; +export declare function getEmailsWithMailboxByCustomerId(customerId: number): Promise<{ + id: number; + email: string; + notes: string | null; + _count: { + cachedEmails: number; + }; + hasMailbox: boolean; }[]>; export declare function getEmailById(id: number): Promise<{ id: number; @@ -19,17 +30,14 @@ export declare function getEmailById(id: number): Promise<{ createdAt: Date; updatedAt: Date; notes: string | null; + hasMailbox: boolean; platform: string | null; isProvisioned: boolean; provisionedAt: Date | null; provisionError: string | null; + emailPasswordEncrypted: string | null; } | null>; -export declare function createEmail(data: { - customerId: number; - email: string; - platform?: string; - notes?: string; -}): Promise<{ +export declare function getEmailWithMailboxById(id: number): Promise<{ id: number; email: string; customerId: number; @@ -37,10 +45,32 @@ export declare function createEmail(data: { createdAt: Date; updatedAt: Date; notes: string | null; + hasMailbox: boolean; + platform: string | null; + emailPasswordEncrypted: string | null; +} | null>; +export interface CreateEmailData { + customerId: number; + email: string; + platform?: string; + notes?: string; + provisionAtProvider?: boolean; + createMailbox?: boolean; +} +export declare function createEmail(data: CreateEmailData): Promise<{ + id: number; + email: string; + customerId: number; + isActive: boolean; + createdAt: Date; + updatedAt: Date; + notes: string | null; + hasMailbox: boolean; platform: string | null; isProvisioned: boolean; provisionedAt: Date | null; provisionError: string | null; + emailPasswordEncrypted: string | null; }>; export declare function updateEmail(id: number, data: { email?: string; @@ -55,10 +85,12 @@ export declare function updateEmail(id: number, data: { createdAt: Date; updatedAt: Date; notes: string | null; + hasMailbox: boolean; platform: string | null; isProvisioned: boolean; provisionedAt: Date | null; provisionError: string | null; + emailPasswordEncrypted: string | null; }>; export declare function deleteEmail(id: number): Promise<{ id: number; @@ -68,9 +100,27 @@ export declare function deleteEmail(id: number): Promise<{ createdAt: Date; updatedAt: Date; notes: string | null; + hasMailbox: boolean; platform: string | null; isProvisioned: boolean; provisionedAt: Date | null; provisionError: string | null; + emailPasswordEncrypted: string | null; +}>; +export declare function enableMailbox(id: number): Promise<{ + success: boolean; + error?: string; +}>; +export declare function syncMailboxStatus(id: number): Promise<{ + success: boolean; + hasMailbox?: boolean; + wasUpdated?: boolean; + error?: string; +}>; +export declare function getDecryptedPassword(id: number): Promise; +export declare function resetMailboxPassword(id: number): Promise<{ + success: boolean; + password?: string; + error?: string; }>; //# sourceMappingURL=stressfreiEmail.service.d.ts.map \ No newline at end of file diff --git a/backend/dist/services/stressfreiEmail.service.d.ts.map b/backend/dist/services/stressfreiEmail.service.d.ts.map index 1c9b8781..b37603c3 100644 --- a/backend/dist/services/stressfreiEmail.service.d.ts.map +++ b/backend/dist/services/stressfreiEmail.service.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"stressfreiEmail.service.d.ts","sourceRoot":"","sources":["../../src/services/stressfreiEmail.service.ts"],"names":[],"mappings":"AAIA,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,UAAQ;;;;;;;;;;;;KAStF;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;UAI5C;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;;;;;;;;;;;GAOA;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;;;;;;;;;;;;GAMF;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;GAE3C"} \ No newline at end of file +{"version":3,"file":"stressfreiEmail.service.d.ts","sourceRoot":"","sources":["../../src/services/stressfreiEmail.service.ts"],"names":[],"mappings":"AAcA,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,UAAQ;;;;;;;;;;;;;;KAStF;AAGD,wBAAsB,gCAAgC,CAAC,UAAU,EAAE,MAAM;;;;;;;;KAoBxE;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;UAI5C;AAGD,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;UAgBvD;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe;;;;;;;;;;;;;;GAuDtD;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;;;;;;;;;;;;;;GAMF;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;GAE3C;AAGD,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmC7F;AAGD,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAgCD;AAGD,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgB7E;AAGD,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiCvH"} \ No newline at end of file diff --git a/backend/dist/services/stressfreiEmail.service.js b/backend/dist/services/stressfreiEmail.service.js index e6a06f96..85a585d9 100644 --- a/backend/dist/services/stressfreiEmail.service.js +++ b/backend/dist/services/stressfreiEmail.service.js @@ -1,11 +1,20 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getEmailsByCustomerId = getEmailsByCustomerId; +exports.getEmailsWithMailboxByCustomerId = getEmailsWithMailboxByCustomerId; exports.getEmailById = getEmailById; +exports.getEmailWithMailboxById = getEmailWithMailboxById; exports.createEmail = createEmail; exports.updateEmail = updateEmail; exports.deleteEmail = deleteEmail; +exports.enableMailbox = enableMailbox; +exports.syncMailboxStatus = syncMailboxStatus; +exports.getDecryptedPassword = getDecryptedPassword; +exports.resetMailboxPassword = resetMailboxPassword; const client_1 = require("@prisma/client"); +const encryption_js_1 = require("../utils/encryption.js"); +const emailProviderService_js_1 = require("./emailProvider/emailProviderService.js"); +const passwordGenerator_js_1 = require("../utils/passwordGenerator.js"); const prisma = new client_1.PrismaClient(); async function getEmailsByCustomerId(customerId, includeInactive = false) { const where = { customerId }; @@ -17,16 +26,96 @@ async function getEmailsByCustomerId(customerId, includeInactive = false) { orderBy: { createdAt: 'desc' }, }); } +// Mit Mailbox-Status für E-Mail-Client +async function getEmailsWithMailboxByCustomerId(customerId) { + return prisma.stressfreiEmail.findMany({ + where: { + customerId, + isActive: true, + hasMailbox: true, + }, + select: { + id: true, + email: true, + notes: true, + hasMailbox: true, + _count: { + select: { + cachedEmails: true, + }, + }, + }, + orderBy: { email: 'asc' }, + }); +} async function getEmailById(id) { return prisma.stressfreiEmail.findUnique({ where: { id }, }); } +// E-Mail mit Mailbox-Status laden +async function getEmailWithMailboxById(id) { + return prisma.stressfreiEmail.findUnique({ + where: { id }, + select: { + id: true, + customerId: true, + email: true, + platform: true, + notes: true, + isActive: true, + hasMailbox: true, + emailPasswordEncrypted: true, + createdAt: true, + updatedAt: true, + }, + }); +} async function createEmail(data) { + const { provisionAtProvider, createMailbox, ...emailData } = data; + // Falls beim Provider anlegen gewünscht + if (provisionAtProvider) { + // Kunde laden für Weiterleitung + const customer = await prisma.customer.findUnique({ + where: { id: data.customerId }, + select: { email: true }, + }); + if (!customer?.email) { + throw new Error('Kunde hat keine E-Mail-Adresse für Weiterleitung'); + } + // LocalPart extrahieren + const localPart = data.email.split('@')[0]; + if (createMailbox) { + // Mit echter Mailbox anlegen + const password = (0, passwordGenerator_js_1.generateSecurePassword)(); + const result = await (0, emailProviderService_js_1.provisionEmailWithMailbox)(localPart, customer.email, password); + if (!result.success) { + throw new Error(result.error || 'Fehler beim Anlegen der Mailbox'); + } + // Passwort verschlüsseln und speichern + const passwordEncrypted = (0, encryption_js_1.encrypt)(password); + return prisma.stressfreiEmail.create({ + data: { + ...emailData, + isActive: true, + hasMailbox: true, + emailPasswordEncrypted: passwordEncrypted, + }, + }); + } + else { + // Nur Weiterleitung anlegen + const result = await (0, emailProviderService_js_1.provisionEmail)(localPart, customer.email); + if (!result.success && !result.message?.includes('existiert bereits')) { + throw new Error(result.error || 'Fehler beim Anlegen der E-Mail'); + } + } + } return prisma.stressfreiEmail.create({ data: { - ...data, + ...emailData, isActive: true, + hasMailbox: createMailbox || false, }, }); } @@ -39,4 +128,105 @@ async function updateEmail(id, data) { async function deleteEmail(id) { return prisma.stressfreiEmail.delete({ where: { id } }); } +// Mailbox nachträglich aktivieren (für existierende E-Mail-Weiterleitung) +async function enableMailbox(id) { + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id }, + }); + if (!stressfreiEmail) { + return { success: false, error: 'StressfreiEmail nicht gefunden' }; + } + if (stressfreiEmail.hasMailbox) { + return { success: false, error: 'Mailbox ist bereits aktiviert' }; + } + const localPart = stressfreiEmail.email.split('@')[0]; + const password = (0, passwordGenerator_js_1.generateSecurePassword)(); + // Mailbox für existierende E-Mail aktivieren (nicht neu erstellen!) + const result = await (0, emailProviderService_js_1.enableMailboxForExistingEmail)(localPart, password); + if (!result.success) { + return { success: false, error: result.error || 'Fehler beim Aktivieren der Mailbox' }; + } + // Passwort verschlüsseln und speichern + const passwordEncrypted = (0, encryption_js_1.encrypt)(password); + await prisma.stressfreiEmail.update({ + where: { id }, + data: { + hasMailbox: true, + emailPasswordEncrypted: passwordEncrypted, + }, + }); + return { success: true }; +} +// Mailbox-Status mit Provider synchronisieren +async function syncMailboxStatus(id) { + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id }, + select: { email: true, hasMailbox: true }, + }); + if (!stressfreiEmail) { + return { success: false, error: 'StressfreiEmail nicht gefunden' }; + } + const localPart = stressfreiEmail.email.split('@')[0]; + // Provider-Status prüfen + const providerStatus = await (0, emailProviderService_js_1.checkEmailExists)(localPart); + if (!providerStatus.exists) { + return { success: true, hasMailbox: false, wasUpdated: false }; + } + const providerHasMailbox = providerStatus.hasMailbox === true; + // DB aktualisieren wenn Status abweicht + if (stressfreiEmail.hasMailbox !== providerHasMailbox) { + await prisma.stressfreiEmail.update({ + where: { id }, + data: { hasMailbox: providerHasMailbox }, + }); + console.log(`Mailbox-Status für ${stressfreiEmail.email} aktualisiert: ${stressfreiEmail.hasMailbox} -> ${providerHasMailbox}`); + return { success: true, hasMailbox: providerHasMailbox, wasUpdated: true }; + } + return { success: true, hasMailbox: providerHasMailbox, wasUpdated: false }; +} +// Passwort für IMAP/SMTP-Zugang entschlüsseln (nur für autorisierte Nutzung) +async function getDecryptedPassword(id) { + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id }, + select: { emailPasswordEncrypted: true }, + }); + if (!stressfreiEmail?.emailPasswordEncrypted) { + return null; + } + try { + return (0, encryption_js_1.decrypt)(stressfreiEmail.emailPasswordEncrypted); + } + catch { + console.error('Fehler beim Entschlüsseln des Passworts'); + return null; + } +} +// Passwort neu generieren und beim Provider setzen +async function resetMailboxPassword(id) { + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id }, + select: { email: true, hasMailbox: true }, + }); + if (!stressfreiEmail) { + return { success: false, error: 'StressfreiEmail nicht gefunden' }; + } + if (!stressfreiEmail.hasMailbox) { + return { success: false, error: 'Keine Mailbox für diese E-Mail-Adresse' }; + } + // Neues Passwort generieren + const newPassword = (0, passwordGenerator_js_1.generateSecurePassword)(); + const localPart = stressfreiEmail.email.split('@')[0]; + // Passwort beim Provider ändern + const providerResult = await (0, emailProviderService_js_1.updateMailboxPassword)(localPart, newPassword); + if (!providerResult.success) { + return { success: false, error: providerResult.error || 'Fehler beim Aktualisieren des Passworts beim Provider' }; + } + // Passwort verschlüsseln und lokal speichern + const passwordEncrypted = (0, encryption_js_1.encrypt)(newPassword); + await prisma.stressfreiEmail.update({ + where: { id }, + data: { emailPasswordEncrypted: passwordEncrypted }, + }); + return { success: true, password: newPassword }; +} //# sourceMappingURL=stressfreiEmail.service.js.map \ No newline at end of file diff --git a/backend/dist/services/stressfreiEmail.service.js.map b/backend/dist/services/stressfreiEmail.service.js.map index aa3212d0..baa93dd4 100644 --- a/backend/dist/services/stressfreiEmail.service.js.map +++ b/backend/dist/services/stressfreiEmail.service.js.map @@ -1 +1 @@ -{"version":3,"file":"stressfreiEmail.service.js","sourceRoot":"","sources":["../../src/services/stressfreiEmail.service.ts"],"names":[],"mappings":";;AAIA,sDASC;AAED,oCAIC;AAED,kCAYC;AAED,kCAaC;AAED,kCAEC;AApDD,2CAA8C;AAE9C,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;AAE3B,KAAK,UAAU,qBAAqB,CAAC,UAAkB,EAAE,eAAe,GAAG,KAAK;IACrF,MAAM,KAAK,GAA4B,EAAE,UAAU,EAAE,CAAC;IACtD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC;QACrC,KAAK;QACL,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;KAC/B,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,EAAU;IAC3C,OAAO,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC;QACvC,KAAK,EAAE,EAAE,EAAE,EAAE;KACd,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,IAKjC;IACC,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;QACnC,IAAI,EAAE;YACJ,GAAG,IAAI;YACP,QAAQ,EAAE,IAAI;SACf;KACF,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,EAAU,EACV,IAKC;IAED,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;QACnC,KAAK,EAAE,EAAE,EAAE,EAAE;QACb,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC"} \ No newline at end of file +{"version":3,"file":"stressfreiEmail.service.js","sourceRoot":"","sources":["../../src/services/stressfreiEmail.service.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/backend/dist/services/user.service.d.ts b/backend/dist/services/user.service.d.ts index 148c38dc..ff92e3c9 100644 --- a/backend/dist/services/user.service.d.ts +++ b/backend/dist/services/user.service.d.ts @@ -71,6 +71,7 @@ export declare function createUser(data: { lastName: string; roleIds: number[]; customerId?: number; + hasDeveloperAccess?: boolean; }): Promise<{ id: number; email: string; @@ -137,6 +138,7 @@ export declare function deleteUser(id: number): Promise<{ firstName: string; lastName: string; isActive: boolean; + tokenInvalidatedAt: Date | null; createdAt: Date; updatedAt: Date; }>; diff --git a/backend/dist/services/user.service.d.ts.map b/backend/dist/services/user.service.d.ts.map index be467df4..f4ceee54 100644 --- a/backend/dist/services/user.service.d.ts.map +++ b/backend/dist/services/user.service.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqErD;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA0C3C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;;;;;;;;;;;;;;;;;;;GA0BA;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAsHF;AA0DD,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;GA6D1C;AAGD,wBAAsB,WAAW;;;;;;;;;;;;;;;;;;;;MAYhC;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;WAS3C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;;;;;;;;;;;;;;;;;GAeA;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;;;;;;;;;;;;;;;;;WAiBF;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM;;;;;;GAU1C;AAGD,wBAAsB,iBAAiB;;;;KAItC"} \ No newline at end of file +{"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqErD;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA0C3C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;;;;;;;;;;;;;;;;;;;GAiCA;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAwIF;AAoED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;GA6D1C;AAGD,wBAAsB,WAAW;;;;;;;;;;;;;;;;;;;;MAYhC;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;WAS3C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;;;;;;;;;;;;;;;;;GAeA;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;;;;;;;;;;;;;;;;;WAiBF;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM;;;;;;GAU1C;AAGD,wBAAsB,iBAAiB;;;;KAItC"} \ No newline at end of file diff --git a/backend/dist/services/user.service.js b/backend/dist/services/user.service.js index 900c9d69..41f4ecd6 100644 --- a/backend/dist/services/user.service.js +++ b/backend/dist/services/user.service.js @@ -122,7 +122,7 @@ async function getUserById(id) { } async function createUser(data) { const hashedPassword = await bcryptjs_1.default.hash(data.password, 10); - return prisma.user.create({ + const user = await prisma.user.create({ data: { email: data.email, password: hashedPassword, @@ -145,6 +145,11 @@ async function createUser(data) { }, }, }); + // Entwicklerzugriff setzen falls aktiviert + if (data.hasDeveloperAccess) { + await setUserDeveloperAccess(user.id, true); + } + return user; } async function updateUser(id, data) { const { roleIds, password, hasDeveloperAccess, ...userData } = data; @@ -224,10 +229,27 @@ async function updateUser(id, data) { if (password) { userData.password = await bcryptjs_1.default.hash(password, 10); } - // Update user + // Prüfen ob Rollen geändert werden (für Zwangslogout) + let rolesChanged = false; + if (roleIds !== undefined) { + const currentRoles = await prisma.userRole.findMany({ + where: { userId: id }, + select: { roleId: true }, + }); + const currentRoleIds = currentRoles.map((r) => r.roleId).sort(); + const newRoleIds = [...roleIds].sort(); + rolesChanged = + currentRoleIds.length !== newRoleIds.length || + !currentRoleIds.every((id, i) => id === newRoleIds[i]); + } + // Update user - bei Rollenänderung Token invalidieren await prisma.user.update({ where: { id }, - data: userData, + data: { + ...userData, + // Token invalidieren wenn Rollen geändert werden + ...(rolesChanged && { tokenInvalidatedAt: new Date() }), + }, }); // Update roles if provided if (roleIds) { @@ -281,6 +303,11 @@ async function setUserDeveloperAccess(userId, enabled) { await prisma.userRole.create({ data: { userId, roleId: developerRole.id }, }); + // Token invalidieren bei Rechteänderung + await prisma.user.update({ + where: { id: userId }, + data: { tokenInvalidatedAt: new Date() }, + }); } else if (!enabled && hasRole) { // Remove Developer role @@ -288,6 +315,11 @@ async function setUserDeveloperAccess(userId, enabled) { await prisma.userRole.delete({ where: { userId_roleId: { userId, roleId: developerRole.id } }, }); + // Token invalidieren bei Rechteänderung + await prisma.user.update({ + where: { id: userId }, + data: { tokenInvalidatedAt: new Date() }, + }); } else { console.log('No action needed - enabled:', enabled, 'hasRole:', !!hasRole); diff --git a/backend/dist/services/user.service.js.map b/backend/dist/services/user.service.js.map index 52ad90d3..1fc08ce7 100644 --- a/backend/dist/services/user.service.js.map +++ b/backend/dist/services/user.service.js.map @@ -1 +1 @@ -{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":";;;;;AAcA,kCAqEC;AAED,kCA0CC;AAED,gCAiCC;AAED,gCAiIC;AA0DD,gCA6DC;AAGD,kCAYC;AAED,kCASC;AAED,gCAmBC;AAED,gCAuBC;AAED,gCAUC;AAGD,8CAIC;AAvfD,2CAA8C;AAC9C,wDAA8B;AAC9B,oDAAwE;AAExE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;AAU3B,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IACnE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAA,qBAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE7C,MAAM,KAAK,GAA4B,EAAE,CAAC;IAE1C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,EAAE,GAAG;YACT,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC/B,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;YACnC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;SACnC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;YACnB,KAAK;YACL,IAAI;YACJ,IAAI;YACJ,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;YAC9B,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE;oBACL,OAAO,EAAE;wBACP,IAAI,EAAE;4BACJ,OAAO,EAAE;gCACP,WAAW,EAAE,IAAI;6BAClB;yBACF;qBACF;iBACF;aACF;SACF,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;KAC7B,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QAChD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;KAC7B,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,4CAA4C;YAC5C,MAAM,kBAAkB,GAAG,aAAa;gBACtC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,aAAa,CAAC,EAAE,CAAC;gBACtD,CAAC,CAAC,KAAK,CAAC;YACV,OAAO;gBACL,GAAG,CAAC;gBACJ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjC,kBAAkB;aACnB,CAAC;QACJ,CAAC,CAAC;QACF,UAAU,EAAE,IAAA,oCAAuB,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;KACxD,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACxC,KAAK,EAAE,EAAE,EAAE,EAAE;QACb,MAAM,EAAE;YACN,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI;YACf,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP,IAAI,EAAE;wBACJ,OAAO,EAAE;4BACP,WAAW,EAAE;gCACX,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;6BAC9B;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjD,WAAW,CAAC,GAAG,CACb,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CAChE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,IAAI;QACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;KACrC,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,IAOhC;IACC,MAAM,cAAc,GAAG,MAAM,kBAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAE5D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;aACnD;SACF;QACD,MAAM,EAAE;YACN,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE;gBACL,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;aACxB;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,EAAU,EACV,IASC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;IAEpE,4CAA4C;IAC5C,MAAM,kBAAkB,GAAG,QAAQ,CAAC,QAAQ,KAAK,KAAK,CAAC;IACvD,MAAM,oBAAoB,GAAG,OAAO,KAAK,SAAS,CAAC;IAEnD,IAAI,kBAAkB,IAAI,oBAAoB,EAAE,CAAC;QAC/C,gDAAgD;QAChD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/C,KAAK,EAAE,EAAE,EAAE,EAAE;YACb,OAAO,EAAE;gBACP,KAAK,EAAE;oBACL,OAAO,EAAE;wBACP,IAAI,EAAE;4BACJ,OAAO,EAAE;gCACP,WAAW,EAAE;oCACX,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;iCAC9B;6BACF;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CACtD,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CACtB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,QAAQ,CAChF,CACF,CAAC;QAEF,IAAI,gBAAgB,EAAE,CAAC;YACrB,sDAAsD;YACtD,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAC7B,IAAI,oBAAoB,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC1C,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;oBAC9B,OAAO,EAAE;wBACP,WAAW,EAAE;4BACX,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;yBAC9B;qBACF;iBACF,CAAC,CAAC;gBACH,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,QAAQ,CAChF,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,gBAAgB,GAAG,IAAI,CAAC,CAAC,0BAA0B;YACrD,CAAC;YAED,8EAA8E;YAC9E,IAAI,CAAC,gBAAgB,IAAI,kBAAkB,EAAE,CAAC;gBAC5C,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC9C,KAAK,EAAE;wBACL,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;wBACf,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE;4BACL,IAAI,EAAE;gCACJ,IAAI,EAAE;oCACJ,WAAW,EAAE;wCACX,IAAI,EAAE;4CACJ,UAAU,EAAE;gDACV,QAAQ,EAAE,OAAO;gDACjB,MAAM,EAAE,QAAQ;6CACjB;yCACF;qCACF;iCACF;6BACF;yBACF;qBACF;iBACF,CAAC,CAAC;gBAEH,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;oBAC1B,IAAI,kBAAkB,EAAE,CAAC;wBACvB,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,QAAQ,EAAE,CAAC;QACZ,QAAoC,CAAC,QAAQ,GAAG,MAAM,kBAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,cAAc;IACd,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACvB,KAAK,EAAE,EAAE,EAAE,EAAE;QACb,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IAEH,2BAA2B;IAC3B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC/B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,kBAAkB,CAAC,CAAC;IACpE,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,sBAAsB,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,4CAA4C;AAC5C,KAAK,UAAU,sBAAsB,CAAC,MAAc,EAAE,OAAgB;IACpE,OAAO,CAAC,GAAG,CAAC,yCAAyC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAEpF,4CAA4C;IAC5C,IAAI,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;QACpD,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE;KACnD,CAAC,CAAC;IAEH,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YAC7C,IAAI,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE;SAClD,CAAC,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,IAAI,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACvC,IAAI,EAAE;gBACJ,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,sCAAsC;gBACnD,WAAW,EAAE;oBACX,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC;iBAC7C;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC9C,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE;KAC5C,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAEjG,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,qBAAqB;QACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE;SAC3C,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;QAC/B,wBAAwB;QACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3B,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE;SAC/D,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,4BAA4B;IAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACxC,KAAK,EAAE,EAAE,EAAE,EAAE;QACb,OAAO,EAAE;YACP,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP,IAAI,EAAE;wBACJ,OAAO,EAAE;4BACP,WAAW,EAAE;gCACX,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;6BAC9B;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,iEAAiE;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CACrC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CACtB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,QAAQ,CAChF,CACF,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,0DAA0D;QAC1D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YACzC,KAAK,EAAE;gBACL,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;gBACf,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE;wBACJ,IAAI,EAAE;4BACJ,WAAW,EAAE;gCACX,IAAI,EAAE;oCACJ,UAAU,EAAE;wCACV,QAAQ,EAAE,OAAO;wCACjB,MAAM,EAAE,QAAQ;qCACjB;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,kBAAkB;AACX,KAAK,UAAU,WAAW;IAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1B,OAAO,EAAE;YACP,WAAW,EAAE;gBACX,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;aAC9B;YACD,MAAM,EAAE;gBACN,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;aACxB;SACF;QACD,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;KACzB,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5B,KAAK,EAAE,EAAE,EAAE,EAAE;QACb,OAAO,EAAE;YACP,WAAW,EAAE;gBACX,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;aAC9B;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,IAIhC;IACC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE;gBACX,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;aACrE;SACF;QACD,OAAO,EAAE;YACP,WAAW,EAAE;gBACX,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;aAC9B;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,EAAU,EACV,IAIC;IAED,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE5C,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACvB,KAAK,EAAE,EAAE,EAAE,EAAE;QACb,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IAEH,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC;YACrC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;SAC1E,CAAC,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,yCAAyC;IACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,4CAA4C,KAAK,2BAA2B,CAC7E,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,wBAAwB;AACjB,KAAK,UAAU,iBAAiB;IACrC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;QAChC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;KAClD,CAAC,CAAC;AACL,CAAC"} \ No newline at end of file +{"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/backend/dist/types/index.d.ts b/backend/dist/types/index.d.ts index 93de078d..790fd7de 100644 --- a/backend/dist/types/index.d.ts +++ b/backend/dist/types/index.d.ts @@ -6,6 +6,7 @@ export interface JwtPayload { customerId?: number; isCustomerPortal?: boolean; representedCustomerIds?: number[]; + iat?: number; } export interface AuthRequest extends Request { user?: JwtPayload; diff --git a/backend/dist/types/index.d.ts.map b/backend/dist/types/index.d.ts.map index c212a70d..5d15fac8 100644 --- a/backend/dist/types/index.d.ts.map +++ b/backend/dist/types/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAY,SAAQ,OAAO;IAC1C,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH"} \ No newline at end of file diff --git a/backend/node_modules/.package-lock.json b/backend/node_modules/.package-lock.json index 6ba6d058..1e0d8190 100644 --- a/backend/node_modules/.package-lock.json +++ b/backend/node_modules/.package-lock.json @@ -20,6 +20,36 @@ "node": ">=18" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@prisma/client": { "version": "5.22.0", "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", @@ -82,6 +112,36 @@ "@prisma/debug": "5.22.0" } }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/@types/adm-zip": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.7.tgz", + "integrity": "sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/archiver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-7.0.0.tgz", + "integrity": "sha512-/3vwGwx9n+mCQdYZ2IKGGHEFL30I96UgBlk8EtRDDFQ9uxM1l4O5Ci6r00EMAkiDaTqD9DQ6nVrWRICnBPtzzg==", + "dev": true, + "dependencies": { + "@types/readdir-glob": "*" + } + }, "node_modules/@types/bcryptjs": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", @@ -156,6 +216,28 @@ "@types/node": "*" } }, + "node_modules/@types/mailparser": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/@types/mailparser/-/mailparser-3.4.6.tgz", + "integrity": "sha512-wVV3cnIKzxTffaPH8iRnddX1zahbYB1ZEoAxyhoBo3TBCBuK6nZ8M8JYO/RhsCuuBVOw/DEN/t/ENbruwlxn6Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "iconv-lite": "^0.6.3" + } + }, + "node_modules/@types/mailparser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -186,6 +268,15 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/nodemailer": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-7.0.9.tgz", + "integrity": "sha512-vI8oF1M+8JvQhsId0Pc38BdUP2evenIIys7c7p+9OZXSPOH5c1dyINP1jT8xQ2xPuBUXmIC87s+91IZMDjH8Ow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -198,6 +289,15 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, + "node_modules/@types/readdir-glob": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz", + "integrity": "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", @@ -228,6 +328,27 @@ "@types/node": "*" } }, + "node_modules/@zone-eu/mailsplit": { + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/@zone-eu/mailsplit/-/mailsplit-5.4.8.tgz", + "integrity": "sha512-eEyACj4JZ7sjzRvy26QhLgKEMWwQbsw1+QZnlLX+/gihcNH07lVPOcnwf5U6UAL7gkc//J3jVd76o/WS+taUiA==", + "dependencies": { + "libbase64": "1.3.0", + "libmime": "5.3.7", + "libqp": "2.1.1" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -240,16 +361,189 @@ "node": ">= 0.6" } }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -278,6 +572,45 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -334,6 +667,60 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -397,6 +784,65 @@ "node": ">= 0.10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -405,6 +851,14 @@ "ms": "2.0.0" } }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -422,6 +876,57 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dotenv": { "version": "16.6.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", @@ -446,6 +951,11 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -459,6 +969,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -467,6 +982,25 @@ "node": ">= 0.8" } }, + "node_modules/encoding-japanese": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.2.0.tgz", + "integrity": "sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==", + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -548,6 +1082,30 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/express": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", @@ -605,6 +1163,11 @@ "node": ">= 8.0.0" } }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, "node_modules/finalhandler": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", @@ -622,6 +1185,21 @@ "node": ">= 0.8" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -693,6 +1271,25 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -704,6 +1301,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -726,6 +1328,47 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -756,11 +1399,69 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/imapflow": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/imapflow/-/imapflow-1.2.8.tgz", + "integrity": "sha512-ym7FF2tKOlOzfRvxehs4eLkhjP8Mme3sSp2tcxEbyoeJuJwtEWxaVDv12+DnaMG2LXm0zuQGWZiClq31FLPUNg==", + "dependencies": { + "@zone-eu/mailsplit": "5.4.8", + "encoding-japanese": "2.2.0", + "iconv-lite": "0.7.2", + "libbase64": "1.3.0", + "libmime": "5.3.7", + "libqp": "2.1.1", + "nodemailer": "7.0.13", + "pino": "10.3.0", + "socks": "2.8.7" + } + }, + "node_modules/imapflow/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -769,11 +1470,49 @@ "node": ">= 0.10" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", @@ -819,6 +1558,65 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/libbase64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.3.0.tgz", + "integrity": "sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==" + }, + "node_modules/libmime": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.3.7.tgz", + "integrity": "sha512-FlDb3Wtha8P01kTL3P9M+ZDNDWPKPmKHWaU/cG/lg5pfuAwdflVpZE+wm9m7pKmC5ww6s+zTxBKS1p6yl3KpSw==", + "dependencies": { + "encoding-japanese": "2.2.0", + "iconv-lite": "0.6.3", + "libbase64": "1.3.0", + "libqp": "2.1.1" + } + }, + "node_modules/libmime/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/libqp": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-2.1.1.tgz", + "integrity": "sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow==" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -859,6 +1657,43 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/mailparser": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.9.3.tgz", + "integrity": "sha512-AnB0a3zROum6fLaa52L+/K2SoRJVyFDk78Ea6q1D0ofcZLxWEWDtsS1+OrVqKbV7r5dulKL/AwYQccFGAPpuYQ==", + "dependencies": { + "@zone-eu/mailsplit": "5.4.8", + "encoding-japanese": "2.2.0", + "he": "1.2.0", + "html-to-text": "9.0.5", + "iconv-lite": "0.7.2", + "libmime": "5.3.7", + "linkify-it": "5.0.0", + "nodemailer": "7.0.13", + "punycode.js": "2.3.1", + "tlds": "1.261.0" + } + }, + "node_modules/mailparser/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -921,6 +1756,20 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -929,6 +1778,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -971,6 +1828,22 @@ "node": ">= 0.6" } }, + "node_modules/nodemailer": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.13.tgz", + "integrity": "sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -990,6 +1863,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -1001,6 +1882,23 @@ "node": ">= 0.8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1009,11 +1907,76 @@ "node": ">= 0.8" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/pino": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.0.tgz", + "integrity": "sha512-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA==", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==" + }, "node_modules/prisma": { "version": "5.22.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", @@ -1033,11 +1996,34 @@ "fsevents": "2.3.3" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1050,6 +2036,14 @@ "node": ">= 0.10" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.14.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", @@ -1064,6 +2058,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1105,6 +2104,33 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1133,11 +2159,30 @@ } ] }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -1196,6 +2241,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -1264,6 +2328,55 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -1280,6 +2393,16 @@ "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -1293,6 +2416,131 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thread-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", + "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", + "dependencies": { + "real-require": "^0.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tlds": { + "version": "1.261.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz", + "integrity": "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==", + "bin": { + "tlds": "bin.js" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1350,6 +2598,11 @@ "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, "node_modules/undici": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", @@ -1401,6 +2654,104 @@ "node": ">= 0.8" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -1408,6 +2759,42 @@ "engines": { "node": ">=0.4" } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/zip-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } } } } diff --git a/backend/node_modules/.prisma/client/edge.js b/backend/node_modules/.prisma/client/edge.js index 200fe5e5..54283ca3 100644 --- a/backend/node_modules/.prisma/client/edge.js +++ b/backend/node_modules/.prisma/client/edge.js @@ -105,6 +105,7 @@ exports.Prisma.UserScalarFieldEnum = { firstName: 'firstName', lastName: 'lastName', isActive: 'isActive', + tokenInvalidatedAt: 'tokenInvalidatedAt', customerId: 'customerId', createdAt: 'createdAt', updatedAt: 'updatedAt' @@ -227,6 +228,13 @@ exports.Prisma.EmailProviderConfigScalarFieldEnum = { passwordEncrypted: 'passwordEncrypted', domain: 'domain', defaultForwardEmail: 'defaultForwardEmail', + imapServer: 'imapServer', + imapPort: 'imapPort', + smtpServer: 'smtpServer', + smtpPort: 'smtpPort', + imapEncryption: 'imapEncryption', + smtpEncryption: 'smtpEncryption', + allowSelfSignedCerts: 'allowSelfSignedCerts', isActive: 'isActive', isDefault: 'isDefault', createdAt: 'createdAt', @@ -243,6 +251,36 @@ exports.Prisma.StressfreiEmailScalarFieldEnum = { isProvisioned: 'isProvisioned', provisionedAt: 'provisionedAt', provisionError: 'provisionError', + hasMailbox: 'hasMailbox', + emailPasswordEncrypted: 'emailPasswordEncrypted', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +}; + +exports.Prisma.CachedEmailScalarFieldEnum = { + id: 'id', + stressfreiEmailId: 'stressfreiEmailId', + folder: 'folder', + messageId: 'messageId', + uid: 'uid', + subject: 'subject', + fromAddress: 'fromAddress', + fromName: 'fromName', + toAddresses: 'toAddresses', + ccAddresses: 'ccAddresses', + receivedAt: 'receivedAt', + textBody: 'textBody', + htmlBody: 'htmlBody', + hasAttachments: 'hasAttachments', + attachmentNames: 'attachmentNames', + contractId: 'contractId', + assignedAt: 'assignedAt', + assignedBy: 'assignedBy', + isAutoAssigned: 'isAutoAssigned', + isRead: 'isRead', + isStarred: 'isStarred', + isDeleted: 'isDeleted', + deletedAt: 'deletedAt', createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -510,6 +548,17 @@ exports.EmailProviderType = exports.$Enums.EmailProviderType = { DIRECTADMIN: 'DIRECTADMIN' }; +exports.MailEncryption = exports.$Enums.MailEncryption = { + SSL: 'SSL', + STARTTLS: 'STARTTLS', + NONE: 'NONE' +}; + +exports.EmailFolder = exports.$Enums.EmailFolder = { + INBOX: 'INBOX', + SENT: 'SENT' +}; + exports.MeterType = exports.$Enums.MeterType = { ELECTRICITY: 'ELECTRICITY', GAS: 'GAS' @@ -560,6 +609,7 @@ exports.Prisma.ModelName = { IdentityDocument: 'IdentityDocument', EmailProviderConfig: 'EmailProviderConfig', StressfreiEmail: 'StressfreiEmail', + CachedEmail: 'CachedEmail', Meter: 'Meter', MeterReading: 'MeterReading', SalesPlatform: 'SalesPlatform', @@ -617,7 +667,6 @@ const config = { "db" ], "activeProvider": "mysql", - "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -626,13 +675,13 @@ const config = { } } }, - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"mysql\"\n url = env(\"DATABASE_URL\")\n}\n\n// ==================== APP SETTINGS ====================\n\nmodel AppSetting {\n id Int @id @default(autoincrement())\n key String @unique\n value String @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== USERS & AUTH ====================\n\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n password String\n firstName String\n lastName String\n isActive Boolean @default(true)\n customerId Int? @unique\n customer Customer? @relation(fields: [customerId], references: [id])\n roles UserRole[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique\n description String?\n permissions RolePermission[]\n users UserRole[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Permission {\n id Int @id @default(autoincrement())\n resource String\n action String\n roles RolePermission[]\n\n @@unique([resource, action])\n}\n\nmodel RolePermission {\n roleId Int\n permissionId Int\n role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)\n permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade)\n\n @@id([roleId, permissionId])\n}\n\nmodel UserRole {\n userId Int\n roleId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)\n\n @@id([userId, roleId])\n}\n\n// ==================== CUSTOMERS ====================\n\nenum CustomerType {\n PRIVATE\n BUSINESS\n}\n\nmodel Customer {\n id Int @id @default(autoincrement())\n customerNumber String @unique\n type CustomerType @default(PRIVATE)\n salutation String?\n firstName String\n lastName String\n companyName String?\n foundingDate DateTime? // Gründungsdatum (für Firmen)\n birthDate DateTime?\n birthPlace String?\n email String?\n phone String?\n mobile String?\n taxNumber String?\n businessRegistrationPath String? // PDF-Pfad zur Gewerbeanmeldung\n commercialRegisterPath String? // PDF-Pfad zum Handelsregisterauszug\n commercialRegisterNumber String? // Handelsregisternummer (Text)\n privacyPolicyPath String? // PDF-Pfad zur Datenschutzerklärung (für alle Kunden)\n notes String? @db.Text\n\n // ===== Portal-Zugangsdaten =====\n portalEnabled Boolean @default(false) // Portal aktiviert?\n portalEmail String? @unique // Portal-Login E-Mail\n portalPasswordHash String? // Gehashtes Passwort (für Login)\n portalPasswordEncrypted String? // Verschlüsseltes Passwort (für Anzeige)\n portalLastLogin DateTime? // Letzte Anmeldung\n\n user User?\n addresses Address[]\n bankCards BankCard[]\n identityDocuments IdentityDocument[]\n meters Meter[]\n stressfreiEmails StressfreiEmail[]\n contracts Contract[]\n\n // Vertreter-Beziehungen (Kunde kann für andere Kunden handeln)\n representingFor CustomerRepresentative[] @relation(\"RepresentativeCustomer\")\n representedBy CustomerRepresentative[] @relation(\"RepresentedCustomer\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CUSTOMER REPRESENTATIVES ====================\n// Vertretungsbeziehung: Ein Kunde kann die Verträge eines anderen Kunden einsehen\n// z.B. Sohn (representativeId) kann Verträge der Mutter (customerId) sehen\n\nmodel CustomerRepresentative {\n id Int @id @default(autoincrement())\n customerId Int // Der Kunde, dessen Verträge eingesehen werden (z.B. Mutter)\n customer Customer @relation(\"RepresentedCustomer\", fields: [customerId], references: [id], onDelete: Cascade)\n representativeId Int // Der Kunde, der einsehen darf (z.B. Sohn)\n representative Customer @relation(\"RepresentativeCustomer\", fields: [representativeId], references: [id], onDelete: Cascade)\n notes String? // Notizen zur Vertretung\n isActive Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([customerId, representativeId]) // Keine doppelten Einträge\n}\n\n// ==================== ADDRESSES ====================\n\nenum AddressType {\n DELIVERY_RESIDENCE\n BILLING\n}\n\nmodel Address {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type AddressType @default(DELIVERY_RESIDENCE)\n street String\n houseNumber String\n postalCode String\n city String\n country String @default(\"Deutschland\")\n isDefault Boolean @default(false)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== BANK CARDS ====================\n\nmodel BankCard {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n accountHolder String\n iban String\n bic String?\n bankName String?\n expiryDate DateTime?\n documentPath String? // Pfad zur hochgeladenen PDF\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== IDENTITY DOCUMENTS ====================\n\nenum DocumentType {\n ID_CARD\n PASSPORT\n DRIVERS_LICENSE\n OTHER\n}\n\nmodel IdentityDocument {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type DocumentType @default(ID_CARD)\n documentNumber String\n issuingAuthority String?\n issueDate DateTime?\n expiryDate DateTime?\n documentPath String? // Pfad zur hochgeladenen PDF\n isActive Boolean @default(true)\n // Führerschein-spezifische Felder\n licenseClasses String? // z.B. \"B, BE, AM, L\" - kommasepariert\n licenseIssueDate DateTime? // Datum des Führerscheinerwerbs (Klasse B)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== EMAIL PROVIDER CONFIG (Plesk, cPanel etc.) ====================\n\nenum EmailProviderType {\n PLESK\n CPANEL\n DIRECTADMIN\n}\n\nmodel EmailProviderConfig {\n id Int @id @default(autoincrement())\n name String @unique // z.B. \"Plesk Hauptserver\"\n type EmailProviderType\n apiUrl String // API-URL (z.B. https://server.de:8443)\n apiKey String? // API-Key (verschlüsselt)\n username String? // Benutzername für API\n passwordEncrypted String? // Passwort (verschlüsselt)\n domain String // Domain für E-Mails (z.B. stressfrei-wechseln.de)\n defaultForwardEmail String? // Standard-Weiterleitungsadresse (unsere eigene)\n isActive Boolean @default(true)\n isDefault Boolean @default(false) // Standard-Provider\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== STRESSFREI-WECHSELN EMAIL ADDRESSES ====================\n\nmodel StressfreiEmail {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n email String // Die Weiterleitungs-E-Mail-Adresse\n platform String? // Für welche Plattform (z.B. \"Freenet\", \"Klarmobil\")\n notes String? @db.Text // Optionale Notizen\n isActive Boolean @default(true)\n isProvisioned Boolean @default(false) // Wurde bei Provider angelegt?\n provisionedAt DateTime? // Wann wurde provisioniert?\n provisionError String? @db.Text // Fehlermeldung falls Provisionierung fehlschlug\n contracts Contract[] // Verträge die diese E-Mail als Benutzername verwenden\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== METERS (Energy) ====================\n\nenum MeterType {\n ELECTRICITY\n GAS\n}\n\nmodel Meter {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n meterNumber String\n type MeterType\n location String?\n isActive Boolean @default(true)\n readings MeterReading[]\n energyDetails EnergyContractDetails[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel MeterReading {\n id Int @id @default(autoincrement())\n meterId Int\n meter Meter @relation(fields: [meterId], references: [id], onDelete: Cascade)\n readingDate DateTime\n value Float\n unit String @default(\"kWh\")\n notes String?\n createdAt DateTime @default(now())\n}\n\n// ==================== SALES PLATFORMS ====================\n\nmodel SalesPlatform {\n id Int @id @default(autoincrement())\n name String @unique\n contactInfo String? @db.Text\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CANCELLATION PERIODS ====================\n\nmodel CancellationPeriod {\n id Int @id @default(autoincrement())\n code String @unique // z.B. \"14T\", \"1M\", \"3M\", \"12M\", \"1J\"\n description String // z.B. \"14 Tage\", \"1 Monat\", \"3 Monate\"\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACT DURATIONS ====================\n\nmodel ContractDuration {\n id Int @id @default(autoincrement())\n code String @unique // z.B. \"12M\", \"24M\", \"1J\", \"2J\"\n description String // z.B. \"12 Monate\", \"24 Monate\", \"1 Jahr\"\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== PROVIDERS (Anbieter) ====================\n\nmodel Provider {\n id Int @id @default(autoincrement())\n name String @unique // Anbietername\n portalUrl String? // Kundenkontourl (Login-Seite)\n usernameFieldName String? // Benutzernamefeld (z.B. \"email\", \"username\")\n passwordFieldName String? // Kennwortfeld (z.B. \"password\", \"pwd\")\n isActive Boolean @default(true)\n tariffs Tariff[]\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== TARIFFS (Tarife) ====================\n\nmodel Tariff {\n id Int @id @default(autoincrement())\n providerId Int\n provider Provider @relation(fields: [providerId], references: [id], onDelete: Cascade)\n name String // Tarifname\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([providerId, name]) // Eindeutiger Tarif pro Anbieter\n}\n\n// ==================== CONTRACT CATEGORIES ====================\n\nmodel ContractCategory {\n id Int @id @default(autoincrement())\n code String @unique // Technischer Code (z.B. ELECTRICITY, GAS)\n name String // Anzeigename (z.B. Strom, Gas)\n icon String? // Icon-Name für UI (z.B. \"Zap\", \"Flame\")\n color String? // Farbe für UI (z.B. \"#FFC107\")\n sortOrder Int @default(0)\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACTS ====================\n\n// Legacy Enum - wird durch ContractCategory ersetzt\nenum ContractType {\n ELECTRICITY\n GAS\n DSL\n CABLE\n FIBER\n MOBILE\n TV\n CAR_INSURANCE\n}\n\nenum ContractStatus {\n DRAFT\n PENDING\n ACTIVE\n CANCELLED\n EXPIRED\n DEACTIVATED\n}\n\nmodel Contract {\n id Int @id @default(autoincrement())\n contractNumber String @unique\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type ContractType\n status ContractStatus @default(DRAFT)\n\n // Neue konfigurierbare Kategorie (ersetzt langfristig das type-Enum)\n contractCategoryId Int?\n contractCategory ContractCategory? @relation(fields: [contractCategoryId], references: [id])\n\n addressId Int?\n address Address? @relation(fields: [addressId], references: [id])\n\n bankCardId Int?\n bankCard BankCard? @relation(fields: [bankCardId], references: [id])\n\n identityDocumentId Int?\n identityDocument IdentityDocument? @relation(fields: [identityDocumentId], references: [id])\n\n salesPlatformId Int?\n salesPlatform SalesPlatform? @relation(fields: [salesPlatformId], references: [id])\n\n cancellationPeriodId Int?\n cancellationPeriod CancellationPeriod? @relation(fields: [cancellationPeriodId], references: [id])\n\n contractDurationId Int?\n contractDuration ContractDuration? @relation(fields: [contractDurationId], references: [id])\n\n previousContractId Int? @unique\n previousContract Contract? @relation(\"ContractHistory\", fields: [previousContractId], references: [id])\n followUpContract Contract? @relation(\"ContractHistory\")\n\n // Anbieter & Tarif (neue Verknüpfung)\n providerId Int?\n provider Provider? @relation(fields: [providerId], references: [id])\n tariffId Int?\n tariff Tariff? @relation(fields: [tariffId], references: [id])\n\n // Legacy-Felder (für Abwärtskompatibilität)\n providerName String?\n tariffName String?\n customerNumberAtProvider String?\n priceFirst12Months String? // Preis erste 12 Monate\n priceFrom13Months String? // Preis ab 13. Monat\n priceAfter24Months String? // Preis nach 24 Monaten\n\n startDate DateTime?\n endDate DateTime? // Wird aus startDate + contractDuration berechnet\n commission Float?\n\n // Kündigungsdokumente\n cancellationLetterPath String? // Kündigungsschreiben PDF\n cancellationConfirmationPath String? // Kündigungsbestätigung PDF\n cancellationLetterOptionsPath String? // Kündigungsschreiben Optionen PDF\n cancellationConfirmationOptionsPath String? // Kündigungsbestätigung Optionen PDF\n\n // Kündigungsdaten\n cancellationConfirmationDate DateTime? // Kündigungsbestätigungsdatum\n cancellationConfirmationOptionsDate DateTime? // Kündigungsbestätigungsoptionendatum\n wasSpecialCancellation Boolean @default(false) // Wurde sondergekündigt?\n\n portalUsername String?\n portalPasswordEncrypted String?\n\n // Stressfrei-Wechseln E-Mail als Benutzername (Alternative zu portalUsername)\n stressfreiEmailId Int?\n stressfreiEmail StressfreiEmail? @relation(fields: [stressfreiEmailId], references: [id])\n\n notes String? @db.Text\n\n energyDetails EnergyContractDetails?\n internetDetails InternetContractDetails?\n mobileDetails MobileContractDetails?\n tvDetails TvContractDetails?\n carInsuranceDetails CarInsuranceDetails?\n\n tasks ContractTask[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACT TASKS ====================\n\nenum ContractTaskStatus {\n OPEN\n COMPLETED\n}\n\nmodel ContractTask {\n id Int @id @default(autoincrement())\n contractId Int\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n title String\n description String? @db.Text\n status ContractTaskStatus @default(OPEN)\n visibleInPortal Boolean @default(false)\n createdBy String? // Name des Erstellers\n completedAt DateTime?\n subtasks ContractTaskSubtask[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ContractTaskSubtask {\n id Int @id @default(autoincrement())\n taskId Int\n task ContractTask @relation(fields: [taskId], references: [id], onDelete: Cascade)\n title String\n status ContractTaskStatus @default(OPEN)\n createdBy String?\n completedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== ENERGY CONTRACT DETAILS ====================\n\nmodel EnergyContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n meterId Int?\n meter Meter? @relation(fields: [meterId], references: [id])\n annualConsumption Float?\n basePrice Float?\n unitPrice Float?\n bonus Float?\n previousProviderName String?\n previousCustomerNumber String?\n}\n\n// ==================== INTERNET CONTRACT DETAILS ====================\n\nmodel InternetContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n downloadSpeed Int?\n uploadSpeed Int?\n routerModel String?\n routerSerialNumber String?\n installationDate DateTime?\n // Internet-Zugangsdaten\n internetUsername String?\n internetPasswordEncrypted String? // Verschlüsselt gespeichert\n // Glasfaser-spezifisch\n homeId String?\n // Vodafone DSL/Kabel spezifisch\n activationCode String?\n phoneNumbers PhoneNumber[]\n}\n\nmodel PhoneNumber {\n id Int @id @default(autoincrement())\n internetContractDetailsId Int\n internetDetails InternetContractDetails @relation(fields: [internetContractDetailsId], references: [id], onDelete: Cascade)\n phoneNumber String\n isMain Boolean @default(false)\n // SIP-Zugangsdaten\n sipUsername String?\n sipPasswordEncrypted String? // Verschlüsselt gespeichert\n sipServer String?\n}\n\n// ==================== MOBILE CONTRACT DETAILS ====================\n\nmodel MobileContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n requiresMultisim Boolean @default(false) // Multisim erforderlich?\n dataVolume Float?\n includedMinutes Int?\n includedSMS Int?\n deviceModel String?\n deviceImei String?\n simCards SimCard[]\n // Legacy-Felder (für Abwärtskompatibilität, werden durch simCards ersetzt)\n phoneNumber String?\n simCardNumber String?\n}\n\nmodel SimCard {\n id Int @id @default(autoincrement())\n mobileDetailsId Int\n mobileDetails MobileContractDetails @relation(fields: [mobileDetailsId], references: [id], onDelete: Cascade)\n phoneNumber String? // Rufnummer\n simCardNumber String? // SIM-Kartennummer\n pin String? // PIN (verschlüsselt gespeichert)\n puk String? // PUK (verschlüsselt gespeichert)\n isMultisim Boolean @default(false) // Ist dies eine Multisim-Karte?\n isMain Boolean @default(false) // Ist dies die Hauptkarte?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== TV CONTRACT DETAILS ====================\n\nmodel TvContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n receiverModel String?\n smartcardNumber String?\n package String?\n}\n\n// ==================== CAR INSURANCE DETAILS ====================\n\nenum InsuranceType {\n LIABILITY\n PARTIAL\n FULL\n}\n\nmodel CarInsuranceDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n licensePlate String?\n hsn String?\n tsn String?\n vin String?\n vehicleType String?\n firstRegistration DateTime?\n noClaimsClass String?\n insuranceType InsuranceType @default(LIABILITY)\n deductiblePartial Float?\n deductibleFull Float?\n policyNumber String?\n previousInsurer String?\n}\n", - "inlineSchemaHash": "36ecbca17fa945f160ba1bb4a7cfa1b4971e63c59c4e05b0dcc483003048b598", + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"mysql\"\n url = env(\"DATABASE_URL\")\n}\n\n// ==================== APP SETTINGS ====================\n\nmodel AppSetting {\n id Int @id @default(autoincrement())\n key String @unique\n value String @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== USERS & AUTH ====================\n\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n password String\n firstName String\n lastName String\n isActive Boolean @default(true)\n tokenInvalidatedAt DateTime? // Zeitpunkt ab dem alle Tokens ungültig sind (für Zwangslogout bei Rechteänderung)\n customerId Int? @unique\n customer Customer? @relation(fields: [customerId], references: [id])\n roles UserRole[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique\n description String?\n permissions RolePermission[]\n users UserRole[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Permission {\n id Int @id @default(autoincrement())\n resource String\n action String\n roles RolePermission[]\n\n @@unique([resource, action])\n}\n\nmodel RolePermission {\n roleId Int\n permissionId Int\n role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)\n permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade)\n\n @@id([roleId, permissionId])\n}\n\nmodel UserRole {\n userId Int\n roleId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)\n\n @@id([userId, roleId])\n}\n\n// ==================== CUSTOMERS ====================\n\nenum CustomerType {\n PRIVATE\n BUSINESS\n}\n\nmodel Customer {\n id Int @id @default(autoincrement())\n customerNumber String @unique\n type CustomerType @default(PRIVATE)\n salutation String?\n firstName String\n lastName String\n companyName String?\n foundingDate DateTime? // Gründungsdatum (für Firmen)\n birthDate DateTime?\n birthPlace String?\n email String?\n phone String?\n mobile String?\n taxNumber String?\n businessRegistrationPath String? // PDF-Pfad zur Gewerbeanmeldung\n commercialRegisterPath String? // PDF-Pfad zum Handelsregisterauszug\n commercialRegisterNumber String? // Handelsregisternummer (Text)\n privacyPolicyPath String? // PDF-Pfad zur Datenschutzerklärung (für alle Kunden)\n notes String? @db.Text\n\n // ===== Portal-Zugangsdaten =====\n portalEnabled Boolean @default(false) // Portal aktiviert?\n portalEmail String? @unique // Portal-Login E-Mail\n portalPasswordHash String? // Gehashtes Passwort (für Login)\n portalPasswordEncrypted String? // Verschlüsseltes Passwort (für Anzeige)\n portalLastLogin DateTime? // Letzte Anmeldung\n\n user User?\n addresses Address[]\n bankCards BankCard[]\n identityDocuments IdentityDocument[]\n meters Meter[]\n stressfreiEmails StressfreiEmail[]\n contracts Contract[]\n\n // Vertreter-Beziehungen (Kunde kann für andere Kunden handeln)\n representingFor CustomerRepresentative[] @relation(\"RepresentativeCustomer\")\n representedBy CustomerRepresentative[] @relation(\"RepresentedCustomer\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CUSTOMER REPRESENTATIVES ====================\n// Vertretungsbeziehung: Ein Kunde kann die Verträge eines anderen Kunden einsehen\n// z.B. Sohn (representativeId) kann Verträge der Mutter (customerId) sehen\n\nmodel CustomerRepresentative {\n id Int @id @default(autoincrement())\n customerId Int // Der Kunde, dessen Verträge eingesehen werden (z.B. Mutter)\n customer Customer @relation(\"RepresentedCustomer\", fields: [customerId], references: [id], onDelete: Cascade)\n representativeId Int // Der Kunde, der einsehen darf (z.B. Sohn)\n representative Customer @relation(\"RepresentativeCustomer\", fields: [representativeId], references: [id], onDelete: Cascade)\n notes String? // Notizen zur Vertretung\n isActive Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([customerId, representativeId]) // Keine doppelten Einträge\n}\n\n// ==================== ADDRESSES ====================\n\nenum AddressType {\n DELIVERY_RESIDENCE\n BILLING\n}\n\nmodel Address {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type AddressType @default(DELIVERY_RESIDENCE)\n street String\n houseNumber String\n postalCode String\n city String\n country String @default(\"Deutschland\")\n isDefault Boolean @default(false)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== BANK CARDS ====================\n\nmodel BankCard {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n accountHolder String\n iban String\n bic String?\n bankName String?\n expiryDate DateTime?\n documentPath String? // Pfad zur hochgeladenen PDF\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== IDENTITY DOCUMENTS ====================\n\nenum DocumentType {\n ID_CARD\n PASSPORT\n DRIVERS_LICENSE\n OTHER\n}\n\nmodel IdentityDocument {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type DocumentType @default(ID_CARD)\n documentNumber String\n issuingAuthority String?\n issueDate DateTime?\n expiryDate DateTime?\n documentPath String? // Pfad zur hochgeladenen PDF\n isActive Boolean @default(true)\n // Führerschein-spezifische Felder\n licenseClasses String? // z.B. \"B, BE, AM, L\" - kommasepariert\n licenseIssueDate DateTime? // Datum des Führerscheinerwerbs (Klasse B)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== EMAIL PROVIDER CONFIG (Plesk, cPanel etc.) ====================\n\nenum EmailProviderType {\n PLESK\n CPANEL\n DIRECTADMIN\n}\n\n// Verschlüsselungstyp für E-Mail-Verbindungen\nenum MailEncryption {\n SSL // Implicit SSL/TLS (Ports 465/993) - Verschlüsselung von Anfang an\n STARTTLS // STARTTLS (Ports 587/143) - Startet unverschlüsselt, dann Upgrade\n NONE // Keine Verschlüsselung (Ports 25/143)\n}\n\nmodel EmailProviderConfig {\n id Int @id @default(autoincrement())\n name String @unique // z.B. \"Plesk Hauptserver\"\n type EmailProviderType\n apiUrl String // API-URL (z.B. https://server.de:8443)\n apiKey String? // API-Key (verschlüsselt)\n username String? // Benutzername für API\n passwordEncrypted String? // Passwort (verschlüsselt)\n domain String // Domain für E-Mails (z.B. stressfrei-wechseln.de)\n defaultForwardEmail String? // Standard-Weiterleitungsadresse (unsere eigene)\n\n // IMAP/SMTP-Server für E-Mail-Client (optional, default: mail.{domain})\n imapServer String? // z.B. \"mail.stressfrei-wechseln.de\"\n imapPort Int? @default(993)\n smtpServer String?\n smtpPort Int? @default(465)\n\n // Verschlüsselungs-Einstellungen\n imapEncryption MailEncryption @default(SSL) // SSL, STARTTLS oder NONE\n smtpEncryption MailEncryption @default(SSL) // SSL, STARTTLS oder NONE\n allowSelfSignedCerts Boolean @default(false) // Selbstsignierte Zertifikate erlauben\n\n isActive Boolean @default(true)\n isDefault Boolean @default(false) // Standard-Provider\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== STRESSFREI-WECHSELN EMAIL ADDRESSES ====================\n\nmodel StressfreiEmail {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n email String // Die Weiterleitungs-E-Mail-Adresse\n platform String? // Für welche Plattform (z.B. \"Freenet\", \"Klarmobil\")\n notes String? @db.Text // Optionale Notizen\n isActive Boolean @default(true)\n isProvisioned Boolean @default(false) // Wurde bei Provider angelegt?\n provisionedAt DateTime? // Wann wurde provisioniert?\n provisionError String? @db.Text // Fehlermeldung falls Provisionierung fehlschlug\n\n // Mailbox-Zugangsdaten (für IMAP/SMTP-Zugang)\n hasMailbox Boolean @default(false) // Hat echte Mailbox (nicht nur Weiterleitung)?\n emailPasswordEncrypted String? // Verschlüsseltes Mailbox-Passwort (AES-256-GCM)\n\n contracts Contract[] // Verträge die diese E-Mail als Benutzername verwenden\n cachedEmails CachedEmail[] // Gecachte E-Mails aus dieser Mailbox\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CACHED EMAILS (E-Mail-Client) ====================\n\nenum EmailFolder {\n INBOX\n SENT\n}\n\nmodel CachedEmail {\n id Int @id @default(autoincrement())\n stressfreiEmailId Int\n stressfreiEmail StressfreiEmail @relation(fields: [stressfreiEmailId], references: [id], onDelete: Cascade)\n\n // Ordner (Posteingang oder Gesendet)\n folder EmailFolder @default(INBOX)\n\n // IMAP-Identifikation\n messageId String // RFC 5322 Message-ID\n uid Int // IMAP UID (für Synchronisierung, bei SENT = 0)\n\n // E-Mail-Metadaten\n subject String?\n fromAddress String\n fromName String?\n toAddresses String @db.Text // JSON Array\n ccAddresses String? @db.Text // JSON Array\n receivedAt DateTime\n\n // Inhalt\n textBody String? @db.LongText\n htmlBody String? @db.LongText\n hasAttachments Boolean @default(false)\n attachmentNames String? @db.Text // JSON Array\n\n // Vertragszuordnung\n contractId Int?\n contract Contract? @relation(fields: [contractId], references: [id], onDelete: SetNull)\n assignedAt DateTime?\n assignedBy Int? // User ID der die Zuordnung gemacht hat\n isAutoAssigned Boolean @default(false) // true = automatisch beim Senden aus Vertrag\n\n // Flags\n isRead Boolean @default(false)\n isStarred Boolean @default(false)\n\n // Papierkorb\n isDeleted Boolean @default(false) // Im Papierkorb?\n deletedAt DateTime? // Wann gelöscht?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([stressfreiEmailId, messageId, folder]) // Folder hinzugefügt: gleiche MessageID kann in INBOX und SENT existieren\n @@index([contractId])\n @@index([stressfreiEmailId, folder, receivedAt])\n @@index([stressfreiEmailId, isDeleted]) // Für Papierkorb-Abfragen\n}\n\n// ==================== METERS (Energy) ====================\n\nenum MeterType {\n ELECTRICITY\n GAS\n}\n\nmodel Meter {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n meterNumber String\n type MeterType\n location String?\n isActive Boolean @default(true)\n readings MeterReading[]\n energyDetails EnergyContractDetails[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel MeterReading {\n id Int @id @default(autoincrement())\n meterId Int\n meter Meter @relation(fields: [meterId], references: [id], onDelete: Cascade)\n readingDate DateTime\n value Float\n unit String @default(\"kWh\")\n notes String?\n createdAt DateTime @default(now())\n}\n\n// ==================== SALES PLATFORMS ====================\n\nmodel SalesPlatform {\n id Int @id @default(autoincrement())\n name String @unique\n contactInfo String? @db.Text\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CANCELLATION PERIODS ====================\n\nmodel CancellationPeriod {\n id Int @id @default(autoincrement())\n code String @unique // z.B. \"14T\", \"1M\", \"3M\", \"12M\", \"1J\"\n description String // z.B. \"14 Tage\", \"1 Monat\", \"3 Monate\"\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACT DURATIONS ====================\n\nmodel ContractDuration {\n id Int @id @default(autoincrement())\n code String @unique // z.B. \"12M\", \"24M\", \"1J\", \"2J\"\n description String // z.B. \"12 Monate\", \"24 Monate\", \"1 Jahr\"\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== PROVIDERS (Anbieter) ====================\n\nmodel Provider {\n id Int @id @default(autoincrement())\n name String @unique // Anbietername\n portalUrl String? // Kundenkontourl (Login-Seite)\n usernameFieldName String? // Benutzernamefeld (z.B. \"email\", \"username\")\n passwordFieldName String? // Kennwortfeld (z.B. \"password\", \"pwd\")\n isActive Boolean @default(true)\n tariffs Tariff[]\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== TARIFFS (Tarife) ====================\n\nmodel Tariff {\n id Int @id @default(autoincrement())\n providerId Int\n provider Provider @relation(fields: [providerId], references: [id], onDelete: Cascade)\n name String // Tarifname\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([providerId, name]) // Eindeutiger Tarif pro Anbieter\n}\n\n// ==================== CONTRACT CATEGORIES ====================\n\nmodel ContractCategory {\n id Int @id @default(autoincrement())\n code String @unique // Technischer Code (z.B. ELECTRICITY, GAS)\n name String // Anzeigename (z.B. Strom, Gas)\n icon String? // Icon-Name für UI (z.B. \"Zap\", \"Flame\")\n color String? // Farbe für UI (z.B. \"#FFC107\")\n sortOrder Int @default(0)\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACTS ====================\n\n// Legacy Enum - wird durch ContractCategory ersetzt\nenum ContractType {\n ELECTRICITY\n GAS\n DSL\n CABLE\n FIBER\n MOBILE\n TV\n CAR_INSURANCE\n}\n\nenum ContractStatus {\n DRAFT\n PENDING\n ACTIVE\n CANCELLED\n EXPIRED\n DEACTIVATED\n}\n\nmodel Contract {\n id Int @id @default(autoincrement())\n contractNumber String @unique\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type ContractType\n status ContractStatus @default(DRAFT)\n\n // Neue konfigurierbare Kategorie (ersetzt langfristig das type-Enum)\n contractCategoryId Int?\n contractCategory ContractCategory? @relation(fields: [contractCategoryId], references: [id])\n\n addressId Int?\n address Address? @relation(fields: [addressId], references: [id])\n\n bankCardId Int?\n bankCard BankCard? @relation(fields: [bankCardId], references: [id])\n\n identityDocumentId Int?\n identityDocument IdentityDocument? @relation(fields: [identityDocumentId], references: [id])\n\n salesPlatformId Int?\n salesPlatform SalesPlatform? @relation(fields: [salesPlatformId], references: [id])\n\n cancellationPeriodId Int?\n cancellationPeriod CancellationPeriod? @relation(fields: [cancellationPeriodId], references: [id])\n\n contractDurationId Int?\n contractDuration ContractDuration? @relation(fields: [contractDurationId], references: [id])\n\n previousContractId Int? @unique\n previousContract Contract? @relation(\"ContractHistory\", fields: [previousContractId], references: [id])\n followUpContract Contract? @relation(\"ContractHistory\")\n\n // Anbieter & Tarif (neue Verknüpfung)\n providerId Int?\n provider Provider? @relation(fields: [providerId], references: [id])\n tariffId Int?\n tariff Tariff? @relation(fields: [tariffId], references: [id])\n\n // Legacy-Felder (für Abwärtskompatibilität)\n providerName String?\n tariffName String?\n customerNumberAtProvider String?\n priceFirst12Months String? // Preis erste 12 Monate\n priceFrom13Months String? // Preis ab 13. Monat\n priceAfter24Months String? // Preis nach 24 Monaten\n\n startDate DateTime?\n endDate DateTime? // Wird aus startDate + contractDuration berechnet\n commission Float?\n\n // Kündigungsdokumente\n cancellationLetterPath String? // Kündigungsschreiben PDF\n cancellationConfirmationPath String? // Kündigungsbestätigung PDF\n cancellationLetterOptionsPath String? // Kündigungsschreiben Optionen PDF\n cancellationConfirmationOptionsPath String? // Kündigungsbestätigung Optionen PDF\n\n // Kündigungsdaten\n cancellationConfirmationDate DateTime? // Kündigungsbestätigungsdatum\n cancellationConfirmationOptionsDate DateTime? // Kündigungsbestätigungsoptionendatum\n wasSpecialCancellation Boolean @default(false) // Wurde sondergekündigt?\n\n portalUsername String?\n portalPasswordEncrypted String?\n\n // Stressfrei-Wechseln E-Mail als Benutzername (Alternative zu portalUsername)\n stressfreiEmailId Int?\n stressfreiEmail StressfreiEmail? @relation(fields: [stressfreiEmailId], references: [id])\n\n notes String? @db.Text\n\n energyDetails EnergyContractDetails?\n internetDetails InternetContractDetails?\n mobileDetails MobileContractDetails?\n tvDetails TvContractDetails?\n carInsuranceDetails CarInsuranceDetails?\n\n tasks ContractTask[]\n assignedEmails CachedEmail[] // Zugeordnete E-Mails aus dem E-Mail-Client\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACT TASKS ====================\n\nenum ContractTaskStatus {\n OPEN\n COMPLETED\n}\n\nmodel ContractTask {\n id Int @id @default(autoincrement())\n contractId Int\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n title String\n description String? @db.Text\n status ContractTaskStatus @default(OPEN)\n visibleInPortal Boolean @default(false)\n createdBy String? // Name des Erstellers\n completedAt DateTime?\n subtasks ContractTaskSubtask[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ContractTaskSubtask {\n id Int @id @default(autoincrement())\n taskId Int\n task ContractTask @relation(fields: [taskId], references: [id], onDelete: Cascade)\n title String\n status ContractTaskStatus @default(OPEN)\n createdBy String?\n completedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== ENERGY CONTRACT DETAILS ====================\n\nmodel EnergyContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n meterId Int?\n meter Meter? @relation(fields: [meterId], references: [id])\n annualConsumption Float?\n basePrice Float?\n unitPrice Float?\n bonus Float?\n previousProviderName String?\n previousCustomerNumber String?\n}\n\n// ==================== INTERNET CONTRACT DETAILS ====================\n\nmodel InternetContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n downloadSpeed Int?\n uploadSpeed Int?\n routerModel String?\n routerSerialNumber String?\n installationDate DateTime?\n // Internet-Zugangsdaten\n internetUsername String?\n internetPasswordEncrypted String? // Verschlüsselt gespeichert\n // Glasfaser-spezifisch\n homeId String?\n // Vodafone DSL/Kabel spezifisch\n activationCode String?\n phoneNumbers PhoneNumber[]\n}\n\nmodel PhoneNumber {\n id Int @id @default(autoincrement())\n internetContractDetailsId Int\n internetDetails InternetContractDetails @relation(fields: [internetContractDetailsId], references: [id], onDelete: Cascade)\n phoneNumber String\n isMain Boolean @default(false)\n // SIP-Zugangsdaten\n sipUsername String?\n sipPasswordEncrypted String? // Verschlüsselt gespeichert\n sipServer String?\n}\n\n// ==================== MOBILE CONTRACT DETAILS ====================\n\nmodel MobileContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n requiresMultisim Boolean @default(false) // Multisim erforderlich?\n dataVolume Float?\n includedMinutes Int?\n includedSMS Int?\n deviceModel String?\n deviceImei String?\n simCards SimCard[]\n // Legacy-Felder (für Abwärtskompatibilität, werden durch simCards ersetzt)\n phoneNumber String?\n simCardNumber String?\n}\n\nmodel SimCard {\n id Int @id @default(autoincrement())\n mobileDetailsId Int\n mobileDetails MobileContractDetails @relation(fields: [mobileDetailsId], references: [id], onDelete: Cascade)\n phoneNumber String? // Rufnummer\n simCardNumber String? // SIM-Kartennummer\n pin String? // PIN (verschlüsselt gespeichert)\n puk String? // PUK (verschlüsselt gespeichert)\n isMultisim Boolean @default(false) // Ist dies eine Multisim-Karte?\n isMain Boolean @default(false) // Ist dies die Hauptkarte?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== TV CONTRACT DETAILS ====================\n\nmodel TvContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n receiverModel String?\n smartcardNumber String?\n package String?\n}\n\n// ==================== CAR INSURANCE DETAILS ====================\n\nenum InsuranceType {\n LIABILITY\n PARTIAL\n FULL\n}\n\nmodel CarInsuranceDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n licensePlate String?\n hsn String?\n tsn String?\n vin String?\n vehicleType String?\n firstRegistration DateTime?\n noClaimsClass String?\n insuranceType InsuranceType @default(LIABILITY)\n deductiblePartial Float?\n deductibleFull Float?\n policyNumber String?\n previousInsurer String?\n}\n", + "inlineSchemaHash": "0275307bf5bad35d995156e9cf00dc7906b05135b28bd545b6e7e6322aaa01ab", "copyEngine": true } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"AppSetting\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"password\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToUser\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Role\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permissions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RolePermission\",\"relationName\":\"RoleToRolePermission\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"users\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UserRole\",\"relationName\":\"RoleToUserRole\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Permission\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"action\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RolePermission\",\"relationName\":\"PermissionToRolePermission\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"resource\",\"action\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"resource\",\"action\"]}],\"isGenerated\":false},\"RolePermission\":{\"dbName\":null,\"fields\":[{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permissionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Role\",\"relationName\":\"RoleToRolePermission\",\"relationFromFields\":[\"roleId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permission\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Permission\",\"relationName\":\"PermissionToRolePermission\",\"relationFromFields\":[\"permissionId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"roleId\",\"permissionId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"UserRole\":{\"dbName\":null,\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"UserToUserRole\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Role\",\"relationName\":\"RoleToUserRole\",\"relationFromFields\":[\"roleId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"userId\",\"roleId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Customer\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"CustomerType\",\"default\":\"PRIVATE\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salutation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"companyName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"foundingDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"birthDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"birthPlace\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phone\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobile\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taxNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"businessRegistrationPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commercialRegisterPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commercialRegisterNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"privacyPolicyPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalEmail\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordHash\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalLastLogin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"CustomerToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addresses\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Address\",\"relationName\":\"AddressToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCards\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BankCard\",\"relationName\":\"BankCardToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocuments\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"IdentityDocument\",\"relationName\":\"CustomerToIdentityDocument\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meters\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"CustomerToMeter\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"CustomerToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representingFor\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CustomerRepresentative\",\"relationName\":\"RepresentativeCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representedBy\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CustomerRepresentative\",\"relationName\":\"RepresentedCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CustomerRepresentative\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"RepresentedCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representativeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representative\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"RepresentativeCustomer\",\"relationFromFields\":[\"representativeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"customerId\",\"representativeId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"customerId\",\"representativeId\"]}],\"isGenerated\":false},\"Address\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"AddressToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"AddressType\",\"default\":\"DELIVERY_RESIDENCE\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"street\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"houseNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"Deutschland\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"AddressToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"BankCard\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"BankCardToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accountHolder\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"iban\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bic\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiryDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"BankCardToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"IdentityDocument\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToIdentityDocument\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DocumentType\",\"default\":\"ID_CARD\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issuingAuthority\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issueDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiryDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licenseClasses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licenseIssueDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToIdentityDocument\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"EmailProviderConfig\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EmailProviderType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"apiUrl\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"apiKey\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"domain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultForwardEmail\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"StressfreiEmail\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToStressfreiEmail\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"platform\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isProvisioned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provisionedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provisionError\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Meter\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToMeter\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MeterType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"location\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"readings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MeterReading\",\"relationName\":\"MeterToMeterReading\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"energyDetails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EnergyContractDetails\",\"relationName\":\"EnergyContractDetailsToMeter\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MeterReading\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meter\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"MeterToMeterReading\",\"relationFromFields\":[\"meterId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"readingDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unit\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"kWh\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"SalesPlatform\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contactInfo\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToSalesPlatform\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CancellationPeriod\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CancellationPeriodToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractDuration\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractDuration\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Provider\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalUrl\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"usernameFieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordFieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tariff\",\"relationName\":\"ProviderToTariff\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToProvider\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Tariff\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Provider\",\"relationName\":\"ProviderToTariff\",\"relationFromFields\":[\"providerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToTariff\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"providerId\",\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"providerId\",\"name\"]}],\"isGenerated\":false},\"ContractCategory\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"icon\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"color\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractCategory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Contract\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"ContractToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractStatus\",\"default\":\"DRAFT\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractCategoryId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractCategory\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractCategory\",\"relationName\":\"ContractToContractCategory\",\"relationFromFields\":[\"contractCategoryId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addressId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"address\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Address\",\"relationName\":\"AddressToContract\",\"relationFromFields\":[\"addressId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCard\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BankCard\",\"relationName\":\"BankCardToContract\",\"relationFromFields\":[\"bankCardId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocumentId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocument\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"IdentityDocument\",\"relationName\":\"ContractToIdentityDocument\",\"relationFromFields\":[\"identityDocumentId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salesPlatformId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salesPlatform\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SalesPlatform\",\"relationName\":\"ContractToSalesPlatform\",\"relationFromFields\":[\"salesPlatformId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationPeriodId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationPeriod\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CancellationPeriod\",\"relationName\":\"CancellationPeriodToContract\",\"relationFromFields\":[\"cancellationPeriodId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractDurationId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractDuration\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractDuration\",\"relationName\":\"ContractToContractDuration\",\"relationFromFields\":[\"contractDurationId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousContractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousContract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractHistory\",\"relationFromFields\":[\"previousContractId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"followUpContract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Provider\",\"relationName\":\"ContractToProvider\",\"relationFromFields\":[\"providerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariff\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tariff\",\"relationName\":\"ContractToTariff\",\"relationFromFields\":[\"tariffId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerNumberAtProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceFirst12Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceFrom13Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceAfter24Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commission\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationLetterPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationLetterOptionsPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationOptionsPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationOptionsDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wasSpecialCancellation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmailId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmail\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"ContractToStressfreiEmail\",\"relationFromFields\":[\"stressfreiEmailId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"energyDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EnergyContractDetails\",\"relationName\":\"ContractToEnergyContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"InternetContractDetails\",\"relationName\":\"ContractToInternetContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MobileContractDetails\",\"relationName\":\"ContractToMobileContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tvDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TvContractDetails\",\"relationName\":\"ContractToTvContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"carInsuranceDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CarInsuranceDetails\",\"relationName\":\"CarInsuranceDetailsToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tasks\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTask\",\"relationName\":\"ContractToContractTask\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractTask\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractTask\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractTaskStatus\",\"default\":\"OPEN\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"visibleInPortal\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subtasks\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTaskSubtask\",\"relationName\":\"ContractTaskToContractTaskSubtask\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractTaskSubtask\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"task\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTask\",\"relationName\":\"ContractTaskToContractTaskSubtask\",\"relationFromFields\":[\"taskId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractTaskStatus\",\"default\":\"OPEN\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"EnergyContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToEnergyContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meter\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"EnergyContractDetailsToMeter\",\"relationFromFields\":[\"meterId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"annualConsumption\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unitPrice\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bonus\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousProviderName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousCustomerNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"InternetContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToInternetContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"downloadSpeed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"uploadSpeed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routerModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routerSerialNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"installationDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"homeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"activationCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumbers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PhoneNumber\",\"relationName\":\"InternetContractDetailsToPhoneNumber\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PhoneNumber\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetContractDetailsId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"InternetContractDetails\",\"relationName\":\"InternetContractDetailsToPhoneNumber\",\"relationFromFields\":[\"internetContractDetailsId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipServer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MobileContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToMobileContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"requiresMultisim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"dataVolume\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"includedMinutes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"includedSMS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deviceModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deviceImei\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCards\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SimCard\",\"relationName\":\"MobileContractDetailsToSimCard\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"SimCard\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetailsId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MobileContractDetails\",\"relationName\":\"MobileContractDetailsToSimCard\",\"relationFromFields\":[\"mobileDetailsId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"puk\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMultisim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TvContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToTvContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receiverModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smartcardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"package\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CarInsuranceDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CarInsuranceDetailsToContract\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licensePlate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hsn\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tsn\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vehicleType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstRegistration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"noClaimsClass\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"insuranceType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"InsuranceType\",\"default\":\"LIABILITY\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deductiblePartial\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deductibleFull\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"policyNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousInsurer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"CustomerType\":{\"values\":[{\"name\":\"PRIVATE\",\"dbName\":null},{\"name\":\"BUSINESS\",\"dbName\":null}],\"dbName\":null},\"AddressType\":{\"values\":[{\"name\":\"DELIVERY_RESIDENCE\",\"dbName\":null},{\"name\":\"BILLING\",\"dbName\":null}],\"dbName\":null},\"DocumentType\":{\"values\":[{\"name\":\"ID_CARD\",\"dbName\":null},{\"name\":\"PASSPORT\",\"dbName\":null},{\"name\":\"DRIVERS_LICENSE\",\"dbName\":null},{\"name\":\"OTHER\",\"dbName\":null}],\"dbName\":null},\"EmailProviderType\":{\"values\":[{\"name\":\"PLESK\",\"dbName\":null},{\"name\":\"CPANEL\",\"dbName\":null},{\"name\":\"DIRECTADMIN\",\"dbName\":null}],\"dbName\":null},\"MeterType\":{\"values\":[{\"name\":\"ELECTRICITY\",\"dbName\":null},{\"name\":\"GAS\",\"dbName\":null}],\"dbName\":null},\"ContractType\":{\"values\":[{\"name\":\"ELECTRICITY\",\"dbName\":null},{\"name\":\"GAS\",\"dbName\":null},{\"name\":\"DSL\",\"dbName\":null},{\"name\":\"CABLE\",\"dbName\":null},{\"name\":\"FIBER\",\"dbName\":null},{\"name\":\"MOBILE\",\"dbName\":null},{\"name\":\"TV\",\"dbName\":null},{\"name\":\"CAR_INSURANCE\",\"dbName\":null}],\"dbName\":null},\"ContractStatus\":{\"values\":[{\"name\":\"DRAFT\",\"dbName\":null},{\"name\":\"PENDING\",\"dbName\":null},{\"name\":\"ACTIVE\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"EXPIRED\",\"dbName\":null},{\"name\":\"DEACTIVATED\",\"dbName\":null}],\"dbName\":null},\"ContractTaskStatus\":{\"values\":[{\"name\":\"OPEN\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null}],\"dbName\":null},\"InsuranceType\":{\"values\":[{\"name\":\"LIABILITY\",\"dbName\":null},{\"name\":\"PARTIAL\",\"dbName\":null},{\"name\":\"FULL\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"AppSetting\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"password\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tokenInvalidatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToUser\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Role\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permissions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RolePermission\",\"relationName\":\"RoleToRolePermission\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"users\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UserRole\",\"relationName\":\"RoleToUserRole\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Permission\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"action\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RolePermission\",\"relationName\":\"PermissionToRolePermission\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"resource\",\"action\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"resource\",\"action\"]}],\"isGenerated\":false},\"RolePermission\":{\"dbName\":null,\"fields\":[{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permissionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Role\",\"relationName\":\"RoleToRolePermission\",\"relationFromFields\":[\"roleId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permission\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Permission\",\"relationName\":\"PermissionToRolePermission\",\"relationFromFields\":[\"permissionId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"roleId\",\"permissionId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"UserRole\":{\"dbName\":null,\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"UserToUserRole\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Role\",\"relationName\":\"RoleToUserRole\",\"relationFromFields\":[\"roleId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"userId\",\"roleId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Customer\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"CustomerType\",\"default\":\"PRIVATE\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salutation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"companyName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"foundingDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"birthDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"birthPlace\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phone\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobile\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taxNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"businessRegistrationPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commercialRegisterPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commercialRegisterNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"privacyPolicyPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalEmail\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordHash\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalLastLogin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"CustomerToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addresses\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Address\",\"relationName\":\"AddressToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCards\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BankCard\",\"relationName\":\"BankCardToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocuments\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"IdentityDocument\",\"relationName\":\"CustomerToIdentityDocument\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meters\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"CustomerToMeter\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"CustomerToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representingFor\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CustomerRepresentative\",\"relationName\":\"RepresentativeCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representedBy\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CustomerRepresentative\",\"relationName\":\"RepresentedCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CustomerRepresentative\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"RepresentedCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representativeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representative\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"RepresentativeCustomer\",\"relationFromFields\":[\"representativeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"customerId\",\"representativeId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"customerId\",\"representativeId\"]}],\"isGenerated\":false},\"Address\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"AddressToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"AddressType\",\"default\":\"DELIVERY_RESIDENCE\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"street\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"houseNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"Deutschland\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"AddressToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"BankCard\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"BankCardToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accountHolder\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"iban\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bic\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiryDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"BankCardToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"IdentityDocument\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToIdentityDocument\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DocumentType\",\"default\":\"ID_CARD\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issuingAuthority\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issueDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiryDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licenseClasses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licenseIssueDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToIdentityDocument\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"EmailProviderConfig\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EmailProviderType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"apiUrl\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"apiKey\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"domain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultForwardEmail\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapServer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":993,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpServer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":465,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapEncryption\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"MailEncryption\",\"default\":\"SSL\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpEncryption\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"MailEncryption\",\"default\":\"SSL\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"allowSelfSignedCerts\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"StressfreiEmail\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToStressfreiEmail\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"platform\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isProvisioned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provisionedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provisionError\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hasMailbox\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"emailPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cachedEmails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CachedEmail\",\"relationName\":\"CachedEmailToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CachedEmail\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmailId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmail\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"CachedEmailToStressfreiEmail\",\"relationFromFields\":[\"stressfreiEmailId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folder\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"EmailFolder\",\"default\":\"INBOX\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"messageId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"uid\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subject\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fromAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fromName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"toAddresses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ccAddresses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receivedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"textBody\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"htmlBody\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hasAttachments\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"attachmentNames\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CachedEmailToContract\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"SetNull\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assignedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assignedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isAutoAssigned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isRead\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isStarred\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDeleted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"stressfreiEmailId\",\"messageId\",\"folder\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"stressfreiEmailId\",\"messageId\",\"folder\"]}],\"isGenerated\":false},\"Meter\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToMeter\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MeterType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"location\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"readings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MeterReading\",\"relationName\":\"MeterToMeterReading\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"energyDetails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EnergyContractDetails\",\"relationName\":\"EnergyContractDetailsToMeter\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MeterReading\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meter\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"MeterToMeterReading\",\"relationFromFields\":[\"meterId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"readingDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unit\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"kWh\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"SalesPlatform\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contactInfo\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToSalesPlatform\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CancellationPeriod\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CancellationPeriodToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractDuration\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractDuration\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Provider\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalUrl\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"usernameFieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordFieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tariff\",\"relationName\":\"ProviderToTariff\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToProvider\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Tariff\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Provider\",\"relationName\":\"ProviderToTariff\",\"relationFromFields\":[\"providerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToTariff\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"providerId\",\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"providerId\",\"name\"]}],\"isGenerated\":false},\"ContractCategory\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"icon\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"color\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractCategory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Contract\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"ContractToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractStatus\",\"default\":\"DRAFT\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractCategoryId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractCategory\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractCategory\",\"relationName\":\"ContractToContractCategory\",\"relationFromFields\":[\"contractCategoryId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addressId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"address\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Address\",\"relationName\":\"AddressToContract\",\"relationFromFields\":[\"addressId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCard\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BankCard\",\"relationName\":\"BankCardToContract\",\"relationFromFields\":[\"bankCardId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocumentId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocument\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"IdentityDocument\",\"relationName\":\"ContractToIdentityDocument\",\"relationFromFields\":[\"identityDocumentId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salesPlatformId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salesPlatform\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SalesPlatform\",\"relationName\":\"ContractToSalesPlatform\",\"relationFromFields\":[\"salesPlatformId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationPeriodId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationPeriod\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CancellationPeriod\",\"relationName\":\"CancellationPeriodToContract\",\"relationFromFields\":[\"cancellationPeriodId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractDurationId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractDuration\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractDuration\",\"relationName\":\"ContractToContractDuration\",\"relationFromFields\":[\"contractDurationId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousContractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousContract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractHistory\",\"relationFromFields\":[\"previousContractId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"followUpContract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Provider\",\"relationName\":\"ContractToProvider\",\"relationFromFields\":[\"providerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariff\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tariff\",\"relationName\":\"ContractToTariff\",\"relationFromFields\":[\"tariffId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerNumberAtProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceFirst12Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceFrom13Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceAfter24Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commission\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationLetterPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationLetterOptionsPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationOptionsPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationOptionsDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wasSpecialCancellation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmailId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmail\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"ContractToStressfreiEmail\",\"relationFromFields\":[\"stressfreiEmailId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"energyDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EnergyContractDetails\",\"relationName\":\"ContractToEnergyContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"InternetContractDetails\",\"relationName\":\"ContractToInternetContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MobileContractDetails\",\"relationName\":\"ContractToMobileContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tvDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TvContractDetails\",\"relationName\":\"ContractToTvContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"carInsuranceDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CarInsuranceDetails\",\"relationName\":\"CarInsuranceDetailsToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tasks\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTask\",\"relationName\":\"ContractToContractTask\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assignedEmails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CachedEmail\",\"relationName\":\"CachedEmailToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractTask\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractTask\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractTaskStatus\",\"default\":\"OPEN\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"visibleInPortal\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subtasks\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTaskSubtask\",\"relationName\":\"ContractTaskToContractTaskSubtask\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractTaskSubtask\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"task\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTask\",\"relationName\":\"ContractTaskToContractTaskSubtask\",\"relationFromFields\":[\"taskId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractTaskStatus\",\"default\":\"OPEN\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"EnergyContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToEnergyContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meter\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"EnergyContractDetailsToMeter\",\"relationFromFields\":[\"meterId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"annualConsumption\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unitPrice\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bonus\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousProviderName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousCustomerNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"InternetContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToInternetContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"downloadSpeed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"uploadSpeed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routerModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routerSerialNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"installationDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"homeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"activationCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumbers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PhoneNumber\",\"relationName\":\"InternetContractDetailsToPhoneNumber\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PhoneNumber\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetContractDetailsId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"InternetContractDetails\",\"relationName\":\"InternetContractDetailsToPhoneNumber\",\"relationFromFields\":[\"internetContractDetailsId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipServer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MobileContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToMobileContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"requiresMultisim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"dataVolume\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"includedMinutes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"includedSMS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deviceModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deviceImei\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCards\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SimCard\",\"relationName\":\"MobileContractDetailsToSimCard\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"SimCard\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetailsId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MobileContractDetails\",\"relationName\":\"MobileContractDetailsToSimCard\",\"relationFromFields\":[\"mobileDetailsId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"puk\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMultisim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TvContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToTvContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receiverModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smartcardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"package\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CarInsuranceDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CarInsuranceDetailsToContract\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licensePlate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hsn\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tsn\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vehicleType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstRegistration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"noClaimsClass\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"insuranceType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"InsuranceType\",\"default\":\"LIABILITY\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deductiblePartial\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deductibleFull\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"policyNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousInsurer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"CustomerType\":{\"values\":[{\"name\":\"PRIVATE\",\"dbName\":null},{\"name\":\"BUSINESS\",\"dbName\":null}],\"dbName\":null},\"AddressType\":{\"values\":[{\"name\":\"DELIVERY_RESIDENCE\",\"dbName\":null},{\"name\":\"BILLING\",\"dbName\":null}],\"dbName\":null},\"DocumentType\":{\"values\":[{\"name\":\"ID_CARD\",\"dbName\":null},{\"name\":\"PASSPORT\",\"dbName\":null},{\"name\":\"DRIVERS_LICENSE\",\"dbName\":null},{\"name\":\"OTHER\",\"dbName\":null}],\"dbName\":null},\"EmailProviderType\":{\"values\":[{\"name\":\"PLESK\",\"dbName\":null},{\"name\":\"CPANEL\",\"dbName\":null},{\"name\":\"DIRECTADMIN\",\"dbName\":null}],\"dbName\":null},\"MailEncryption\":{\"values\":[{\"name\":\"SSL\",\"dbName\":null},{\"name\":\"STARTTLS\",\"dbName\":null},{\"name\":\"NONE\",\"dbName\":null}],\"dbName\":null},\"EmailFolder\":{\"values\":[{\"name\":\"INBOX\",\"dbName\":null},{\"name\":\"SENT\",\"dbName\":null}],\"dbName\":null},\"MeterType\":{\"values\":[{\"name\":\"ELECTRICITY\",\"dbName\":null},{\"name\":\"GAS\",\"dbName\":null}],\"dbName\":null},\"ContractType\":{\"values\":[{\"name\":\"ELECTRICITY\",\"dbName\":null},{\"name\":\"GAS\",\"dbName\":null},{\"name\":\"DSL\",\"dbName\":null},{\"name\":\"CABLE\",\"dbName\":null},{\"name\":\"FIBER\",\"dbName\":null},{\"name\":\"MOBILE\",\"dbName\":null},{\"name\":\"TV\",\"dbName\":null},{\"name\":\"CAR_INSURANCE\",\"dbName\":null}],\"dbName\":null},\"ContractStatus\":{\"values\":[{\"name\":\"DRAFT\",\"dbName\":null},{\"name\":\"PENDING\",\"dbName\":null},{\"name\":\"ACTIVE\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"EXPIRED\",\"dbName\":null},{\"name\":\"DEACTIVATED\",\"dbName\":null}],\"dbName\":null},\"ContractTaskStatus\":{\"values\":[{\"name\":\"OPEN\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null}],\"dbName\":null},\"InsuranceType\":{\"values\":[{\"name\":\"LIABILITY\",\"dbName\":null},{\"name\":\"PARTIAL\",\"dbName\":null},{\"name\":\"FULL\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/backend/node_modules/.prisma/client/index-browser.js b/backend/node_modules/.prisma/client/index-browser.js index 788cdf87..f2d10b1d 100644 --- a/backend/node_modules/.prisma/client/index-browser.js +++ b/backend/node_modules/.prisma/client/index-browser.js @@ -137,6 +137,7 @@ exports.Prisma.UserScalarFieldEnum = { firstName: 'firstName', lastName: 'lastName', isActive: 'isActive', + tokenInvalidatedAt: 'tokenInvalidatedAt', customerId: 'customerId', createdAt: 'createdAt', updatedAt: 'updatedAt' @@ -259,6 +260,13 @@ exports.Prisma.EmailProviderConfigScalarFieldEnum = { passwordEncrypted: 'passwordEncrypted', domain: 'domain', defaultForwardEmail: 'defaultForwardEmail', + imapServer: 'imapServer', + imapPort: 'imapPort', + smtpServer: 'smtpServer', + smtpPort: 'smtpPort', + imapEncryption: 'imapEncryption', + smtpEncryption: 'smtpEncryption', + allowSelfSignedCerts: 'allowSelfSignedCerts', isActive: 'isActive', isDefault: 'isDefault', createdAt: 'createdAt', @@ -275,6 +283,36 @@ exports.Prisma.StressfreiEmailScalarFieldEnum = { isProvisioned: 'isProvisioned', provisionedAt: 'provisionedAt', provisionError: 'provisionError', + hasMailbox: 'hasMailbox', + emailPasswordEncrypted: 'emailPasswordEncrypted', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +}; + +exports.Prisma.CachedEmailScalarFieldEnum = { + id: 'id', + stressfreiEmailId: 'stressfreiEmailId', + folder: 'folder', + messageId: 'messageId', + uid: 'uid', + subject: 'subject', + fromAddress: 'fromAddress', + fromName: 'fromName', + toAddresses: 'toAddresses', + ccAddresses: 'ccAddresses', + receivedAt: 'receivedAt', + textBody: 'textBody', + htmlBody: 'htmlBody', + hasAttachments: 'hasAttachments', + attachmentNames: 'attachmentNames', + contractId: 'contractId', + assignedAt: 'assignedAt', + assignedBy: 'assignedBy', + isAutoAssigned: 'isAutoAssigned', + isRead: 'isRead', + isStarred: 'isStarred', + isDeleted: 'isDeleted', + deletedAt: 'deletedAt', createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -542,6 +580,17 @@ exports.EmailProviderType = exports.$Enums.EmailProviderType = { DIRECTADMIN: 'DIRECTADMIN' }; +exports.MailEncryption = exports.$Enums.MailEncryption = { + SSL: 'SSL', + STARTTLS: 'STARTTLS', + NONE: 'NONE' +}; + +exports.EmailFolder = exports.$Enums.EmailFolder = { + INBOX: 'INBOX', + SENT: 'SENT' +}; + exports.MeterType = exports.$Enums.MeterType = { ELECTRICITY: 'ELECTRICITY', GAS: 'GAS' @@ -592,6 +641,7 @@ exports.Prisma.ModelName = { IdentityDocument: 'IdentityDocument', EmailProviderConfig: 'EmailProviderConfig', StressfreiEmail: 'StressfreiEmail', + CachedEmail: 'CachedEmail', Meter: 'Meter', MeterReading: 'MeterReading', SalesPlatform: 'SalesPlatform', diff --git a/backend/node_modules/.prisma/client/index.d.ts b/backend/node_modules/.prisma/client/index.d.ts index 938e39df..6764fc5c 100644 --- a/backend/node_modules/.prisma/client/index.d.ts +++ b/backend/node_modules/.prisma/client/index.d.ts @@ -78,6 +78,11 @@ export type EmailProviderConfig = $Result.DefaultSelection +/** + * Model CachedEmail + * + */ +export type CachedEmail = $Result.DefaultSelection /** * Model Meter * @@ -208,6 +213,23 @@ export const EmailProviderType: { export type EmailProviderType = (typeof EmailProviderType)[keyof typeof EmailProviderType] +export const MailEncryption: { + SSL: 'SSL', + STARTTLS: 'STARTTLS', + NONE: 'NONE' +}; + +export type MailEncryption = (typeof MailEncryption)[keyof typeof MailEncryption] + + +export const EmailFolder: { + INBOX: 'INBOX', + SENT: 'SENT' +}; + +export type EmailFolder = (typeof EmailFolder)[keyof typeof EmailFolder] + + export const MeterType: { ELECTRICITY: 'ELECTRICITY', GAS: 'GAS' @@ -276,6 +298,14 @@ export type EmailProviderType = $Enums.EmailProviderType export const EmailProviderType: typeof $Enums.EmailProviderType +export type MailEncryption = $Enums.MailEncryption + +export const MailEncryption: typeof $Enums.MailEncryption + +export type EmailFolder = $Enums.EmailFolder + +export const EmailFolder: typeof $Enums.EmailFolder + export type MeterType = $Enums.MeterType export const MeterType: typeof $Enums.MeterType @@ -549,6 +579,16 @@ export class PrismaClient< */ get stressfreiEmail(): Prisma.StressfreiEmailDelegate; + /** + * `prisma.cachedEmail`: Exposes CRUD operations for the **CachedEmail** model. + * Example usage: + * ```ts + * // Fetch zero or more CachedEmails + * const cachedEmails = await prisma.cachedEmail.findMany() + * ``` + */ + get cachedEmail(): Prisma.CachedEmailDelegate; + /** * `prisma.meter`: Exposes CRUD operations for the **Meter** model. * Example usage: @@ -1182,6 +1222,7 @@ export namespace Prisma { IdentityDocument: 'IdentityDocument', EmailProviderConfig: 'EmailProviderConfig', StressfreiEmail: 'StressfreiEmail', + CachedEmail: 'CachedEmail', Meter: 'Meter', MeterReading: 'MeterReading', SalesPlatform: 'SalesPlatform', @@ -1215,7 +1256,7 @@ export namespace Prisma { export type TypeMap = { meta: { - modelProps: "appSetting" | "user" | "role" | "permission" | "rolePermission" | "userRole" | "customer" | "customerRepresentative" | "address" | "bankCard" | "identityDocument" | "emailProviderConfig" | "stressfreiEmail" | "meter" | "meterReading" | "salesPlatform" | "cancellationPeriod" | "contractDuration" | "provider" | "tariff" | "contractCategory" | "contract" | "contractTask" | "contractTaskSubtask" | "energyContractDetails" | "internetContractDetails" | "phoneNumber" | "mobileContractDetails" | "simCard" | "tvContractDetails" | "carInsuranceDetails" + modelProps: "appSetting" | "user" | "role" | "permission" | "rolePermission" | "userRole" | "customer" | "customerRepresentative" | "address" | "bankCard" | "identityDocument" | "emailProviderConfig" | "stressfreiEmail" | "cachedEmail" | "meter" | "meterReading" | "salesPlatform" | "cancellationPeriod" | "contractDuration" | "provider" | "tariff" | "contractCategory" | "contract" | "contractTask" | "contractTaskSubtask" | "energyContractDetails" | "internetContractDetails" | "phoneNumber" | "mobileContractDetails" | "simCard" | "tvContractDetails" | "carInsuranceDetails" txIsolationLevel: Prisma.TransactionIsolationLevel } model: { @@ -2077,6 +2118,72 @@ export namespace Prisma { } } } + CachedEmail: { + payload: Prisma.$CachedEmailPayload + fields: Prisma.CachedEmailFieldRefs + operations: { + findUnique: { + args: Prisma.CachedEmailFindUniqueArgs + result: $Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.CachedEmailFindUniqueOrThrowArgs + result: $Utils.PayloadToResult + } + findFirst: { + args: Prisma.CachedEmailFindFirstArgs + result: $Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.CachedEmailFindFirstOrThrowArgs + result: $Utils.PayloadToResult + } + findMany: { + args: Prisma.CachedEmailFindManyArgs + result: $Utils.PayloadToResult[] + } + create: { + args: Prisma.CachedEmailCreateArgs + result: $Utils.PayloadToResult + } + createMany: { + args: Prisma.CachedEmailCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.CachedEmailDeleteArgs + result: $Utils.PayloadToResult + } + update: { + args: Prisma.CachedEmailUpdateArgs + result: $Utils.PayloadToResult + } + deleteMany: { + args: Prisma.CachedEmailDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.CachedEmailUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.CachedEmailUpsertArgs + result: $Utils.PayloadToResult + } + aggregate: { + args: Prisma.CachedEmailAggregateArgs + result: $Utils.Optional + } + groupBy: { + args: Prisma.CachedEmailGroupByArgs + result: $Utils.Optional[] + } + count: { + args: Prisma.CachedEmailCountArgs + result: $Utils.Optional | number + } + } + } Meter: { payload: Prisma.$MeterPayload fields: Prisma.MeterFieldRefs @@ -3716,10 +3823,12 @@ export namespace Prisma { export type StressfreiEmailCountOutputType = { contracts: number + cachedEmails: number } export type StressfreiEmailCountOutputTypeSelect = { contracts?: boolean | StressfreiEmailCountOutputTypeCountContractsArgs + cachedEmails?: boolean | StressfreiEmailCountOutputTypeCountCachedEmailsArgs } // Custom InputTypes @@ -3740,6 +3849,13 @@ export namespace Prisma { where?: ContractWhereInput } + /** + * StressfreiEmailCountOutputType without action + */ + export type StressfreiEmailCountOutputTypeCountCachedEmailsArgs = { + where?: CachedEmailWhereInput + } + /** * Count Type MeterCountOutputType @@ -3982,10 +4098,12 @@ export namespace Prisma { export type ContractCountOutputType = { tasks: number + assignedEmails: number } export type ContractCountOutputTypeSelect = { tasks?: boolean | ContractCountOutputTypeCountTasksArgs + assignedEmails?: boolean | ContractCountOutputTypeCountAssignedEmailsArgs } // Custom InputTypes @@ -4006,6 +4124,13 @@ export namespace Prisma { where?: ContractTaskWhereInput } + /** + * ContractCountOutputType without action + */ + export type ContractCountOutputTypeCountAssignedEmailsArgs = { + where?: CachedEmailWhereInput + } + /** * Count Type ContractTaskCountOutputType @@ -4999,6 +5124,7 @@ export namespace Prisma { firstName: string | null lastName: string | null isActive: boolean | null + tokenInvalidatedAt: Date | null customerId: number | null createdAt: Date | null updatedAt: Date | null @@ -5011,6 +5137,7 @@ export namespace Prisma { firstName: string | null lastName: string | null isActive: boolean | null + tokenInvalidatedAt: Date | null customerId: number | null createdAt: Date | null updatedAt: Date | null @@ -5023,6 +5150,7 @@ export namespace Prisma { firstName: number lastName: number isActive: number + tokenInvalidatedAt: number customerId: number createdAt: number updatedAt: number @@ -5047,6 +5175,7 @@ export namespace Prisma { firstName?: true lastName?: true isActive?: true + tokenInvalidatedAt?: true customerId?: true createdAt?: true updatedAt?: true @@ -5059,6 +5188,7 @@ export namespace Prisma { firstName?: true lastName?: true isActive?: true + tokenInvalidatedAt?: true customerId?: true createdAt?: true updatedAt?: true @@ -5071,6 +5201,7 @@ export namespace Prisma { firstName?: true lastName?: true isActive?: true + tokenInvalidatedAt?: true customerId?: true createdAt?: true updatedAt?: true @@ -5170,6 +5301,7 @@ export namespace Prisma { firstName: string lastName: string isActive: boolean + tokenInvalidatedAt: Date | null customerId: number | null createdAt: Date updatedAt: Date @@ -5201,6 +5333,7 @@ export namespace Prisma { firstName?: boolean lastName?: boolean isActive?: boolean + tokenInvalidatedAt?: boolean customerId?: boolean createdAt?: boolean updatedAt?: boolean @@ -5217,6 +5350,7 @@ export namespace Prisma { firstName?: boolean lastName?: boolean isActive?: boolean + tokenInvalidatedAt?: boolean customerId?: boolean createdAt?: boolean updatedAt?: boolean @@ -5241,6 +5375,7 @@ export namespace Prisma { firstName: string lastName: string isActive: boolean + tokenInvalidatedAt: Date | null customerId: number | null createdAt: Date updatedAt: Date @@ -5621,6 +5756,7 @@ export namespace Prisma { readonly firstName: FieldRef<"User", 'String'> readonly lastName: FieldRef<"User", 'String'> readonly isActive: FieldRef<"User", 'Boolean'> + readonly tokenInvalidatedAt: FieldRef<"User", 'DateTime'> readonly customerId: FieldRef<"User", 'Int'> readonly createdAt: FieldRef<"User", 'DateTime'> readonly updatedAt: FieldRef<"User", 'DateTime'> @@ -14983,10 +15119,14 @@ export namespace Prisma { export type EmailProviderConfigAvgAggregateOutputType = { id: number | null + imapPort: number | null + smtpPort: number | null } export type EmailProviderConfigSumAggregateOutputType = { id: number | null + imapPort: number | null + smtpPort: number | null } export type EmailProviderConfigMinAggregateOutputType = { @@ -14999,6 +15139,13 @@ export namespace Prisma { passwordEncrypted: string | null domain: string | null defaultForwardEmail: string | null + imapServer: string | null + imapPort: number | null + smtpServer: string | null + smtpPort: number | null + imapEncryption: $Enums.MailEncryption | null + smtpEncryption: $Enums.MailEncryption | null + allowSelfSignedCerts: boolean | null isActive: boolean | null isDefault: boolean | null createdAt: Date | null @@ -15015,6 +15162,13 @@ export namespace Prisma { passwordEncrypted: string | null domain: string | null defaultForwardEmail: string | null + imapServer: string | null + imapPort: number | null + smtpServer: string | null + smtpPort: number | null + imapEncryption: $Enums.MailEncryption | null + smtpEncryption: $Enums.MailEncryption | null + allowSelfSignedCerts: boolean | null isActive: boolean | null isDefault: boolean | null createdAt: Date | null @@ -15031,6 +15185,13 @@ export namespace Prisma { passwordEncrypted: number domain: number defaultForwardEmail: number + imapServer: number + imapPort: number + smtpServer: number + smtpPort: number + imapEncryption: number + smtpEncryption: number + allowSelfSignedCerts: number isActive: number isDefault: number createdAt: number @@ -15041,10 +15202,14 @@ export namespace Prisma { export type EmailProviderConfigAvgAggregateInputType = { id?: true + imapPort?: true + smtpPort?: true } export type EmailProviderConfigSumAggregateInputType = { id?: true + imapPort?: true + smtpPort?: true } export type EmailProviderConfigMinAggregateInputType = { @@ -15057,6 +15222,13 @@ export namespace Prisma { passwordEncrypted?: true domain?: true defaultForwardEmail?: true + imapServer?: true + imapPort?: true + smtpServer?: true + smtpPort?: true + imapEncryption?: true + smtpEncryption?: true + allowSelfSignedCerts?: true isActive?: true isDefault?: true createdAt?: true @@ -15073,6 +15245,13 @@ export namespace Prisma { passwordEncrypted?: true domain?: true defaultForwardEmail?: true + imapServer?: true + imapPort?: true + smtpServer?: true + smtpPort?: true + imapEncryption?: true + smtpEncryption?: true + allowSelfSignedCerts?: true isActive?: true isDefault?: true createdAt?: true @@ -15089,6 +15268,13 @@ export namespace Prisma { passwordEncrypted?: true domain?: true defaultForwardEmail?: true + imapServer?: true + imapPort?: true + smtpServer?: true + smtpPort?: true + imapEncryption?: true + smtpEncryption?: true + allowSelfSignedCerts?: true isActive?: true isDefault?: true createdAt?: true @@ -15192,6 +15378,13 @@ export namespace Prisma { passwordEncrypted: string | null domain: string defaultForwardEmail: string | null + imapServer: string | null + imapPort: number | null + smtpServer: string | null + smtpPort: number | null + imapEncryption: $Enums.MailEncryption + smtpEncryption: $Enums.MailEncryption + allowSelfSignedCerts: boolean isActive: boolean isDefault: boolean createdAt: Date @@ -15227,6 +15420,13 @@ export namespace Prisma { passwordEncrypted?: boolean domain?: boolean defaultForwardEmail?: boolean + imapServer?: boolean + imapPort?: boolean + smtpServer?: boolean + smtpPort?: boolean + imapEncryption?: boolean + smtpEncryption?: boolean + allowSelfSignedCerts?: boolean isActive?: boolean isDefault?: boolean createdAt?: boolean @@ -15244,6 +15444,13 @@ export namespace Prisma { passwordEncrypted?: boolean domain?: boolean defaultForwardEmail?: boolean + imapServer?: boolean + imapPort?: boolean + smtpServer?: boolean + smtpPort?: boolean + imapEncryption?: boolean + smtpEncryption?: boolean + allowSelfSignedCerts?: boolean isActive?: boolean isDefault?: boolean createdAt?: boolean @@ -15264,6 +15471,13 @@ export namespace Prisma { passwordEncrypted: string | null domain: string defaultForwardEmail: string | null + imapServer: string | null + imapPort: number | null + smtpServer: string | null + smtpPort: number | null + imapEncryption: $Enums.MailEncryption + smtpEncryption: $Enums.MailEncryption + allowSelfSignedCerts: boolean isActive: boolean isDefault: boolean createdAt: Date @@ -15646,6 +15860,13 @@ export namespace Prisma { readonly passwordEncrypted: FieldRef<"EmailProviderConfig", 'String'> readonly domain: FieldRef<"EmailProviderConfig", 'String'> readonly defaultForwardEmail: FieldRef<"EmailProviderConfig", 'String'> + readonly imapServer: FieldRef<"EmailProviderConfig", 'String'> + readonly imapPort: FieldRef<"EmailProviderConfig", 'Int'> + readonly smtpServer: FieldRef<"EmailProviderConfig", 'String'> + readonly smtpPort: FieldRef<"EmailProviderConfig", 'Int'> + readonly imapEncryption: FieldRef<"EmailProviderConfig", 'MailEncryption'> + readonly smtpEncryption: FieldRef<"EmailProviderConfig", 'MailEncryption'> + readonly allowSelfSignedCerts: FieldRef<"EmailProviderConfig", 'Boolean'> readonly isActive: FieldRef<"EmailProviderConfig", 'Boolean'> readonly isDefault: FieldRef<"EmailProviderConfig", 'Boolean'> readonly createdAt: FieldRef<"EmailProviderConfig", 'DateTime'> @@ -15955,6 +16176,8 @@ export namespace Prisma { isProvisioned: boolean | null provisionedAt: Date | null provisionError: string | null + hasMailbox: boolean | null + emailPasswordEncrypted: string | null createdAt: Date | null updatedAt: Date | null } @@ -15969,6 +16192,8 @@ export namespace Prisma { isProvisioned: boolean | null provisionedAt: Date | null provisionError: string | null + hasMailbox: boolean | null + emailPasswordEncrypted: string | null createdAt: Date | null updatedAt: Date | null } @@ -15983,6 +16208,8 @@ export namespace Prisma { isProvisioned: number provisionedAt: number provisionError: number + hasMailbox: number + emailPasswordEncrypted: number createdAt: number updatedAt: number _all: number @@ -16009,6 +16236,8 @@ export namespace Prisma { isProvisioned?: true provisionedAt?: true provisionError?: true + hasMailbox?: true + emailPasswordEncrypted?: true createdAt?: true updatedAt?: true } @@ -16023,6 +16252,8 @@ export namespace Prisma { isProvisioned?: true provisionedAt?: true provisionError?: true + hasMailbox?: true + emailPasswordEncrypted?: true createdAt?: true updatedAt?: true } @@ -16037,6 +16268,8 @@ export namespace Prisma { isProvisioned?: true provisionedAt?: true provisionError?: true + hasMailbox?: true + emailPasswordEncrypted?: true createdAt?: true updatedAt?: true _all?: true @@ -16138,6 +16371,8 @@ export namespace Prisma { isProvisioned: boolean provisionedAt: Date | null provisionError: string | null + hasMailbox: boolean + emailPasswordEncrypted: string | null createdAt: Date updatedAt: Date _count: StressfreiEmailCountAggregateOutputType | null @@ -16171,10 +16406,13 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: boolean provisionError?: boolean + hasMailbox?: boolean + emailPasswordEncrypted?: boolean createdAt?: boolean updatedAt?: boolean customer?: boolean | CustomerDefaultArgs contracts?: boolean | StressfreiEmail$contractsArgs + cachedEmails?: boolean | StressfreiEmail$cachedEmailsArgs _count?: boolean | StressfreiEmailCountOutputTypeDefaultArgs }, ExtArgs["result"]["stressfreiEmail"]> @@ -16189,6 +16427,8 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: boolean provisionError?: boolean + hasMailbox?: boolean + emailPasswordEncrypted?: boolean createdAt?: boolean updatedAt?: boolean } @@ -16196,6 +16436,7 @@ export namespace Prisma { export type StressfreiEmailInclude = { customer?: boolean | CustomerDefaultArgs contracts?: boolean | StressfreiEmail$contractsArgs + cachedEmails?: boolean | StressfreiEmail$cachedEmailsArgs _count?: boolean | StressfreiEmailCountOutputTypeDefaultArgs } @@ -16204,6 +16445,7 @@ export namespace Prisma { objects: { customer: Prisma.$CustomerPayload contracts: Prisma.$ContractPayload[] + cachedEmails: Prisma.$CachedEmailPayload[] } scalars: $Extensions.GetPayloadResult<{ id: number @@ -16215,6 +16457,8 @@ export namespace Prisma { isProvisioned: boolean provisionedAt: Date | null provisionError: string | null + hasMailbox: boolean + emailPasswordEncrypted: string | null createdAt: Date updatedAt: Date }, ExtArgs["result"]["stressfreiEmail"]> @@ -16559,6 +16803,7 @@ export namespace Prisma { readonly [Symbol.toStringTag]: "PrismaPromise" customer = {}>(args?: Subset>): Prisma__CustomerClient<$Result.GetResult, T, "findUniqueOrThrow"> | Null, Null, ExtArgs> contracts = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany"> | Null> + cachedEmails = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany"> | Null> /** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. @@ -16597,6 +16842,8 @@ export namespace Prisma { readonly isProvisioned: FieldRef<"StressfreiEmail", 'Boolean'> readonly provisionedAt: FieldRef<"StressfreiEmail", 'DateTime'> readonly provisionError: FieldRef<"StressfreiEmail", 'String'> + readonly hasMailbox: FieldRef<"StressfreiEmail", 'Boolean'> + readonly emailPasswordEncrypted: FieldRef<"StressfreiEmail", 'String'> readonly createdAt: FieldRef<"StressfreiEmail", 'DateTime'> readonly updatedAt: FieldRef<"StressfreiEmail", 'DateTime'> } @@ -16917,6 +17164,26 @@ export namespace Prisma { distinct?: ContractScalarFieldEnum | ContractScalarFieldEnum[] } + /** + * StressfreiEmail.cachedEmails + */ + export type StressfreiEmail$cachedEmailsArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + where?: CachedEmailWhereInput + orderBy?: CachedEmailOrderByWithRelationInput | CachedEmailOrderByWithRelationInput[] + cursor?: CachedEmailWhereUniqueInput + take?: number + skip?: number + distinct?: CachedEmailScalarFieldEnum | CachedEmailScalarFieldEnum[] + } + /** * StressfreiEmail without action */ @@ -16932,6 +17199,1174 @@ export namespace Prisma { } + /** + * Model CachedEmail + */ + + export type AggregateCachedEmail = { + _count: CachedEmailCountAggregateOutputType | null + _avg: CachedEmailAvgAggregateOutputType | null + _sum: CachedEmailSumAggregateOutputType | null + _min: CachedEmailMinAggregateOutputType | null + _max: CachedEmailMaxAggregateOutputType | null + } + + export type CachedEmailAvgAggregateOutputType = { + id: number | null + stressfreiEmailId: number | null + uid: number | null + contractId: number | null + assignedBy: number | null + } + + export type CachedEmailSumAggregateOutputType = { + id: number | null + stressfreiEmailId: number | null + uid: number | null + contractId: number | null + assignedBy: number | null + } + + export type CachedEmailMinAggregateOutputType = { + id: number | null + stressfreiEmailId: number | null + folder: $Enums.EmailFolder | null + messageId: string | null + uid: number | null + subject: string | null + fromAddress: string | null + fromName: string | null + toAddresses: string | null + ccAddresses: string | null + receivedAt: Date | null + textBody: string | null + htmlBody: string | null + hasAttachments: boolean | null + attachmentNames: string | null + contractId: number | null + assignedAt: Date | null + assignedBy: number | null + isAutoAssigned: boolean | null + isRead: boolean | null + isStarred: boolean | null + isDeleted: boolean | null + deletedAt: Date | null + createdAt: Date | null + updatedAt: Date | null + } + + export type CachedEmailMaxAggregateOutputType = { + id: number | null + stressfreiEmailId: number | null + folder: $Enums.EmailFolder | null + messageId: string | null + uid: number | null + subject: string | null + fromAddress: string | null + fromName: string | null + toAddresses: string | null + ccAddresses: string | null + receivedAt: Date | null + textBody: string | null + htmlBody: string | null + hasAttachments: boolean | null + attachmentNames: string | null + contractId: number | null + assignedAt: Date | null + assignedBy: number | null + isAutoAssigned: boolean | null + isRead: boolean | null + isStarred: boolean | null + isDeleted: boolean | null + deletedAt: Date | null + createdAt: Date | null + updatedAt: Date | null + } + + export type CachedEmailCountAggregateOutputType = { + id: number + stressfreiEmailId: number + folder: number + messageId: number + uid: number + subject: number + fromAddress: number + fromName: number + toAddresses: number + ccAddresses: number + receivedAt: number + textBody: number + htmlBody: number + hasAttachments: number + attachmentNames: number + contractId: number + assignedAt: number + assignedBy: number + isAutoAssigned: number + isRead: number + isStarred: number + isDeleted: number + deletedAt: number + createdAt: number + updatedAt: number + _all: number + } + + + export type CachedEmailAvgAggregateInputType = { + id?: true + stressfreiEmailId?: true + uid?: true + contractId?: true + assignedBy?: true + } + + export type CachedEmailSumAggregateInputType = { + id?: true + stressfreiEmailId?: true + uid?: true + contractId?: true + assignedBy?: true + } + + export type CachedEmailMinAggregateInputType = { + id?: true + stressfreiEmailId?: true + folder?: true + messageId?: true + uid?: true + subject?: true + fromAddress?: true + fromName?: true + toAddresses?: true + ccAddresses?: true + receivedAt?: true + textBody?: true + htmlBody?: true + hasAttachments?: true + attachmentNames?: true + contractId?: true + assignedAt?: true + assignedBy?: true + isAutoAssigned?: true + isRead?: true + isStarred?: true + isDeleted?: true + deletedAt?: true + createdAt?: true + updatedAt?: true + } + + export type CachedEmailMaxAggregateInputType = { + id?: true + stressfreiEmailId?: true + folder?: true + messageId?: true + uid?: true + subject?: true + fromAddress?: true + fromName?: true + toAddresses?: true + ccAddresses?: true + receivedAt?: true + textBody?: true + htmlBody?: true + hasAttachments?: true + attachmentNames?: true + contractId?: true + assignedAt?: true + assignedBy?: true + isAutoAssigned?: true + isRead?: true + isStarred?: true + isDeleted?: true + deletedAt?: true + createdAt?: true + updatedAt?: true + } + + export type CachedEmailCountAggregateInputType = { + id?: true + stressfreiEmailId?: true + folder?: true + messageId?: true + uid?: true + subject?: true + fromAddress?: true + fromName?: true + toAddresses?: true + ccAddresses?: true + receivedAt?: true + textBody?: true + htmlBody?: true + hasAttachments?: true + attachmentNames?: true + contractId?: true + assignedAt?: true + assignedBy?: true + isAutoAssigned?: true + isRead?: true + isStarred?: true + isDeleted?: true + deletedAt?: true + createdAt?: true + updatedAt?: true + _all?: true + } + + export type CachedEmailAggregateArgs = { + /** + * Filter which CachedEmail to aggregate. + */ + where?: CachedEmailWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CachedEmails to fetch. + */ + orderBy?: CachedEmailOrderByWithRelationInput | CachedEmailOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: CachedEmailWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CachedEmails from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CachedEmails. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned CachedEmails + **/ + _count?: true | CachedEmailCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: CachedEmailAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: CachedEmailSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: CachedEmailMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: CachedEmailMaxAggregateInputType + } + + export type GetCachedEmailAggregateType = { + [P in keyof T & keyof AggregateCachedEmail]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : GetScalarType + : GetScalarType + } + + + + + export type CachedEmailGroupByArgs = { + where?: CachedEmailWhereInput + orderBy?: CachedEmailOrderByWithAggregationInput | CachedEmailOrderByWithAggregationInput[] + by: CachedEmailScalarFieldEnum[] | CachedEmailScalarFieldEnum + having?: CachedEmailScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: CachedEmailCountAggregateInputType | true + _avg?: CachedEmailAvgAggregateInputType + _sum?: CachedEmailSumAggregateInputType + _min?: CachedEmailMinAggregateInputType + _max?: CachedEmailMaxAggregateInputType + } + + export type CachedEmailGroupByOutputType = { + id: number + stressfreiEmailId: number + folder: $Enums.EmailFolder + messageId: string + uid: number + subject: string | null + fromAddress: string + fromName: string | null + toAddresses: string + ccAddresses: string | null + receivedAt: Date + textBody: string | null + htmlBody: string | null + hasAttachments: boolean + attachmentNames: string | null + contractId: number | null + assignedAt: Date | null + assignedBy: number | null + isAutoAssigned: boolean + isRead: boolean + isStarred: boolean + isDeleted: boolean + deletedAt: Date | null + createdAt: Date + updatedAt: Date + _count: CachedEmailCountAggregateOutputType | null + _avg: CachedEmailAvgAggregateOutputType | null + _sum: CachedEmailSumAggregateOutputType | null + _min: CachedEmailMinAggregateOutputType | null + _max: CachedEmailMaxAggregateOutputType | null + } + + type GetCachedEmailGroupByPayload = Prisma.PrismaPromise< + Array< + PickEnumerable & + { + [P in ((keyof T) & (keyof CachedEmailGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : GetScalarType + : GetScalarType + } + > + > + + + export type CachedEmailSelect = $Extensions.GetSelect<{ + id?: boolean + stressfreiEmailId?: boolean + folder?: boolean + messageId?: boolean + uid?: boolean + subject?: boolean + fromAddress?: boolean + fromName?: boolean + toAddresses?: boolean + ccAddresses?: boolean + receivedAt?: boolean + textBody?: boolean + htmlBody?: boolean + hasAttachments?: boolean + attachmentNames?: boolean + contractId?: boolean + assignedAt?: boolean + assignedBy?: boolean + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: boolean + createdAt?: boolean + updatedAt?: boolean + stressfreiEmail?: boolean | StressfreiEmailDefaultArgs + contract?: boolean | CachedEmail$contractArgs + }, ExtArgs["result"]["cachedEmail"]> + + + export type CachedEmailSelectScalar = { + id?: boolean + stressfreiEmailId?: boolean + folder?: boolean + messageId?: boolean + uid?: boolean + subject?: boolean + fromAddress?: boolean + fromName?: boolean + toAddresses?: boolean + ccAddresses?: boolean + receivedAt?: boolean + textBody?: boolean + htmlBody?: boolean + hasAttachments?: boolean + attachmentNames?: boolean + contractId?: boolean + assignedAt?: boolean + assignedBy?: boolean + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: boolean + createdAt?: boolean + updatedAt?: boolean + } + + export type CachedEmailInclude = { + stressfreiEmail?: boolean | StressfreiEmailDefaultArgs + contract?: boolean | CachedEmail$contractArgs + } + + export type $CachedEmailPayload = { + name: "CachedEmail" + objects: { + stressfreiEmail: Prisma.$StressfreiEmailPayload + contract: Prisma.$ContractPayload | null + } + scalars: $Extensions.GetPayloadResult<{ + id: number + stressfreiEmailId: number + folder: $Enums.EmailFolder + messageId: string + uid: number + subject: string | null + fromAddress: string + fromName: string | null + toAddresses: string + ccAddresses: string | null + receivedAt: Date + textBody: string | null + htmlBody: string | null + hasAttachments: boolean + attachmentNames: string | null + contractId: number | null + assignedAt: Date | null + assignedBy: number | null + isAutoAssigned: boolean + isRead: boolean + isStarred: boolean + isDeleted: boolean + deletedAt: Date | null + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["cachedEmail"]> + composites: {} + } + + type CachedEmailGetPayload = $Result.GetResult + + type CachedEmailCountArgs = + Omit & { + select?: CachedEmailCountAggregateInputType | true + } + + export interface CachedEmailDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['CachedEmail'], meta: { name: 'CachedEmail' } } + /** + * Find zero or one CachedEmail that matches the filter. + * @param {CachedEmailFindUniqueArgs} args - Arguments to find a CachedEmail + * @example + * // Get one CachedEmail + * const cachedEmail = await prisma.cachedEmail.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: SelectSubset>): Prisma__CachedEmailClient<$Result.GetResult, T, "findUnique"> | null, null, ExtArgs> + + /** + * Find one CachedEmail that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {CachedEmailFindUniqueOrThrowArgs} args - Arguments to find a CachedEmail + * @example + * // Get one CachedEmail + * const cachedEmail = await prisma.cachedEmail.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: SelectSubset>): Prisma__CachedEmailClient<$Result.GetResult, T, "findUniqueOrThrow">, never, ExtArgs> + + /** + * Find the first CachedEmail that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CachedEmailFindFirstArgs} args - Arguments to find a CachedEmail + * @example + * // Get one CachedEmail + * const cachedEmail = await prisma.cachedEmail.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: SelectSubset>): Prisma__CachedEmailClient<$Result.GetResult, T, "findFirst"> | null, null, ExtArgs> + + /** + * Find the first CachedEmail that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CachedEmailFindFirstOrThrowArgs} args - Arguments to find a CachedEmail + * @example + * // Get one CachedEmail + * const cachedEmail = await prisma.cachedEmail.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: SelectSubset>): Prisma__CachedEmailClient<$Result.GetResult, T, "findFirstOrThrow">, never, ExtArgs> + + /** + * Find zero or more CachedEmails that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CachedEmailFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all CachedEmails + * const cachedEmails = await prisma.cachedEmail.findMany() + * + * // Get first 10 CachedEmails + * const cachedEmails = await prisma.cachedEmail.findMany({ take: 10 }) + * + * // Only select the `id` + * const cachedEmailWithIdOnly = await prisma.cachedEmail.findMany({ select: { id: true } }) + * + */ + findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany">> + + /** + * Create a CachedEmail. + * @param {CachedEmailCreateArgs} args - Arguments to create a CachedEmail. + * @example + * // Create one CachedEmail + * const CachedEmail = await prisma.cachedEmail.create({ + * data: { + * // ... data to create a CachedEmail + * } + * }) + * + */ + create(args: SelectSubset>): Prisma__CachedEmailClient<$Result.GetResult, T, "create">, never, ExtArgs> + + /** + * Create many CachedEmails. + * @param {CachedEmailCreateManyArgs} args - Arguments to create many CachedEmails. + * @example + * // Create many CachedEmails + * const cachedEmail = await prisma.cachedEmail.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a CachedEmail. + * @param {CachedEmailDeleteArgs} args - Arguments to delete one CachedEmail. + * @example + * // Delete one CachedEmail + * const CachedEmail = await prisma.cachedEmail.delete({ + * where: { + * // ... filter to delete one CachedEmail + * } + * }) + * + */ + delete(args: SelectSubset>): Prisma__CachedEmailClient<$Result.GetResult, T, "delete">, never, ExtArgs> + + /** + * Update one CachedEmail. + * @param {CachedEmailUpdateArgs} args - Arguments to update one CachedEmail. + * @example + * // Update one CachedEmail + * const cachedEmail = await prisma.cachedEmail.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: SelectSubset>): Prisma__CachedEmailClient<$Result.GetResult, T, "update">, never, ExtArgs> + + /** + * Delete zero or more CachedEmails. + * @param {CachedEmailDeleteManyArgs} args - Arguments to filter CachedEmails to delete. + * @example + * // Delete a few CachedEmails + * const { count } = await prisma.cachedEmail.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more CachedEmails. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CachedEmailUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many CachedEmails + * const cachedEmail = await prisma.cachedEmail.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one CachedEmail. + * @param {CachedEmailUpsertArgs} args - Arguments to update or create a CachedEmail. + * @example + * // Update or create a CachedEmail + * const cachedEmail = await prisma.cachedEmail.upsert({ + * create: { + * // ... data to create a CachedEmail + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the CachedEmail we want to update + * } + * }) + */ + upsert(args: SelectSubset>): Prisma__CachedEmailClient<$Result.GetResult, T, "upsert">, never, ExtArgs> + + + /** + * Count the number of CachedEmails. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CachedEmailCountArgs} args - Arguments to filter CachedEmails to count. + * @example + * // Count the number of CachedEmails + * const count = await prisma.cachedEmail.count({ + * where: { + * // ... the filter for the CachedEmails we want to count + * } + * }) + **/ + count( + args?: Subset, + ): Prisma.PrismaPromise< + T extends $Utils.Record<'select', any> + ? T['select'] extends true + ? number + : GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a CachedEmail. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CachedEmailAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Subset): Prisma.PrismaPromise> + + /** + * Group by CachedEmail. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CachedEmailGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends CachedEmailGroupByArgs, + HasSelectOrTake extends Or< + Extends<'skip', Keys>, + Extends<'take', Keys> + >, + OrderByArg extends True extends HasSelectOrTake + ? { orderBy: CachedEmailGroupByArgs['orderBy'] } + : { orderBy?: CachedEmailGroupByArgs['orderBy'] }, + OrderFields extends ExcludeUnderscoreKeys>>, + ByFields extends MaybeTupleToUnion, + ByValid extends Has, + HavingFields extends GetHavingFields, + HavingValid extends Has, + ByEmpty extends T['by'] extends never[] ? True : False, + InputErrors extends ByEmpty extends True + ? `Error: "by" must not be empty.` + : HavingValid extends False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: SubsetIntersection & InputErrors): {} extends InputErrors ? GetCachedEmailGroupByPayload : Prisma.PrismaPromise + /** + * Fields of the CachedEmail model + */ + readonly fields: CachedEmailFieldRefs; + } + + /** + * The delegate class that acts as a "Promise-like" for CachedEmail. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ + export interface Prisma__CachedEmailClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + stressfreiEmail = {}>(args?: Subset>): Prisma__StressfreiEmailClient<$Result.GetResult, T, "findUniqueOrThrow"> | Null, Null, ExtArgs> + contract = {}>(args?: Subset>): Prisma__ContractClient<$Result.GetResult, T, "findUniqueOrThrow"> | null, null, ExtArgs> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): $Utils.JsPromise + } + + + + + /** + * Fields of the CachedEmail model + */ + interface CachedEmailFieldRefs { + readonly id: FieldRef<"CachedEmail", 'Int'> + readonly stressfreiEmailId: FieldRef<"CachedEmail", 'Int'> + readonly folder: FieldRef<"CachedEmail", 'EmailFolder'> + readonly messageId: FieldRef<"CachedEmail", 'String'> + readonly uid: FieldRef<"CachedEmail", 'Int'> + readonly subject: FieldRef<"CachedEmail", 'String'> + readonly fromAddress: FieldRef<"CachedEmail", 'String'> + readonly fromName: FieldRef<"CachedEmail", 'String'> + readonly toAddresses: FieldRef<"CachedEmail", 'String'> + readonly ccAddresses: FieldRef<"CachedEmail", 'String'> + readonly receivedAt: FieldRef<"CachedEmail", 'DateTime'> + readonly textBody: FieldRef<"CachedEmail", 'String'> + readonly htmlBody: FieldRef<"CachedEmail", 'String'> + readonly hasAttachments: FieldRef<"CachedEmail", 'Boolean'> + readonly attachmentNames: FieldRef<"CachedEmail", 'String'> + readonly contractId: FieldRef<"CachedEmail", 'Int'> + readonly assignedAt: FieldRef<"CachedEmail", 'DateTime'> + readonly assignedBy: FieldRef<"CachedEmail", 'Int'> + readonly isAutoAssigned: FieldRef<"CachedEmail", 'Boolean'> + readonly isRead: FieldRef<"CachedEmail", 'Boolean'> + readonly isStarred: FieldRef<"CachedEmail", 'Boolean'> + readonly isDeleted: FieldRef<"CachedEmail", 'Boolean'> + readonly deletedAt: FieldRef<"CachedEmail", 'DateTime'> + readonly createdAt: FieldRef<"CachedEmail", 'DateTime'> + readonly updatedAt: FieldRef<"CachedEmail", 'DateTime'> + } + + + // Custom InputTypes + /** + * CachedEmail findUnique + */ + export type CachedEmailFindUniqueArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * Filter, which CachedEmail to fetch. + */ + where: CachedEmailWhereUniqueInput + } + + /** + * CachedEmail findUniqueOrThrow + */ + export type CachedEmailFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * Filter, which CachedEmail to fetch. + */ + where: CachedEmailWhereUniqueInput + } + + /** + * CachedEmail findFirst + */ + export type CachedEmailFindFirstArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * Filter, which CachedEmail to fetch. + */ + where?: CachedEmailWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CachedEmails to fetch. + */ + orderBy?: CachedEmailOrderByWithRelationInput | CachedEmailOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CachedEmails. + */ + cursor?: CachedEmailWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CachedEmails from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CachedEmails. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CachedEmails. + */ + distinct?: CachedEmailScalarFieldEnum | CachedEmailScalarFieldEnum[] + } + + /** + * CachedEmail findFirstOrThrow + */ + export type CachedEmailFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * Filter, which CachedEmail to fetch. + */ + where?: CachedEmailWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CachedEmails to fetch. + */ + orderBy?: CachedEmailOrderByWithRelationInput | CachedEmailOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CachedEmails. + */ + cursor?: CachedEmailWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CachedEmails from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CachedEmails. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CachedEmails. + */ + distinct?: CachedEmailScalarFieldEnum | CachedEmailScalarFieldEnum[] + } + + /** + * CachedEmail findMany + */ + export type CachedEmailFindManyArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * Filter, which CachedEmails to fetch. + */ + where?: CachedEmailWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CachedEmails to fetch. + */ + orderBy?: CachedEmailOrderByWithRelationInput | CachedEmailOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing CachedEmails. + */ + cursor?: CachedEmailWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CachedEmails from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CachedEmails. + */ + skip?: number + distinct?: CachedEmailScalarFieldEnum | CachedEmailScalarFieldEnum[] + } + + /** + * CachedEmail create + */ + export type CachedEmailCreateArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * The data needed to create a CachedEmail. + */ + data: XOR + } + + /** + * CachedEmail createMany + */ + export type CachedEmailCreateManyArgs = { + /** + * The data used to create many CachedEmails. + */ + data: CachedEmailCreateManyInput | CachedEmailCreateManyInput[] + skipDuplicates?: boolean + } + + /** + * CachedEmail update + */ + export type CachedEmailUpdateArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * The data needed to update a CachedEmail. + */ + data: XOR + /** + * Choose, which CachedEmail to update. + */ + where: CachedEmailWhereUniqueInput + } + + /** + * CachedEmail updateMany + */ + export type CachedEmailUpdateManyArgs = { + /** + * The data used to update CachedEmails. + */ + data: XOR + /** + * Filter which CachedEmails to update + */ + where?: CachedEmailWhereInput + } + + /** + * CachedEmail upsert + */ + export type CachedEmailUpsertArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * The filter to search for the CachedEmail to update in case it exists. + */ + where: CachedEmailWhereUniqueInput + /** + * In case the CachedEmail found by the `where` argument doesn't exist, create a new CachedEmail with this data. + */ + create: XOR + /** + * In case the CachedEmail was found with the provided `where` argument, update it with this data. + */ + update: XOR + } + + /** + * CachedEmail delete + */ + export type CachedEmailDeleteArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + /** + * Filter which CachedEmail to delete. + */ + where: CachedEmailWhereUniqueInput + } + + /** + * CachedEmail deleteMany + */ + export type CachedEmailDeleteManyArgs = { + /** + * Filter which CachedEmails to delete + */ + where?: CachedEmailWhereInput + } + + /** + * CachedEmail.contract + */ + export type CachedEmail$contractArgs = { + /** + * Select specific fields to fetch from the Contract + */ + select?: ContractSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: ContractInclude | null + where?: ContractWhereInput + } + + /** + * CachedEmail without action + */ + export type CachedEmailDefaultArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + } + + /** * Model Meter */ @@ -25167,6 +26602,7 @@ export namespace Prisma { tvDetails?: boolean | Contract$tvDetailsArgs carInsuranceDetails?: boolean | Contract$carInsuranceDetailsArgs tasks?: boolean | Contract$tasksArgs + assignedEmails?: boolean | Contract$assignedEmailsArgs _count?: boolean | ContractCountOutputTypeDefaultArgs }, ExtArgs["result"]["contract"]> @@ -25231,6 +26667,7 @@ export namespace Prisma { tvDetails?: boolean | Contract$tvDetailsArgs carInsuranceDetails?: boolean | Contract$carInsuranceDetailsArgs tasks?: boolean | Contract$tasksArgs + assignedEmails?: boolean | Contract$assignedEmailsArgs _count?: boolean | ContractCountOutputTypeDefaultArgs } @@ -25256,6 +26693,7 @@ export namespace Prisma { tvDetails: Prisma.$TvContractDetailsPayload | null carInsuranceDetails: Prisma.$CarInsuranceDetailsPayload | null tasks: Prisma.$ContractTaskPayload[] + assignedEmails: Prisma.$CachedEmailPayload[] } scalars: $Extensions.GetPayloadResult<{ id: number @@ -25654,6 +27092,7 @@ export namespace Prisma { tvDetails = {}>(args?: Subset>): Prisma__TvContractDetailsClient<$Result.GetResult, T, "findUniqueOrThrow"> | null, null, ExtArgs> carInsuranceDetails = {}>(args?: Subset>): Prisma__CarInsuranceDetailsClient<$Result.GetResult, T, "findUniqueOrThrow"> | null, null, ExtArgs> tasks = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany"> | Null> + assignedEmails = {}>(args?: Subset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany"> | Null> /** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. @@ -26293,6 +27732,26 @@ export namespace Prisma { distinct?: ContractTaskScalarFieldEnum | ContractTaskScalarFieldEnum[] } + /** + * Contract.assignedEmails + */ + export type Contract$assignedEmailsArgs = { + /** + * Select specific fields to fetch from the CachedEmail + */ + select?: CachedEmailSelect | null + /** + * Choose, which related nodes to fetch as well + */ + include?: CachedEmailInclude | null + where?: CachedEmailWhereInput + orderBy?: CachedEmailOrderByWithRelationInput | CachedEmailOrderByWithRelationInput[] + cursor?: CachedEmailWhereUniqueInput + take?: number + skip?: number + distinct?: CachedEmailScalarFieldEnum | CachedEmailScalarFieldEnum[] + } + /** * Contract without action */ @@ -35167,6 +36626,7 @@ export namespace Prisma { firstName: 'firstName', lastName: 'lastName', isActive: 'isActive', + tokenInvalidatedAt: 'tokenInvalidatedAt', customerId: 'customerId', createdAt: 'createdAt', updatedAt: 'updatedAt' @@ -35319,6 +36779,13 @@ export namespace Prisma { passwordEncrypted: 'passwordEncrypted', domain: 'domain', defaultForwardEmail: 'defaultForwardEmail', + imapServer: 'imapServer', + imapPort: 'imapPort', + smtpServer: 'smtpServer', + smtpPort: 'smtpPort', + imapEncryption: 'imapEncryption', + smtpEncryption: 'smtpEncryption', + allowSelfSignedCerts: 'allowSelfSignedCerts', isActive: 'isActive', isDefault: 'isDefault', createdAt: 'createdAt', @@ -35338,6 +36805,8 @@ export namespace Prisma { isProvisioned: 'isProvisioned', provisionedAt: 'provisionedAt', provisionError: 'provisionError', + hasMailbox: 'hasMailbox', + emailPasswordEncrypted: 'emailPasswordEncrypted', createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -35345,6 +36814,37 @@ export namespace Prisma { export type StressfreiEmailScalarFieldEnum = (typeof StressfreiEmailScalarFieldEnum)[keyof typeof StressfreiEmailScalarFieldEnum] + export const CachedEmailScalarFieldEnum: { + id: 'id', + stressfreiEmailId: 'stressfreiEmailId', + folder: 'folder', + messageId: 'messageId', + uid: 'uid', + subject: 'subject', + fromAddress: 'fromAddress', + fromName: 'fromName', + toAddresses: 'toAddresses', + ccAddresses: 'ccAddresses', + receivedAt: 'receivedAt', + textBody: 'textBody', + htmlBody: 'htmlBody', + hasAttachments: 'hasAttachments', + attachmentNames: 'attachmentNames', + contractId: 'contractId', + assignedAt: 'assignedAt', + assignedBy: 'assignedBy', + isAutoAssigned: 'isAutoAssigned', + isRead: 'isRead', + isStarred: 'isStarred', + isDeleted: 'isDeleted', + deletedAt: 'deletedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt' + }; + + export type CachedEmailScalarFieldEnum = (typeof CachedEmailScalarFieldEnum)[keyof typeof CachedEmailScalarFieldEnum] + + export const MeterScalarFieldEnum: { id: 'id', customerId: 'customerId', @@ -35707,6 +37207,20 @@ export namespace Prisma { + /** + * Reference to a field of type 'MailEncryption' + */ + export type EnumMailEncryptionFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'MailEncryption'> + + + + /** + * Reference to a field of type 'EmailFolder' + */ + export type EnumEmailFolderFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'EmailFolder'> + + + /** * Reference to a field of type 'MeterType' */ @@ -35816,6 +37330,7 @@ export namespace Prisma { firstName?: StringFilter<"User"> | string lastName?: StringFilter<"User"> | string isActive?: BoolFilter<"User"> | boolean + tokenInvalidatedAt?: DateTimeNullableFilter<"User"> | Date | string | null customerId?: IntNullableFilter<"User"> | number | null createdAt?: DateTimeFilter<"User"> | Date | string updatedAt?: DateTimeFilter<"User"> | Date | string @@ -35830,6 +37345,7 @@ export namespace Prisma { firstName?: SortOrder lastName?: SortOrder isActive?: SortOrder + tokenInvalidatedAt?: SortOrderInput | SortOrder customerId?: SortOrderInput | SortOrder createdAt?: SortOrder updatedAt?: SortOrder @@ -35848,6 +37364,7 @@ export namespace Prisma { firstName?: StringFilter<"User"> | string lastName?: StringFilter<"User"> | string isActive?: BoolFilter<"User"> | boolean + tokenInvalidatedAt?: DateTimeNullableFilter<"User"> | Date | string | null createdAt?: DateTimeFilter<"User"> | Date | string updatedAt?: DateTimeFilter<"User"> | Date | string customer?: XOR | null @@ -35861,6 +37378,7 @@ export namespace Prisma { firstName?: SortOrder lastName?: SortOrder isActive?: SortOrder + tokenInvalidatedAt?: SortOrderInput | SortOrder customerId?: SortOrderInput | SortOrder createdAt?: SortOrder updatedAt?: SortOrder @@ -35881,6 +37399,7 @@ export namespace Prisma { firstName?: StringWithAggregatesFilter<"User"> | string lastName?: StringWithAggregatesFilter<"User"> | string isActive?: BoolWithAggregatesFilter<"User"> | boolean + tokenInvalidatedAt?: DateTimeNullableWithAggregatesFilter<"User"> | Date | string | null customerId?: IntNullableWithAggregatesFilter<"User"> | number | null createdAt?: DateTimeWithAggregatesFilter<"User"> | Date | string updatedAt?: DateTimeWithAggregatesFilter<"User"> | Date | string @@ -36636,6 +38155,13 @@ export namespace Prisma { passwordEncrypted?: StringNullableFilter<"EmailProviderConfig"> | string | null domain?: StringFilter<"EmailProviderConfig"> | string defaultForwardEmail?: StringNullableFilter<"EmailProviderConfig"> | string | null + imapServer?: StringNullableFilter<"EmailProviderConfig"> | string | null + imapPort?: IntNullableFilter<"EmailProviderConfig"> | number | null + smtpServer?: StringNullableFilter<"EmailProviderConfig"> | string | null + smtpPort?: IntNullableFilter<"EmailProviderConfig"> | number | null + imapEncryption?: EnumMailEncryptionFilter<"EmailProviderConfig"> | $Enums.MailEncryption + smtpEncryption?: EnumMailEncryptionFilter<"EmailProviderConfig"> | $Enums.MailEncryption + allowSelfSignedCerts?: BoolFilter<"EmailProviderConfig"> | boolean isActive?: BoolFilter<"EmailProviderConfig"> | boolean isDefault?: BoolFilter<"EmailProviderConfig"> | boolean createdAt?: DateTimeFilter<"EmailProviderConfig"> | Date | string @@ -36652,6 +38178,13 @@ export namespace Prisma { passwordEncrypted?: SortOrderInput | SortOrder domain?: SortOrder defaultForwardEmail?: SortOrderInput | SortOrder + imapServer?: SortOrderInput | SortOrder + imapPort?: SortOrderInput | SortOrder + smtpServer?: SortOrderInput | SortOrder + smtpPort?: SortOrderInput | SortOrder + imapEncryption?: SortOrder + smtpEncryption?: SortOrder + allowSelfSignedCerts?: SortOrder isActive?: SortOrder isDefault?: SortOrder createdAt?: SortOrder @@ -36671,6 +38204,13 @@ export namespace Prisma { passwordEncrypted?: StringNullableFilter<"EmailProviderConfig"> | string | null domain?: StringFilter<"EmailProviderConfig"> | string defaultForwardEmail?: StringNullableFilter<"EmailProviderConfig"> | string | null + imapServer?: StringNullableFilter<"EmailProviderConfig"> | string | null + imapPort?: IntNullableFilter<"EmailProviderConfig"> | number | null + smtpServer?: StringNullableFilter<"EmailProviderConfig"> | string | null + smtpPort?: IntNullableFilter<"EmailProviderConfig"> | number | null + imapEncryption?: EnumMailEncryptionFilter<"EmailProviderConfig"> | $Enums.MailEncryption + smtpEncryption?: EnumMailEncryptionFilter<"EmailProviderConfig"> | $Enums.MailEncryption + allowSelfSignedCerts?: BoolFilter<"EmailProviderConfig"> | boolean isActive?: BoolFilter<"EmailProviderConfig"> | boolean isDefault?: BoolFilter<"EmailProviderConfig"> | boolean createdAt?: DateTimeFilter<"EmailProviderConfig"> | Date | string @@ -36687,6 +38227,13 @@ export namespace Prisma { passwordEncrypted?: SortOrderInput | SortOrder domain?: SortOrder defaultForwardEmail?: SortOrderInput | SortOrder + imapServer?: SortOrderInput | SortOrder + imapPort?: SortOrderInput | SortOrder + smtpServer?: SortOrderInput | SortOrder + smtpPort?: SortOrderInput | SortOrder + imapEncryption?: SortOrder + smtpEncryption?: SortOrder + allowSelfSignedCerts?: SortOrder isActive?: SortOrder isDefault?: SortOrder createdAt?: SortOrder @@ -36711,6 +38258,13 @@ export namespace Prisma { passwordEncrypted?: StringNullableWithAggregatesFilter<"EmailProviderConfig"> | string | null domain?: StringWithAggregatesFilter<"EmailProviderConfig"> | string defaultForwardEmail?: StringNullableWithAggregatesFilter<"EmailProviderConfig"> | string | null + imapServer?: StringNullableWithAggregatesFilter<"EmailProviderConfig"> | string | null + imapPort?: IntNullableWithAggregatesFilter<"EmailProviderConfig"> | number | null + smtpServer?: StringNullableWithAggregatesFilter<"EmailProviderConfig"> | string | null + smtpPort?: IntNullableWithAggregatesFilter<"EmailProviderConfig"> | number | null + imapEncryption?: EnumMailEncryptionWithAggregatesFilter<"EmailProviderConfig"> | $Enums.MailEncryption + smtpEncryption?: EnumMailEncryptionWithAggregatesFilter<"EmailProviderConfig"> | $Enums.MailEncryption + allowSelfSignedCerts?: BoolWithAggregatesFilter<"EmailProviderConfig"> | boolean isActive?: BoolWithAggregatesFilter<"EmailProviderConfig"> | boolean isDefault?: BoolWithAggregatesFilter<"EmailProviderConfig"> | boolean createdAt?: DateTimeWithAggregatesFilter<"EmailProviderConfig"> | Date | string @@ -36730,10 +38284,13 @@ export namespace Prisma { isProvisioned?: BoolFilter<"StressfreiEmail"> | boolean provisionedAt?: DateTimeNullableFilter<"StressfreiEmail"> | Date | string | null provisionError?: StringNullableFilter<"StressfreiEmail"> | string | null + hasMailbox?: BoolFilter<"StressfreiEmail"> | boolean + emailPasswordEncrypted?: StringNullableFilter<"StressfreiEmail"> | string | null createdAt?: DateTimeFilter<"StressfreiEmail"> | Date | string updatedAt?: DateTimeFilter<"StressfreiEmail"> | Date | string customer?: XOR contracts?: ContractListRelationFilter + cachedEmails?: CachedEmailListRelationFilter } export type StressfreiEmailOrderByWithRelationInput = { @@ -36746,10 +38303,13 @@ export namespace Prisma { isProvisioned?: SortOrder provisionedAt?: SortOrderInput | SortOrder provisionError?: SortOrderInput | SortOrder + hasMailbox?: SortOrder + emailPasswordEncrypted?: SortOrderInput | SortOrder createdAt?: SortOrder updatedAt?: SortOrder customer?: CustomerOrderByWithRelationInput contracts?: ContractOrderByRelationAggregateInput + cachedEmails?: CachedEmailOrderByRelationAggregateInput } export type StressfreiEmailWhereUniqueInput = Prisma.AtLeast<{ @@ -36765,10 +38325,13 @@ export namespace Prisma { isProvisioned?: BoolFilter<"StressfreiEmail"> | boolean provisionedAt?: DateTimeNullableFilter<"StressfreiEmail"> | Date | string | null provisionError?: StringNullableFilter<"StressfreiEmail"> | string | null + hasMailbox?: BoolFilter<"StressfreiEmail"> | boolean + emailPasswordEncrypted?: StringNullableFilter<"StressfreiEmail"> | string | null createdAt?: DateTimeFilter<"StressfreiEmail"> | Date | string updatedAt?: DateTimeFilter<"StressfreiEmail"> | Date | string customer?: XOR contracts?: ContractListRelationFilter + cachedEmails?: CachedEmailListRelationFilter }, "id"> export type StressfreiEmailOrderByWithAggregationInput = { @@ -36781,6 +38344,8 @@ export namespace Prisma { isProvisioned?: SortOrder provisionedAt?: SortOrderInput | SortOrder provisionError?: SortOrderInput | SortOrder + hasMailbox?: SortOrder + emailPasswordEncrypted?: SortOrderInput | SortOrder createdAt?: SortOrder updatedAt?: SortOrder _count?: StressfreiEmailCountOrderByAggregateInput @@ -36803,10 +38368,173 @@ export namespace Prisma { isProvisioned?: BoolWithAggregatesFilter<"StressfreiEmail"> | boolean provisionedAt?: DateTimeNullableWithAggregatesFilter<"StressfreiEmail"> | Date | string | null provisionError?: StringNullableWithAggregatesFilter<"StressfreiEmail"> | string | null + hasMailbox?: BoolWithAggregatesFilter<"StressfreiEmail"> | boolean + emailPasswordEncrypted?: StringNullableWithAggregatesFilter<"StressfreiEmail"> | string | null createdAt?: DateTimeWithAggregatesFilter<"StressfreiEmail"> | Date | string updatedAt?: DateTimeWithAggregatesFilter<"StressfreiEmail"> | Date | string } + export type CachedEmailWhereInput = { + AND?: CachedEmailWhereInput | CachedEmailWhereInput[] + OR?: CachedEmailWhereInput[] + NOT?: CachedEmailWhereInput | CachedEmailWhereInput[] + id?: IntFilter<"CachedEmail"> | number + stressfreiEmailId?: IntFilter<"CachedEmail"> | number + folder?: EnumEmailFolderFilter<"CachedEmail"> | $Enums.EmailFolder + messageId?: StringFilter<"CachedEmail"> | string + uid?: IntFilter<"CachedEmail"> | number + subject?: StringNullableFilter<"CachedEmail"> | string | null + fromAddress?: StringFilter<"CachedEmail"> | string + fromName?: StringNullableFilter<"CachedEmail"> | string | null + toAddresses?: StringFilter<"CachedEmail"> | string + ccAddresses?: StringNullableFilter<"CachedEmail"> | string | null + receivedAt?: DateTimeFilter<"CachedEmail"> | Date | string + textBody?: StringNullableFilter<"CachedEmail"> | string | null + htmlBody?: StringNullableFilter<"CachedEmail"> | string | null + hasAttachments?: BoolFilter<"CachedEmail"> | boolean + attachmentNames?: StringNullableFilter<"CachedEmail"> | string | null + contractId?: IntNullableFilter<"CachedEmail"> | number | null + assignedAt?: DateTimeNullableFilter<"CachedEmail"> | Date | string | null + assignedBy?: IntNullableFilter<"CachedEmail"> | number | null + isAutoAssigned?: BoolFilter<"CachedEmail"> | boolean + isRead?: BoolFilter<"CachedEmail"> | boolean + isStarred?: BoolFilter<"CachedEmail"> | boolean + isDeleted?: BoolFilter<"CachedEmail"> | boolean + deletedAt?: DateTimeNullableFilter<"CachedEmail"> | Date | string | null + createdAt?: DateTimeFilter<"CachedEmail"> | Date | string + updatedAt?: DateTimeFilter<"CachedEmail"> | Date | string + stressfreiEmail?: XOR + contract?: XOR | null + } + + export type CachedEmailOrderByWithRelationInput = { + id?: SortOrder + stressfreiEmailId?: SortOrder + folder?: SortOrder + messageId?: SortOrder + uid?: SortOrder + subject?: SortOrderInput | SortOrder + fromAddress?: SortOrder + fromName?: SortOrderInput | SortOrder + toAddresses?: SortOrder + ccAddresses?: SortOrderInput | SortOrder + receivedAt?: SortOrder + textBody?: SortOrderInput | SortOrder + htmlBody?: SortOrderInput | SortOrder + hasAttachments?: SortOrder + attachmentNames?: SortOrderInput | SortOrder + contractId?: SortOrderInput | SortOrder + assignedAt?: SortOrderInput | SortOrder + assignedBy?: SortOrderInput | SortOrder + isAutoAssigned?: SortOrder + isRead?: SortOrder + isStarred?: SortOrder + isDeleted?: SortOrder + deletedAt?: SortOrderInput | SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + stressfreiEmail?: StressfreiEmailOrderByWithRelationInput + contract?: ContractOrderByWithRelationInput + } + + export type CachedEmailWhereUniqueInput = Prisma.AtLeast<{ + id?: number + stressfreiEmailId_messageId_folder?: CachedEmailStressfreiEmailIdMessageIdFolderCompoundUniqueInput + AND?: CachedEmailWhereInput | CachedEmailWhereInput[] + OR?: CachedEmailWhereInput[] + NOT?: CachedEmailWhereInput | CachedEmailWhereInput[] + stressfreiEmailId?: IntFilter<"CachedEmail"> | number + folder?: EnumEmailFolderFilter<"CachedEmail"> | $Enums.EmailFolder + messageId?: StringFilter<"CachedEmail"> | string + uid?: IntFilter<"CachedEmail"> | number + subject?: StringNullableFilter<"CachedEmail"> | string | null + fromAddress?: StringFilter<"CachedEmail"> | string + fromName?: StringNullableFilter<"CachedEmail"> | string | null + toAddresses?: StringFilter<"CachedEmail"> | string + ccAddresses?: StringNullableFilter<"CachedEmail"> | string | null + receivedAt?: DateTimeFilter<"CachedEmail"> | Date | string + textBody?: StringNullableFilter<"CachedEmail"> | string | null + htmlBody?: StringNullableFilter<"CachedEmail"> | string | null + hasAttachments?: BoolFilter<"CachedEmail"> | boolean + attachmentNames?: StringNullableFilter<"CachedEmail"> | string | null + contractId?: IntNullableFilter<"CachedEmail"> | number | null + assignedAt?: DateTimeNullableFilter<"CachedEmail"> | Date | string | null + assignedBy?: IntNullableFilter<"CachedEmail"> | number | null + isAutoAssigned?: BoolFilter<"CachedEmail"> | boolean + isRead?: BoolFilter<"CachedEmail"> | boolean + isStarred?: BoolFilter<"CachedEmail"> | boolean + isDeleted?: BoolFilter<"CachedEmail"> | boolean + deletedAt?: DateTimeNullableFilter<"CachedEmail"> | Date | string | null + createdAt?: DateTimeFilter<"CachedEmail"> | Date | string + updatedAt?: DateTimeFilter<"CachedEmail"> | Date | string + stressfreiEmail?: XOR + contract?: XOR | null + }, "id" | "stressfreiEmailId_messageId_folder"> + + export type CachedEmailOrderByWithAggregationInput = { + id?: SortOrder + stressfreiEmailId?: SortOrder + folder?: SortOrder + messageId?: SortOrder + uid?: SortOrder + subject?: SortOrderInput | SortOrder + fromAddress?: SortOrder + fromName?: SortOrderInput | SortOrder + toAddresses?: SortOrder + ccAddresses?: SortOrderInput | SortOrder + receivedAt?: SortOrder + textBody?: SortOrderInput | SortOrder + htmlBody?: SortOrderInput | SortOrder + hasAttachments?: SortOrder + attachmentNames?: SortOrderInput | SortOrder + contractId?: SortOrderInput | SortOrder + assignedAt?: SortOrderInput | SortOrder + assignedBy?: SortOrderInput | SortOrder + isAutoAssigned?: SortOrder + isRead?: SortOrder + isStarred?: SortOrder + isDeleted?: SortOrder + deletedAt?: SortOrderInput | SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + _count?: CachedEmailCountOrderByAggregateInput + _avg?: CachedEmailAvgOrderByAggregateInput + _max?: CachedEmailMaxOrderByAggregateInput + _min?: CachedEmailMinOrderByAggregateInput + _sum?: CachedEmailSumOrderByAggregateInput + } + + export type CachedEmailScalarWhereWithAggregatesInput = { + AND?: CachedEmailScalarWhereWithAggregatesInput | CachedEmailScalarWhereWithAggregatesInput[] + OR?: CachedEmailScalarWhereWithAggregatesInput[] + NOT?: CachedEmailScalarWhereWithAggregatesInput | CachedEmailScalarWhereWithAggregatesInput[] + id?: IntWithAggregatesFilter<"CachedEmail"> | number + stressfreiEmailId?: IntWithAggregatesFilter<"CachedEmail"> | number + folder?: EnumEmailFolderWithAggregatesFilter<"CachedEmail"> | $Enums.EmailFolder + messageId?: StringWithAggregatesFilter<"CachedEmail"> | string + uid?: IntWithAggregatesFilter<"CachedEmail"> | number + subject?: StringNullableWithAggregatesFilter<"CachedEmail"> | string | null + fromAddress?: StringWithAggregatesFilter<"CachedEmail"> | string + fromName?: StringNullableWithAggregatesFilter<"CachedEmail"> | string | null + toAddresses?: StringWithAggregatesFilter<"CachedEmail"> | string + ccAddresses?: StringNullableWithAggregatesFilter<"CachedEmail"> | string | null + receivedAt?: DateTimeWithAggregatesFilter<"CachedEmail"> | Date | string + textBody?: StringNullableWithAggregatesFilter<"CachedEmail"> | string | null + htmlBody?: StringNullableWithAggregatesFilter<"CachedEmail"> | string | null + hasAttachments?: BoolWithAggregatesFilter<"CachedEmail"> | boolean + attachmentNames?: StringNullableWithAggregatesFilter<"CachedEmail"> | string | null + contractId?: IntNullableWithAggregatesFilter<"CachedEmail"> | number | null + assignedAt?: DateTimeNullableWithAggregatesFilter<"CachedEmail"> | Date | string | null + assignedBy?: IntNullableWithAggregatesFilter<"CachedEmail"> | number | null + isAutoAssigned?: BoolWithAggregatesFilter<"CachedEmail"> | boolean + isRead?: BoolWithAggregatesFilter<"CachedEmail"> | boolean + isStarred?: BoolWithAggregatesFilter<"CachedEmail"> | boolean + isDeleted?: BoolWithAggregatesFilter<"CachedEmail"> | boolean + deletedAt?: DateTimeNullableWithAggregatesFilter<"CachedEmail"> | Date | string | null + createdAt?: DateTimeWithAggregatesFilter<"CachedEmail"> | Date | string + updatedAt?: DateTimeWithAggregatesFilter<"CachedEmail"> | Date | string + } + export type MeterWhereInput = { AND?: MeterWhereInput | MeterWhereInput[] OR?: MeterWhereInput[] @@ -37416,6 +39144,7 @@ export namespace Prisma { tvDetails?: XOR | null carInsuranceDetails?: XOR | null tasks?: ContractTaskListRelationFilter + assignedEmails?: CachedEmailListRelationFilter } export type ContractOrderByWithRelationInput = { @@ -37475,6 +39204,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsOrderByWithRelationInput carInsuranceDetails?: CarInsuranceDetailsOrderByWithRelationInput tasks?: ContractTaskOrderByRelationAggregateInput + assignedEmails?: CachedEmailOrderByRelationAggregateInput } export type ContractWhereUniqueInput = Prisma.AtLeast<{ @@ -37537,6 +39267,7 @@ export namespace Prisma { tvDetails?: XOR | null carInsuranceDetails?: XOR | null tasks?: ContractTaskListRelationFilter + assignedEmails?: CachedEmailListRelationFilter }, "id" | "contractNumber" | "previousContractId"> export type ContractOrderByWithAggregationInput = { @@ -38406,6 +40137,7 @@ export namespace Prisma { firstName: string lastName: string isActive?: boolean + tokenInvalidatedAt?: Date | string | null createdAt?: Date | string updatedAt?: Date | string customer?: CustomerCreateNestedOneWithoutUserInput @@ -38419,6 +40151,7 @@ export namespace Prisma { firstName: string lastName: string isActive?: boolean + tokenInvalidatedAt?: Date | string | null customerId?: number | null createdAt?: Date | string updatedAt?: Date | string @@ -38431,6 +40164,7 @@ export namespace Prisma { firstName?: StringFieldUpdateOperationsInput | string lastName?: StringFieldUpdateOperationsInput | string isActive?: BoolFieldUpdateOperationsInput | boolean + tokenInvalidatedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string customer?: CustomerUpdateOneWithoutUserNestedInput @@ -38444,6 +40178,7 @@ export namespace Prisma { firstName?: StringFieldUpdateOperationsInput | string lastName?: StringFieldUpdateOperationsInput | string isActive?: BoolFieldUpdateOperationsInput | boolean + tokenInvalidatedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null customerId?: NullableIntFieldUpdateOperationsInput | number | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -38457,6 +40192,7 @@ export namespace Prisma { firstName: string lastName: string isActive?: boolean + tokenInvalidatedAt?: Date | string | null customerId?: number | null createdAt?: Date | string updatedAt?: Date | string @@ -38468,6 +40204,7 @@ export namespace Prisma { firstName?: StringFieldUpdateOperationsInput | string lastName?: StringFieldUpdateOperationsInput | string isActive?: BoolFieldUpdateOperationsInput | boolean + tokenInvalidatedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -38479,6 +40216,7 @@ export namespace Prisma { firstName?: StringFieldUpdateOperationsInput | string lastName?: StringFieldUpdateOperationsInput | string isActive?: BoolFieldUpdateOperationsInput | boolean + tokenInvalidatedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null customerId?: NullableIntFieldUpdateOperationsInput | number | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -39274,6 +41012,13 @@ export namespace Prisma { passwordEncrypted?: string | null domain: string defaultForwardEmail?: string | null + imapServer?: string | null + imapPort?: number | null + smtpServer?: string | null + smtpPort?: number | null + imapEncryption?: $Enums.MailEncryption + smtpEncryption?: $Enums.MailEncryption + allowSelfSignedCerts?: boolean isActive?: boolean isDefault?: boolean createdAt?: Date | string @@ -39290,6 +41035,13 @@ export namespace Prisma { passwordEncrypted?: string | null domain: string defaultForwardEmail?: string | null + imapServer?: string | null + imapPort?: number | null + smtpServer?: string | null + smtpPort?: number | null + imapEncryption?: $Enums.MailEncryption + smtpEncryption?: $Enums.MailEncryption + allowSelfSignedCerts?: boolean isActive?: boolean isDefault?: boolean createdAt?: Date | string @@ -39305,6 +41057,13 @@ export namespace Prisma { passwordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null domain?: StringFieldUpdateOperationsInput | string defaultForwardEmail?: NullableStringFieldUpdateOperationsInput | string | null + imapServer?: NullableStringFieldUpdateOperationsInput | string | null + imapPort?: NullableIntFieldUpdateOperationsInput | number | null + smtpServer?: NullableStringFieldUpdateOperationsInput | string | null + smtpPort?: NullableIntFieldUpdateOperationsInput | number | null + imapEncryption?: EnumMailEncryptionFieldUpdateOperationsInput | $Enums.MailEncryption + smtpEncryption?: EnumMailEncryptionFieldUpdateOperationsInput | $Enums.MailEncryption + allowSelfSignedCerts?: BoolFieldUpdateOperationsInput | boolean isActive?: BoolFieldUpdateOperationsInput | boolean isDefault?: BoolFieldUpdateOperationsInput | boolean createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -39321,6 +41080,13 @@ export namespace Prisma { passwordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null domain?: StringFieldUpdateOperationsInput | string defaultForwardEmail?: NullableStringFieldUpdateOperationsInput | string | null + imapServer?: NullableStringFieldUpdateOperationsInput | string | null + imapPort?: NullableIntFieldUpdateOperationsInput | number | null + smtpServer?: NullableStringFieldUpdateOperationsInput | string | null + smtpPort?: NullableIntFieldUpdateOperationsInput | number | null + imapEncryption?: EnumMailEncryptionFieldUpdateOperationsInput | $Enums.MailEncryption + smtpEncryption?: EnumMailEncryptionFieldUpdateOperationsInput | $Enums.MailEncryption + allowSelfSignedCerts?: BoolFieldUpdateOperationsInput | boolean isActive?: BoolFieldUpdateOperationsInput | boolean isDefault?: BoolFieldUpdateOperationsInput | boolean createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -39337,6 +41103,13 @@ export namespace Prisma { passwordEncrypted?: string | null domain: string defaultForwardEmail?: string | null + imapServer?: string | null + imapPort?: number | null + smtpServer?: string | null + smtpPort?: number | null + imapEncryption?: $Enums.MailEncryption + smtpEncryption?: $Enums.MailEncryption + allowSelfSignedCerts?: boolean isActive?: boolean isDefault?: boolean createdAt?: Date | string @@ -39352,6 +41125,13 @@ export namespace Prisma { passwordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null domain?: StringFieldUpdateOperationsInput | string defaultForwardEmail?: NullableStringFieldUpdateOperationsInput | string | null + imapServer?: NullableStringFieldUpdateOperationsInput | string | null + imapPort?: NullableIntFieldUpdateOperationsInput | number | null + smtpServer?: NullableStringFieldUpdateOperationsInput | string | null + smtpPort?: NullableIntFieldUpdateOperationsInput | number | null + imapEncryption?: EnumMailEncryptionFieldUpdateOperationsInput | $Enums.MailEncryption + smtpEncryption?: EnumMailEncryptionFieldUpdateOperationsInput | $Enums.MailEncryption + allowSelfSignedCerts?: BoolFieldUpdateOperationsInput | boolean isActive?: BoolFieldUpdateOperationsInput | boolean isDefault?: BoolFieldUpdateOperationsInput | boolean createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -39368,6 +41148,13 @@ export namespace Prisma { passwordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null domain?: StringFieldUpdateOperationsInput | string defaultForwardEmail?: NullableStringFieldUpdateOperationsInput | string | null + imapServer?: NullableStringFieldUpdateOperationsInput | string | null + imapPort?: NullableIntFieldUpdateOperationsInput | number | null + smtpServer?: NullableStringFieldUpdateOperationsInput | string | null + smtpPort?: NullableIntFieldUpdateOperationsInput | number | null + imapEncryption?: EnumMailEncryptionFieldUpdateOperationsInput | $Enums.MailEncryption + smtpEncryption?: EnumMailEncryptionFieldUpdateOperationsInput | $Enums.MailEncryption + allowSelfSignedCerts?: BoolFieldUpdateOperationsInput | boolean isActive?: BoolFieldUpdateOperationsInput | boolean isDefault?: BoolFieldUpdateOperationsInput | boolean createdAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -39382,10 +41169,13 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: Date | string | null provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null createdAt?: Date | string updatedAt?: Date | string customer: CustomerCreateNestedOneWithoutStressfreiEmailsInput contracts?: ContractCreateNestedManyWithoutStressfreiEmailInput + cachedEmails?: CachedEmailCreateNestedManyWithoutStressfreiEmailInput } export type StressfreiEmailUncheckedCreateInput = { @@ -39398,9 +41188,12 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: Date | string | null provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null createdAt?: Date | string updatedAt?: Date | string contracts?: ContractUncheckedCreateNestedManyWithoutStressfreiEmailInput + cachedEmails?: CachedEmailUncheckedCreateNestedManyWithoutStressfreiEmailInput } export type StressfreiEmailUpdateInput = { @@ -39411,10 +41204,13 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string customer?: CustomerUpdateOneRequiredWithoutStressfreiEmailsNestedInput contracts?: ContractUpdateManyWithoutStressfreiEmailNestedInput + cachedEmails?: CachedEmailUpdateManyWithoutStressfreiEmailNestedInput } export type StressfreiEmailUncheckedUpdateInput = { @@ -39427,9 +41223,12 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string contracts?: ContractUncheckedUpdateManyWithoutStressfreiEmailNestedInput + cachedEmails?: CachedEmailUncheckedUpdateManyWithoutStressfreiEmailNestedInput } export type StressfreiEmailCreateManyInput = { @@ -39442,6 +41241,8 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: Date | string | null provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null createdAt?: Date | string updatedAt?: Date | string } @@ -39454,6 +41255,8 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -39468,6 +41271,199 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type CachedEmailCreateInput = { + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + stressfreiEmail: StressfreiEmailCreateNestedOneWithoutCachedEmailsInput + contract?: ContractCreateNestedOneWithoutAssignedEmailsInput + } + + export type CachedEmailUncheckedCreateInput = { + id?: number + stressfreiEmailId: number + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + contractId?: number | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + } + + export type CachedEmailUpdateInput = { + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + stressfreiEmail?: StressfreiEmailUpdateOneRequiredWithoutCachedEmailsNestedInput + contract?: ContractUpdateOneWithoutAssignedEmailsNestedInput + } + + export type CachedEmailUncheckedUpdateInput = { + id?: IntFieldUpdateOperationsInput | number + stressfreiEmailId?: IntFieldUpdateOperationsInput | number + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + contractId?: NullableIntFieldUpdateOperationsInput | number | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type CachedEmailCreateManyInput = { + id?: number + stressfreiEmailId: number + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + contractId?: number | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + } + + export type CachedEmailUpdateManyMutationInput = { + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type CachedEmailUncheckedUpdateManyInput = { + id?: IntFieldUpdateOperationsInput | number + stressfreiEmailId?: IntFieldUpdateOperationsInput | number + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + contractId?: NullableIntFieldUpdateOperationsInput | number | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -40085,6 +42081,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateInput = { @@ -40132,6 +42129,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractUpdateInput = { @@ -40178,6 +42176,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateInput = { @@ -40225,6 +42224,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractCreateManyInput = { @@ -41206,6 +43206,17 @@ export namespace Prisma { not?: NestedBoolFilter<$PrismaModel> | boolean } + export type DateTimeNullableFilter<$PrismaModel = never> = { + equals?: Date | string | DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | null + notIn?: Date[] | string[] | null + lt?: Date | string | DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | DateTimeFieldRefInput<$PrismaModel> + not?: NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null + } + export type IntNullableFilter<$PrismaModel = never> = { equals?: number | IntFieldRefInput<$PrismaModel> | null in?: number[] | null @@ -41244,6 +43255,7 @@ export namespace Prisma { firstName?: SortOrder lastName?: SortOrder isActive?: SortOrder + tokenInvalidatedAt?: SortOrder customerId?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder @@ -41261,6 +43273,7 @@ export namespace Prisma { firstName?: SortOrder lastName?: SortOrder isActive?: SortOrder + tokenInvalidatedAt?: SortOrder customerId?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder @@ -41273,6 +43286,7 @@ export namespace Prisma { firstName?: SortOrder lastName?: SortOrder isActive?: SortOrder + tokenInvalidatedAt?: SortOrder customerId?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder @@ -41291,6 +43305,20 @@ export namespace Prisma { _max?: NestedBoolFilter<$PrismaModel> } + export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | null + notIn?: Date[] | string[] | null + lt?: Date | string | DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | DateTimeFieldRefInput<$PrismaModel> + not?: NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null + _count?: NestedIntNullableFilter<$PrismaModel> + _min?: NestedDateTimeNullableFilter<$PrismaModel> + _max?: NestedDateTimeNullableFilter<$PrismaModel> + } + export type IntNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: number | IntFieldRefInput<$PrismaModel> | null in?: number[] | null @@ -41493,17 +43521,6 @@ export namespace Prisma { not?: NestedEnumCustomerTypeFilter<$PrismaModel> | $Enums.CustomerType } - export type DateTimeNullableFilter<$PrismaModel = never> = { - equals?: Date | string | DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | null - notIn?: Date[] | string[] | null - lt?: Date | string | DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | DateTimeFieldRefInput<$PrismaModel> - not?: NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null - } - export type UserNullableRelationFilter = { is?: UserWhereInput | null isNot?: UserWhereInput | null @@ -41684,20 +43701,6 @@ export namespace Prisma { _max?: NestedEnumCustomerTypeFilter<$PrismaModel> } - export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { - equals?: Date | string | DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | null - notIn?: Date[] | string[] | null - lt?: Date | string | DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | DateTimeFieldRefInput<$PrismaModel> - not?: NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null - _count?: NestedIntNullableFilter<$PrismaModel> - _min?: NestedDateTimeNullableFilter<$PrismaModel> - _max?: NestedDateTimeNullableFilter<$PrismaModel> - } - export type CustomerRelationFilter = { is?: CustomerWhereInput isNot?: CustomerWhereInput @@ -41953,6 +43956,13 @@ export namespace Prisma { not?: NestedEnumEmailProviderTypeFilter<$PrismaModel> | $Enums.EmailProviderType } + export type EnumMailEncryptionFilter<$PrismaModel = never> = { + equals?: $Enums.MailEncryption | EnumMailEncryptionFieldRefInput<$PrismaModel> + in?: $Enums.MailEncryption[] + notIn?: $Enums.MailEncryption[] + not?: NestedEnumMailEncryptionFilter<$PrismaModel> | $Enums.MailEncryption + } + export type EmailProviderConfigCountOrderByAggregateInput = { id?: SortOrder name?: SortOrder @@ -41963,6 +43973,13 @@ export namespace Prisma { passwordEncrypted?: SortOrder domain?: SortOrder defaultForwardEmail?: SortOrder + imapServer?: SortOrder + imapPort?: SortOrder + smtpServer?: SortOrder + smtpPort?: SortOrder + imapEncryption?: SortOrder + smtpEncryption?: SortOrder + allowSelfSignedCerts?: SortOrder isActive?: SortOrder isDefault?: SortOrder createdAt?: SortOrder @@ -41971,6 +43988,8 @@ export namespace Prisma { export type EmailProviderConfigAvgOrderByAggregateInput = { id?: SortOrder + imapPort?: SortOrder + smtpPort?: SortOrder } export type EmailProviderConfigMaxOrderByAggregateInput = { @@ -41983,6 +44002,13 @@ export namespace Prisma { passwordEncrypted?: SortOrder domain?: SortOrder defaultForwardEmail?: SortOrder + imapServer?: SortOrder + imapPort?: SortOrder + smtpServer?: SortOrder + smtpPort?: SortOrder + imapEncryption?: SortOrder + smtpEncryption?: SortOrder + allowSelfSignedCerts?: SortOrder isActive?: SortOrder isDefault?: SortOrder createdAt?: SortOrder @@ -41999,6 +44025,13 @@ export namespace Prisma { passwordEncrypted?: SortOrder domain?: SortOrder defaultForwardEmail?: SortOrder + imapServer?: SortOrder + imapPort?: SortOrder + smtpServer?: SortOrder + smtpPort?: SortOrder + imapEncryption?: SortOrder + smtpEncryption?: SortOrder + allowSelfSignedCerts?: SortOrder isActive?: SortOrder isDefault?: SortOrder createdAt?: SortOrder @@ -42007,6 +44040,8 @@ export namespace Prisma { export type EmailProviderConfigSumOrderByAggregateInput = { id?: SortOrder + imapPort?: SortOrder + smtpPort?: SortOrder } export type EnumEmailProviderTypeWithAggregatesFilter<$PrismaModel = never> = { @@ -42019,6 +44054,26 @@ export namespace Prisma { _max?: NestedEnumEmailProviderTypeFilter<$PrismaModel> } + export type EnumMailEncryptionWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.MailEncryption | EnumMailEncryptionFieldRefInput<$PrismaModel> + in?: $Enums.MailEncryption[] + notIn?: $Enums.MailEncryption[] + not?: NestedEnumMailEncryptionWithAggregatesFilter<$PrismaModel> | $Enums.MailEncryption + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumMailEncryptionFilter<$PrismaModel> + _max?: NestedEnumMailEncryptionFilter<$PrismaModel> + } + + export type CachedEmailListRelationFilter = { + every?: CachedEmailWhereInput + some?: CachedEmailWhereInput + none?: CachedEmailWhereInput + } + + export type CachedEmailOrderByRelationAggregateInput = { + _count?: SortOrder + } + export type StressfreiEmailCountOrderByAggregateInput = { id?: SortOrder customerId?: SortOrder @@ -42029,6 +44084,8 @@ export namespace Prisma { isProvisioned?: SortOrder provisionedAt?: SortOrder provisionError?: SortOrder + hasMailbox?: SortOrder + emailPasswordEncrypted?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder } @@ -42048,6 +44105,8 @@ export namespace Prisma { isProvisioned?: SortOrder provisionedAt?: SortOrder provisionError?: SortOrder + hasMailbox?: SortOrder + emailPasswordEncrypted?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder } @@ -42062,6 +44121,8 @@ export namespace Prisma { isProvisioned?: SortOrder provisionedAt?: SortOrder provisionError?: SortOrder + hasMailbox?: SortOrder + emailPasswordEncrypted?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder } @@ -42071,6 +44132,139 @@ export namespace Prisma { customerId?: SortOrder } + export type EnumEmailFolderFilter<$PrismaModel = never> = { + equals?: $Enums.EmailFolder | EnumEmailFolderFieldRefInput<$PrismaModel> + in?: $Enums.EmailFolder[] + notIn?: $Enums.EmailFolder[] + not?: NestedEnumEmailFolderFilter<$PrismaModel> | $Enums.EmailFolder + } + + export type StressfreiEmailRelationFilter = { + is?: StressfreiEmailWhereInput + isNot?: StressfreiEmailWhereInput + } + + export type ContractNullableRelationFilter = { + is?: ContractWhereInput | null + isNot?: ContractWhereInput | null + } + + export type CachedEmailStressfreiEmailIdMessageIdFolderCompoundUniqueInput = { + stressfreiEmailId: number + messageId: string + folder: $Enums.EmailFolder + } + + export type CachedEmailCountOrderByAggregateInput = { + id?: SortOrder + stressfreiEmailId?: SortOrder + folder?: SortOrder + messageId?: SortOrder + uid?: SortOrder + subject?: SortOrder + fromAddress?: SortOrder + fromName?: SortOrder + toAddresses?: SortOrder + ccAddresses?: SortOrder + receivedAt?: SortOrder + textBody?: SortOrder + htmlBody?: SortOrder + hasAttachments?: SortOrder + attachmentNames?: SortOrder + contractId?: SortOrder + assignedAt?: SortOrder + assignedBy?: SortOrder + isAutoAssigned?: SortOrder + isRead?: SortOrder + isStarred?: SortOrder + isDeleted?: SortOrder + deletedAt?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type CachedEmailAvgOrderByAggregateInput = { + id?: SortOrder + stressfreiEmailId?: SortOrder + uid?: SortOrder + contractId?: SortOrder + assignedBy?: SortOrder + } + + export type CachedEmailMaxOrderByAggregateInput = { + id?: SortOrder + stressfreiEmailId?: SortOrder + folder?: SortOrder + messageId?: SortOrder + uid?: SortOrder + subject?: SortOrder + fromAddress?: SortOrder + fromName?: SortOrder + toAddresses?: SortOrder + ccAddresses?: SortOrder + receivedAt?: SortOrder + textBody?: SortOrder + htmlBody?: SortOrder + hasAttachments?: SortOrder + attachmentNames?: SortOrder + contractId?: SortOrder + assignedAt?: SortOrder + assignedBy?: SortOrder + isAutoAssigned?: SortOrder + isRead?: SortOrder + isStarred?: SortOrder + isDeleted?: SortOrder + deletedAt?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type CachedEmailMinOrderByAggregateInput = { + id?: SortOrder + stressfreiEmailId?: SortOrder + folder?: SortOrder + messageId?: SortOrder + uid?: SortOrder + subject?: SortOrder + fromAddress?: SortOrder + fromName?: SortOrder + toAddresses?: SortOrder + ccAddresses?: SortOrder + receivedAt?: SortOrder + textBody?: SortOrder + htmlBody?: SortOrder + hasAttachments?: SortOrder + attachmentNames?: SortOrder + contractId?: SortOrder + assignedAt?: SortOrder + assignedBy?: SortOrder + isAutoAssigned?: SortOrder + isRead?: SortOrder + isStarred?: SortOrder + isDeleted?: SortOrder + deletedAt?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type CachedEmailSumOrderByAggregateInput = { + id?: SortOrder + stressfreiEmailId?: SortOrder + uid?: SortOrder + contractId?: SortOrder + assignedBy?: SortOrder + } + + export type EnumEmailFolderWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.EmailFolder | EnumEmailFolderFieldRefInput<$PrismaModel> + in?: $Enums.EmailFolder[] + notIn?: $Enums.EmailFolder[] + not?: NestedEnumEmailFolderWithAggregatesFilter<$PrismaModel> | $Enums.EmailFolder + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumEmailFolderFilter<$PrismaModel> + _max?: NestedEnumEmailFolderFilter<$PrismaModel> + } + export type EnumMeterTypeFilter<$PrismaModel = never> = { equals?: $Enums.MeterType | EnumMeterTypeFieldRefInput<$PrismaModel> in?: $Enums.MeterType[] @@ -42534,11 +44728,6 @@ export namespace Prisma { isNot?: ContractDurationWhereInput | null } - export type ContractNullableRelationFilter = { - is?: ContractWhereInput | null - isNot?: ContractWhereInput | null - } - export type ProviderNullableRelationFilter = { is?: ProviderWhereInput | null isNot?: ProviderWhereInput | null @@ -43355,6 +45544,10 @@ export namespace Prisma { set?: boolean } + export type NullableDateTimeFieldUpdateOperationsInput = { + set?: Date | string | null + } + export type CustomerUpdateOneWithoutUserNestedInput = { create?: XOR connectOrCreate?: CustomerCreateOrConnectWithoutUserInput @@ -43715,10 +45908,6 @@ export namespace Prisma { set?: $Enums.CustomerType } - export type NullableDateTimeFieldUpdateOperationsInput = { - set?: Date | string | null - } - export type UserUpdateOneWithoutCustomerNestedInput = { create?: XOR connectOrCreate?: UserCreateOrConnectWithoutCustomerInput @@ -44171,6 +46360,10 @@ export namespace Prisma { set?: $Enums.EmailProviderType } + export type EnumMailEncryptionFieldUpdateOperationsInput = { + set?: $Enums.MailEncryption + } + export type CustomerCreateNestedOneWithoutStressfreiEmailsInput = { create?: XOR connectOrCreate?: CustomerCreateOrConnectWithoutStressfreiEmailsInput @@ -44184,6 +46377,13 @@ export namespace Prisma { connect?: ContractWhereUniqueInput | ContractWhereUniqueInput[] } + export type CachedEmailCreateNestedManyWithoutStressfreiEmailInput = { + create?: XOR | CachedEmailCreateWithoutStressfreiEmailInput[] | CachedEmailUncheckedCreateWithoutStressfreiEmailInput[] + connectOrCreate?: CachedEmailCreateOrConnectWithoutStressfreiEmailInput | CachedEmailCreateOrConnectWithoutStressfreiEmailInput[] + createMany?: CachedEmailCreateManyStressfreiEmailInputEnvelope + connect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + } + export type ContractUncheckedCreateNestedManyWithoutStressfreiEmailInput = { create?: XOR | ContractCreateWithoutStressfreiEmailInput[] | ContractUncheckedCreateWithoutStressfreiEmailInput[] connectOrCreate?: ContractCreateOrConnectWithoutStressfreiEmailInput | ContractCreateOrConnectWithoutStressfreiEmailInput[] @@ -44191,6 +46391,13 @@ export namespace Prisma { connect?: ContractWhereUniqueInput | ContractWhereUniqueInput[] } + export type CachedEmailUncheckedCreateNestedManyWithoutStressfreiEmailInput = { + create?: XOR | CachedEmailCreateWithoutStressfreiEmailInput[] | CachedEmailUncheckedCreateWithoutStressfreiEmailInput[] + connectOrCreate?: CachedEmailCreateOrConnectWithoutStressfreiEmailInput | CachedEmailCreateOrConnectWithoutStressfreiEmailInput[] + createMany?: CachedEmailCreateManyStressfreiEmailInputEnvelope + connect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + } + export type CustomerUpdateOneRequiredWithoutStressfreiEmailsNestedInput = { create?: XOR connectOrCreate?: CustomerCreateOrConnectWithoutStressfreiEmailsInput @@ -44213,6 +46420,20 @@ export namespace Prisma { deleteMany?: ContractScalarWhereInput | ContractScalarWhereInput[] } + export type CachedEmailUpdateManyWithoutStressfreiEmailNestedInput = { + create?: XOR | CachedEmailCreateWithoutStressfreiEmailInput[] | CachedEmailUncheckedCreateWithoutStressfreiEmailInput[] + connectOrCreate?: CachedEmailCreateOrConnectWithoutStressfreiEmailInput | CachedEmailCreateOrConnectWithoutStressfreiEmailInput[] + upsert?: CachedEmailUpsertWithWhereUniqueWithoutStressfreiEmailInput | CachedEmailUpsertWithWhereUniqueWithoutStressfreiEmailInput[] + createMany?: CachedEmailCreateManyStressfreiEmailInputEnvelope + set?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + disconnect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + delete?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + connect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + update?: CachedEmailUpdateWithWhereUniqueWithoutStressfreiEmailInput | CachedEmailUpdateWithWhereUniqueWithoutStressfreiEmailInput[] + updateMany?: CachedEmailUpdateManyWithWhereWithoutStressfreiEmailInput | CachedEmailUpdateManyWithWhereWithoutStressfreiEmailInput[] + deleteMany?: CachedEmailScalarWhereInput | CachedEmailScalarWhereInput[] + } + export type ContractUncheckedUpdateManyWithoutStressfreiEmailNestedInput = { create?: XOR | ContractCreateWithoutStressfreiEmailInput[] | ContractUncheckedCreateWithoutStressfreiEmailInput[] connectOrCreate?: ContractCreateOrConnectWithoutStressfreiEmailInput | ContractCreateOrConnectWithoutStressfreiEmailInput[] @@ -44227,6 +46448,54 @@ export namespace Prisma { deleteMany?: ContractScalarWhereInput | ContractScalarWhereInput[] } + export type CachedEmailUncheckedUpdateManyWithoutStressfreiEmailNestedInput = { + create?: XOR | CachedEmailCreateWithoutStressfreiEmailInput[] | CachedEmailUncheckedCreateWithoutStressfreiEmailInput[] + connectOrCreate?: CachedEmailCreateOrConnectWithoutStressfreiEmailInput | CachedEmailCreateOrConnectWithoutStressfreiEmailInput[] + upsert?: CachedEmailUpsertWithWhereUniqueWithoutStressfreiEmailInput | CachedEmailUpsertWithWhereUniqueWithoutStressfreiEmailInput[] + createMany?: CachedEmailCreateManyStressfreiEmailInputEnvelope + set?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + disconnect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + delete?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + connect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + update?: CachedEmailUpdateWithWhereUniqueWithoutStressfreiEmailInput | CachedEmailUpdateWithWhereUniqueWithoutStressfreiEmailInput[] + updateMany?: CachedEmailUpdateManyWithWhereWithoutStressfreiEmailInput | CachedEmailUpdateManyWithWhereWithoutStressfreiEmailInput[] + deleteMany?: CachedEmailScalarWhereInput | CachedEmailScalarWhereInput[] + } + + export type StressfreiEmailCreateNestedOneWithoutCachedEmailsInput = { + create?: XOR + connectOrCreate?: StressfreiEmailCreateOrConnectWithoutCachedEmailsInput + connect?: StressfreiEmailWhereUniqueInput + } + + export type ContractCreateNestedOneWithoutAssignedEmailsInput = { + create?: XOR + connectOrCreate?: ContractCreateOrConnectWithoutAssignedEmailsInput + connect?: ContractWhereUniqueInput + } + + export type EnumEmailFolderFieldUpdateOperationsInput = { + set?: $Enums.EmailFolder + } + + export type StressfreiEmailUpdateOneRequiredWithoutCachedEmailsNestedInput = { + create?: XOR + connectOrCreate?: StressfreiEmailCreateOrConnectWithoutCachedEmailsInput + upsert?: StressfreiEmailUpsertWithoutCachedEmailsInput + connect?: StressfreiEmailWhereUniqueInput + update?: XOR, StressfreiEmailUncheckedUpdateWithoutCachedEmailsInput> + } + + export type ContractUpdateOneWithoutAssignedEmailsNestedInput = { + create?: XOR + connectOrCreate?: ContractCreateOrConnectWithoutAssignedEmailsInput + upsert?: ContractUpsertWithoutAssignedEmailsInput + disconnect?: ContractWhereInput | boolean + delete?: ContractWhereInput | boolean + connect?: ContractWhereUniqueInput + update?: XOR, ContractUncheckedUpdateWithoutAssignedEmailsInput> + } + export type CustomerCreateNestedOneWithoutMetersInput = { create?: XOR connectOrCreate?: CustomerCreateOrConnectWithoutMetersInput @@ -44774,6 +47043,13 @@ export namespace Prisma { connect?: ContractTaskWhereUniqueInput | ContractTaskWhereUniqueInput[] } + export type CachedEmailCreateNestedManyWithoutContractInput = { + create?: XOR | CachedEmailCreateWithoutContractInput[] | CachedEmailUncheckedCreateWithoutContractInput[] + connectOrCreate?: CachedEmailCreateOrConnectWithoutContractInput | CachedEmailCreateOrConnectWithoutContractInput[] + createMany?: CachedEmailCreateManyContractInputEnvelope + connect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + } + export type ContractUncheckedCreateNestedOneWithoutPreviousContractInput = { create?: XOR connectOrCreate?: ContractCreateOrConnectWithoutPreviousContractInput @@ -44817,6 +47093,13 @@ export namespace Prisma { connect?: ContractTaskWhereUniqueInput | ContractTaskWhereUniqueInput[] } + export type CachedEmailUncheckedCreateNestedManyWithoutContractInput = { + create?: XOR | CachedEmailCreateWithoutContractInput[] | CachedEmailUncheckedCreateWithoutContractInput[] + connectOrCreate?: CachedEmailCreateOrConnectWithoutContractInput | CachedEmailCreateOrConnectWithoutContractInput[] + createMany?: CachedEmailCreateManyContractInputEnvelope + connect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + } + export type EnumContractTypeFieldUpdateOperationsInput = { set?: $Enums.ContractType } @@ -45025,6 +47308,20 @@ export namespace Prisma { deleteMany?: ContractTaskScalarWhereInput | ContractTaskScalarWhereInput[] } + export type CachedEmailUpdateManyWithoutContractNestedInput = { + create?: XOR | CachedEmailCreateWithoutContractInput[] | CachedEmailUncheckedCreateWithoutContractInput[] + connectOrCreate?: CachedEmailCreateOrConnectWithoutContractInput | CachedEmailCreateOrConnectWithoutContractInput[] + upsert?: CachedEmailUpsertWithWhereUniqueWithoutContractInput | CachedEmailUpsertWithWhereUniqueWithoutContractInput[] + createMany?: CachedEmailCreateManyContractInputEnvelope + set?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + disconnect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + delete?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + connect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + update?: CachedEmailUpdateWithWhereUniqueWithoutContractInput | CachedEmailUpdateWithWhereUniqueWithoutContractInput[] + updateMany?: CachedEmailUpdateManyWithWhereWithoutContractInput | CachedEmailUpdateManyWithWhereWithoutContractInput[] + deleteMany?: CachedEmailScalarWhereInput | CachedEmailScalarWhereInput[] + } + export type ContractUncheckedUpdateOneWithoutPreviousContractNestedInput = { create?: XOR connectOrCreate?: ContractCreateOrConnectWithoutPreviousContractInput @@ -45099,6 +47396,20 @@ export namespace Prisma { deleteMany?: ContractTaskScalarWhereInput | ContractTaskScalarWhereInput[] } + export type CachedEmailUncheckedUpdateManyWithoutContractNestedInput = { + create?: XOR | CachedEmailCreateWithoutContractInput[] | CachedEmailUncheckedCreateWithoutContractInput[] + connectOrCreate?: CachedEmailCreateOrConnectWithoutContractInput | CachedEmailCreateOrConnectWithoutContractInput[] + upsert?: CachedEmailUpsertWithWhereUniqueWithoutContractInput | CachedEmailUpsertWithWhereUniqueWithoutContractInput[] + createMany?: CachedEmailCreateManyContractInputEnvelope + set?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + disconnect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + delete?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + connect?: CachedEmailWhereUniqueInput | CachedEmailWhereUniqueInput[] + update?: CachedEmailUpdateWithWhereUniqueWithoutContractInput | CachedEmailUpdateWithWhereUniqueWithoutContractInput[] + updateMany?: CachedEmailUpdateManyWithWhereWithoutContractInput | CachedEmailUpdateManyWithWhereWithoutContractInput[] + deleteMany?: CachedEmailScalarWhereInput | CachedEmailScalarWhereInput[] + } + export type ContractCreateNestedOneWithoutTasksInput = { create?: XOR connectOrCreate?: ContractCreateOrConnectWithoutTasksInput @@ -45474,6 +47785,17 @@ export namespace Prisma { not?: NestedBoolFilter<$PrismaModel> | boolean } + export type NestedDateTimeNullableFilter<$PrismaModel = never> = { + equals?: Date | string | DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | null + notIn?: Date[] | string[] | null + lt?: Date | string | DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | DateTimeFieldRefInput<$PrismaModel> + not?: NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null + } + export type NestedIntNullableFilter<$PrismaModel = never> = { equals?: number | IntFieldRefInput<$PrismaModel> | null in?: number[] | null @@ -45493,6 +47815,20 @@ export namespace Prisma { _max?: NestedBoolFilter<$PrismaModel> } + export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | null + notIn?: Date[] | string[] | null + lt?: Date | string | DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | DateTimeFieldRefInput<$PrismaModel> + not?: NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null + _count?: NestedIntNullableFilter<$PrismaModel> + _min?: NestedDateTimeNullableFilter<$PrismaModel> + _max?: NestedDateTimeNullableFilter<$PrismaModel> + } + export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: number | IntFieldRefInput<$PrismaModel> | null in?: number[] | null @@ -45558,17 +47894,6 @@ export namespace Prisma { not?: NestedEnumCustomerTypeFilter<$PrismaModel> | $Enums.CustomerType } - export type NestedDateTimeNullableFilter<$PrismaModel = never> = { - equals?: Date | string | DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | null - notIn?: Date[] | string[] | null - lt?: Date | string | DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | DateTimeFieldRefInput<$PrismaModel> - not?: NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null - } - export type NestedEnumCustomerTypeWithAggregatesFilter<$PrismaModel = never> = { equals?: $Enums.CustomerType | EnumCustomerTypeFieldRefInput<$PrismaModel> in?: $Enums.CustomerType[] @@ -45579,20 +47904,6 @@ export namespace Prisma { _max?: NestedEnumCustomerTypeFilter<$PrismaModel> } - export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { - equals?: Date | string | DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | null - notIn?: Date[] | string[] | null - lt?: Date | string | DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | DateTimeFieldRefInput<$PrismaModel> - not?: NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null - _count?: NestedIntNullableFilter<$PrismaModel> - _min?: NestedDateTimeNullableFilter<$PrismaModel> - _max?: NestedDateTimeNullableFilter<$PrismaModel> - } - export type NestedEnumAddressTypeFilter<$PrismaModel = never> = { equals?: $Enums.AddressType | EnumAddressTypeFieldRefInput<$PrismaModel> in?: $Enums.AddressType[] @@ -45634,6 +47945,13 @@ export namespace Prisma { not?: NestedEnumEmailProviderTypeFilter<$PrismaModel> | $Enums.EmailProviderType } + export type NestedEnumMailEncryptionFilter<$PrismaModel = never> = { + equals?: $Enums.MailEncryption | EnumMailEncryptionFieldRefInput<$PrismaModel> + in?: $Enums.MailEncryption[] + notIn?: $Enums.MailEncryption[] + not?: NestedEnumMailEncryptionFilter<$PrismaModel> | $Enums.MailEncryption + } + export type NestedEnumEmailProviderTypeWithAggregatesFilter<$PrismaModel = never> = { equals?: $Enums.EmailProviderType | EnumEmailProviderTypeFieldRefInput<$PrismaModel> in?: $Enums.EmailProviderType[] @@ -45644,6 +47962,33 @@ export namespace Prisma { _max?: NestedEnumEmailProviderTypeFilter<$PrismaModel> } + export type NestedEnumMailEncryptionWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.MailEncryption | EnumMailEncryptionFieldRefInput<$PrismaModel> + in?: $Enums.MailEncryption[] + notIn?: $Enums.MailEncryption[] + not?: NestedEnumMailEncryptionWithAggregatesFilter<$PrismaModel> | $Enums.MailEncryption + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumMailEncryptionFilter<$PrismaModel> + _max?: NestedEnumMailEncryptionFilter<$PrismaModel> + } + + export type NestedEnumEmailFolderFilter<$PrismaModel = never> = { + equals?: $Enums.EmailFolder | EnumEmailFolderFieldRefInput<$PrismaModel> + in?: $Enums.EmailFolder[] + notIn?: $Enums.EmailFolder[] + not?: NestedEnumEmailFolderFilter<$PrismaModel> | $Enums.EmailFolder + } + + export type NestedEnumEmailFolderWithAggregatesFilter<$PrismaModel = never> = { + equals?: $Enums.EmailFolder | EnumEmailFolderFieldRefInput<$PrismaModel> + in?: $Enums.EmailFolder[] + notIn?: $Enums.EmailFolder[] + not?: NestedEnumEmailFolderWithAggregatesFilter<$PrismaModel> | $Enums.EmailFolder + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedEnumEmailFolderFilter<$PrismaModel> + _max?: NestedEnumEmailFolderFilter<$PrismaModel> + } + export type NestedEnumMeterTypeFilter<$PrismaModel = never> = { equals?: $Enums.MeterType | EnumMeterTypeFieldRefInput<$PrismaModel> in?: $Enums.MeterType[] @@ -46169,6 +48514,7 @@ export namespace Prisma { firstName: string lastName: string isActive?: boolean + tokenInvalidatedAt?: Date | string | null createdAt?: Date | string updatedAt?: Date | string customer?: CustomerCreateNestedOneWithoutUserInput @@ -46181,6 +48527,7 @@ export namespace Prisma { firstName: string lastName: string isActive?: boolean + tokenInvalidatedAt?: Date | string | null customerId?: number | null createdAt?: Date | string updatedAt?: Date | string @@ -46230,6 +48577,7 @@ export namespace Prisma { firstName?: StringFieldUpdateOperationsInput | string lastName?: StringFieldUpdateOperationsInput | string isActive?: BoolFieldUpdateOperationsInput | boolean + tokenInvalidatedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string customer?: CustomerUpdateOneWithoutUserNestedInput @@ -46242,6 +48590,7 @@ export namespace Prisma { firstName?: StringFieldUpdateOperationsInput | string lastName?: StringFieldUpdateOperationsInput | string isActive?: BoolFieldUpdateOperationsInput | boolean + tokenInvalidatedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null customerId?: NullableIntFieldUpdateOperationsInput | number | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string @@ -46281,6 +48630,7 @@ export namespace Prisma { firstName: string lastName: string isActive?: boolean + tokenInvalidatedAt?: Date | string | null createdAt?: Date | string updatedAt?: Date | string roles?: UserRoleCreateNestedManyWithoutUserInput @@ -46293,6 +48643,7 @@ export namespace Prisma { firstName: string lastName: string isActive?: boolean + tokenInvalidatedAt?: Date | string | null createdAt?: Date | string updatedAt?: Date | string roles?: UserRoleUncheckedCreateNestedManyWithoutUserInput @@ -46459,9 +48810,12 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: Date | string | null provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null createdAt?: Date | string updatedAt?: Date | string contracts?: ContractCreateNestedManyWithoutStressfreiEmailInput + cachedEmails?: CachedEmailCreateNestedManyWithoutStressfreiEmailInput } export type StressfreiEmailUncheckedCreateWithoutCustomerInput = { @@ -46473,9 +48827,12 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: Date | string | null provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null createdAt?: Date | string updatedAt?: Date | string contracts?: ContractUncheckedCreateNestedManyWithoutStressfreiEmailInput + cachedEmails?: CachedEmailUncheckedCreateNestedManyWithoutStressfreiEmailInput } export type StressfreiEmailCreateOrConnectWithoutCustomerInput = { @@ -46531,6 +48888,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutCustomerInput = { @@ -46577,6 +48935,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutCustomerInput = { @@ -46660,6 +49019,7 @@ export namespace Prisma { firstName?: StringFieldUpdateOperationsInput | string lastName?: StringFieldUpdateOperationsInput | string isActive?: BoolFieldUpdateOperationsInput | boolean + tokenInvalidatedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string roles?: UserRoleUpdateManyWithoutUserNestedInput @@ -46672,6 +49032,7 @@ export namespace Prisma { firstName?: StringFieldUpdateOperationsInput | string lastName?: StringFieldUpdateOperationsInput | string isActive?: BoolFieldUpdateOperationsInput | boolean + tokenInvalidatedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string roles?: UserRoleUncheckedUpdateManyWithoutUserNestedInput @@ -46837,6 +49198,8 @@ export namespace Prisma { isProvisioned?: BoolFilter<"StressfreiEmail"> | boolean provisionedAt?: DateTimeNullableFilter<"StressfreiEmail"> | Date | string | null provisionError?: StringNullableFilter<"StressfreiEmail"> | string | null + hasMailbox?: BoolFilter<"StressfreiEmail"> | boolean + emailPasswordEncrypted?: StringNullableFilter<"StressfreiEmail"> | string | null createdAt?: DateTimeFilter<"StressfreiEmail"> | Date | string updatedAt?: DateTimeFilter<"StressfreiEmail"> | Date | string } @@ -47390,6 +49753,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutAddressInput = { @@ -47436,6 +49800,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutAddressInput = { @@ -47669,6 +50034,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutBankCardInput = { @@ -47715,6 +50081,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutBankCardInput = { @@ -47948,6 +50315,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutIdentityDocumentInput = { @@ -47994,6 +50362,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutIdentityDocumentInput = { @@ -48227,6 +50596,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutStressfreiEmailInput = { @@ -48273,6 +50643,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutStressfreiEmailInput = { @@ -48285,6 +50656,69 @@ export namespace Prisma { skipDuplicates?: boolean } + export type CachedEmailCreateWithoutStressfreiEmailInput = { + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + contract?: ContractCreateNestedOneWithoutAssignedEmailsInput + } + + export type CachedEmailUncheckedCreateWithoutStressfreiEmailInput = { + id?: number + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + contractId?: number | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + } + + export type CachedEmailCreateOrConnectWithoutStressfreiEmailInput = { + where: CachedEmailWhereUniqueInput + create: XOR + } + + export type CachedEmailCreateManyStressfreiEmailInputEnvelope = { + data: CachedEmailCreateManyStressfreiEmailInput | CachedEmailCreateManyStressfreiEmailInput[] + skipDuplicates?: boolean + } + export type CustomerUpsertWithoutStressfreiEmailsInput = { update: XOR create: XOR @@ -48385,6 +50819,337 @@ export namespace Prisma { data: XOR } + export type CachedEmailUpsertWithWhereUniqueWithoutStressfreiEmailInput = { + where: CachedEmailWhereUniqueInput + update: XOR + create: XOR + } + + export type CachedEmailUpdateWithWhereUniqueWithoutStressfreiEmailInput = { + where: CachedEmailWhereUniqueInput + data: XOR + } + + export type CachedEmailUpdateManyWithWhereWithoutStressfreiEmailInput = { + where: CachedEmailScalarWhereInput + data: XOR + } + + export type CachedEmailScalarWhereInput = { + AND?: CachedEmailScalarWhereInput | CachedEmailScalarWhereInput[] + OR?: CachedEmailScalarWhereInput[] + NOT?: CachedEmailScalarWhereInput | CachedEmailScalarWhereInput[] + id?: IntFilter<"CachedEmail"> | number + stressfreiEmailId?: IntFilter<"CachedEmail"> | number + folder?: EnumEmailFolderFilter<"CachedEmail"> | $Enums.EmailFolder + messageId?: StringFilter<"CachedEmail"> | string + uid?: IntFilter<"CachedEmail"> | number + subject?: StringNullableFilter<"CachedEmail"> | string | null + fromAddress?: StringFilter<"CachedEmail"> | string + fromName?: StringNullableFilter<"CachedEmail"> | string | null + toAddresses?: StringFilter<"CachedEmail"> | string + ccAddresses?: StringNullableFilter<"CachedEmail"> | string | null + receivedAt?: DateTimeFilter<"CachedEmail"> | Date | string + textBody?: StringNullableFilter<"CachedEmail"> | string | null + htmlBody?: StringNullableFilter<"CachedEmail"> | string | null + hasAttachments?: BoolFilter<"CachedEmail"> | boolean + attachmentNames?: StringNullableFilter<"CachedEmail"> | string | null + contractId?: IntNullableFilter<"CachedEmail"> | number | null + assignedAt?: DateTimeNullableFilter<"CachedEmail"> | Date | string | null + assignedBy?: IntNullableFilter<"CachedEmail"> | number | null + isAutoAssigned?: BoolFilter<"CachedEmail"> | boolean + isRead?: BoolFilter<"CachedEmail"> | boolean + isStarred?: BoolFilter<"CachedEmail"> | boolean + isDeleted?: BoolFilter<"CachedEmail"> | boolean + deletedAt?: DateTimeNullableFilter<"CachedEmail"> | Date | string | null + createdAt?: DateTimeFilter<"CachedEmail"> | Date | string + updatedAt?: DateTimeFilter<"CachedEmail"> | Date | string + } + + export type StressfreiEmailCreateWithoutCachedEmailsInput = { + email: string + platform?: string | null + notes?: string | null + isActive?: boolean + isProvisioned?: boolean + provisionedAt?: Date | string | null + provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null + createdAt?: Date | string + updatedAt?: Date | string + customer: CustomerCreateNestedOneWithoutStressfreiEmailsInput + contracts?: ContractCreateNestedManyWithoutStressfreiEmailInput + } + + export type StressfreiEmailUncheckedCreateWithoutCachedEmailsInput = { + id?: number + customerId: number + email: string + platform?: string | null + notes?: string | null + isActive?: boolean + isProvisioned?: boolean + provisionedAt?: Date | string | null + provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null + createdAt?: Date | string + updatedAt?: Date | string + contracts?: ContractUncheckedCreateNestedManyWithoutStressfreiEmailInput + } + + export type StressfreiEmailCreateOrConnectWithoutCachedEmailsInput = { + where: StressfreiEmailWhereUniqueInput + create: XOR + } + + export type ContractCreateWithoutAssignedEmailsInput = { + contractNumber: string + type: $Enums.ContractType + status?: $Enums.ContractStatus + providerName?: string | null + tariffName?: string | null + customerNumberAtProvider?: string | null + priceFirst12Months?: string | null + priceFrom13Months?: string | null + priceAfter24Months?: string | null + startDate?: Date | string | null + endDate?: Date | string | null + commission?: number | null + cancellationLetterPath?: string | null + cancellationConfirmationPath?: string | null + cancellationLetterOptionsPath?: string | null + cancellationConfirmationOptionsPath?: string | null + cancellationConfirmationDate?: Date | string | null + cancellationConfirmationOptionsDate?: Date | string | null + wasSpecialCancellation?: boolean + portalUsername?: string | null + portalPasswordEncrypted?: string | null + notes?: string | null + createdAt?: Date | string + updatedAt?: Date | string + customer: CustomerCreateNestedOneWithoutContractsInput + contractCategory?: ContractCategoryCreateNestedOneWithoutContractsInput + address?: AddressCreateNestedOneWithoutContractsInput + bankCard?: BankCardCreateNestedOneWithoutContractsInput + identityDocument?: IdentityDocumentCreateNestedOneWithoutContractsInput + salesPlatform?: SalesPlatformCreateNestedOneWithoutContractsInput + cancellationPeriod?: CancellationPeriodCreateNestedOneWithoutContractsInput + contractDuration?: ContractDurationCreateNestedOneWithoutContractsInput + previousContract?: ContractCreateNestedOneWithoutFollowUpContractInput + followUpContract?: ContractCreateNestedOneWithoutPreviousContractInput + provider?: ProviderCreateNestedOneWithoutContractsInput + tariff?: TariffCreateNestedOneWithoutContractsInput + stressfreiEmail?: StressfreiEmailCreateNestedOneWithoutContractsInput + energyDetails?: EnergyContractDetailsCreateNestedOneWithoutContractInput + internetDetails?: InternetContractDetailsCreateNestedOneWithoutContractInput + mobileDetails?: MobileContractDetailsCreateNestedOneWithoutContractInput + tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput + carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput + tasks?: ContractTaskCreateNestedManyWithoutContractInput + } + + export type ContractUncheckedCreateWithoutAssignedEmailsInput = { + id?: number + contractNumber: string + customerId: number + type: $Enums.ContractType + status?: $Enums.ContractStatus + contractCategoryId?: number | null + addressId?: number | null + bankCardId?: number | null + identityDocumentId?: number | null + salesPlatformId?: number | null + cancellationPeriodId?: number | null + contractDurationId?: number | null + previousContractId?: number | null + providerId?: number | null + tariffId?: number | null + providerName?: string | null + tariffName?: string | null + customerNumberAtProvider?: string | null + priceFirst12Months?: string | null + priceFrom13Months?: string | null + priceAfter24Months?: string | null + startDate?: Date | string | null + endDate?: Date | string | null + commission?: number | null + cancellationLetterPath?: string | null + cancellationConfirmationPath?: string | null + cancellationLetterOptionsPath?: string | null + cancellationConfirmationOptionsPath?: string | null + cancellationConfirmationDate?: Date | string | null + cancellationConfirmationOptionsDate?: Date | string | null + wasSpecialCancellation?: boolean + portalUsername?: string | null + portalPasswordEncrypted?: string | null + stressfreiEmailId?: number | null + notes?: string | null + createdAt?: Date | string + updatedAt?: Date | string + followUpContract?: ContractUncheckedCreateNestedOneWithoutPreviousContractInput + energyDetails?: EnergyContractDetailsUncheckedCreateNestedOneWithoutContractInput + internetDetails?: InternetContractDetailsUncheckedCreateNestedOneWithoutContractInput + mobileDetails?: MobileContractDetailsUncheckedCreateNestedOneWithoutContractInput + tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput + carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput + tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + } + + export type ContractCreateOrConnectWithoutAssignedEmailsInput = { + where: ContractWhereUniqueInput + create: XOR + } + + export type StressfreiEmailUpsertWithoutCachedEmailsInput = { + update: XOR + create: XOR + where?: StressfreiEmailWhereInput + } + + export type StressfreiEmailUpdateToOneWithWhereWithoutCachedEmailsInput = { + where?: StressfreiEmailWhereInput + data: XOR + } + + export type StressfreiEmailUpdateWithoutCachedEmailsInput = { + email?: StringFieldUpdateOperationsInput | string + platform?: NullableStringFieldUpdateOperationsInput | string | null + notes?: NullableStringFieldUpdateOperationsInput | string | null + isActive?: BoolFieldUpdateOperationsInput | boolean + isProvisioned?: BoolFieldUpdateOperationsInput | boolean + provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + customer?: CustomerUpdateOneRequiredWithoutStressfreiEmailsNestedInput + contracts?: ContractUpdateManyWithoutStressfreiEmailNestedInput + } + + export type StressfreiEmailUncheckedUpdateWithoutCachedEmailsInput = { + id?: IntFieldUpdateOperationsInput | number + customerId?: IntFieldUpdateOperationsInput | number + email?: StringFieldUpdateOperationsInput | string + platform?: NullableStringFieldUpdateOperationsInput | string | null + notes?: NullableStringFieldUpdateOperationsInput | string | null + isActive?: BoolFieldUpdateOperationsInput | boolean + isProvisioned?: BoolFieldUpdateOperationsInput | boolean + provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + contracts?: ContractUncheckedUpdateManyWithoutStressfreiEmailNestedInput + } + + export type ContractUpsertWithoutAssignedEmailsInput = { + update: XOR + create: XOR + where?: ContractWhereInput + } + + export type ContractUpdateToOneWithWhereWithoutAssignedEmailsInput = { + where?: ContractWhereInput + data: XOR + } + + export type ContractUpdateWithoutAssignedEmailsInput = { + contractNumber?: StringFieldUpdateOperationsInput | string + type?: EnumContractTypeFieldUpdateOperationsInput | $Enums.ContractType + status?: EnumContractStatusFieldUpdateOperationsInput | $Enums.ContractStatus + providerName?: NullableStringFieldUpdateOperationsInput | string | null + tariffName?: NullableStringFieldUpdateOperationsInput | string | null + customerNumberAtProvider?: NullableStringFieldUpdateOperationsInput | string | null + priceFirst12Months?: NullableStringFieldUpdateOperationsInput | string | null + priceFrom13Months?: NullableStringFieldUpdateOperationsInput | string | null + priceAfter24Months?: NullableStringFieldUpdateOperationsInput | string | null + startDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + endDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + commission?: NullableFloatFieldUpdateOperationsInput | number | null + cancellationLetterPath?: NullableStringFieldUpdateOperationsInput | string | null + cancellationConfirmationPath?: NullableStringFieldUpdateOperationsInput | string | null + cancellationLetterOptionsPath?: NullableStringFieldUpdateOperationsInput | string | null + cancellationConfirmationOptionsPath?: NullableStringFieldUpdateOperationsInput | string | null + cancellationConfirmationDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + cancellationConfirmationOptionsDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + wasSpecialCancellation?: BoolFieldUpdateOperationsInput | boolean + portalUsername?: NullableStringFieldUpdateOperationsInput | string | null + portalPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null + notes?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + customer?: CustomerUpdateOneRequiredWithoutContractsNestedInput + contractCategory?: ContractCategoryUpdateOneWithoutContractsNestedInput + address?: AddressUpdateOneWithoutContractsNestedInput + bankCard?: BankCardUpdateOneWithoutContractsNestedInput + identityDocument?: IdentityDocumentUpdateOneWithoutContractsNestedInput + salesPlatform?: SalesPlatformUpdateOneWithoutContractsNestedInput + cancellationPeriod?: CancellationPeriodUpdateOneWithoutContractsNestedInput + contractDuration?: ContractDurationUpdateOneWithoutContractsNestedInput + previousContract?: ContractUpdateOneWithoutFollowUpContractNestedInput + followUpContract?: ContractUpdateOneWithoutPreviousContractNestedInput + provider?: ProviderUpdateOneWithoutContractsNestedInput + tariff?: TariffUpdateOneWithoutContractsNestedInput + stressfreiEmail?: StressfreiEmailUpdateOneWithoutContractsNestedInput + energyDetails?: EnergyContractDetailsUpdateOneWithoutContractNestedInput + internetDetails?: InternetContractDetailsUpdateOneWithoutContractNestedInput + mobileDetails?: MobileContractDetailsUpdateOneWithoutContractNestedInput + tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput + carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput + tasks?: ContractTaskUpdateManyWithoutContractNestedInput + } + + export type ContractUncheckedUpdateWithoutAssignedEmailsInput = { + id?: IntFieldUpdateOperationsInput | number + contractNumber?: StringFieldUpdateOperationsInput | string + customerId?: IntFieldUpdateOperationsInput | number + type?: EnumContractTypeFieldUpdateOperationsInput | $Enums.ContractType + status?: EnumContractStatusFieldUpdateOperationsInput | $Enums.ContractStatus + contractCategoryId?: NullableIntFieldUpdateOperationsInput | number | null + addressId?: NullableIntFieldUpdateOperationsInput | number | null + bankCardId?: NullableIntFieldUpdateOperationsInput | number | null + identityDocumentId?: NullableIntFieldUpdateOperationsInput | number | null + salesPlatformId?: NullableIntFieldUpdateOperationsInput | number | null + cancellationPeriodId?: NullableIntFieldUpdateOperationsInput | number | null + contractDurationId?: NullableIntFieldUpdateOperationsInput | number | null + previousContractId?: NullableIntFieldUpdateOperationsInput | number | null + providerId?: NullableIntFieldUpdateOperationsInput | number | null + tariffId?: NullableIntFieldUpdateOperationsInput | number | null + providerName?: NullableStringFieldUpdateOperationsInput | string | null + tariffName?: NullableStringFieldUpdateOperationsInput | string | null + customerNumberAtProvider?: NullableStringFieldUpdateOperationsInput | string | null + priceFirst12Months?: NullableStringFieldUpdateOperationsInput | string | null + priceFrom13Months?: NullableStringFieldUpdateOperationsInput | string | null + priceAfter24Months?: NullableStringFieldUpdateOperationsInput | string | null + startDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + endDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + commission?: NullableFloatFieldUpdateOperationsInput | number | null + cancellationLetterPath?: NullableStringFieldUpdateOperationsInput | string | null + cancellationConfirmationPath?: NullableStringFieldUpdateOperationsInput | string | null + cancellationLetterOptionsPath?: NullableStringFieldUpdateOperationsInput | string | null + cancellationConfirmationOptionsPath?: NullableStringFieldUpdateOperationsInput | string | null + cancellationConfirmationDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + cancellationConfirmationOptionsDate?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + wasSpecialCancellation?: BoolFieldUpdateOperationsInput | boolean + portalUsername?: NullableStringFieldUpdateOperationsInput | string | null + portalPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null + stressfreiEmailId?: NullableIntFieldUpdateOperationsInput | number | null + notes?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + followUpContract?: ContractUncheckedUpdateOneWithoutPreviousContractNestedInput + energyDetails?: EnergyContractDetailsUncheckedUpdateOneWithoutContractNestedInput + internetDetails?: InternetContractDetailsUncheckedUpdateOneWithoutContractNestedInput + mobileDetails?: MobileContractDetailsUncheckedUpdateOneWithoutContractNestedInput + tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput + carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput + tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + } + export type CustomerCreateWithoutMetersInput = { customerNumber: string type?: $Enums.CustomerType @@ -48770,6 +51535,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutSalesPlatformInput = { @@ -48816,6 +51582,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutSalesPlatformInput = { @@ -48887,6 +51654,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutCancellationPeriodInput = { @@ -48933,6 +51701,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutCancellationPeriodInput = { @@ -49004,6 +51773,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutContractDurationInput = { @@ -49050,6 +51820,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutContractDurationInput = { @@ -49148,6 +51919,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutProviderInput = { @@ -49194,6 +51966,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutProviderInput = { @@ -49321,6 +52094,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutTariffInput = { @@ -49367,6 +52141,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutTariffInput = { @@ -49472,6 +52247,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutContractCategoryInput = { @@ -49518,6 +52294,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutContractCategoryInput = { @@ -49861,6 +52638,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutFollowUpContractInput = { @@ -49907,6 +52685,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutFollowUpContractInput = { @@ -49957,6 +52736,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutPreviousContractInput = { @@ -50003,6 +52783,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutPreviousContractInput = { @@ -50068,9 +52849,12 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: Date | string | null provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null createdAt?: Date | string updatedAt?: Date | string customer: CustomerCreateNestedOneWithoutStressfreiEmailsInput + cachedEmails?: CachedEmailCreateNestedManyWithoutStressfreiEmailInput } export type StressfreiEmailUncheckedCreateWithoutContractsInput = { @@ -50083,8 +52867,11 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: Date | string | null provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null createdAt?: Date | string updatedAt?: Date | string + cachedEmails?: CachedEmailUncheckedCreateNestedManyWithoutStressfreiEmailInput } export type StressfreiEmailCreateOrConnectWithoutContractsInput = { @@ -50269,6 +53056,69 @@ export namespace Prisma { skipDuplicates?: boolean } + export type CachedEmailCreateWithoutContractInput = { + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + stressfreiEmail: StressfreiEmailCreateNestedOneWithoutCachedEmailsInput + } + + export type CachedEmailUncheckedCreateWithoutContractInput = { + id?: number + stressfreiEmailId: number + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + } + + export type CachedEmailCreateOrConnectWithoutContractInput = { + where: CachedEmailWhereUniqueInput + create: XOR + } + + export type CachedEmailCreateManyContractInputEnvelope = { + data: CachedEmailCreateManyContractInput | CachedEmailCreateManyContractInput[] + skipDuplicates?: boolean + } + export type CustomerUpsertWithoutContractsInput = { update: XOR create: XOR @@ -50643,6 +53493,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutFollowUpContractInput = { @@ -50689,6 +53540,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUpsertWithoutPreviousContractInput = { @@ -50745,6 +53597,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutPreviousContractInput = { @@ -50791,6 +53644,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ProviderUpsertWithoutContractsInput = { @@ -50874,9 +53728,12 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string customer?: CustomerUpdateOneRequiredWithoutStressfreiEmailsNestedInput + cachedEmails?: CachedEmailUpdateManyWithoutStressfreiEmailNestedInput } export type StressfreiEmailUncheckedUpdateWithoutContractsInput = { @@ -50889,8 +53746,11 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + cachedEmails?: CachedEmailUncheckedUpdateManyWithoutStressfreiEmailNestedInput } export type EnergyContractDetailsUpsertWithoutContractInput = { @@ -51097,6 +53957,22 @@ export namespace Prisma { updatedAt?: DateTimeFilter<"ContractTask"> | Date | string } + export type CachedEmailUpsertWithWhereUniqueWithoutContractInput = { + where: CachedEmailWhereUniqueInput + update: XOR + create: XOR + } + + export type CachedEmailUpdateWithWhereUniqueWithoutContractInput = { + where: CachedEmailWhereUniqueInput + data: XOR + } + + export type CachedEmailUpdateManyWithWhereWithoutContractInput = { + where: CachedEmailScalarWhereInput + data: XOR + } + export type ContractCreateWithoutTasksInput = { contractNumber: string type: $Enums.ContractType @@ -51140,6 +54016,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsCreateNestedOneWithoutContractInput tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutTasksInput = { @@ -51186,6 +54063,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUncheckedCreateNestedOneWithoutContractInput tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutTasksInput = { @@ -51276,6 +54154,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUpdateOneWithoutContractNestedInput tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutTasksInput = { @@ -51322,6 +54201,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUncheckedUpdateOneWithoutContractNestedInput tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractTaskSubtaskUpsertWithWhereUniqueWithoutTaskInput = { @@ -51463,6 +54343,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutEnergyDetailsInput = { @@ -51509,6 +54390,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutEnergyDetailsInput = { @@ -51598,6 +54480,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutEnergyDetailsInput = { @@ -51644,6 +54527,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type MeterUpsertWithoutEnergyDetailsInput = { @@ -51723,6 +54607,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutInternetDetailsInput = { @@ -51769,6 +54654,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutInternetDetailsInput = { @@ -51857,6 +54743,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutInternetDetailsInput = { @@ -51903,6 +54790,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type PhoneNumberUpsertWithWhereUniqueWithoutInternetDetailsInput = { @@ -52047,6 +54935,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutMobileDetailsInput = { @@ -52093,6 +54982,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutMobileDetailsInput = { @@ -52187,6 +55077,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutMobileDetailsInput = { @@ -52233,6 +55124,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type SimCardUpsertWithWhereUniqueWithoutMobileDetailsInput = { @@ -52376,6 +55268,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutTvDetailsInput = { @@ -52422,6 +55315,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUncheckedCreateNestedOneWithoutContractInput carInsuranceDetails?: CarInsuranceDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutTvDetailsInput = { @@ -52483,6 +55377,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutTvDetailsInput = { @@ -52529,6 +55424,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractCreateWithoutCarInsuranceDetailsInput = { @@ -52574,6 +55470,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsCreateNestedOneWithoutContractInput tvDetails?: TvContractDetailsCreateNestedOneWithoutContractInput tasks?: ContractTaskCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailCreateNestedManyWithoutContractInput } export type ContractUncheckedCreateWithoutCarInsuranceDetailsInput = { @@ -52620,6 +55517,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUncheckedCreateNestedOneWithoutContractInput tvDetails?: TvContractDetailsUncheckedCreateNestedOneWithoutContractInput tasks?: ContractTaskUncheckedCreateNestedManyWithoutContractInput + assignedEmails?: CachedEmailUncheckedCreateNestedManyWithoutContractInput } export type ContractCreateOrConnectWithoutCarInsuranceDetailsInput = { @@ -52681,6 +55579,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUpdateOneWithoutContractNestedInput tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutCarInsuranceDetailsInput = { @@ -52727,6 +55626,7 @@ export namespace Prisma { mobileDetails?: MobileContractDetailsUncheckedUpdateOneWithoutContractNestedInput tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type UserRoleCreateManyUserInput = { @@ -52853,6 +55753,8 @@ export namespace Prisma { isProvisioned?: boolean provisionedAt?: Date | string | null provisionError?: string | null + hasMailbox?: boolean + emailPasswordEncrypted?: string | null createdAt?: Date | string updatedAt?: Date | string } @@ -53081,9 +55983,12 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string contracts?: ContractUpdateManyWithoutStressfreiEmailNestedInput + cachedEmails?: CachedEmailUpdateManyWithoutStressfreiEmailNestedInput } export type StressfreiEmailUncheckedUpdateWithoutCustomerInput = { @@ -53095,9 +56000,12 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string contracts?: ContractUncheckedUpdateManyWithoutStressfreiEmailNestedInput + cachedEmails?: CachedEmailUncheckedUpdateManyWithoutStressfreiEmailNestedInput } export type StressfreiEmailUncheckedUpdateManyWithoutCustomerInput = { @@ -53109,6 +56017,8 @@ export namespace Prisma { isProvisioned?: BoolFieldUpdateOperationsInput | boolean provisionedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null provisionError?: NullableStringFieldUpdateOperationsInput | string | null + hasMailbox?: BoolFieldUpdateOperationsInput | boolean + emailPasswordEncrypted?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string } @@ -53156,6 +56066,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutCustomerInput = { @@ -53202,6 +56113,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutCustomerInput = { @@ -53377,6 +56289,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutAddressInput = { @@ -53423,6 +56336,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutAddressInput = { @@ -53546,6 +56460,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutBankCardInput = { @@ -53592,6 +56507,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutBankCardInput = { @@ -53715,6 +56631,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutIdentityDocumentInput = { @@ -53761,6 +56678,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutIdentityDocumentInput = { @@ -53841,6 +56759,33 @@ export namespace Prisma { updatedAt?: Date | string } + export type CachedEmailCreateManyStressfreiEmailInput = { + id?: number + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + contractId?: number | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + } + export type ContractUpdateWithoutStressfreiEmailInput = { contractNumber?: StringFieldUpdateOperationsInput | string type?: EnumContractTypeFieldUpdateOperationsInput | $Enums.ContractType @@ -53884,6 +56829,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutStressfreiEmailInput = { @@ -53930,6 +56876,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutStressfreiEmailInput = { @@ -53971,6 +56918,86 @@ export namespace Prisma { updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string } + export type CachedEmailUpdateWithoutStressfreiEmailInput = { + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + contract?: ContractUpdateOneWithoutAssignedEmailsNestedInput + } + + export type CachedEmailUncheckedUpdateWithoutStressfreiEmailInput = { + id?: IntFieldUpdateOperationsInput | number + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + contractId?: NullableIntFieldUpdateOperationsInput | number | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type CachedEmailUncheckedUpdateManyWithoutStressfreiEmailInput = { + id?: IntFieldUpdateOperationsInput | number + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + contractId?: NullableIntFieldUpdateOperationsInput | number | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + export type MeterReadingCreateManyMeterInput = { id?: number readingDate: Date | string @@ -54131,6 +57158,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutSalesPlatformInput = { @@ -54177,6 +57205,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutSalesPlatformInput = { @@ -54300,6 +57329,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutCancellationPeriodInput = { @@ -54346,6 +57376,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutCancellationPeriodInput = { @@ -54469,6 +57500,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutContractDurationInput = { @@ -54515,6 +57547,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutContractDurationInput = { @@ -54671,6 +57704,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutProviderInput = { @@ -54717,6 +57751,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutProviderInput = { @@ -54840,6 +57875,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutTariffInput = { @@ -54886,6 +57922,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutTariffInput = { @@ -55009,6 +58046,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUpdateOneWithoutContractNestedInput tasks?: ContractTaskUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateWithoutContractCategoryInput = { @@ -55055,6 +58093,7 @@ export namespace Prisma { tvDetails?: TvContractDetailsUncheckedUpdateOneWithoutContractNestedInput carInsuranceDetails?: CarInsuranceDetailsUncheckedUpdateOneWithoutContractNestedInput tasks?: ContractTaskUncheckedUpdateManyWithoutContractNestedInput + assignedEmails?: CachedEmailUncheckedUpdateManyWithoutContractNestedInput } export type ContractUncheckedUpdateManyWithoutContractCategoryInput = { @@ -55108,6 +58147,33 @@ export namespace Prisma { updatedAt?: Date | string } + export type CachedEmailCreateManyContractInput = { + id?: number + stressfreiEmailId: number + folder?: $Enums.EmailFolder + messageId: string + uid: number + subject?: string | null + fromAddress: string + fromName?: string | null + toAddresses: string + ccAddresses?: string | null + receivedAt: Date | string + textBody?: string | null + htmlBody?: string | null + hasAttachments?: boolean + attachmentNames?: string | null + assignedAt?: Date | string | null + assignedBy?: number | null + isAutoAssigned?: boolean + isRead?: boolean + isStarred?: boolean + isDeleted?: boolean + deletedAt?: Date | string | null + createdAt?: Date | string + updatedAt?: Date | string + } + export type ContractTaskUpdateWithoutContractInput = { title?: StringFieldUpdateOperationsInput | string description?: NullableStringFieldUpdateOperationsInput | string | null @@ -55145,6 +58211,86 @@ export namespace Prisma { updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string } + export type CachedEmailUpdateWithoutContractInput = { + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + stressfreiEmail?: StressfreiEmailUpdateOneRequiredWithoutCachedEmailsNestedInput + } + + export type CachedEmailUncheckedUpdateWithoutContractInput = { + id?: IntFieldUpdateOperationsInput | number + stressfreiEmailId?: IntFieldUpdateOperationsInput | number + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type CachedEmailUncheckedUpdateManyWithoutContractInput = { + id?: IntFieldUpdateOperationsInput | number + stressfreiEmailId?: IntFieldUpdateOperationsInput | number + folder?: EnumEmailFolderFieldUpdateOperationsInput | $Enums.EmailFolder + messageId?: StringFieldUpdateOperationsInput | string + uid?: IntFieldUpdateOperationsInput | number + subject?: NullableStringFieldUpdateOperationsInput | string | null + fromAddress?: StringFieldUpdateOperationsInput | string + fromName?: NullableStringFieldUpdateOperationsInput | string | null + toAddresses?: StringFieldUpdateOperationsInput | string + ccAddresses?: NullableStringFieldUpdateOperationsInput | string | null + receivedAt?: DateTimeFieldUpdateOperationsInput | Date | string + textBody?: NullableStringFieldUpdateOperationsInput | string | null + htmlBody?: NullableStringFieldUpdateOperationsInput | string | null + hasAttachments?: BoolFieldUpdateOperationsInput | boolean + attachmentNames?: NullableStringFieldUpdateOperationsInput | string | null + assignedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + assignedBy?: NullableIntFieldUpdateOperationsInput | number | null + isAutoAssigned?: BoolFieldUpdateOperationsInput | boolean + isRead?: BoolFieldUpdateOperationsInput | boolean + isStarred?: BoolFieldUpdateOperationsInput | boolean + isDeleted?: BoolFieldUpdateOperationsInput | boolean + deletedAt?: NullableDateTimeFieldUpdateOperationsInput | Date | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + export type ContractTaskSubtaskCreateManyTaskInput = { id?: number title: string @@ -55399,6 +58545,10 @@ export namespace Prisma { * @deprecated Use StressfreiEmailDefaultArgs instead */ export type StressfreiEmailArgs = StressfreiEmailDefaultArgs + /** + * @deprecated Use CachedEmailDefaultArgs instead + */ + export type CachedEmailArgs = CachedEmailDefaultArgs /** * @deprecated Use MeterDefaultArgs instead */ diff --git a/backend/node_modules/.prisma/client/index.js b/backend/node_modules/.prisma/client/index.js index b7415e60..10fc488d 100644 --- a/backend/node_modules/.prisma/client/index.js +++ b/backend/node_modules/.prisma/client/index.js @@ -106,6 +106,7 @@ exports.Prisma.UserScalarFieldEnum = { firstName: 'firstName', lastName: 'lastName', isActive: 'isActive', + tokenInvalidatedAt: 'tokenInvalidatedAt', customerId: 'customerId', createdAt: 'createdAt', updatedAt: 'updatedAt' @@ -228,6 +229,13 @@ exports.Prisma.EmailProviderConfigScalarFieldEnum = { passwordEncrypted: 'passwordEncrypted', domain: 'domain', defaultForwardEmail: 'defaultForwardEmail', + imapServer: 'imapServer', + imapPort: 'imapPort', + smtpServer: 'smtpServer', + smtpPort: 'smtpPort', + imapEncryption: 'imapEncryption', + smtpEncryption: 'smtpEncryption', + allowSelfSignedCerts: 'allowSelfSignedCerts', isActive: 'isActive', isDefault: 'isDefault', createdAt: 'createdAt', @@ -244,6 +252,36 @@ exports.Prisma.StressfreiEmailScalarFieldEnum = { isProvisioned: 'isProvisioned', provisionedAt: 'provisionedAt', provisionError: 'provisionError', + hasMailbox: 'hasMailbox', + emailPasswordEncrypted: 'emailPasswordEncrypted', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +}; + +exports.Prisma.CachedEmailScalarFieldEnum = { + id: 'id', + stressfreiEmailId: 'stressfreiEmailId', + folder: 'folder', + messageId: 'messageId', + uid: 'uid', + subject: 'subject', + fromAddress: 'fromAddress', + fromName: 'fromName', + toAddresses: 'toAddresses', + ccAddresses: 'ccAddresses', + receivedAt: 'receivedAt', + textBody: 'textBody', + htmlBody: 'htmlBody', + hasAttachments: 'hasAttachments', + attachmentNames: 'attachmentNames', + contractId: 'contractId', + assignedAt: 'assignedAt', + assignedBy: 'assignedBy', + isAutoAssigned: 'isAutoAssigned', + isRead: 'isRead', + isStarred: 'isStarred', + isDeleted: 'isDeleted', + deletedAt: 'deletedAt', createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -511,6 +549,17 @@ exports.EmailProviderType = exports.$Enums.EmailProviderType = { DIRECTADMIN: 'DIRECTADMIN' }; +exports.MailEncryption = exports.$Enums.MailEncryption = { + SSL: 'SSL', + STARTTLS: 'STARTTLS', + NONE: 'NONE' +}; + +exports.EmailFolder = exports.$Enums.EmailFolder = { + INBOX: 'INBOX', + SENT: 'SENT' +}; + exports.MeterType = exports.$Enums.MeterType = { ELECTRICITY: 'ELECTRICITY', GAS: 'GAS' @@ -561,6 +610,7 @@ exports.Prisma.ModelName = { IdentityDocument: 'IdentityDocument', EmailProviderConfig: 'EmailProviderConfig', StressfreiEmail: 'StressfreiEmail', + CachedEmail: 'CachedEmail', Meter: 'Meter', MeterReading: 'MeterReading', SalesPlatform: 'SalesPlatform', @@ -618,7 +668,6 @@ const config = { "db" ], "activeProvider": "mysql", - "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -627,8 +676,8 @@ const config = { } } }, - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"mysql\"\n url = env(\"DATABASE_URL\")\n}\n\n// ==================== APP SETTINGS ====================\n\nmodel AppSetting {\n id Int @id @default(autoincrement())\n key String @unique\n value String @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== USERS & AUTH ====================\n\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n password String\n firstName String\n lastName String\n isActive Boolean @default(true)\n customerId Int? @unique\n customer Customer? @relation(fields: [customerId], references: [id])\n roles UserRole[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique\n description String?\n permissions RolePermission[]\n users UserRole[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Permission {\n id Int @id @default(autoincrement())\n resource String\n action String\n roles RolePermission[]\n\n @@unique([resource, action])\n}\n\nmodel RolePermission {\n roleId Int\n permissionId Int\n role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)\n permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade)\n\n @@id([roleId, permissionId])\n}\n\nmodel UserRole {\n userId Int\n roleId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)\n\n @@id([userId, roleId])\n}\n\n// ==================== CUSTOMERS ====================\n\nenum CustomerType {\n PRIVATE\n BUSINESS\n}\n\nmodel Customer {\n id Int @id @default(autoincrement())\n customerNumber String @unique\n type CustomerType @default(PRIVATE)\n salutation String?\n firstName String\n lastName String\n companyName String?\n foundingDate DateTime? // Gründungsdatum (für Firmen)\n birthDate DateTime?\n birthPlace String?\n email String?\n phone String?\n mobile String?\n taxNumber String?\n businessRegistrationPath String? // PDF-Pfad zur Gewerbeanmeldung\n commercialRegisterPath String? // PDF-Pfad zum Handelsregisterauszug\n commercialRegisterNumber String? // Handelsregisternummer (Text)\n privacyPolicyPath String? // PDF-Pfad zur Datenschutzerklärung (für alle Kunden)\n notes String? @db.Text\n\n // ===== Portal-Zugangsdaten =====\n portalEnabled Boolean @default(false) // Portal aktiviert?\n portalEmail String? @unique // Portal-Login E-Mail\n portalPasswordHash String? // Gehashtes Passwort (für Login)\n portalPasswordEncrypted String? // Verschlüsseltes Passwort (für Anzeige)\n portalLastLogin DateTime? // Letzte Anmeldung\n\n user User?\n addresses Address[]\n bankCards BankCard[]\n identityDocuments IdentityDocument[]\n meters Meter[]\n stressfreiEmails StressfreiEmail[]\n contracts Contract[]\n\n // Vertreter-Beziehungen (Kunde kann für andere Kunden handeln)\n representingFor CustomerRepresentative[] @relation(\"RepresentativeCustomer\")\n representedBy CustomerRepresentative[] @relation(\"RepresentedCustomer\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CUSTOMER REPRESENTATIVES ====================\n// Vertretungsbeziehung: Ein Kunde kann die Verträge eines anderen Kunden einsehen\n// z.B. Sohn (representativeId) kann Verträge der Mutter (customerId) sehen\n\nmodel CustomerRepresentative {\n id Int @id @default(autoincrement())\n customerId Int // Der Kunde, dessen Verträge eingesehen werden (z.B. Mutter)\n customer Customer @relation(\"RepresentedCustomer\", fields: [customerId], references: [id], onDelete: Cascade)\n representativeId Int // Der Kunde, der einsehen darf (z.B. Sohn)\n representative Customer @relation(\"RepresentativeCustomer\", fields: [representativeId], references: [id], onDelete: Cascade)\n notes String? // Notizen zur Vertretung\n isActive Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([customerId, representativeId]) // Keine doppelten Einträge\n}\n\n// ==================== ADDRESSES ====================\n\nenum AddressType {\n DELIVERY_RESIDENCE\n BILLING\n}\n\nmodel Address {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type AddressType @default(DELIVERY_RESIDENCE)\n street String\n houseNumber String\n postalCode String\n city String\n country String @default(\"Deutschland\")\n isDefault Boolean @default(false)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== BANK CARDS ====================\n\nmodel BankCard {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n accountHolder String\n iban String\n bic String?\n bankName String?\n expiryDate DateTime?\n documentPath String? // Pfad zur hochgeladenen PDF\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== IDENTITY DOCUMENTS ====================\n\nenum DocumentType {\n ID_CARD\n PASSPORT\n DRIVERS_LICENSE\n OTHER\n}\n\nmodel IdentityDocument {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type DocumentType @default(ID_CARD)\n documentNumber String\n issuingAuthority String?\n issueDate DateTime?\n expiryDate DateTime?\n documentPath String? // Pfad zur hochgeladenen PDF\n isActive Boolean @default(true)\n // Führerschein-spezifische Felder\n licenseClasses String? // z.B. \"B, BE, AM, L\" - kommasepariert\n licenseIssueDate DateTime? // Datum des Führerscheinerwerbs (Klasse B)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== EMAIL PROVIDER CONFIG (Plesk, cPanel etc.) ====================\n\nenum EmailProviderType {\n PLESK\n CPANEL\n DIRECTADMIN\n}\n\nmodel EmailProviderConfig {\n id Int @id @default(autoincrement())\n name String @unique // z.B. \"Plesk Hauptserver\"\n type EmailProviderType\n apiUrl String // API-URL (z.B. https://server.de:8443)\n apiKey String? // API-Key (verschlüsselt)\n username String? // Benutzername für API\n passwordEncrypted String? // Passwort (verschlüsselt)\n domain String // Domain für E-Mails (z.B. stressfrei-wechseln.de)\n defaultForwardEmail String? // Standard-Weiterleitungsadresse (unsere eigene)\n isActive Boolean @default(true)\n isDefault Boolean @default(false) // Standard-Provider\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== STRESSFREI-WECHSELN EMAIL ADDRESSES ====================\n\nmodel StressfreiEmail {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n email String // Die Weiterleitungs-E-Mail-Adresse\n platform String? // Für welche Plattform (z.B. \"Freenet\", \"Klarmobil\")\n notes String? @db.Text // Optionale Notizen\n isActive Boolean @default(true)\n isProvisioned Boolean @default(false) // Wurde bei Provider angelegt?\n provisionedAt DateTime? // Wann wurde provisioniert?\n provisionError String? @db.Text // Fehlermeldung falls Provisionierung fehlschlug\n contracts Contract[] // Verträge die diese E-Mail als Benutzername verwenden\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== METERS (Energy) ====================\n\nenum MeterType {\n ELECTRICITY\n GAS\n}\n\nmodel Meter {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n meterNumber String\n type MeterType\n location String?\n isActive Boolean @default(true)\n readings MeterReading[]\n energyDetails EnergyContractDetails[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel MeterReading {\n id Int @id @default(autoincrement())\n meterId Int\n meter Meter @relation(fields: [meterId], references: [id], onDelete: Cascade)\n readingDate DateTime\n value Float\n unit String @default(\"kWh\")\n notes String?\n createdAt DateTime @default(now())\n}\n\n// ==================== SALES PLATFORMS ====================\n\nmodel SalesPlatform {\n id Int @id @default(autoincrement())\n name String @unique\n contactInfo String? @db.Text\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CANCELLATION PERIODS ====================\n\nmodel CancellationPeriod {\n id Int @id @default(autoincrement())\n code String @unique // z.B. \"14T\", \"1M\", \"3M\", \"12M\", \"1J\"\n description String // z.B. \"14 Tage\", \"1 Monat\", \"3 Monate\"\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACT DURATIONS ====================\n\nmodel ContractDuration {\n id Int @id @default(autoincrement())\n code String @unique // z.B. \"12M\", \"24M\", \"1J\", \"2J\"\n description String // z.B. \"12 Monate\", \"24 Monate\", \"1 Jahr\"\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== PROVIDERS (Anbieter) ====================\n\nmodel Provider {\n id Int @id @default(autoincrement())\n name String @unique // Anbietername\n portalUrl String? // Kundenkontourl (Login-Seite)\n usernameFieldName String? // Benutzernamefeld (z.B. \"email\", \"username\")\n passwordFieldName String? // Kennwortfeld (z.B. \"password\", \"pwd\")\n isActive Boolean @default(true)\n tariffs Tariff[]\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== TARIFFS (Tarife) ====================\n\nmodel Tariff {\n id Int @id @default(autoincrement())\n providerId Int\n provider Provider @relation(fields: [providerId], references: [id], onDelete: Cascade)\n name String // Tarifname\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([providerId, name]) // Eindeutiger Tarif pro Anbieter\n}\n\n// ==================== CONTRACT CATEGORIES ====================\n\nmodel ContractCategory {\n id Int @id @default(autoincrement())\n code String @unique // Technischer Code (z.B. ELECTRICITY, GAS)\n name String // Anzeigename (z.B. Strom, Gas)\n icon String? // Icon-Name für UI (z.B. \"Zap\", \"Flame\")\n color String? // Farbe für UI (z.B. \"#FFC107\")\n sortOrder Int @default(0)\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACTS ====================\n\n// Legacy Enum - wird durch ContractCategory ersetzt\nenum ContractType {\n ELECTRICITY\n GAS\n DSL\n CABLE\n FIBER\n MOBILE\n TV\n CAR_INSURANCE\n}\n\nenum ContractStatus {\n DRAFT\n PENDING\n ACTIVE\n CANCELLED\n EXPIRED\n DEACTIVATED\n}\n\nmodel Contract {\n id Int @id @default(autoincrement())\n contractNumber String @unique\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type ContractType\n status ContractStatus @default(DRAFT)\n\n // Neue konfigurierbare Kategorie (ersetzt langfristig das type-Enum)\n contractCategoryId Int?\n contractCategory ContractCategory? @relation(fields: [contractCategoryId], references: [id])\n\n addressId Int?\n address Address? @relation(fields: [addressId], references: [id])\n\n bankCardId Int?\n bankCard BankCard? @relation(fields: [bankCardId], references: [id])\n\n identityDocumentId Int?\n identityDocument IdentityDocument? @relation(fields: [identityDocumentId], references: [id])\n\n salesPlatformId Int?\n salesPlatform SalesPlatform? @relation(fields: [salesPlatformId], references: [id])\n\n cancellationPeriodId Int?\n cancellationPeriod CancellationPeriod? @relation(fields: [cancellationPeriodId], references: [id])\n\n contractDurationId Int?\n contractDuration ContractDuration? @relation(fields: [contractDurationId], references: [id])\n\n previousContractId Int? @unique\n previousContract Contract? @relation(\"ContractHistory\", fields: [previousContractId], references: [id])\n followUpContract Contract? @relation(\"ContractHistory\")\n\n // Anbieter & Tarif (neue Verknüpfung)\n providerId Int?\n provider Provider? @relation(fields: [providerId], references: [id])\n tariffId Int?\n tariff Tariff? @relation(fields: [tariffId], references: [id])\n\n // Legacy-Felder (für Abwärtskompatibilität)\n providerName String?\n tariffName String?\n customerNumberAtProvider String?\n priceFirst12Months String? // Preis erste 12 Monate\n priceFrom13Months String? // Preis ab 13. Monat\n priceAfter24Months String? // Preis nach 24 Monaten\n\n startDate DateTime?\n endDate DateTime? // Wird aus startDate + contractDuration berechnet\n commission Float?\n\n // Kündigungsdokumente\n cancellationLetterPath String? // Kündigungsschreiben PDF\n cancellationConfirmationPath String? // Kündigungsbestätigung PDF\n cancellationLetterOptionsPath String? // Kündigungsschreiben Optionen PDF\n cancellationConfirmationOptionsPath String? // Kündigungsbestätigung Optionen PDF\n\n // Kündigungsdaten\n cancellationConfirmationDate DateTime? // Kündigungsbestätigungsdatum\n cancellationConfirmationOptionsDate DateTime? // Kündigungsbestätigungsoptionendatum\n wasSpecialCancellation Boolean @default(false) // Wurde sondergekündigt?\n\n portalUsername String?\n portalPasswordEncrypted String?\n\n // Stressfrei-Wechseln E-Mail als Benutzername (Alternative zu portalUsername)\n stressfreiEmailId Int?\n stressfreiEmail StressfreiEmail? @relation(fields: [stressfreiEmailId], references: [id])\n\n notes String? @db.Text\n\n energyDetails EnergyContractDetails?\n internetDetails InternetContractDetails?\n mobileDetails MobileContractDetails?\n tvDetails TvContractDetails?\n carInsuranceDetails CarInsuranceDetails?\n\n tasks ContractTask[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACT TASKS ====================\n\nenum ContractTaskStatus {\n OPEN\n COMPLETED\n}\n\nmodel ContractTask {\n id Int @id @default(autoincrement())\n contractId Int\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n title String\n description String? @db.Text\n status ContractTaskStatus @default(OPEN)\n visibleInPortal Boolean @default(false)\n createdBy String? // Name des Erstellers\n completedAt DateTime?\n subtasks ContractTaskSubtask[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ContractTaskSubtask {\n id Int @id @default(autoincrement())\n taskId Int\n task ContractTask @relation(fields: [taskId], references: [id], onDelete: Cascade)\n title String\n status ContractTaskStatus @default(OPEN)\n createdBy String?\n completedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== ENERGY CONTRACT DETAILS ====================\n\nmodel EnergyContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n meterId Int?\n meter Meter? @relation(fields: [meterId], references: [id])\n annualConsumption Float?\n basePrice Float?\n unitPrice Float?\n bonus Float?\n previousProviderName String?\n previousCustomerNumber String?\n}\n\n// ==================== INTERNET CONTRACT DETAILS ====================\n\nmodel InternetContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n downloadSpeed Int?\n uploadSpeed Int?\n routerModel String?\n routerSerialNumber String?\n installationDate DateTime?\n // Internet-Zugangsdaten\n internetUsername String?\n internetPasswordEncrypted String? // Verschlüsselt gespeichert\n // Glasfaser-spezifisch\n homeId String?\n // Vodafone DSL/Kabel spezifisch\n activationCode String?\n phoneNumbers PhoneNumber[]\n}\n\nmodel PhoneNumber {\n id Int @id @default(autoincrement())\n internetContractDetailsId Int\n internetDetails InternetContractDetails @relation(fields: [internetContractDetailsId], references: [id], onDelete: Cascade)\n phoneNumber String\n isMain Boolean @default(false)\n // SIP-Zugangsdaten\n sipUsername String?\n sipPasswordEncrypted String? // Verschlüsselt gespeichert\n sipServer String?\n}\n\n// ==================== MOBILE CONTRACT DETAILS ====================\n\nmodel MobileContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n requiresMultisim Boolean @default(false) // Multisim erforderlich?\n dataVolume Float?\n includedMinutes Int?\n includedSMS Int?\n deviceModel String?\n deviceImei String?\n simCards SimCard[]\n // Legacy-Felder (für Abwärtskompatibilität, werden durch simCards ersetzt)\n phoneNumber String?\n simCardNumber String?\n}\n\nmodel SimCard {\n id Int @id @default(autoincrement())\n mobileDetailsId Int\n mobileDetails MobileContractDetails @relation(fields: [mobileDetailsId], references: [id], onDelete: Cascade)\n phoneNumber String? // Rufnummer\n simCardNumber String? // SIM-Kartennummer\n pin String? // PIN (verschlüsselt gespeichert)\n puk String? // PUK (verschlüsselt gespeichert)\n isMultisim Boolean @default(false) // Ist dies eine Multisim-Karte?\n isMain Boolean @default(false) // Ist dies die Hauptkarte?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== TV CONTRACT DETAILS ====================\n\nmodel TvContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n receiverModel String?\n smartcardNumber String?\n package String?\n}\n\n// ==================== CAR INSURANCE DETAILS ====================\n\nenum InsuranceType {\n LIABILITY\n PARTIAL\n FULL\n}\n\nmodel CarInsuranceDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n licensePlate String?\n hsn String?\n tsn String?\n vin String?\n vehicleType String?\n firstRegistration DateTime?\n noClaimsClass String?\n insuranceType InsuranceType @default(LIABILITY)\n deductiblePartial Float?\n deductibleFull Float?\n policyNumber String?\n previousInsurer String?\n}\n", - "inlineSchemaHash": "36ecbca17fa945f160ba1bb4a7cfa1b4971e63c59c4e05b0dcc483003048b598", + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ndatasource db {\n provider = \"mysql\"\n url = env(\"DATABASE_URL\")\n}\n\n// ==================== APP SETTINGS ====================\n\nmodel AppSetting {\n id Int @id @default(autoincrement())\n key String @unique\n value String @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== USERS & AUTH ====================\n\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n password String\n firstName String\n lastName String\n isActive Boolean @default(true)\n tokenInvalidatedAt DateTime? // Zeitpunkt ab dem alle Tokens ungültig sind (für Zwangslogout bei Rechteänderung)\n customerId Int? @unique\n customer Customer? @relation(fields: [customerId], references: [id])\n roles UserRole[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique\n description String?\n permissions RolePermission[]\n users UserRole[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Permission {\n id Int @id @default(autoincrement())\n resource String\n action String\n roles RolePermission[]\n\n @@unique([resource, action])\n}\n\nmodel RolePermission {\n roleId Int\n permissionId Int\n role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)\n permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade)\n\n @@id([roleId, permissionId])\n}\n\nmodel UserRole {\n userId Int\n roleId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)\n\n @@id([userId, roleId])\n}\n\n// ==================== CUSTOMERS ====================\n\nenum CustomerType {\n PRIVATE\n BUSINESS\n}\n\nmodel Customer {\n id Int @id @default(autoincrement())\n customerNumber String @unique\n type CustomerType @default(PRIVATE)\n salutation String?\n firstName String\n lastName String\n companyName String?\n foundingDate DateTime? // Gründungsdatum (für Firmen)\n birthDate DateTime?\n birthPlace String?\n email String?\n phone String?\n mobile String?\n taxNumber String?\n businessRegistrationPath String? // PDF-Pfad zur Gewerbeanmeldung\n commercialRegisterPath String? // PDF-Pfad zum Handelsregisterauszug\n commercialRegisterNumber String? // Handelsregisternummer (Text)\n privacyPolicyPath String? // PDF-Pfad zur Datenschutzerklärung (für alle Kunden)\n notes String? @db.Text\n\n // ===== Portal-Zugangsdaten =====\n portalEnabled Boolean @default(false) // Portal aktiviert?\n portalEmail String? @unique // Portal-Login E-Mail\n portalPasswordHash String? // Gehashtes Passwort (für Login)\n portalPasswordEncrypted String? // Verschlüsseltes Passwort (für Anzeige)\n portalLastLogin DateTime? // Letzte Anmeldung\n\n user User?\n addresses Address[]\n bankCards BankCard[]\n identityDocuments IdentityDocument[]\n meters Meter[]\n stressfreiEmails StressfreiEmail[]\n contracts Contract[]\n\n // Vertreter-Beziehungen (Kunde kann für andere Kunden handeln)\n representingFor CustomerRepresentative[] @relation(\"RepresentativeCustomer\")\n representedBy CustomerRepresentative[] @relation(\"RepresentedCustomer\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CUSTOMER REPRESENTATIVES ====================\n// Vertretungsbeziehung: Ein Kunde kann die Verträge eines anderen Kunden einsehen\n// z.B. Sohn (representativeId) kann Verträge der Mutter (customerId) sehen\n\nmodel CustomerRepresentative {\n id Int @id @default(autoincrement())\n customerId Int // Der Kunde, dessen Verträge eingesehen werden (z.B. Mutter)\n customer Customer @relation(\"RepresentedCustomer\", fields: [customerId], references: [id], onDelete: Cascade)\n representativeId Int // Der Kunde, der einsehen darf (z.B. Sohn)\n representative Customer @relation(\"RepresentativeCustomer\", fields: [representativeId], references: [id], onDelete: Cascade)\n notes String? // Notizen zur Vertretung\n isActive Boolean @default(true)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([customerId, representativeId]) // Keine doppelten Einträge\n}\n\n// ==================== ADDRESSES ====================\n\nenum AddressType {\n DELIVERY_RESIDENCE\n BILLING\n}\n\nmodel Address {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type AddressType @default(DELIVERY_RESIDENCE)\n street String\n houseNumber String\n postalCode String\n city String\n country String @default(\"Deutschland\")\n isDefault Boolean @default(false)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== BANK CARDS ====================\n\nmodel BankCard {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n accountHolder String\n iban String\n bic String?\n bankName String?\n expiryDate DateTime?\n documentPath String? // Pfad zur hochgeladenen PDF\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== IDENTITY DOCUMENTS ====================\n\nenum DocumentType {\n ID_CARD\n PASSPORT\n DRIVERS_LICENSE\n OTHER\n}\n\nmodel IdentityDocument {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type DocumentType @default(ID_CARD)\n documentNumber String\n issuingAuthority String?\n issueDate DateTime?\n expiryDate DateTime?\n documentPath String? // Pfad zur hochgeladenen PDF\n isActive Boolean @default(true)\n // Führerschein-spezifische Felder\n licenseClasses String? // z.B. \"B, BE, AM, L\" - kommasepariert\n licenseIssueDate DateTime? // Datum des Führerscheinerwerbs (Klasse B)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== EMAIL PROVIDER CONFIG (Plesk, cPanel etc.) ====================\n\nenum EmailProviderType {\n PLESK\n CPANEL\n DIRECTADMIN\n}\n\n// Verschlüsselungstyp für E-Mail-Verbindungen\nenum MailEncryption {\n SSL // Implicit SSL/TLS (Ports 465/993) - Verschlüsselung von Anfang an\n STARTTLS // STARTTLS (Ports 587/143) - Startet unverschlüsselt, dann Upgrade\n NONE // Keine Verschlüsselung (Ports 25/143)\n}\n\nmodel EmailProviderConfig {\n id Int @id @default(autoincrement())\n name String @unique // z.B. \"Plesk Hauptserver\"\n type EmailProviderType\n apiUrl String // API-URL (z.B. https://server.de:8443)\n apiKey String? // API-Key (verschlüsselt)\n username String? // Benutzername für API\n passwordEncrypted String? // Passwort (verschlüsselt)\n domain String // Domain für E-Mails (z.B. stressfrei-wechseln.de)\n defaultForwardEmail String? // Standard-Weiterleitungsadresse (unsere eigene)\n\n // IMAP/SMTP-Server für E-Mail-Client (optional, default: mail.{domain})\n imapServer String? // z.B. \"mail.stressfrei-wechseln.de\"\n imapPort Int? @default(993)\n smtpServer String?\n smtpPort Int? @default(465)\n\n // Verschlüsselungs-Einstellungen\n imapEncryption MailEncryption @default(SSL) // SSL, STARTTLS oder NONE\n smtpEncryption MailEncryption @default(SSL) // SSL, STARTTLS oder NONE\n allowSelfSignedCerts Boolean @default(false) // Selbstsignierte Zertifikate erlauben\n\n isActive Boolean @default(true)\n isDefault Boolean @default(false) // Standard-Provider\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== STRESSFREI-WECHSELN EMAIL ADDRESSES ====================\n\nmodel StressfreiEmail {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n email String // Die Weiterleitungs-E-Mail-Adresse\n platform String? // Für welche Plattform (z.B. \"Freenet\", \"Klarmobil\")\n notes String? @db.Text // Optionale Notizen\n isActive Boolean @default(true)\n isProvisioned Boolean @default(false) // Wurde bei Provider angelegt?\n provisionedAt DateTime? // Wann wurde provisioniert?\n provisionError String? @db.Text // Fehlermeldung falls Provisionierung fehlschlug\n\n // Mailbox-Zugangsdaten (für IMAP/SMTP-Zugang)\n hasMailbox Boolean @default(false) // Hat echte Mailbox (nicht nur Weiterleitung)?\n emailPasswordEncrypted String? // Verschlüsseltes Mailbox-Passwort (AES-256-GCM)\n\n contracts Contract[] // Verträge die diese E-Mail als Benutzername verwenden\n cachedEmails CachedEmail[] // Gecachte E-Mails aus dieser Mailbox\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CACHED EMAILS (E-Mail-Client) ====================\n\nenum EmailFolder {\n INBOX\n SENT\n}\n\nmodel CachedEmail {\n id Int @id @default(autoincrement())\n stressfreiEmailId Int\n stressfreiEmail StressfreiEmail @relation(fields: [stressfreiEmailId], references: [id], onDelete: Cascade)\n\n // Ordner (Posteingang oder Gesendet)\n folder EmailFolder @default(INBOX)\n\n // IMAP-Identifikation\n messageId String // RFC 5322 Message-ID\n uid Int // IMAP UID (für Synchronisierung, bei SENT = 0)\n\n // E-Mail-Metadaten\n subject String?\n fromAddress String\n fromName String?\n toAddresses String @db.Text // JSON Array\n ccAddresses String? @db.Text // JSON Array\n receivedAt DateTime\n\n // Inhalt\n textBody String? @db.LongText\n htmlBody String? @db.LongText\n hasAttachments Boolean @default(false)\n attachmentNames String? @db.Text // JSON Array\n\n // Vertragszuordnung\n contractId Int?\n contract Contract? @relation(fields: [contractId], references: [id], onDelete: SetNull)\n assignedAt DateTime?\n assignedBy Int? // User ID der die Zuordnung gemacht hat\n isAutoAssigned Boolean @default(false) // true = automatisch beim Senden aus Vertrag\n\n // Flags\n isRead Boolean @default(false)\n isStarred Boolean @default(false)\n\n // Papierkorb\n isDeleted Boolean @default(false) // Im Papierkorb?\n deletedAt DateTime? // Wann gelöscht?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([stressfreiEmailId, messageId, folder]) // Folder hinzugefügt: gleiche MessageID kann in INBOX und SENT existieren\n @@index([contractId])\n @@index([stressfreiEmailId, folder, receivedAt])\n @@index([stressfreiEmailId, isDeleted]) // Für Papierkorb-Abfragen\n}\n\n// ==================== METERS (Energy) ====================\n\nenum MeterType {\n ELECTRICITY\n GAS\n}\n\nmodel Meter {\n id Int @id @default(autoincrement())\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n meterNumber String\n type MeterType\n location String?\n isActive Boolean @default(true)\n readings MeterReading[]\n energyDetails EnergyContractDetails[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel MeterReading {\n id Int @id @default(autoincrement())\n meterId Int\n meter Meter @relation(fields: [meterId], references: [id], onDelete: Cascade)\n readingDate DateTime\n value Float\n unit String @default(\"kWh\")\n notes String?\n createdAt DateTime @default(now())\n}\n\n// ==================== SALES PLATFORMS ====================\n\nmodel SalesPlatform {\n id Int @id @default(autoincrement())\n name String @unique\n contactInfo String? @db.Text\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CANCELLATION PERIODS ====================\n\nmodel CancellationPeriod {\n id Int @id @default(autoincrement())\n code String @unique // z.B. \"14T\", \"1M\", \"3M\", \"12M\", \"1J\"\n description String // z.B. \"14 Tage\", \"1 Monat\", \"3 Monate\"\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACT DURATIONS ====================\n\nmodel ContractDuration {\n id Int @id @default(autoincrement())\n code String @unique // z.B. \"12M\", \"24M\", \"1J\", \"2J\"\n description String // z.B. \"12 Monate\", \"24 Monate\", \"1 Jahr\"\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== PROVIDERS (Anbieter) ====================\n\nmodel Provider {\n id Int @id @default(autoincrement())\n name String @unique // Anbietername\n portalUrl String? // Kundenkontourl (Login-Seite)\n usernameFieldName String? // Benutzernamefeld (z.B. \"email\", \"username\")\n passwordFieldName String? // Kennwortfeld (z.B. \"password\", \"pwd\")\n isActive Boolean @default(true)\n tariffs Tariff[]\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== TARIFFS (Tarife) ====================\n\nmodel Tariff {\n id Int @id @default(autoincrement())\n providerId Int\n provider Provider @relation(fields: [providerId], references: [id], onDelete: Cascade)\n name String // Tarifname\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([providerId, name]) // Eindeutiger Tarif pro Anbieter\n}\n\n// ==================== CONTRACT CATEGORIES ====================\n\nmodel ContractCategory {\n id Int @id @default(autoincrement())\n code String @unique // Technischer Code (z.B. ELECTRICITY, GAS)\n name String // Anzeigename (z.B. Strom, Gas)\n icon String? // Icon-Name für UI (z.B. \"Zap\", \"Flame\")\n color String? // Farbe für UI (z.B. \"#FFC107\")\n sortOrder Int @default(0)\n isActive Boolean @default(true)\n contracts Contract[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACTS ====================\n\n// Legacy Enum - wird durch ContractCategory ersetzt\nenum ContractType {\n ELECTRICITY\n GAS\n DSL\n CABLE\n FIBER\n MOBILE\n TV\n CAR_INSURANCE\n}\n\nenum ContractStatus {\n DRAFT\n PENDING\n ACTIVE\n CANCELLED\n EXPIRED\n DEACTIVATED\n}\n\nmodel Contract {\n id Int @id @default(autoincrement())\n contractNumber String @unique\n customerId Int\n customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade)\n type ContractType\n status ContractStatus @default(DRAFT)\n\n // Neue konfigurierbare Kategorie (ersetzt langfristig das type-Enum)\n contractCategoryId Int?\n contractCategory ContractCategory? @relation(fields: [contractCategoryId], references: [id])\n\n addressId Int?\n address Address? @relation(fields: [addressId], references: [id])\n\n bankCardId Int?\n bankCard BankCard? @relation(fields: [bankCardId], references: [id])\n\n identityDocumentId Int?\n identityDocument IdentityDocument? @relation(fields: [identityDocumentId], references: [id])\n\n salesPlatformId Int?\n salesPlatform SalesPlatform? @relation(fields: [salesPlatformId], references: [id])\n\n cancellationPeriodId Int?\n cancellationPeriod CancellationPeriod? @relation(fields: [cancellationPeriodId], references: [id])\n\n contractDurationId Int?\n contractDuration ContractDuration? @relation(fields: [contractDurationId], references: [id])\n\n previousContractId Int? @unique\n previousContract Contract? @relation(\"ContractHistory\", fields: [previousContractId], references: [id])\n followUpContract Contract? @relation(\"ContractHistory\")\n\n // Anbieter & Tarif (neue Verknüpfung)\n providerId Int?\n provider Provider? @relation(fields: [providerId], references: [id])\n tariffId Int?\n tariff Tariff? @relation(fields: [tariffId], references: [id])\n\n // Legacy-Felder (für Abwärtskompatibilität)\n providerName String?\n tariffName String?\n customerNumberAtProvider String?\n priceFirst12Months String? // Preis erste 12 Monate\n priceFrom13Months String? // Preis ab 13. Monat\n priceAfter24Months String? // Preis nach 24 Monaten\n\n startDate DateTime?\n endDate DateTime? // Wird aus startDate + contractDuration berechnet\n commission Float?\n\n // Kündigungsdokumente\n cancellationLetterPath String? // Kündigungsschreiben PDF\n cancellationConfirmationPath String? // Kündigungsbestätigung PDF\n cancellationLetterOptionsPath String? // Kündigungsschreiben Optionen PDF\n cancellationConfirmationOptionsPath String? // Kündigungsbestätigung Optionen PDF\n\n // Kündigungsdaten\n cancellationConfirmationDate DateTime? // Kündigungsbestätigungsdatum\n cancellationConfirmationOptionsDate DateTime? // Kündigungsbestätigungsoptionendatum\n wasSpecialCancellation Boolean @default(false) // Wurde sondergekündigt?\n\n portalUsername String?\n portalPasswordEncrypted String?\n\n // Stressfrei-Wechseln E-Mail als Benutzername (Alternative zu portalUsername)\n stressfreiEmailId Int?\n stressfreiEmail StressfreiEmail? @relation(fields: [stressfreiEmailId], references: [id])\n\n notes String? @db.Text\n\n energyDetails EnergyContractDetails?\n internetDetails InternetContractDetails?\n mobileDetails MobileContractDetails?\n tvDetails TvContractDetails?\n carInsuranceDetails CarInsuranceDetails?\n\n tasks ContractTask[]\n assignedEmails CachedEmail[] // Zugeordnete E-Mails aus dem E-Mail-Client\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== CONTRACT TASKS ====================\n\nenum ContractTaskStatus {\n OPEN\n COMPLETED\n}\n\nmodel ContractTask {\n id Int @id @default(autoincrement())\n contractId Int\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n title String\n description String? @db.Text\n status ContractTaskStatus @default(OPEN)\n visibleInPortal Boolean @default(false)\n createdBy String? // Name des Erstellers\n completedAt DateTime?\n subtasks ContractTaskSubtask[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ContractTaskSubtask {\n id Int @id @default(autoincrement())\n taskId Int\n task ContractTask @relation(fields: [taskId], references: [id], onDelete: Cascade)\n title String\n status ContractTaskStatus @default(OPEN)\n createdBy String?\n completedAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== ENERGY CONTRACT DETAILS ====================\n\nmodel EnergyContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n meterId Int?\n meter Meter? @relation(fields: [meterId], references: [id])\n annualConsumption Float?\n basePrice Float?\n unitPrice Float?\n bonus Float?\n previousProviderName String?\n previousCustomerNumber String?\n}\n\n// ==================== INTERNET CONTRACT DETAILS ====================\n\nmodel InternetContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n downloadSpeed Int?\n uploadSpeed Int?\n routerModel String?\n routerSerialNumber String?\n installationDate DateTime?\n // Internet-Zugangsdaten\n internetUsername String?\n internetPasswordEncrypted String? // Verschlüsselt gespeichert\n // Glasfaser-spezifisch\n homeId String?\n // Vodafone DSL/Kabel spezifisch\n activationCode String?\n phoneNumbers PhoneNumber[]\n}\n\nmodel PhoneNumber {\n id Int @id @default(autoincrement())\n internetContractDetailsId Int\n internetDetails InternetContractDetails @relation(fields: [internetContractDetailsId], references: [id], onDelete: Cascade)\n phoneNumber String\n isMain Boolean @default(false)\n // SIP-Zugangsdaten\n sipUsername String?\n sipPasswordEncrypted String? // Verschlüsselt gespeichert\n sipServer String?\n}\n\n// ==================== MOBILE CONTRACT DETAILS ====================\n\nmodel MobileContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n requiresMultisim Boolean @default(false) // Multisim erforderlich?\n dataVolume Float?\n includedMinutes Int?\n includedSMS Int?\n deviceModel String?\n deviceImei String?\n simCards SimCard[]\n // Legacy-Felder (für Abwärtskompatibilität, werden durch simCards ersetzt)\n phoneNumber String?\n simCardNumber String?\n}\n\nmodel SimCard {\n id Int @id @default(autoincrement())\n mobileDetailsId Int\n mobileDetails MobileContractDetails @relation(fields: [mobileDetailsId], references: [id], onDelete: Cascade)\n phoneNumber String? // Rufnummer\n simCardNumber String? // SIM-Kartennummer\n pin String? // PIN (verschlüsselt gespeichert)\n puk String? // PUK (verschlüsselt gespeichert)\n isMultisim Boolean @default(false) // Ist dies eine Multisim-Karte?\n isMain Boolean @default(false) // Ist dies die Hauptkarte?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// ==================== TV CONTRACT DETAILS ====================\n\nmodel TvContractDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n receiverModel String?\n smartcardNumber String?\n package String?\n}\n\n// ==================== CAR INSURANCE DETAILS ====================\n\nenum InsuranceType {\n LIABILITY\n PARTIAL\n FULL\n}\n\nmodel CarInsuranceDetails {\n id Int @id @default(autoincrement())\n contractId Int @unique\n contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)\n licensePlate String?\n hsn String?\n tsn String?\n vin String?\n vehicleType String?\n firstRegistration DateTime?\n noClaimsClass String?\n insuranceType InsuranceType @default(LIABILITY)\n deductiblePartial Float?\n deductibleFull Float?\n policyNumber String?\n previousInsurer String?\n}\n", + "inlineSchemaHash": "0275307bf5bad35d995156e9cf00dc7906b05135b28bd545b6e7e6322aaa01ab", "copyEngine": true } @@ -649,7 +698,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) { config.isBundled = true } -config.runtimeDataModel = JSON.parse("{\"models\":{\"AppSetting\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"password\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToUser\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Role\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permissions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RolePermission\",\"relationName\":\"RoleToRolePermission\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"users\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UserRole\",\"relationName\":\"RoleToUserRole\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Permission\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"action\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RolePermission\",\"relationName\":\"PermissionToRolePermission\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"resource\",\"action\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"resource\",\"action\"]}],\"isGenerated\":false},\"RolePermission\":{\"dbName\":null,\"fields\":[{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permissionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Role\",\"relationName\":\"RoleToRolePermission\",\"relationFromFields\":[\"roleId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permission\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Permission\",\"relationName\":\"PermissionToRolePermission\",\"relationFromFields\":[\"permissionId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"roleId\",\"permissionId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"UserRole\":{\"dbName\":null,\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"UserToUserRole\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Role\",\"relationName\":\"RoleToUserRole\",\"relationFromFields\":[\"roleId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"userId\",\"roleId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Customer\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"CustomerType\",\"default\":\"PRIVATE\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salutation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"companyName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"foundingDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"birthDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"birthPlace\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phone\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobile\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taxNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"businessRegistrationPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commercialRegisterPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commercialRegisterNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"privacyPolicyPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalEmail\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordHash\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalLastLogin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"CustomerToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addresses\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Address\",\"relationName\":\"AddressToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCards\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BankCard\",\"relationName\":\"BankCardToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocuments\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"IdentityDocument\",\"relationName\":\"CustomerToIdentityDocument\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meters\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"CustomerToMeter\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"CustomerToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representingFor\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CustomerRepresentative\",\"relationName\":\"RepresentativeCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representedBy\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CustomerRepresentative\",\"relationName\":\"RepresentedCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CustomerRepresentative\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"RepresentedCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representativeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representative\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"RepresentativeCustomer\",\"relationFromFields\":[\"representativeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"customerId\",\"representativeId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"customerId\",\"representativeId\"]}],\"isGenerated\":false},\"Address\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"AddressToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"AddressType\",\"default\":\"DELIVERY_RESIDENCE\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"street\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"houseNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"Deutschland\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"AddressToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"BankCard\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"BankCardToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accountHolder\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"iban\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bic\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiryDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"BankCardToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"IdentityDocument\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToIdentityDocument\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DocumentType\",\"default\":\"ID_CARD\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issuingAuthority\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issueDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiryDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licenseClasses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licenseIssueDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToIdentityDocument\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"EmailProviderConfig\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EmailProviderType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"apiUrl\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"apiKey\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"domain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultForwardEmail\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"StressfreiEmail\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToStressfreiEmail\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"platform\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isProvisioned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provisionedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provisionError\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Meter\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToMeter\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MeterType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"location\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"readings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MeterReading\",\"relationName\":\"MeterToMeterReading\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"energyDetails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EnergyContractDetails\",\"relationName\":\"EnergyContractDetailsToMeter\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MeterReading\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meter\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"MeterToMeterReading\",\"relationFromFields\":[\"meterId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"readingDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unit\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"kWh\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"SalesPlatform\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contactInfo\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToSalesPlatform\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CancellationPeriod\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CancellationPeriodToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractDuration\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractDuration\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Provider\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalUrl\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"usernameFieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordFieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tariff\",\"relationName\":\"ProviderToTariff\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToProvider\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Tariff\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Provider\",\"relationName\":\"ProviderToTariff\",\"relationFromFields\":[\"providerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToTariff\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"providerId\",\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"providerId\",\"name\"]}],\"isGenerated\":false},\"ContractCategory\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"icon\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"color\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractCategory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Contract\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"ContractToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractStatus\",\"default\":\"DRAFT\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractCategoryId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractCategory\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractCategory\",\"relationName\":\"ContractToContractCategory\",\"relationFromFields\":[\"contractCategoryId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addressId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"address\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Address\",\"relationName\":\"AddressToContract\",\"relationFromFields\":[\"addressId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCard\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BankCard\",\"relationName\":\"BankCardToContract\",\"relationFromFields\":[\"bankCardId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocumentId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocument\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"IdentityDocument\",\"relationName\":\"ContractToIdentityDocument\",\"relationFromFields\":[\"identityDocumentId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salesPlatformId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salesPlatform\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SalesPlatform\",\"relationName\":\"ContractToSalesPlatform\",\"relationFromFields\":[\"salesPlatformId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationPeriodId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationPeriod\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CancellationPeriod\",\"relationName\":\"CancellationPeriodToContract\",\"relationFromFields\":[\"cancellationPeriodId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractDurationId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractDuration\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractDuration\",\"relationName\":\"ContractToContractDuration\",\"relationFromFields\":[\"contractDurationId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousContractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousContract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractHistory\",\"relationFromFields\":[\"previousContractId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"followUpContract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Provider\",\"relationName\":\"ContractToProvider\",\"relationFromFields\":[\"providerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariff\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tariff\",\"relationName\":\"ContractToTariff\",\"relationFromFields\":[\"tariffId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerNumberAtProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceFirst12Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceFrom13Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceAfter24Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commission\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationLetterPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationLetterOptionsPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationOptionsPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationOptionsDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wasSpecialCancellation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmailId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmail\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"ContractToStressfreiEmail\",\"relationFromFields\":[\"stressfreiEmailId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"energyDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EnergyContractDetails\",\"relationName\":\"ContractToEnergyContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"InternetContractDetails\",\"relationName\":\"ContractToInternetContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MobileContractDetails\",\"relationName\":\"ContractToMobileContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tvDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TvContractDetails\",\"relationName\":\"ContractToTvContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"carInsuranceDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CarInsuranceDetails\",\"relationName\":\"CarInsuranceDetailsToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tasks\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTask\",\"relationName\":\"ContractToContractTask\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractTask\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractTask\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractTaskStatus\",\"default\":\"OPEN\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"visibleInPortal\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subtasks\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTaskSubtask\",\"relationName\":\"ContractTaskToContractTaskSubtask\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractTaskSubtask\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"task\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTask\",\"relationName\":\"ContractTaskToContractTaskSubtask\",\"relationFromFields\":[\"taskId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractTaskStatus\",\"default\":\"OPEN\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"EnergyContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToEnergyContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meter\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"EnergyContractDetailsToMeter\",\"relationFromFields\":[\"meterId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"annualConsumption\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unitPrice\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bonus\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousProviderName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousCustomerNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"InternetContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToInternetContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"downloadSpeed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"uploadSpeed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routerModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routerSerialNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"installationDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"homeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"activationCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumbers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PhoneNumber\",\"relationName\":\"InternetContractDetailsToPhoneNumber\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PhoneNumber\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetContractDetailsId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"InternetContractDetails\",\"relationName\":\"InternetContractDetailsToPhoneNumber\",\"relationFromFields\":[\"internetContractDetailsId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipServer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MobileContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToMobileContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"requiresMultisim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"dataVolume\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"includedMinutes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"includedSMS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deviceModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deviceImei\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCards\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SimCard\",\"relationName\":\"MobileContractDetailsToSimCard\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"SimCard\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetailsId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MobileContractDetails\",\"relationName\":\"MobileContractDetailsToSimCard\",\"relationFromFields\":[\"mobileDetailsId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"puk\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMultisim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TvContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToTvContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receiverModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smartcardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"package\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CarInsuranceDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CarInsuranceDetailsToContract\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licensePlate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hsn\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tsn\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vehicleType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstRegistration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"noClaimsClass\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"insuranceType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"InsuranceType\",\"default\":\"LIABILITY\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deductiblePartial\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deductibleFull\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"policyNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousInsurer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"CustomerType\":{\"values\":[{\"name\":\"PRIVATE\",\"dbName\":null},{\"name\":\"BUSINESS\",\"dbName\":null}],\"dbName\":null},\"AddressType\":{\"values\":[{\"name\":\"DELIVERY_RESIDENCE\",\"dbName\":null},{\"name\":\"BILLING\",\"dbName\":null}],\"dbName\":null},\"DocumentType\":{\"values\":[{\"name\":\"ID_CARD\",\"dbName\":null},{\"name\":\"PASSPORT\",\"dbName\":null},{\"name\":\"DRIVERS_LICENSE\",\"dbName\":null},{\"name\":\"OTHER\",\"dbName\":null}],\"dbName\":null},\"EmailProviderType\":{\"values\":[{\"name\":\"PLESK\",\"dbName\":null},{\"name\":\"CPANEL\",\"dbName\":null},{\"name\":\"DIRECTADMIN\",\"dbName\":null}],\"dbName\":null},\"MeterType\":{\"values\":[{\"name\":\"ELECTRICITY\",\"dbName\":null},{\"name\":\"GAS\",\"dbName\":null}],\"dbName\":null},\"ContractType\":{\"values\":[{\"name\":\"ELECTRICITY\",\"dbName\":null},{\"name\":\"GAS\",\"dbName\":null},{\"name\":\"DSL\",\"dbName\":null},{\"name\":\"CABLE\",\"dbName\":null},{\"name\":\"FIBER\",\"dbName\":null},{\"name\":\"MOBILE\",\"dbName\":null},{\"name\":\"TV\",\"dbName\":null},{\"name\":\"CAR_INSURANCE\",\"dbName\":null}],\"dbName\":null},\"ContractStatus\":{\"values\":[{\"name\":\"DRAFT\",\"dbName\":null},{\"name\":\"PENDING\",\"dbName\":null},{\"name\":\"ACTIVE\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"EXPIRED\",\"dbName\":null},{\"name\":\"DEACTIVATED\",\"dbName\":null}],\"dbName\":null},\"ContractTaskStatus\":{\"values\":[{\"name\":\"OPEN\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null}],\"dbName\":null},\"InsuranceType\":{\"values\":[{\"name\":\"LIABILITY\",\"dbName\":null},{\"name\":\"PARTIAL\",\"dbName\":null},{\"name\":\"FULL\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"AppSetting\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"key\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"User\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"password\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tokenInvalidatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToUser\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Role\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permissions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RolePermission\",\"relationName\":\"RoleToRolePermission\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"users\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"UserRole\",\"relationName\":\"RoleToUserRole\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Permission\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"action\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roles\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RolePermission\",\"relationName\":\"PermissionToRolePermission\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"resource\",\"action\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"resource\",\"action\"]}],\"isGenerated\":false},\"RolePermission\":{\"dbName\":null,\"fields\":[{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permissionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Role\",\"relationName\":\"RoleToRolePermission\",\"relationFromFields\":[\"roleId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"permission\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Permission\",\"relationName\":\"PermissionToRolePermission\",\"relationFromFields\":[\"permissionId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"roleId\",\"permissionId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"UserRole\":{\"dbName\":null,\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"roleId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"UserToUserRole\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"role\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Role\",\"relationName\":\"RoleToUserRole\",\"relationFromFields\":[\"roleId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":{\"name\":null,\"fields\":[\"userId\",\"roleId\"]},\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Customer\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"CustomerType\",\"default\":\"PRIVATE\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salutation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"lastName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"companyName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"foundingDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"birthDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"birthPlace\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phone\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobile\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taxNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"businessRegistrationPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commercialRegisterPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commercialRegisterNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"privacyPolicyPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalEnabled\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalEmail\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordHash\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalLastLogin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"relationName\":\"CustomerToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addresses\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Address\",\"relationName\":\"AddressToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCards\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BankCard\",\"relationName\":\"BankCardToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocuments\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"IdentityDocument\",\"relationName\":\"CustomerToIdentityDocument\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meters\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"CustomerToMeter\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"CustomerToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representingFor\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CustomerRepresentative\",\"relationName\":\"RepresentativeCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representedBy\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CustomerRepresentative\",\"relationName\":\"RepresentedCustomer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CustomerRepresentative\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"RepresentedCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representativeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"representative\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"RepresentativeCustomer\",\"relationFromFields\":[\"representativeId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"customerId\",\"representativeId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"customerId\",\"representativeId\"]}],\"isGenerated\":false},\"Address\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"AddressToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"AddressType\",\"default\":\"DELIVERY_RESIDENCE\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"street\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"houseNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"Deutschland\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"AddressToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"BankCard\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"BankCardToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accountHolder\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"iban\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bic\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiryDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"BankCardToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"IdentityDocument\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToIdentityDocument\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DocumentType\",\"default\":\"ID_CARD\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issuingAuthority\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"issueDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiryDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"documentPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licenseClasses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licenseIssueDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToIdentityDocument\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"EmailProviderConfig\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EmailProviderType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"apiUrl\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"apiKey\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"username\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"domain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"defaultForwardEmail\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapServer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":993,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpServer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpPort\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":465,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"imapEncryption\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"MailEncryption\",\"default\":\"SSL\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smtpEncryption\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"MailEncryption\",\"default\":\"SSL\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"allowSelfSignedCerts\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDefault\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"StressfreiEmail\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToStressfreiEmail\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"platform\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isProvisioned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provisionedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provisionError\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hasMailbox\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"emailPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cachedEmails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CachedEmail\",\"relationName\":\"CachedEmailToStressfreiEmail\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CachedEmail\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmailId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmail\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"CachedEmailToStressfreiEmail\",\"relationFromFields\":[\"stressfreiEmailId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"folder\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"EmailFolder\",\"default\":\"INBOX\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"messageId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"uid\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subject\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fromAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"fromName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"toAddresses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ccAddresses\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receivedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"textBody\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"htmlBody\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hasAttachments\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"attachmentNames\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CachedEmailToContract\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"SetNull\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assignedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assignedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isAutoAssigned\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isRead\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isStarred\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isDeleted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"stressfreiEmailId\",\"messageId\",\"folder\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"stressfreiEmailId\",\"messageId\",\"folder\"]}],\"isGenerated\":false},\"Meter\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"CustomerToMeter\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MeterType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"location\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"readings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MeterReading\",\"relationName\":\"MeterToMeterReading\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"energyDetails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EnergyContractDetails\",\"relationName\":\"EnergyContractDetailsToMeter\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MeterReading\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meter\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"MeterToMeterReading\",\"relationFromFields\":[\"meterId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"readingDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"value\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unit\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"kWh\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"SalesPlatform\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contactInfo\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToSalesPlatform\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CancellationPeriod\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CancellationPeriodToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractDuration\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractDuration\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Provider\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalUrl\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"usernameFieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordFieldName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffs\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tariff\",\"relationName\":\"ProviderToTariff\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToProvider\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Tariff\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Provider\",\"relationName\":\"ProviderToTariff\",\"relationFromFields\":[\"providerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToTariff\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[[\"providerId\",\"name\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"providerId\",\"name\"]}],\"isGenerated\":false},\"ContractCategory\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"icon\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"color\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isActive\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":true,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contracts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractCategory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Contract\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Customer\",\"relationName\":\"ContractToCustomer\",\"relationFromFields\":[\"customerId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractType\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractStatus\",\"default\":\"DRAFT\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractCategoryId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractCategory\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractCategory\",\"relationName\":\"ContractToContractCategory\",\"relationFromFields\":[\"contractCategoryId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"addressId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"address\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Address\",\"relationName\":\"AddressToContract\",\"relationFromFields\":[\"addressId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCardId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bankCard\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"BankCard\",\"relationName\":\"BankCardToContract\",\"relationFromFields\":[\"bankCardId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocumentId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identityDocument\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"IdentityDocument\",\"relationName\":\"ContractToIdentityDocument\",\"relationFromFields\":[\"identityDocumentId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salesPlatformId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salesPlatform\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SalesPlatform\",\"relationName\":\"ContractToSalesPlatform\",\"relationFromFields\":[\"salesPlatformId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationPeriodId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationPeriod\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CancellationPeriod\",\"relationName\":\"CancellationPeriodToContract\",\"relationFromFields\":[\"cancellationPeriodId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractDurationId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractDuration\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractDuration\",\"relationName\":\"ContractToContractDuration\",\"relationFromFields\":[\"contractDurationId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousContractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousContract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractHistory\",\"relationFromFields\":[\"previousContractId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"followUpContract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractHistory\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Provider\",\"relationName\":\"ContractToProvider\",\"relationFromFields\":[\"providerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariff\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Tariff\",\"relationName\":\"ContractToTariff\",\"relationFromFields\":[\"tariffId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tariffName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"customerNumberAtProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceFirst12Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceFrom13Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"priceAfter24Months\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"startDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"commission\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationLetterPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationLetterOptionsPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationOptionsPath\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"cancellationConfirmationOptionsDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"wasSpecialCancellation\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"portalPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmailId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"stressfreiEmail\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"StressfreiEmail\",\"relationName\":\"ContractToStressfreiEmail\",\"relationFromFields\":[\"stressfreiEmailId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"notes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"energyDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"EnergyContractDetails\",\"relationName\":\"ContractToEnergyContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"InternetContractDetails\",\"relationName\":\"ContractToInternetContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MobileContractDetails\",\"relationName\":\"ContractToMobileContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tvDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"TvContractDetails\",\"relationName\":\"ContractToTvContractDetails\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"carInsuranceDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CarInsuranceDetails\",\"relationName\":\"CarInsuranceDetailsToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tasks\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTask\",\"relationName\":\"ContractToContractTask\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"assignedEmails\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"CachedEmail\",\"relationName\":\"CachedEmailToContract\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractTask\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToContractTask\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractTaskStatus\",\"default\":\"OPEN\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"visibleInPortal\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"subtasks\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTaskSubtask\",\"relationName\":\"ContractTaskToContractTaskSubtask\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"ContractTaskSubtask\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"taskId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"task\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"ContractTask\",\"relationName\":\"ContractTaskToContractTaskSubtask\",\"relationFromFields\":[\"taskId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"title\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"status\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"ContractTaskStatus\",\"default\":\"OPEN\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"EnergyContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToEnergyContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meterId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"meter\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Meter\",\"relationName\":\"EnergyContractDetailsToMeter\",\"relationFromFields\":[\"meterId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"annualConsumption\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"unitPrice\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"bonus\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousProviderName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousCustomerNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"InternetContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToInternetContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"downloadSpeed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"uploadSpeed\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routerModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"routerSerialNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"installationDate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"homeId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"activationCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumbers\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"PhoneNumber\",\"relationName\":\"InternetContractDetailsToPhoneNumber\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PhoneNumber\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetContractDetailsId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"internetDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"InternetContractDetails\",\"relationName\":\"InternetContractDetailsToPhoneNumber\",\"relationFromFields\":[\"internetContractDetailsId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipUsername\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipPasswordEncrypted\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sipServer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MobileContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToMobileContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"requiresMultisim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"dataVolume\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"includedMinutes\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"includedSMS\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deviceModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deviceImei\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCards\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SimCard\",\"relationName\":\"MobileContractDetailsToSimCard\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"SimCard\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetailsId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mobileDetails\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MobileContractDetails\",\"relationName\":\"MobileContractDetailsToSimCard\",\"relationFromFields\":[\"mobileDetailsId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"simCardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"pin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"puk\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMultisim\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"isMain\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"TvContractDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"ContractToTvContractDetails\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"receiverModel\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"smartcardNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"package\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"CarInsuranceDetails\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":{\"name\":\"autoincrement\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contractId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"Int\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"contract\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Contract\",\"relationName\":\"CarInsuranceDetailsToContract\",\"relationFromFields\":[\"contractId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"licensePlate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hsn\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tsn\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vin\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"vehicleType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"firstRegistration\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"noClaimsClass\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"insuranceType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"InsuranceType\",\"default\":\"LIABILITY\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deductiblePartial\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"deductibleFull\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Float\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"policyNumber\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"previousInsurer\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"CustomerType\":{\"values\":[{\"name\":\"PRIVATE\",\"dbName\":null},{\"name\":\"BUSINESS\",\"dbName\":null}],\"dbName\":null},\"AddressType\":{\"values\":[{\"name\":\"DELIVERY_RESIDENCE\",\"dbName\":null},{\"name\":\"BILLING\",\"dbName\":null}],\"dbName\":null},\"DocumentType\":{\"values\":[{\"name\":\"ID_CARD\",\"dbName\":null},{\"name\":\"PASSPORT\",\"dbName\":null},{\"name\":\"DRIVERS_LICENSE\",\"dbName\":null},{\"name\":\"OTHER\",\"dbName\":null}],\"dbName\":null},\"EmailProviderType\":{\"values\":[{\"name\":\"PLESK\",\"dbName\":null},{\"name\":\"CPANEL\",\"dbName\":null},{\"name\":\"DIRECTADMIN\",\"dbName\":null}],\"dbName\":null},\"MailEncryption\":{\"values\":[{\"name\":\"SSL\",\"dbName\":null},{\"name\":\"STARTTLS\",\"dbName\":null},{\"name\":\"NONE\",\"dbName\":null}],\"dbName\":null},\"EmailFolder\":{\"values\":[{\"name\":\"INBOX\",\"dbName\":null},{\"name\":\"SENT\",\"dbName\":null}],\"dbName\":null},\"MeterType\":{\"values\":[{\"name\":\"ELECTRICITY\",\"dbName\":null},{\"name\":\"GAS\",\"dbName\":null}],\"dbName\":null},\"ContractType\":{\"values\":[{\"name\":\"ELECTRICITY\",\"dbName\":null},{\"name\":\"GAS\",\"dbName\":null},{\"name\":\"DSL\",\"dbName\":null},{\"name\":\"CABLE\",\"dbName\":null},{\"name\":\"FIBER\",\"dbName\":null},{\"name\":\"MOBILE\",\"dbName\":null},{\"name\":\"TV\",\"dbName\":null},{\"name\":\"CAR_INSURANCE\",\"dbName\":null}],\"dbName\":null},\"ContractStatus\":{\"values\":[{\"name\":\"DRAFT\",\"dbName\":null},{\"name\":\"PENDING\",\"dbName\":null},{\"name\":\"ACTIVE\",\"dbName\":null},{\"name\":\"CANCELLED\",\"dbName\":null},{\"name\":\"EXPIRED\",\"dbName\":null},{\"name\":\"DEACTIVATED\",\"dbName\":null}],\"dbName\":null},\"ContractTaskStatus\":{\"values\":[{\"name\":\"OPEN\",\"dbName\":null},{\"name\":\"COMPLETED\",\"dbName\":null}],\"dbName\":null},\"InsuranceType\":{\"values\":[{\"name\":\"LIABILITY\",\"dbName\":null},{\"name\":\"PARTIAL\",\"dbName\":null},{\"name\":\"FULL\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/backend/node_modules/.prisma/client/package.json b/backend/node_modules/.prisma/client/package.json index c06e07ed..7c4248b1 100644 --- a/backend/node_modules/.prisma/client/package.json +++ b/backend/node_modules/.prisma/client/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-f3be941c86c0d933a2a09d69aafc49ad121411869df4ce4f365fdf53679b90db", + "name": "prisma-client-3c4bb688688ba372393d0bf86523c07e8b4de3ff0d9ad23a89f905f15047a1a5", "main": "index.js", "types": "index.d.ts", "browser": "index-browser.js", diff --git a/backend/node_modules/.prisma/client/schema.prisma b/backend/node_modules/.prisma/client/schema.prisma index b705919f..2138f684 100644 --- a/backend/node_modules/.prisma/client/schema.prisma +++ b/backend/node_modules/.prisma/client/schema.prisma @@ -20,17 +20,18 @@ model AppSetting { // ==================== USERS & AUTH ==================== model User { - id Int @id @default(autoincrement()) - email String @unique - password String - firstName String - lastName String - isActive Boolean @default(true) - customerId Int? @unique - customer Customer? @relation(fields: [customerId], references: [id]) - roles UserRole[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + email String @unique + password String + firstName String + lastName String + isActive Boolean @default(true) + tokenInvalidatedAt DateTime? // Zeitpunkt ab dem alle Tokens ungültig sind (für Zwangslogout bei Rechteänderung) + customerId Int? @unique + customer Customer? @relation(fields: [customerId], references: [id]) + roles UserRole[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model Role { @@ -216,6 +217,13 @@ enum EmailProviderType { DIRECTADMIN } +// Verschlüsselungstyp für E-Mail-Verbindungen +enum MailEncryption { + SSL // Implicit SSL/TLS (Ports 465/993) - Verschlüsselung von Anfang an + STARTTLS // STARTTLS (Ports 587/143) - Startet unverschlüsselt, dann Upgrade + NONE // Keine Verschlüsselung (Ports 25/143) +} + model EmailProviderConfig { id Int @id @default(autoincrement()) name String @unique // z.B. "Plesk Hauptserver" @@ -226,28 +234,103 @@ model EmailProviderConfig { passwordEncrypted String? // Passwort (verschlüsselt) domain String // Domain für E-Mails (z.B. stressfrei-wechseln.de) defaultForwardEmail String? // Standard-Weiterleitungsadresse (unsere eigene) - isActive Boolean @default(true) - isDefault Boolean @default(false) // Standard-Provider - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + + // IMAP/SMTP-Server für E-Mail-Client (optional, default: mail.{domain}) + imapServer String? // z.B. "mail.stressfrei-wechseln.de" + imapPort Int? @default(993) + smtpServer String? + smtpPort Int? @default(465) + + // Verschlüsselungs-Einstellungen + imapEncryption MailEncryption @default(SSL) // SSL, STARTTLS oder NONE + smtpEncryption MailEncryption @default(SSL) // SSL, STARTTLS oder NONE + allowSelfSignedCerts Boolean @default(false) // Selbstsignierte Zertifikate erlauben + + isActive Boolean @default(true) + isDefault Boolean @default(false) // Standard-Provider + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } // ==================== STRESSFREI-WECHSELN EMAIL ADDRESSES ==================== model StressfreiEmail { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) customerId Int - customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade) + customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade) email String // Die Weiterleitungs-E-Mail-Adresse platform String? // Für welche Plattform (z.B. "Freenet", "Klarmobil") - notes String? @db.Text // Optionale Notizen - isActive Boolean @default(true) - isProvisioned Boolean @default(false) // Wurde bei Provider angelegt? + notes String? @db.Text // Optionale Notizen + isActive Boolean @default(true) + isProvisioned Boolean @default(false) // Wurde bei Provider angelegt? provisionedAt DateTime? // Wann wurde provisioniert? - provisionError String? @db.Text // Fehlermeldung falls Provisionierung fehlschlug - contracts Contract[] // Verträge die diese E-Mail als Benutzername verwenden - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + provisionError String? @db.Text // Fehlermeldung falls Provisionierung fehlschlug + + // Mailbox-Zugangsdaten (für IMAP/SMTP-Zugang) + hasMailbox Boolean @default(false) // Hat echte Mailbox (nicht nur Weiterleitung)? + emailPasswordEncrypted String? // Verschlüsseltes Mailbox-Passwort (AES-256-GCM) + + contracts Contract[] // Verträge die diese E-Mail als Benutzername verwenden + cachedEmails CachedEmail[] // Gecachte E-Mails aus dieser Mailbox + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +// ==================== CACHED EMAILS (E-Mail-Client) ==================== + +enum EmailFolder { + INBOX + SENT +} + +model CachedEmail { + id Int @id @default(autoincrement()) + stressfreiEmailId Int + stressfreiEmail StressfreiEmail @relation(fields: [stressfreiEmailId], references: [id], onDelete: Cascade) + + // Ordner (Posteingang oder Gesendet) + folder EmailFolder @default(INBOX) + + // IMAP-Identifikation + messageId String // RFC 5322 Message-ID + uid Int // IMAP UID (für Synchronisierung, bei SENT = 0) + + // E-Mail-Metadaten + subject String? + fromAddress String + fromName String? + toAddresses String @db.Text // JSON Array + ccAddresses String? @db.Text // JSON Array + receivedAt DateTime + + // Inhalt + textBody String? @db.LongText + htmlBody String? @db.LongText + hasAttachments Boolean @default(false) + attachmentNames String? @db.Text // JSON Array + + // Vertragszuordnung + contractId Int? + contract Contract? @relation(fields: [contractId], references: [id], onDelete: SetNull) + assignedAt DateTime? + assignedBy Int? // User ID der die Zuordnung gemacht hat + isAutoAssigned Boolean @default(false) // true = automatisch beim Senden aus Vertrag + + // Flags + isRead Boolean @default(false) + isStarred Boolean @default(false) + + // Papierkorb + isDeleted Boolean @default(false) // Im Papierkorb? + deletedAt DateTime? // Wann gelöscht? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([stressfreiEmailId, messageId, folder]) // Folder hinzugefügt: gleiche MessageID kann in INBOX und SENT existieren + @@index([contractId]) + @@index([stressfreiEmailId, folder, receivedAt]) + @@index([stressfreiEmailId, isDeleted]) // Für Papierkorb-Abfragen } // ==================== METERS (Energy) ==================== @@ -464,7 +547,8 @@ model Contract { tvDetails TvContractDetails? carInsuranceDetails CarInsuranceDetails? - tasks ContractTask[] + tasks ContractTask[] + assignedEmails CachedEmail[] // Zugeordnete E-Mails aus dem E-Mail-Client createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/backend/node_modules/.prisma/client/wasm.js b/backend/node_modules/.prisma/client/wasm.js index 788cdf87..f2d10b1d 100644 --- a/backend/node_modules/.prisma/client/wasm.js +++ b/backend/node_modules/.prisma/client/wasm.js @@ -137,6 +137,7 @@ exports.Prisma.UserScalarFieldEnum = { firstName: 'firstName', lastName: 'lastName', isActive: 'isActive', + tokenInvalidatedAt: 'tokenInvalidatedAt', customerId: 'customerId', createdAt: 'createdAt', updatedAt: 'updatedAt' @@ -259,6 +260,13 @@ exports.Prisma.EmailProviderConfigScalarFieldEnum = { passwordEncrypted: 'passwordEncrypted', domain: 'domain', defaultForwardEmail: 'defaultForwardEmail', + imapServer: 'imapServer', + imapPort: 'imapPort', + smtpServer: 'smtpServer', + smtpPort: 'smtpPort', + imapEncryption: 'imapEncryption', + smtpEncryption: 'smtpEncryption', + allowSelfSignedCerts: 'allowSelfSignedCerts', isActive: 'isActive', isDefault: 'isDefault', createdAt: 'createdAt', @@ -275,6 +283,36 @@ exports.Prisma.StressfreiEmailScalarFieldEnum = { isProvisioned: 'isProvisioned', provisionedAt: 'provisionedAt', provisionError: 'provisionError', + hasMailbox: 'hasMailbox', + emailPasswordEncrypted: 'emailPasswordEncrypted', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +}; + +exports.Prisma.CachedEmailScalarFieldEnum = { + id: 'id', + stressfreiEmailId: 'stressfreiEmailId', + folder: 'folder', + messageId: 'messageId', + uid: 'uid', + subject: 'subject', + fromAddress: 'fromAddress', + fromName: 'fromName', + toAddresses: 'toAddresses', + ccAddresses: 'ccAddresses', + receivedAt: 'receivedAt', + textBody: 'textBody', + htmlBody: 'htmlBody', + hasAttachments: 'hasAttachments', + attachmentNames: 'attachmentNames', + contractId: 'contractId', + assignedAt: 'assignedAt', + assignedBy: 'assignedBy', + isAutoAssigned: 'isAutoAssigned', + isRead: 'isRead', + isStarred: 'isStarred', + isDeleted: 'isDeleted', + deletedAt: 'deletedAt', createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -542,6 +580,17 @@ exports.EmailProviderType = exports.$Enums.EmailProviderType = { DIRECTADMIN: 'DIRECTADMIN' }; +exports.MailEncryption = exports.$Enums.MailEncryption = { + SSL: 'SSL', + STARTTLS: 'STARTTLS', + NONE: 'NONE' +}; + +exports.EmailFolder = exports.$Enums.EmailFolder = { + INBOX: 'INBOX', + SENT: 'SENT' +}; + exports.MeterType = exports.$Enums.MeterType = { ELECTRICITY: 'ELECTRICITY', GAS: 'GAS' @@ -592,6 +641,7 @@ exports.Prisma.ModelName = { IdentityDocument: 'IdentityDocument', EmailProviderConfig: 'EmailProviderConfig', StressfreiEmail: 'StressfreiEmail', + CachedEmail: 'CachedEmail', Meter: 'Meter', MeterReading: 'MeterReading', SalesPlatform: 'SalesPlatform', diff --git a/backend/package-lock.json b/backend/package-lock.json index 9a1c3772..40d90ed1 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,22 +9,31 @@ "version": "1.0.0", "dependencies": { "@prisma/client": "^5.22.0", + "adm-zip": "^0.5.16", + "archiver": "^7.0.1", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.1", "express-validator": "^7.2.0", + "imapflow": "^1.2.8", "jsonwebtoken": "^9.0.2", + "mailparser": "^3.9.3", "multer": "^1.4.5-lts.1", + "nodemailer": "^7.0.13", "undici": "^6.23.0" }, "devDependencies": { + "@types/adm-zip": "^0.5.7", + "@types/archiver": "^7.0.0", "@types/bcryptjs": "^2.4.6", "@types/cors": "^2.8.17", "@types/express": "^4.17.25", "@types/jsonwebtoken": "^9.0.7", + "@types/mailparser": "^3.4.6", "@types/multer": "^1.4.12", "@types/node": "^22.9.0", + "@types/nodemailer": "^7.0.9", "prisma": "^5.22.0", "tsx": "^4.19.2", "typescript": "^5.6.3" @@ -446,6 +455,36 @@ "node": ">=18" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@prisma/client": { "version": "5.22.0", "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", @@ -508,6 +547,36 @@ "@prisma/debug": "5.22.0" } }, + "node_modules/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/@types/adm-zip": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.7.tgz", + "integrity": "sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/archiver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-7.0.0.tgz", + "integrity": "sha512-/3vwGwx9n+mCQdYZ2IKGGHEFL30I96UgBlk8EtRDDFQ9uxM1l4O5Ci6r00EMAkiDaTqD9DQ6nVrWRICnBPtzzg==", + "dev": true, + "dependencies": { + "@types/readdir-glob": "*" + } + }, "node_modules/@types/bcryptjs": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", @@ -582,6 +651,28 @@ "@types/node": "*" } }, + "node_modules/@types/mailparser": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/@types/mailparser/-/mailparser-3.4.6.tgz", + "integrity": "sha512-wVV3cnIKzxTffaPH8iRnddX1zahbYB1ZEoAxyhoBo3TBCBuK6nZ8M8JYO/RhsCuuBVOw/DEN/t/ENbruwlxn6Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "iconv-lite": "^0.6.3" + } + }, + "node_modules/@types/mailparser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -612,6 +703,15 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/nodemailer": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-7.0.9.tgz", + "integrity": "sha512-vI8oF1M+8JvQhsId0Pc38BdUP2evenIIys7c7p+9OZXSPOH5c1dyINP1jT8xQ2xPuBUXmIC87s+91IZMDjH8Ow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -624,6 +724,15 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, + "node_modules/@types/readdir-glob": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz", + "integrity": "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", @@ -654,6 +763,27 @@ "@types/node": "*" } }, + "node_modules/@zone-eu/mailsplit": { + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/@zone-eu/mailsplit/-/mailsplit-5.4.8.tgz", + "integrity": "sha512-eEyACj4JZ7sjzRvy26QhLgKEMWwQbsw1+QZnlLX+/gihcNH07lVPOcnwf5U6UAL7gkc//J3jVd76o/WS+taUiA==", + "dependencies": { + "libbase64": "1.3.0", + "libmime": "5.3.7", + "libqp": "2.1.1" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -666,16 +796,189 @@ "node": ">= 0.6" } }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -704,6 +1007,45 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -760,6 +1102,60 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -823,6 +1219,65 @@ "node": ">= 0.10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -831,6 +1286,14 @@ "ms": "2.0.0" } }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -848,6 +1311,57 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dotenv": { "version": "16.6.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", @@ -872,6 +1386,11 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -885,6 +1404,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -893,6 +1417,25 @@ "node": ">= 0.8" } }, + "node_modules/encoding-japanese": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/encoding-japanese/-/encoding-japanese-2.2.0.tgz", + "integrity": "sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==", + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -974,6 +1517,30 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/express": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", @@ -1031,6 +1598,11 @@ "node": ">= 8.0.0" } }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, "node_modules/finalhandler": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", @@ -1048,6 +1620,21 @@ "node": ">= 0.8" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1133,6 +1720,25 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1144,6 +1750,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -1166,6 +1777,47 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -1196,11 +1848,69 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/imapflow": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/imapflow/-/imapflow-1.2.8.tgz", + "integrity": "sha512-ym7FF2tKOlOzfRvxehs4eLkhjP8Mme3sSp2tcxEbyoeJuJwtEWxaVDv12+DnaMG2LXm0zuQGWZiClq31FLPUNg==", + "dependencies": { + "@zone-eu/mailsplit": "5.4.8", + "encoding-japanese": "2.2.0", + "iconv-lite": "0.7.2", + "libbase64": "1.3.0", + "libmime": "5.3.7", + "libqp": "2.1.1", + "nodemailer": "7.0.13", + "pino": "10.3.0", + "socks": "2.8.7" + } + }, + "node_modules/imapflow/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -1209,11 +1919,49 @@ "node": ">= 0.10" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", @@ -1259,6 +2007,65 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/libbase64": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.3.0.tgz", + "integrity": "sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==" + }, + "node_modules/libmime": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-5.3.7.tgz", + "integrity": "sha512-FlDb3Wtha8P01kTL3P9M+ZDNDWPKPmKHWaU/cG/lg5pfuAwdflVpZE+wm9m7pKmC5ww6s+zTxBKS1p6yl3KpSw==", + "dependencies": { + "encoding-japanese": "2.2.0", + "iconv-lite": "0.6.3", + "libbase64": "1.3.0", + "libqp": "2.1.1" + } + }, + "node_modules/libmime/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/libqp": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-2.1.1.tgz", + "integrity": "sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow==" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -1299,6 +2106,43 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/mailparser": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-3.9.3.tgz", + "integrity": "sha512-AnB0a3zROum6fLaa52L+/K2SoRJVyFDk78Ea6q1D0ofcZLxWEWDtsS1+OrVqKbV7r5dulKL/AwYQccFGAPpuYQ==", + "dependencies": { + "@zone-eu/mailsplit": "5.4.8", + "encoding-japanese": "2.2.0", + "he": "1.2.0", + "html-to-text": "9.0.5", + "iconv-lite": "0.7.2", + "libmime": "5.3.7", + "linkify-it": "5.0.0", + "nodemailer": "7.0.13", + "punycode.js": "2.3.1", + "tlds": "1.261.0" + } + }, + "node_modules/mailparser/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1361,6 +2205,20 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -1369,6 +2227,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -1411,6 +2277,22 @@ "node": ">= 0.6" } }, + "node_modules/nodemailer": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.13.tgz", + "integrity": "sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1430,6 +2312,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -1441,6 +2331,23 @@ "node": ">= 0.8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1449,11 +2356,76 @@ "node": ">= 0.8" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/pino": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.0.tgz", + "integrity": "sha512-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA==", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==" + }, "node_modules/prisma": { "version": "5.22.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", @@ -1473,11 +2445,34 @@ "fsevents": "2.3.3" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1490,6 +2485,14 @@ "node": ">= 0.10" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.14.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", @@ -1504,6 +2507,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1545,6 +2553,33 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1573,11 +2608,30 @@ } ] }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -1636,6 +2690,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -1704,6 +2777,55 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -1720,6 +2842,16 @@ "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -1733,6 +2865,131 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thread-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", + "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", + "dependencies": { + "real-require": "^0.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tlds": { + "version": "1.261.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.261.0.tgz", + "integrity": "sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==", + "bin": { + "tlds": "bin.js" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1790,6 +3047,11 @@ "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, "node_modules/undici": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", @@ -1841,6 +3103,104 @@ "node": ">= 0.8" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -1848,6 +3208,42 @@ "engines": { "node": ">=0.4" } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/zip-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } } } } diff --git a/backend/package.json b/backend/package.json index 230e1a73..db7ba247 100644 --- a/backend/package.json +++ b/backend/package.json @@ -13,26 +13,37 @@ "db:migrate": "prisma migrate dev", "db:push": "prisma db push", "db:seed": "tsx prisma/seed.ts", - "db:studio": "prisma studio" + "db:studio": "prisma studio", + "db:backup": "tsx prisma/backup-data.ts", + "db:restore": "tsx prisma/restore-data.ts" }, "dependencies": { "@prisma/client": "^5.22.0", + "adm-zip": "^0.5.16", + "archiver": "^7.0.1", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.1", "express-validator": "^7.2.0", + "imapflow": "^1.2.8", "jsonwebtoken": "^9.0.2", + "mailparser": "^3.9.3", "multer": "^1.4.5-lts.1", + "nodemailer": "^7.0.13", "undici": "^6.23.0" }, "devDependencies": { + "@types/adm-zip": "^0.5.7", + "@types/archiver": "^7.0.0", "@types/bcryptjs": "^2.4.6", "@types/cors": "^2.8.17", "@types/express": "^4.17.25", "@types/jsonwebtoken": "^9.0.7", + "@types/mailparser": "^3.4.6", "@types/multer": "^1.4.12", "@types/node": "^22.9.0", + "@types/nodemailer": "^7.0.9", "prisma": "^5.22.0", "tsx": "^4.19.2", "typescript": "^5.6.3" diff --git a/backend/prisma/add-email-delete-permission.ts b/backend/prisma/add-email-delete-permission.ts new file mode 100644 index 00000000..5ea56b7c --- /dev/null +++ b/backend/prisma/add-email-delete-permission.ts @@ -0,0 +1,88 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('Adding/updating permissions and Developer role...'); + + // 1. Create or get the emails:delete permission + const emailsDeletePerm = await prisma.permission.upsert({ + where: { resource_action: { resource: 'emails', action: 'delete' } }, + update: {}, + create: { resource: 'emails', action: 'delete' }, + }); + console.log('emails:delete permission created/found'); + + // 2. Create or get the developer:access permission + const developerAccessPerm = await prisma.permission.upsert({ + where: { resource_action: { resource: 'developer', action: 'access' } }, + update: {}, + create: { resource: 'developer', action: 'access' }, + }); + console.log('developer:access permission created/found'); + + // 3. Create Developer role if it doesn't exist + let developerRole = await prisma.role.findUnique({ + where: { name: 'Developer' }, + }); + + if (!developerRole) { + // Get all permissions for Developer role + const allPermissions = await prisma.permission.findMany(); + developerRole = await prisma.role.create({ + data: { + name: 'Developer', + description: 'Voller Zugriff inkl. Entwickler-Tools', + permissions: { + create: allPermissions.map(p => ({ permissionId: p.id })), + }, + }, + }); + console.log('Developer role created with all permissions'); + } + + // 4. Add emails:delete to Admin and Developer + const rolesToUpdate = [ + { name: 'Admin', permissions: [emailsDeletePerm] }, + { name: 'Developer', permissions: [emailsDeletePerm, developerAccessPerm] }, + ]; + + for (const roleConfig of rolesToUpdate) { + const role = await prisma.role.findUnique({ + where: { name: roleConfig.name }, + include: { permissions: true }, + }); + + if (!role) { + console.log(`${roleConfig.name} role not found, skipping...`); + continue; + } + + for (const perm of roleConfig.permissions) { + const hasPermission = role.permissions.some( + (rp) => rp.permissionId === perm.id + ); + + if (!hasPermission) { + await prisma.rolePermission.create({ + data: { + roleId: role.id, + permissionId: perm.id, + }, + }); + console.log(`Added ${perm.resource}:${perm.action} to ${roleConfig.name}`); + } + } + } + + console.log('Done!'); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/backend/prisma/backup-data.ts b/backend/prisma/backup-data.ts new file mode 100644 index 00000000..2ae2dcba --- /dev/null +++ b/backend/prisma/backup-data.ts @@ -0,0 +1,114 @@ +/** + * Datenbank-Backup Script + * + * Exportiert alle Daten als JSON-Dateien für die Wiederherstellung nach Migrationen. + * + * Verwendung: + * npx ts-node prisma/backup-data.ts + * + * Erstellt einen Ordner 'backups/YYYY-MM-DD_HH-mm-ss/' mit JSON-Dateien pro Tabelle. + */ + +import { PrismaClient } from '@prisma/client'; +import * as fs from 'fs'; +import * as path from 'path'; + +const prisma = new PrismaClient(); + +async function main() { + // Backup-Ordner mit Zeitstempel erstellen + const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19); + const backupDir = path.join(__dirname, 'backups', timestamp); + + if (!fs.existsSync(backupDir)) { + fs.mkdirSync(backupDir, { recursive: true }); + } + + console.log(`\n📦 Starte Datenbank-Backup nach: ${backupDir}\n`); + + // Tabellen in Abhängigkeitsreihenfolge (unabhängige zuerst) + const tables = [ + // Level 0: Keine Abhängigkeiten + { name: 'Permission', query: () => prisma.permission.findMany() }, + { name: 'Role', query: () => prisma.role.findMany() }, + { name: 'SalesPlatform', query: () => prisma.salesPlatform.findMany() }, + { name: 'ContractCategory', query: () => prisma.contractCategory.findMany() }, + { name: 'CancellationPeriod', query: () => prisma.cancellationPeriod.findMany() }, + { name: 'ContractDuration', query: () => prisma.contractDuration.findMany() }, + { name: 'AppSetting', query: () => prisma.appSetting.findMany() }, + { name: 'EmailProviderConfig', query: () => prisma.emailProviderConfig.findMany() }, + { name: 'EnergyProvider', query: () => prisma.energyProvider.findMany() }, + { name: 'TelecomProvider', query: () => prisma.telecomProvider.findMany() }, + + // Level 1: Abhängig von Level 0 + { name: 'RolePermission', query: () => prisma.rolePermission.findMany() }, + { name: 'User', query: () => prisma.user.findMany() }, + { name: 'Customer', query: () => prisma.customer.findMany() }, + { name: 'Tariff', query: () => prisma.tariff.findMany() }, + + // Level 2: Abhängig von Level 1 + { name: 'UserRole', query: () => prisma.userRole.findMany() }, + { name: 'CustomerRepresentative', query: () => prisma.customerRepresentative.findMany() }, + { name: 'StressfreiEmail', query: () => prisma.stressfreiEmail.findMany() }, + { name: 'Contract', query: () => prisma.contract.findMany() }, + { name: 'Meter', query: () => prisma.meter.findMany() }, + + // Level 3: Abhängig von Level 2 + { name: 'CachedEmail', query: () => prisma.cachedEmail.findMany() }, + { name: 'ContractTask', query: () => prisma.contractTask.findMany() }, + { name: 'MeterReading', query: () => prisma.meterReading.findMany() }, + { name: 'ContractNote', query: () => prisma.contractNote.findMany() }, + { name: 'ContractDocument', query: () => prisma.contractDocument.findMany() }, + + // Level 4: Abhängig von Level 3 + { name: 'ContractTaskSubtask', query: () => prisma.contractTaskSubtask.findMany() }, + + // Vertragstyp-spezifische Details + { name: 'EnergyContractDetails', query: () => prisma.energyContractDetails.findMany() }, + { name: 'TelecomContractDetails', query: () => prisma.telecomContractDetails.findMany() }, + { name: 'CarInsuranceDetails', query: () => prisma.carInsuranceDetails.findMany() }, + ]; + + let totalRecords = 0; + const stats: { table: string; count: number }[] = []; + + for (const table of tables) { + try { + const data = await table.query(); + const count = data.length; + totalRecords += count; + stats.push({ table: table.name, count }); + + // JSON-Datei schreiben + const filePath = path.join(backupDir, `${table.name}.json`); + fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); + + const status = count > 0 ? '✅' : '⚪'; + console.log(`${status} ${table.name}: ${count} Einträge`); + } catch (error: any) { + // Tabelle existiert möglicherweise nicht (bei älteren Schema-Versionen) + console.log(`⚠️ ${table.name}: Übersprungen (${error.message?.slice(0, 50)}...)`); + } + } + + // Backup-Info speichern + const backupInfo = { + timestamp: new Date().toISOString(), + totalRecords, + tables: stats, + }; + fs.writeFileSync(path.join(backupDir, '_backup-info.json'), JSON.stringify(backupInfo, null, 2)); + + console.log(`\n✅ Backup abgeschlossen!`); + console.log(` 📊 ${totalRecords} Datensätze in ${stats.filter(s => s.count > 0).length} Tabellen`); + console.log(` 📁 Gespeichert in: ${backupDir}\n`); +} + +main() + .catch((e) => { + console.error('❌ Backup fehlgeschlagen:', e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/backend/prisma/backups/.gitkeep b/backend/prisma/backups/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/backend/prisma/migrations/20260130231219_add_email_trash_fields/migration.sql b/backend/prisma/migrations/20260130231219_add_email_trash_fields/migration.sql new file mode 100644 index 00000000..0ee61b34 --- /dev/null +++ b/backend/prisma/migrations/20260130231219_add_email_trash_fields/migration.sql @@ -0,0 +1,180 @@ +/* + Warnings: + + - A unique constraint covering the columns `[portalEmail]` on the table `Customer` will be added. If there are existing duplicate values, this will fail. + +*/ +-- AlterTable +ALTER TABLE `Contract` ADD COLUMN `stressfreiEmailId` INTEGER NULL, + MODIFY `status` ENUM('DRAFT', 'PENDING', 'ACTIVE', 'CANCELLED', 'EXPIRED', 'DEACTIVATED') NOT NULL DEFAULT 'DRAFT'; + +-- AlterTable +ALTER TABLE `Customer` ADD COLUMN `portalEmail` VARCHAR(191) NULL, + ADD COLUMN `portalEnabled` BOOLEAN NOT NULL DEFAULT false, + ADD COLUMN `portalLastLogin` DATETIME(3) NULL, + ADD COLUMN `portalPasswordEncrypted` VARCHAR(191) NULL, + ADD COLUMN `portalPasswordHash` VARCHAR(191) NULL; + +-- CreateTable +CREATE TABLE `AppSetting` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `key` VARCHAR(191) NOT NULL, + `value` TEXT NOT NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `AppSetting_key_key`(`key`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CustomerRepresentative` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `representativeId` INTEGER NOT NULL, + `notes` VARCHAR(191) NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `CustomerRepresentative_customerId_representativeId_key`(`customerId`, `representativeId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `EmailProviderConfig` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(191) NOT NULL, + `type` ENUM('PLESK', 'CPANEL', 'DIRECTADMIN') NOT NULL, + `apiUrl` VARCHAR(191) NOT NULL, + `apiKey` VARCHAR(191) NULL, + `username` VARCHAR(191) NULL, + `passwordEncrypted` VARCHAR(191) NULL, + `domain` VARCHAR(191) NOT NULL, + `defaultForwardEmail` VARCHAR(191) NULL, + `imapServer` VARCHAR(191) NULL, + `imapPort` INTEGER NULL DEFAULT 993, + `smtpServer` VARCHAR(191) NULL, + `smtpPort` INTEGER NULL DEFAULT 465, + `imapEncryption` ENUM('SSL', 'STARTTLS', 'NONE') NOT NULL DEFAULT 'SSL', + `smtpEncryption` ENUM('SSL', 'STARTTLS', 'NONE') NOT NULL DEFAULT 'SSL', + `allowSelfSignedCerts` BOOLEAN NOT NULL DEFAULT false, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `isDefault` BOOLEAN NOT NULL DEFAULT false, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + UNIQUE INDEX `EmailProviderConfig_name_key`(`name`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `StressfreiEmail` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `customerId` INTEGER NOT NULL, + `email` VARCHAR(191) NOT NULL, + `platform` VARCHAR(191) NULL, + `notes` TEXT NULL, + `isActive` BOOLEAN NOT NULL DEFAULT true, + `isProvisioned` BOOLEAN NOT NULL DEFAULT false, + `provisionedAt` DATETIME(3) NULL, + `provisionError` TEXT NULL, + `hasMailbox` BOOLEAN NOT NULL DEFAULT false, + `emailPasswordEncrypted` VARCHAR(191) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CachedEmail` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `stressfreiEmailId` INTEGER NOT NULL, + `folder` ENUM('INBOX', 'SENT') NOT NULL DEFAULT 'INBOX', + `messageId` VARCHAR(191) NOT NULL, + `uid` INTEGER NOT NULL, + `subject` VARCHAR(191) NULL, + `fromAddress` VARCHAR(191) NOT NULL, + `fromName` VARCHAR(191) NULL, + `toAddresses` TEXT NOT NULL, + `ccAddresses` TEXT NULL, + `receivedAt` DATETIME(3) NOT NULL, + `textBody` LONGTEXT NULL, + `htmlBody` LONGTEXT NULL, + `hasAttachments` BOOLEAN NOT NULL DEFAULT false, + `attachmentNames` TEXT NULL, + `contractId` INTEGER NULL, + `assignedAt` DATETIME(3) NULL, + `assignedBy` INTEGER NULL, + `isAutoAssigned` BOOLEAN NOT NULL DEFAULT false, + `isRead` BOOLEAN NOT NULL DEFAULT false, + `isStarred` BOOLEAN NOT NULL DEFAULT false, + `isDeleted` BOOLEAN NOT NULL DEFAULT false, + `deletedAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `CachedEmail_contractId_idx`(`contractId`), + INDEX `CachedEmail_stressfreiEmailId_folder_receivedAt_idx`(`stressfreiEmailId`, `folder`, `receivedAt`), + INDEX `CachedEmail_stressfreiEmailId_isDeleted_idx`(`stressfreiEmailId`, `isDeleted`), + UNIQUE INDEX `CachedEmail_stressfreiEmailId_messageId_folder_key`(`stressfreiEmailId`, `messageId`, `folder`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractTask` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `contractId` INTEGER NOT NULL, + `title` VARCHAR(191) NOT NULL, + `description` TEXT NULL, + `status` ENUM('OPEN', 'COMPLETED') NOT NULL DEFAULT 'OPEN', + `visibleInPortal` BOOLEAN NOT NULL DEFAULT false, + `createdBy` VARCHAR(191) NULL, + `completedAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `ContractTaskSubtask` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `taskId` INTEGER NOT NULL, + `title` VARCHAR(191) NOT NULL, + `status` ENUM('OPEN', 'COMPLETED') NOT NULL DEFAULT 'OPEN', + `createdBy` VARCHAR(191) NULL, + `completedAt` DATETIME(3) NULL, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateIndex +CREATE UNIQUE INDEX `Customer_portalEmail_key` ON `Customer`(`portalEmail`); + +-- AddForeignKey +ALTER TABLE `CustomerRepresentative` ADD CONSTRAINT `CustomerRepresentative_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CustomerRepresentative` ADD CONSTRAINT `CustomerRepresentative_representativeId_fkey` FOREIGN KEY (`representativeId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `StressfreiEmail` ADD CONSTRAINT `StressfreiEmail_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CachedEmail` ADD CONSTRAINT `CachedEmail_stressfreiEmailId_fkey` FOREIGN KEY (`stressfreiEmailId`) REFERENCES `StressfreiEmail`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CachedEmail` ADD CONSTRAINT `CachedEmail_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `Contract` ADD CONSTRAINT `Contract_stressfreiEmailId_fkey` FOREIGN KEY (`stressfreiEmailId`) REFERENCES `StressfreiEmail`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ContractTask` ADD CONSTRAINT `ContractTask_contractId_fkey` FOREIGN KEY (`contractId`) REFERENCES `Contract`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `ContractTaskSubtask` ADD CONSTRAINT `ContractTaskSubtask_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `ContractTask`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/backend/prisma/migrations/20260130233909_add_token_invalidation/migration.sql b/backend/prisma/migrations/20260130233909_add_token_invalidation/migration.sql new file mode 100644 index 00000000..064972fb --- /dev/null +++ b/backend/prisma/migrations/20260130233909_add_token_invalidation/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE `User` ADD COLUMN `tokenInvalidatedAt` DATETIME(3) NULL; diff --git a/backend/prisma/restore-data.ts b/backend/prisma/restore-data.ts new file mode 100644 index 00000000..53ab9822 --- /dev/null +++ b/backend/prisma/restore-data.ts @@ -0,0 +1,486 @@ +/** + * Datenbank-Restore Script + * + * Stellt Daten aus einem JSON-Backup wieder her. + * + * Verwendung: + * npx ts-node prisma/restore-data.ts [backup-ordner] + * + * Beispiele: + * npx ts-node prisma/restore-data.ts # Letztes Backup + * npx ts-node prisma/restore-data.ts 2025-01-31_14-30-00 # Bestimmtes Backup + * + * WICHTIG: Führe vorher 'npx prisma migrate deploy' oder 'npx prisma db push' aus! + */ + +import { PrismaClient } from '@prisma/client'; +import * as fs from 'fs'; +import * as path from 'path'; + +const prisma = new PrismaClient(); + +// Hilfsfunktion: JSON-Datei lesen +function readJsonFile(filePath: string): T[] { + if (!fs.existsSync(filePath)) { + return []; + } + const content = fs.readFileSync(filePath, 'utf-8'); + return JSON.parse(content); +} + +// Hilfsfunktion: Datum-Strings zu Date-Objekten konvertieren +function convertDates(obj: any): any { + if (obj === null || obj === undefined) return obj; + if (typeof obj === 'string') { + // ISO-Datumsformat erkennen + if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(obj)) { + return new Date(obj); + } + return obj; + } + if (Array.isArray(obj)) { + return obj.map(convertDates); + } + if (typeof obj === 'object') { + const result: any = {}; + for (const [key, value] of Object.entries(obj)) { + result[key] = convertDates(value); + } + return result; + } + return obj; +} + +async function main() { + // Backup-Ordner bestimmen + const backupsDir = path.join(__dirname, 'backups'); + let backupName = process.argv[2]; + + if (!backupName) { + // Neuestes Backup finden + if (!fs.existsSync(backupsDir)) { + console.error('❌ Kein Backup-Ordner gefunden!'); + process.exit(1); + } + const backups = fs.readdirSync(backupsDir) + .filter(f => fs.statSync(path.join(backupsDir, f)).isDirectory()) + .sort() + .reverse(); + + if (backups.length === 0) { + console.error('❌ Keine Backups gefunden!'); + process.exit(1); + } + backupName = backups[0]; + console.log(`📦 Verwende neuestes Backup: ${backupName}`); + } + + const backupDir = path.join(backupsDir, backupName); + + if (!fs.existsSync(backupDir)) { + console.error(`❌ Backup-Ordner nicht gefunden: ${backupDir}`); + process.exit(1); + } + + // Backup-Info lesen + const infoPath = path.join(backupDir, '_backup-info.json'); + if (fs.existsSync(infoPath)) { + const info = JSON.parse(fs.readFileSync(infoPath, 'utf-8')); + console.log(`\n📅 Backup vom: ${new Date(info.timestamp).toLocaleString('de-DE')}`); + console.log(`📊 ${info.totalRecords} Datensätze in ${info.tables.filter((t: any) => t.count > 0).length} Tabellen\n`); + } + + console.log(`🔄 Starte Wiederherstellung aus: ${backupDir}\n`); + + // Foreign Key Checks deaktivieren für MySQL + await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 0'); + + try { + // Tabellen in Abhängigkeitsreihenfolge wiederherstellen + const restoreOrder = [ + // Level 0: Keine Abhängigkeiten + { + name: 'Permission', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.permission.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Role', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.role.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'SalesPlatform', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.salesPlatform.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractCategory', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractCategory.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'CancellationPeriod', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.cancellationPeriod.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractDuration', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractDuration.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'AppSetting', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.appSetting.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'EmailProviderConfig', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.emailProviderConfig.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'EnergyProvider', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.energyProvider.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'TelecomProvider', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.telecomProvider.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + + // Level 1 + { + name: 'RolePermission', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.rolePermission.upsert({ + where: { roleId_permissionId: { roleId: item.roleId, permissionId: item.permissionId } }, + update: {}, + create: convertDates(item), + }); + } + }, + }, + { + name: 'User', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.user.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Customer', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.customer.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Tariff', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.tariff.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + + // Level 2 + { + name: 'UserRole', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.userRole.upsert({ + where: { userId_roleId: { userId: item.userId, roleId: item.roleId } }, + update: {}, + create: convertDates(item), + }); + } + }, + }, + { + name: 'CustomerRepresentative', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.customerRepresentative.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'StressfreiEmail', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.stressfreiEmail.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Contract', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contract.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Meter', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.meter.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + + // Level 3 + { + name: 'CachedEmail', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.cachedEmail.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractTask', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractTask.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'MeterReading', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.meterReading.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractNote', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractNote.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractDocument', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractDocument.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + + // Level 4 + { + name: 'ContractTaskSubtask', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractTaskSubtask.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + + // Vertragsdetails + { + name: 'EnergyContractDetails', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.energyContractDetails.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'TelecomContractDetails', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.telecomContractDetails.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'CarInsuranceDetails', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.carInsuranceDetails.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + ]; + + let totalRestored = 0; + + for (const table of restoreOrder) { + const filePath = path.join(backupDir, `${table.name}.json`); + const data = readJsonFile(filePath); + + if (data.length === 0) { + console.log(`⚪ ${table.name}: Keine Daten`); + continue; + } + + try { + await table.restore(data); + totalRestored += data.length; + console.log(`✅ ${table.name}: ${data.length} Einträge wiederhergestellt`); + } catch (error: any) { + console.log(`⚠️ ${table.name}: Fehler - ${error.message?.slice(0, 80)}`); + } + } + + console.log(`\n✅ Wiederherstellung abgeschlossen!`); + console.log(` 📊 ${totalRestored} Datensätze wiederhergestellt\n`); + + } finally { + // Foreign Key Checks wieder aktivieren + await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 1'); + } +} + +main() + .catch((e) => { + console.error('❌ Wiederherstellung fehlgeschlagen:', e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 95322474..0b8152af 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -20,17 +20,18 @@ model AppSetting { // ==================== USERS & AUTH ==================== model User { - id Int @id @default(autoincrement()) - email String @unique - password String - firstName String - lastName String - isActive Boolean @default(true) - customerId Int? @unique - customer Customer? @relation(fields: [customerId], references: [id]) - roles UserRole[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + email String @unique + password String + firstName String + lastName String + isActive Boolean @default(true) + tokenInvalidatedAt DateTime? // Zeitpunkt ab dem alle Tokens ungültig sind (für Zwangslogout bei Rechteänderung) + customerId Int? @unique + customer Customer? @relation(fields: [customerId], references: [id]) + roles UserRole[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model Role { @@ -216,6 +217,13 @@ enum EmailProviderType { DIRECTADMIN } +// Verschlüsselungstyp für E-Mail-Verbindungen +enum MailEncryption { + SSL // Implicit SSL/TLS (Ports 465/993) - Verschlüsselung von Anfang an + STARTTLS // STARTTLS (Ports 587/143) - Startet unverschlüsselt, dann Upgrade + NONE // Keine Verschlüsselung (Ports 25/143) +} + model EmailProviderConfig { id Int @id @default(autoincrement()) name String @unique // z.B. "Plesk Hauptserver" @@ -226,6 +234,18 @@ model EmailProviderConfig { passwordEncrypted String? // Passwort (verschlüsselt) domain String // Domain für E-Mails (z.B. stressfrei-wechseln.de) defaultForwardEmail String? // Standard-Weiterleitungsadresse (unsere eigene) + + // IMAP/SMTP-Server für E-Mail-Client (optional, default: mail.{domain}) + imapServer String? // z.B. "mail.stressfrei-wechseln.de" + imapPort Int? @default(993) + smtpServer String? + smtpPort Int? @default(465) + + // Verschlüsselungs-Einstellungen + imapEncryption MailEncryption @default(SSL) // SSL, STARTTLS oder NONE + smtpEncryption MailEncryption @default(SSL) // SSL, STARTTLS oder NONE + allowSelfSignedCerts Boolean @default(false) // Selbstsignierte Zertifikate erlauben + isActive Boolean @default(true) isDefault Boolean @default(false) // Standard-Provider createdAt DateTime @default(now()) @@ -235,19 +255,82 @@ model EmailProviderConfig { // ==================== STRESSFREI-WECHSELN EMAIL ADDRESSES ==================== model StressfreiEmail { - id Int @id @default(autoincrement()) - customerId Int - customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade) - email String // Die Weiterleitungs-E-Mail-Adresse - platform String? // Für welche Plattform (z.B. "Freenet", "Klarmobil") - notes String? @db.Text // Optionale Notizen - isActive Boolean @default(true) - isProvisioned Boolean @default(false) // Wurde bei Provider angelegt? - provisionedAt DateTime? // Wann wurde provisioniert? - provisionError String? @db.Text // Fehlermeldung falls Provisionierung fehlschlug - contracts Contract[] // Verträge die diese E-Mail als Benutzername verwenden - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + customerId Int + customer Customer @relation(fields: [customerId], references: [id], onDelete: Cascade) + email String // Die Weiterleitungs-E-Mail-Adresse + platform String? // Für welche Plattform (z.B. "Freenet", "Klarmobil") + notes String? @db.Text // Optionale Notizen + isActive Boolean @default(true) + isProvisioned Boolean @default(false) // Wurde bei Provider angelegt? + provisionedAt DateTime? // Wann wurde provisioniert? + provisionError String? @db.Text // Fehlermeldung falls Provisionierung fehlschlug + + // Mailbox-Zugangsdaten (für IMAP/SMTP-Zugang) + hasMailbox Boolean @default(false) // Hat echte Mailbox (nicht nur Weiterleitung)? + emailPasswordEncrypted String? // Verschlüsseltes Mailbox-Passwort (AES-256-GCM) + + contracts Contract[] // Verträge die diese E-Mail als Benutzername verwenden + cachedEmails CachedEmail[] // Gecachte E-Mails aus dieser Mailbox + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +// ==================== CACHED EMAILS (E-Mail-Client) ==================== + +enum EmailFolder { + INBOX + SENT +} + +model CachedEmail { + id Int @id @default(autoincrement()) + stressfreiEmailId Int + stressfreiEmail StressfreiEmail @relation(fields: [stressfreiEmailId], references: [id], onDelete: Cascade) + + // Ordner (Posteingang oder Gesendet) + folder EmailFolder @default(INBOX) + + // IMAP-Identifikation + messageId String // RFC 5322 Message-ID + uid Int // IMAP UID (für Synchronisierung, bei SENT = 0) + + // E-Mail-Metadaten + subject String? + fromAddress String + fromName String? + toAddresses String @db.Text // JSON Array + ccAddresses String? @db.Text // JSON Array + receivedAt DateTime + + // Inhalt + textBody String? @db.LongText + htmlBody String? @db.LongText + hasAttachments Boolean @default(false) + attachmentNames String? @db.Text // JSON Array + + // Vertragszuordnung + contractId Int? + contract Contract? @relation(fields: [contractId], references: [id], onDelete: SetNull) + assignedAt DateTime? + assignedBy Int? // User ID der die Zuordnung gemacht hat + isAutoAssigned Boolean @default(false) // true = automatisch beim Senden aus Vertrag + + // Flags + isRead Boolean @default(false) + isStarred Boolean @default(false) + + // Papierkorb + isDeleted Boolean @default(false) // Im Papierkorb? + deletedAt DateTime? // Wann gelöscht? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([stressfreiEmailId, messageId, folder]) // Folder hinzugefügt: gleiche MessageID kann in INBOX und SENT existieren + @@index([contractId]) + @@index([stressfreiEmailId, folder, receivedAt]) + @@index([stressfreiEmailId, isDeleted]) // Für Papierkorb-Abfragen } // ==================== METERS (Energy) ==================== @@ -465,6 +548,7 @@ model Contract { carInsuranceDetails CarInsuranceDetails? tasks ContractTask[] + assignedEmails CachedEmail[] // Zugeordnete E-Mails aus dem E-Mail-Client createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/backend/prisma/seed.ts b/backend/prisma/seed.ts index 03ba3de9..bf5ce4da 100644 --- a/backend/prisma/seed.ts +++ b/backend/prisma/seed.ts @@ -6,17 +6,31 @@ const prisma = new PrismaClient(); async function main() { console.log('Seeding database...'); - // Create permissions - const resources = ['customers', 'contracts', 'users', 'platforms', 'providers', 'developer']; - const actions = ['create', 'read', 'update', 'delete', 'access']; + // ==================== PERMISSIONS ==================== + // Ressourcen mit ihren erlaubten Aktionen + const resourcePermissions: Record = { + // Haupt-Ressourcen (CRUD) + customers: ['create', 'read', 'update', 'delete'], + contracts: ['create', 'read', 'update', 'delete'], + users: ['create', 'read', 'update', 'delete'], + platforms: ['create', 'read', 'update', 'delete'], + providers: ['create', 'read', 'update', 'delete'], + tariffs: ['create', 'read', 'update', 'delete'], + // Konfiguration (CRUD) + 'cancellation-periods': ['create', 'read', 'update', 'delete'], + 'contract-durations': ['create', 'read', 'update', 'delete'], + 'contract-categories': ['create', 'read', 'update', 'delete'], + 'email-providers': ['create', 'read', 'update', 'delete'], + // Einstellungen (nur lesen/ändern) + settings: ['read', 'update'], + // Spezial-Permissions + developer: ['access'], + emails: ['delete'], + }; const permissions: { resource: string; action: string }[] = []; - for (const resource of resources) { + for (const [resource, actions] of Object.entries(resourcePermissions)) { for (const action of actions) { - // developer nur mit 'access' action - if (resource === 'developer' && action !== 'access') continue; - // andere resources ohne 'access' action - if (resource !== 'developer' && action === 'access') continue; permissions.push({ resource, action }); } } @@ -29,7 +43,7 @@ async function main() { }); } - console.log('Permissions created'); + console.log(`Permissions created (${permissions.length} total)`); // Get all permissions const allPermissions = await prisma.permission.findMany(); @@ -63,14 +77,34 @@ async function main() { }, }); - // Employee - full access to customers, contracts, read platforms and providers + // Developer - ALL permissions including developer:access + const developerRole = await prisma.role.upsert({ + where: { name: 'Developer' }, + update: {}, + create: { + name: 'Developer', + description: 'Voller Zugriff inkl. Entwickler-Tools', + permissions: { + create: allPermissions.map((p) => ({ permissionId: p.id })), + }, + }, + }); + + // Employee - full access to customers, contracts, read access to lookup tables const employeePermIds = allPermissions .filter( (p) => p.resource === 'customers' || p.resource === 'contracts' || - (p.resource === 'platforms' && p.action === 'read') || - (p.resource === 'providers' && p.action === 'read') + // Read-only Zugriff auf Stammdaten und Konfiguration + (p.action === 'read' && [ + 'platforms', + 'providers', + 'tariffs', + 'cancellation-periods', + 'contract-durations', + 'contract-categories', + ].includes(p.resource)) ) .map((p) => p.id); @@ -86,10 +120,20 @@ async function main() { }, }); - // Read-only employee - const readOnlyPermIds = [customerReadPerm?.id, contractReadPerm?.id, platformReadPerm?.id, providerReadPerm?.id].filter( - (id): id is number => id !== undefined - ); + // Read-only employee - read access to main entities and lookup tables + const readOnlyResources = [ + 'customers', + 'contracts', + 'platforms', + 'providers', + 'tariffs', + 'cancellation-periods', + 'contract-durations', + 'contract-categories', + ]; + const readOnlyPermIds = allPermissions + .filter((p) => p.action === 'read' && readOnlyResources.includes(p.resource)) + .map((p) => p.id); const readOnlyRole = await prisma.role.upsert({ where: { name: 'Mitarbeiter (Nur-Lesen)' }, @@ -149,15 +193,76 @@ async function main() { console.log('Sales platforms created'); + // ==================== STANDARD PROVIDERS ==================== + const providers = [ + { + name: 'Vodafone', + portalUrl: 'https://www.vodafone.de/meinvodafone/account/login', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'Klarmobil', + portalUrl: 'https://www.klarmobil.de/login', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'Otelo', + portalUrl: 'https://www.otelo.de/mein-otelo/login', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'Congstar', + portalUrl: 'https://www.congstar.de/login/', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'Telekom', + portalUrl: 'https://www.telekom.de/kundencenter/startseite', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'O2', + portalUrl: 'https://www.o2online.de/ecare/selfcare', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: '1&1', + portalUrl: 'https://control-center.1und1.de/', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + ]; + + for (const provider of providers) { + await prisma.provider.upsert({ + where: { name: provider.name }, + update: { + portalUrl: provider.portalUrl, + usernameFieldName: provider.usernameFieldName, + passwordFieldName: provider.passwordFieldName, + }, + create: { ...provider, isActive: true }, + }); + } + + console.log('Providers created'); + // Create contract categories (matching existing enum values) const contractCategories = [ { code: 'ELECTRICITY', name: 'Strom', icon: 'Zap', color: '#FFC107', sortOrder: 1 }, { code: 'GAS', name: 'Gas', icon: 'Flame', color: '#FF5722', sortOrder: 2 }, { code: 'DSL', name: 'DSL', icon: 'Wifi', color: '#2196F3', sortOrder: 3 }, { code: 'FIBER', name: 'Glasfaser', icon: 'Cable', color: '#9C27B0', sortOrder: 4 }, - { code: 'MOBILE', name: 'Mobilfunk', icon: 'Smartphone', color: '#4CAF50', sortOrder: 5 }, - { code: 'TV', name: 'TV', icon: 'Tv', color: '#E91E63', sortOrder: 6 }, - { code: 'CAR_INSURANCE', name: 'KFZ-Versicherung', icon: 'Car', color: '#607D8B', sortOrder: 7 }, + { code: 'CABLE', name: 'Kabel Internet (Coax)', icon: 'Cable', color: '#00BCD4', sortOrder: 5 }, + { code: 'MOBILE', name: 'Mobilfunk', icon: 'Smartphone', color: '#4CAF50', sortOrder: 6 }, + { code: 'TV', name: 'TV', icon: 'Tv', color: '#E91E63', sortOrder: 7 }, + { code: 'CAR_INSURANCE', name: 'KFZ-Versicherung', icon: 'Car', color: '#607D8B', sortOrder: 8 }, ]; for (const category of contractCategories) { @@ -170,6 +275,77 @@ async function main() { console.log('Contract categories created'); + // ==================== CANCELLATION PERIODS ==================== + const cancellationPeriods = [ + { code: '14D', description: '14 Tage' }, + { code: '1M', description: '1 Monat' }, + { code: '2M', description: '2 Monate' }, + { code: '3M', description: '3 Monate' }, + { code: '6M', description: '6 Monate' }, + { code: '12M', description: '12 Monate' }, + { code: '1W', description: '1 Woche' }, + { code: '2W', description: '2 Wochen' }, + { code: '4W', description: '4 Wochen' }, + { code: '6W', description: '6 Wochen' }, + ]; + + for (const period of cancellationPeriods) { + await prisma.cancellationPeriod.upsert({ + where: { code: period.code }, + update: { description: period.description }, + create: period, + }); + } + + console.log('Cancellation periods created'); + + // ==================== CONTRACT DURATIONS ==================== + const contractDurations = [ + { code: '1M', description: '1 Monat' }, + { code: '3M', description: '3 Monate' }, + { code: '6M', description: '6 Monate' }, + { code: '12M', description: '12 Monate' }, + { code: '24M', description: '24 Monate' }, + { code: '36M', description: '36 Monate' }, + { code: '1J', description: '1 Jahr' }, + { code: '2J', description: '2 Jahre' }, + { code: '3J', description: '3 Jahre' }, + { code: '4J', description: '4 Jahre' }, + { code: '5J', description: '5 Jahre' }, + { code: 'UNBEFRISTET', description: 'Unbefristet' }, + ]; + + for (const duration of contractDurations) { + await prisma.contractDuration.upsert({ + where: { code: duration.code }, + update: { description: duration.description }, + create: duration, + }); + } + + console.log('Contract durations created'); + + // ==================== APP SETTINGS ==================== + const appSettings = [ + // Cockpit-Einstellungen (Fristen-Ampel) + { key: 'deadlineCriticalDays', value: '14' }, // Rot: <= 14 Tage + { key: 'deadlineWarningDays', value: '42' }, // Gelb: <= 42 Tage + { key: 'deadlineOkDays', value: '90' }, // Grün: <= 90 Tage + // Allgemeine Einstellungen + { key: 'companyName', value: 'OpenCRM' }, + { key: 'defaultEmailDomain', value: 'stressfrei-wechseln.de' }, + ]; + + for (const setting of appSettings) { + await prisma.appSetting.upsert({ + where: { key: setting.key }, + update: {}, // Bestehende Werte nicht überschreiben + create: setting, + }); + } + + console.log('App settings created'); + console.log('Seeding completed!'); } diff --git a/backend/src/controllers/backup.controller.ts b/backend/src/controllers/backup.controller.ts new file mode 100644 index 00000000..c613256f --- /dev/null +++ b/backend/src/controllers/backup.controller.ts @@ -0,0 +1,169 @@ +import { Request, Response } from 'express'; +import * as backupService from '../services/backup.service.js'; + +/** + * Liste aller Backups abrufen + * GET /api/settings/backups + */ +export async function listBackups(req: Request, res: Response) { + try { + const backups = await backupService.listBackups(); + res.json({ data: backups }); + } catch (error: any) { + res.status(500).json({ error: 'Fehler beim Laden der Backups', details: error.message }); + } +} + +/** + * Neues Backup erstellen + * POST /api/settings/backup + */ +export async function createBackup(req: Request, res: Response) { + try { + const result = await backupService.createBackup(); + + if (result.success) { + res.json({ data: { backupName: result.backupName }, message: 'Backup erfolgreich erstellt' }); + } else { + res.status(500).json({ error: 'Backup fehlgeschlagen', details: result.error }); + } + } catch (error: any) { + res.status(500).json({ error: 'Fehler beim Erstellen des Backups', details: error.message }); + } +} + +/** + * Backup wiederherstellen + * POST /api/settings/backup/:name/restore + */ +export async function restoreBackup(req: Request, res: Response) { + try { + const { name } = req.params; + + if (!name) { + return res.status(400).json({ error: 'Backup-Name erforderlich' }); + } + + const result = await backupService.restoreBackup(name); + + if (result.success) { + res.json({ + data: { + restoredRecords: result.restoredRecords, + restoredFiles: result.restoredFiles, + }, + message: `${result.restoredRecords} Datensätze und ${result.restoredFiles || 0} Dateien wiederhergestellt`, + }); + } else { + res.status(500).json({ error: 'Wiederherstellung fehlgeschlagen', details: result.error }); + } + } catch (error: any) { + res.status(500).json({ error: 'Fehler bei der Wiederherstellung', details: error.message }); + } +} + +/** + * Backup löschen + * DELETE /api/settings/backup/:name + */ +export async function deleteBackup(req: Request, res: Response) { + try { + const { name } = req.params; + + if (!name) { + return res.status(400).json({ error: 'Backup-Name erforderlich' }); + } + + const result = await backupService.deleteBackup(name); + + if (result.success) { + res.json({ message: 'Backup gelöscht' }); + } else { + res.status(500).json({ error: 'Löschen fehlgeschlagen', details: result.error }); + } + } catch (error: any) { + res.status(500).json({ error: 'Fehler beim Löschen des Backups', details: error.message }); + } +} + +/** + * Backup als ZIP herunterladen + * GET /api/settings/backup/:name/download + */ +export async function downloadBackup(req: Request, res: Response) { + try { + const { name } = req.params; + + if (!name) { + return res.status(400).json({ error: 'Backup-Name erforderlich' }); + } + + const result = await backupService.createBackupZip(name); + + if ('error' in result) { + return res.status(404).json({ error: result.error }); + } + + // Response-Header setzen + res.setHeader('Content-Type', 'application/zip'); + res.setHeader('Content-Disposition', `attachment; filename="${result.filename}"`); + + // Archiver zum Response pipen + result.stream.pipe(res); + + // Archiver finalisieren (startet das Schreiben) + result.stream.finalize(); + } catch (error: any) { + res.status(500).json({ error: 'Fehler beim Download', details: error.message }); + } +} + +/** + * Backup-ZIP hochladen + * POST /api/settings/backup/upload + */ +export async function uploadBackup(req: Request, res: Response) { + try { + if (!req.file) { + return res.status(400).json({ error: 'Keine Datei hochgeladen' }); + } + + // Prüfen ob es eine ZIP-Datei ist + if (!req.file.originalname.endsWith('.zip')) { + return res.status(400).json({ error: 'Nur ZIP-Dateien sind erlaubt' }); + } + + const result = await backupService.uploadBackupZip(req.file.buffer); + + if (result.success) { + res.json({ + data: { backupName: result.backupName }, + message: 'Backup erfolgreich hochgeladen', + }); + } else { + res.status(400).json({ error: 'Upload fehlgeschlagen', details: result.error }); + } + } catch (error: any) { + res.status(500).json({ error: 'Fehler beim Upload', details: error.message }); + } +} + +/** + * Werkseinstellungen - Alle Daten löschen + * POST /api/settings/factory-reset + */ +export async function factoryReset(req: Request, res: Response) { + try { + const result = await backupService.factoryReset(); + + if (result.success) { + res.json({ + message: 'Werkseinstellungen wiederhergestellt. Bitte melden Sie sich mit admin@admin.com / admin an.', + }); + } else { + res.status(500).json({ error: 'Werkseinstellungen fehlgeschlagen', details: result.error }); + } + } catch (error: any) { + res.status(500).json({ error: 'Fehler bei Werkseinstellungen', details: error.message }); + } +} diff --git a/backend/src/controllers/cachedEmail.controller.ts b/backend/src/controllers/cachedEmail.controller.ts new file mode 100644 index 00000000..52b9921f --- /dev/null +++ b/backend/src/controllers/cachedEmail.controller.ts @@ -0,0 +1,805 @@ +// ==================== CACHED EMAIL CONTROLLER ==================== + +import { Request, Response } from 'express'; +import * as cachedEmailService from '../services/cachedEmail.service.js'; +import * as stressfreiEmailService from '../services/stressfreiEmail.service.js'; +import { sendEmail, SmtpCredentials, SendEmailParams, EmailAttachment } from '../services/smtpService.js'; +import { fetchAttachment, appendToSent, ImapCredentials } from '../services/imapService.js'; +import { getImapSmtpSettings } from '../services/emailProvider/emailProviderService.js'; +import { decrypt } from '../utils/encryption.js'; +import { ApiResponse } from '../types/index.js'; + +// ==================== E-MAIL LIST ==================== + +// E-Mails für einen Kunden abrufen +export async function getEmailsForCustomer(req: Request, res: Response): Promise { + try { + const customerId = parseInt(req.params.customerId); + const stressfreiEmailId = req.query.accountId ? parseInt(req.query.accountId as string) : undefined; + const folder = req.query.folder as string | undefined; // INBOX oder SENT + const limit = req.query.limit ? parseInt(req.query.limit as string) : 50; + const offset = req.query.offset ? parseInt(req.query.offset as string) : 0; + + const emails = await cachedEmailService.getCachedEmails({ + customerId, + stressfreiEmailId, + folder, + limit, + offset, + includeBody: false, + }); + + res.json({ success: true, data: emails } as ApiResponse); + } catch (error) { + console.error('getEmailsForCustomer error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der E-Mails', + } as ApiResponse); + } +} + +// E-Mails für einen Vertrag abrufen +export async function getEmailsForContract(req: Request, res: Response): Promise { + try { + const contractId = parseInt(req.params.contractId); + const folder = req.query.folder as string | undefined; // INBOX oder SENT + const limit = req.query.limit ? parseInt(req.query.limit as string) : 50; + const offset = req.query.offset ? parseInt(req.query.offset as string) : 0; + + const emails = await cachedEmailService.getCachedEmails({ + contractId, + folder, + limit, + offset, + includeBody: false, + }); + + res.json({ success: true, data: emails } as ApiResponse); + } catch (error) { + console.error('getEmailsForContract error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der Vertrags-E-Mails', + } as ApiResponse); + } +} + +// ==================== SINGLE EMAIL ==================== + +// Einzelne E-Mail abrufen (mit Body) +export async function getEmail(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + const email = await cachedEmailService.getCachedEmailById(id); + + if (!email) { + res.status(404).json({ + success: false, + error: 'E-Mail nicht gefunden', + } as ApiResponse); + return; + } + + // Als gelesen markieren + await cachedEmailService.markEmailAsRead(id); + + res.json({ success: true, data: { ...email, isRead: true } } as ApiResponse); + } catch (error) { + console.error('getEmail error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der E-Mail', + } as ApiResponse); + } +} + +// E-Mail als gelesen/ungelesen markieren +export async function markAsRead(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + const { isRead } = req.body; + + if (isRead) { + await cachedEmailService.markEmailAsRead(id); + } else { + await cachedEmailService.markEmailAsUnread(id); + } + + res.json({ success: true } as ApiResponse); + } catch (error) { + console.error('markAsRead error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Markieren der E-Mail', + } as ApiResponse); + } +} + +// E-Mail Stern umschalten +export async function toggleStar(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + const isStarred = await cachedEmailService.toggleEmailStar(id); + + res.json({ success: true, data: { isStarred } } as ApiResponse); + } catch (error) { + console.error('toggleStar error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Ändern des Sterns', + } as ApiResponse); + } +} + +// ==================== CONTRACT ASSIGNMENT ==================== + +// E-Mail einem Vertrag zuordnen +export async function assignToContract(req: Request, res: Response): Promise { + try { + const emailId = parseInt(req.params.id); + const { contractId } = req.body; + const userId = (req as any).userId; // Falls Auth-Middleware userId setzt + + const email = await cachedEmailService.assignEmailToContract(emailId, contractId, userId); + + res.json({ success: true, data: email } as ApiResponse); + } catch (error) { + console.error('assignToContract error:', error); + res.status(400).json({ + success: false, + error: error instanceof Error ? error.message : 'Fehler beim Zuordnen der E-Mail', + } as ApiResponse); + } +} + +// Vertragszuordnung aufheben +export async function unassignFromContract(req: Request, res: Response): Promise { + try { + const emailId = parseInt(req.params.id); + + const email = await cachedEmailService.unassignEmailFromContract(emailId); + + res.json({ success: true, data: email } as ApiResponse); + } catch (error) { + console.error('unassignFromContract error:', error); + res.status(400).json({ + success: false, + error: error instanceof Error ? error.message : 'Fehler beim Aufheben der Zuordnung', + } as ApiResponse); + } +} + +// E-Mail-Anzahl pro Ordner für ein Konto +export async function getFolderCounts(req: Request, res: Response): Promise { + try { + const stressfreiEmailId = parseInt(req.params.id); + + const counts = await cachedEmailService.getFolderCountsForAccount(stressfreiEmailId); + + res.json({ success: true, data: counts } as ApiResponse); + } catch (error) { + console.error('getFolderCounts error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der Ordner-Anzahlen', + } as ApiResponse); + } +} + +// E-Mail-Anzahl pro Ordner für einen Vertrag +export async function getContractFolderCounts(req: Request, res: Response): Promise { + try { + const contractId = parseInt(req.params.contractId); + + const counts = await cachedEmailService.getFolderCountsForContract(contractId); + + res.json({ success: true, data: counts } as ApiResponse); + } catch (error) { + console.error('getContractFolderCounts error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der Ordner-Anzahlen', + } as ApiResponse); + } +} + +// ==================== SYNC & SEND ==================== + +// E-Mails für ein Konto synchronisieren (INBOX + SENT) +export async function syncAccount(req: Request, res: Response): Promise { + try { + const stressfreiEmailId = parseInt(req.params.id); + const fullSync = req.query.full === 'true'; + + // Synchronisiert sowohl INBOX als auch SENT + const result = await cachedEmailService.syncAllFoldersForAccount(stressfreiEmailId, { fullSync }); + + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + } as ApiResponse); + return; + } + + res.json({ + success: true, + data: { + newEmails: result.newEmails, + totalEmails: result.totalEmails, + }, + } as ApiResponse); + } catch (error) { + console.error('syncAccount error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Synchronisieren der E-Mails', + } as ApiResponse); + } +} + +// E-Mail senden +export async function sendEmailFromAccount(req: Request, res: Response): Promise { + try { + const stressfreiEmailId = parseInt(req.params.id); + const { to, cc, subject, text, html, inReplyTo, references, attachments, contractId } = req.body; + + // StressfreiEmail laden + const stressfreiEmail = await stressfreiEmailService.getEmailWithMailboxById(stressfreiEmailId); + + if (!stressfreiEmail) { + res.status(404).json({ + success: false, + error: 'E-Mail-Konto nicht gefunden', + } as ApiResponse); + return; + } + + if (!stressfreiEmail.hasMailbox) { + res.status(400).json({ + success: false, + error: 'Dieses Konto hat keine Mailbox für den Versand', + } as ApiResponse); + return; + } + + // Passwort entschlüsseln + const password = await stressfreiEmailService.getDecryptedPassword(stressfreiEmailId); + + if (!password) { + res.status(400).json({ + success: false, + error: 'Passwort für E-Mail-Versand nicht verfügbar', + } as ApiResponse); + return; + } + + // SMTP-Einstellungen vom Provider + const settings = await getImapSmtpSettings(); + + if (!settings) { + res.status(400).json({ + success: false, + error: 'Keine SMTP-Einstellungen konfiguriert', + } as ApiResponse); + return; + } + + // SMTP-Credentials + const credentials: SmtpCredentials = { + host: settings.smtpServer, + port: settings.smtpPort, + user: stressfreiEmail.email, + password, + encryption: settings.smtpEncryption, + allowSelfSignedCerts: settings.allowSelfSignedCerts, + }; + + // E-Mail-Parameter + const emailParams: SendEmailParams = { + to, + cc, + subject, + text, + html, + inReplyTo, + references, + attachments: attachments as EmailAttachment[] | undefined, + }; + + // E-Mail senden + const result = await sendEmail(credentials, stressfreiEmail.email, emailParams); + + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + } as ApiResponse); + return; + } + + // Gesendete E-Mail im IMAP Sent-Ordner speichern (für Attachment-Download) + let sentUid: number | undefined; + if (result.rawEmail) { + try { + // IMAP-Credentials für Sent-Ordner + const imapCredentials: ImapCredentials = { + host: settings.imapServer, + port: settings.imapPort, + user: stressfreiEmail.email, + password, + encryption: settings.imapEncryption, + allowSelfSignedCerts: settings.allowSelfSignedCerts, + }; + + const appendResult = await appendToSent(imapCredentials, { + rawEmail: result.rawEmail, + }); + + if (appendResult.success && appendResult.uid) { + sentUid = appendResult.uid; + console.log(`[SMTP] Email stored in Sent folder with UID ${sentUid}`); + } + } catch (appendError) { + // Nicht kritisch - E-Mail wurde trotzdem gesendet + console.error('Error appending to IMAP Sent folder:', appendError); + } + } + + // Gesendete E-Mail im Cache speichern + try { + // Anhangsnamen extrahieren falls vorhanden + const attachmentNames = attachments?.map((a: EmailAttachment) => a.filename) || []; + + await cachedEmailService.createSentEmail(stressfreiEmailId, { + to, + cc, + subject, + text, + html, + messageId: result.messageId || `sent-${Date.now()}@opencrm.local`, + contractId: contractId ? parseInt(contractId) : undefined, + attachmentNames: attachmentNames.length > 0 ? attachmentNames : undefined, + uid: sentUid, // UID vom IMAP Sent-Ordner für Attachment-Download + }); + } catch (saveError) { + // Fehler beim Speichern nicht kritisch - E-Mail wurde trotzdem gesendet + console.error('Error saving sent email to cache:', saveError); + } + + res.json({ + success: true, + data: { messageId: result.messageId }, + } as ApiResponse); + } catch (error) { + console.error('sendEmailFromAccount error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Senden der E-Mail', + } as ApiResponse); + } +} + +// ==================== ATTACHMENTS ==================== + +// Anhang-Liste einer E-Mail abrufen +export async function getAttachments(req: Request, res: Response): Promise { + try { + const emailId = parseInt(req.params.emailId); + + // E-Mail aus Cache laden + const email = await cachedEmailService.getCachedEmailById(emailId); + if (!email) { + res.status(404).json({ + success: false, + error: 'E-Mail nicht gefunden', + } as ApiResponse); + return; + } + + // Anhänge aus attachmentNames parsen (JSON Array) + const attachmentNames: string[] = email.attachmentNames + ? JSON.parse(email.attachmentNames) + : []; + + res.json({ + success: true, + data: attachmentNames.map((name) => ({ filename: name })), + } as ApiResponse); + } catch (error) { + console.error('getAttachments error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der Anhänge', + } as ApiResponse); + } +} + +// Einzelnen Anhang herunterladen +export async function downloadAttachment(req: Request, res: Response): Promise { + try { + const emailId = parseInt(req.params.emailId); + const filename = decodeURIComponent(req.params.filename); + + // E-Mail aus Cache laden + const email = await cachedEmailService.getCachedEmailById(emailId); + if (!email) { + res.status(404).json({ + success: false, + error: 'E-Mail nicht gefunden', + } as ApiResponse); + return; + } + + // Für gesendete E-Mails: Prüfen ob UID vorhanden (im IMAP Sent gespeichert) + if (email.folder === 'SENT' && email.uid === 0) { + res.status(400).json({ + success: false, + error: 'Anhang nicht verfügbar - E-Mail wurde vor der IMAP-Speicherung gesendet', + } as ApiResponse); + return; + } + + // StressfreiEmail laden um Zugangsdaten zu bekommen + const stressfreiEmail = await stressfreiEmailService.getEmailWithMailboxById(email.stressfreiEmailId); + if (!stressfreiEmail || !stressfreiEmail.emailPasswordEncrypted) { + res.status(400).json({ + success: false, + error: 'Keine Mailbox-Zugangsdaten verfügbar', + } as ApiResponse); + return; + } + + // IMAP-Einstellungen laden + const settings = await getImapSmtpSettings(); + if (!settings) { + res.status(400).json({ + success: false, + error: 'Keine E-Mail-Provider-Einstellungen gefunden', + } as ApiResponse); + return; + } + + // Passwort entschlüsseln + const password = decrypt(stressfreiEmail.emailPasswordEncrypted); + + // IMAP-Credentials + const credentials: ImapCredentials = { + host: settings.imapServer, + port: settings.imapPort, + user: stressfreiEmail.email, + password, + encryption: settings.imapEncryption, + allowSelfSignedCerts: settings.allowSelfSignedCerts, + }; + + // Ordner basierend auf E-Mail-Typ bestimmen (INBOX oder Sent) + const imapFolder = email.folder === 'SENT' ? 'Sent' : 'INBOX'; + + // Anhang per IMAP abrufen + const attachment = await fetchAttachment(credentials, email.uid, filename, imapFolder); + + if (!attachment) { + res.status(404).json({ + success: false, + error: 'Anhang nicht gefunden', + } as ApiResponse); + return; + } + + // Datei senden - inline (öffnen) oder attachment (download) + const disposition = req.query.view === 'true' ? 'inline' : 'attachment'; + res.setHeader('Content-Type', attachment.contentType); + res.setHeader('Content-Disposition', `${disposition}; filename="${encodeURIComponent(attachment.filename)}"`); + res.setHeader('Content-Length', attachment.size); + res.send(attachment.content); + } catch (error) { + console.error('downloadAttachment error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Herunterladen des Anhangs', + } as ApiResponse); + } +} + +// ==================== MAILBOX ACCOUNTS ==================== + +// Mailbox-Konten eines Kunden abrufen +export async function getMailboxAccounts(req: Request, res: Response): Promise { + try { + const customerId = parseInt(req.params.customerId); + + const accounts = await cachedEmailService.getMailboxAccountsForCustomer(customerId); + + res.json({ success: true, data: accounts } as ApiResponse); + } catch (error) { + console.error('getMailboxAccounts error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der E-Mail-Konten', + } as ApiResponse); + } +} + +// Mailbox nachträglich aktivieren +export async function enableMailbox(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + + const result = await stressfreiEmailService.enableMailbox(id); + + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + } as ApiResponse); + return; + } + + res.json({ success: true } as ApiResponse); + } catch (error) { + console.error('enableMailbox error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Aktivieren der Mailbox', + } as ApiResponse); + } +} + +// Mailbox-Status mit Provider synchronisieren +export async function syncMailboxStatus(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + + const result = await stressfreiEmailService.syncMailboxStatus(id); + + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + } as ApiResponse); + return; + } + + res.json({ + success: true, + data: { + hasMailbox: result.hasMailbox, + wasUpdated: result.wasUpdated, + }, + } as ApiResponse); + } catch (error) { + console.error('syncMailboxStatus error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Synchronisieren des Mailbox-Status', + } as ApiResponse); + } +} + +// E-Mail-Thread abrufen +export async function getThread(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + + const thread = await cachedEmailService.getEmailThread(id); + + res.json({ success: true, data: thread } as ApiResponse); + } catch (error) { + console.error('getThread error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden des E-Mail-Threads', + } as ApiResponse); + } +} + +// Mailbox-Zugangsdaten abrufen (IMAP/SMTP) +export async function getMailboxCredentials(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + + // StressfreiEmail laden + const stressfreiEmail = await stressfreiEmailService.getEmailWithMailboxById(id); + + if (!stressfreiEmail) { + res.status(404).json({ + success: false, + error: 'E-Mail-Konto nicht gefunden', + } as ApiResponse); + return; + } + + if (!stressfreiEmail.hasMailbox) { + res.status(400).json({ + success: false, + error: 'Keine Mailbox für diese E-Mail-Adresse', + } as ApiResponse); + return; + } + + // Passwort entschlüsseln + const password = await stressfreiEmailService.getDecryptedPassword(id); + + if (!password) { + res.status(500).json({ + success: false, + error: 'Passwort konnte nicht entschlüsselt werden', + } as ApiResponse); + return; + } + + // IMAP/SMTP-Einstellungen laden + const settings = await getImapSmtpSettings(); + + res.json({ + success: true, + data: { + email: stressfreiEmail.email, + password, + imap: settings ? { + server: settings.imapServer, + port: settings.imapPort, + encryption: settings.imapEncryption, + } : null, + smtp: settings ? { + server: settings.smtpServer, + port: settings.smtpPort, + encryption: settings.smtpEncryption, + } : null, + }, + } as ApiResponse); + } catch (error) { + console.error('getMailboxCredentials error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der Mailbox-Zugangsdaten', + } as ApiResponse); + } +} + +// Ungelesene E-Mails zählen +export async function getUnreadCount(req: Request, res: Response): Promise { + try { + const customerId = req.query.customerId ? parseInt(req.query.customerId as string) : undefined; + const contractId = req.query.contractId ? parseInt(req.query.contractId as string) : undefined; + + let count = 0; + + if (customerId) { + count = await cachedEmailService.getUnreadCountForCustomer(customerId); + } else if (contractId) { + count = await cachedEmailService.getUnreadCountForContract(contractId); + } + + res.json({ success: true, data: { count } } as ApiResponse); + } catch (error) { + console.error('getUnreadCount error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Zählen der ungelesenen E-Mails', + } as ApiResponse); + } +} + +// E-Mail in Papierkorb verschieben (nur Admin) +export async function deleteEmail(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + + // Prüfen ob E-Mail existiert + const email = await cachedEmailService.getCachedEmailById(id); + if (!email) { + res.status(404).json({ + success: false, + error: 'E-Mail nicht gefunden', + } as ApiResponse); + return; + } + + const result = await cachedEmailService.moveEmailToTrash(id); + + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + } as ApiResponse); + return; + } + + res.json({ success: true, message: 'E-Mail in Papierkorb verschoben' } as ApiResponse); + } catch (error) { + console.error('deleteEmail error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Löschen der E-Mail', + } as ApiResponse); + } +} + +// ==================== TRASH OPERATIONS ==================== + +// Papierkorb-E-Mails für einen Kunden abrufen +export async function getTrashEmails(req: Request, res: Response): Promise { + try { + const customerId = parseInt(req.params.customerId); + + const emails = await cachedEmailService.getTrashEmails(customerId); + + res.json({ success: true, data: emails } as ApiResponse); + } catch (error) { + console.error('getTrashEmails error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Laden der Papierkorb-E-Mails', + } as ApiResponse); + } +} + +// Papierkorb-Anzahl für einen Kunden +export async function getTrashCount(req: Request, res: Response): Promise { + try { + const customerId = parseInt(req.params.customerId); + + const count = await cachedEmailService.getTrashCount(customerId); + + res.json({ success: true, data: { count } } as ApiResponse); + } catch (error) { + console.error('getTrashCount error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Zählen der Papierkorb-E-Mails', + } as ApiResponse); + } +} + +// E-Mail aus Papierkorb wiederherstellen +export async function restoreEmail(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + + const result = await cachedEmailService.restoreEmailFromTrash(id); + + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + } as ApiResponse); + return; + } + + res.json({ success: true, message: 'E-Mail wiederhergestellt' } as ApiResponse); + } catch (error) { + console.error('restoreEmail error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim Wiederherstellen der E-Mail', + } as ApiResponse); + } +} + +// E-Mail endgültig löschen (aus Papierkorb) +export async function permanentDeleteEmail(req: Request, res: Response): Promise { + try { + const id = parseInt(req.params.id); + + const result = await cachedEmailService.permanentDeleteEmail(id); + + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + } as ApiResponse); + return; + } + + res.json({ success: true, message: 'E-Mail endgültig gelöscht' } as ApiResponse); + } catch (error) { + console.error('permanentDeleteEmail error:', error); + res.status(500).json({ + success: false, + error: 'Fehler beim endgültigen Löschen der E-Mail', + } as ApiResponse); + } +} diff --git a/backend/src/controllers/stressfreiEmail.controller.ts b/backend/src/controllers/stressfreiEmail.controller.ts index 5fa1c2b7..7b20cd28 100644 --- a/backend/src/controllers/stressfreiEmail.controller.ts +++ b/backend/src/controllers/stressfreiEmail.controller.ts @@ -74,3 +74,26 @@ export async function deleteEmail(req: Request, res: Response): Promise { } as ApiResponse); } } + +export async function resetPassword(req: Request, res: Response): Promise { + try { + const result = await stressfreiEmailService.resetMailboxPassword(parseInt(req.params.id)); + if (!result.success) { + res.status(400).json({ + success: false, + error: result.error, + } as ApiResponse); + return; + } + res.json({ + success: true, + data: { password: result.password }, + message: 'Passwort wurde zurückgesetzt', + } as ApiResponse); + } catch (error) { + res.status(500).json({ + success: false, + error: error instanceof Error ? error.message : 'Fehler beim Zurücksetzen des Passworts', + } as ApiResponse); + } +} diff --git a/backend/src/index.ts b/backend/src/index.ts index fe3e99ed..cbb8583a 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -23,6 +23,7 @@ import contractCategoryRoutes from './routes/contractCategory.routes.js'; import contractTaskRoutes from './routes/contractTask.routes.js'; import appSettingRoutes from './routes/appSetting.routes.js'; import emailProviderRoutes from './routes/emailProvider.routes.js'; +import cachedEmailRoutes from './routes/cachedEmail.routes.js'; dotenv.config(); @@ -57,6 +58,7 @@ app.use('/api/contract-categories', contractCategoryRoutes); app.use('/api', contractTaskRoutes); app.use('/api/settings', appSettingRoutes); app.use('/api/email-providers', emailProviderRoutes); +app.use('/api', cachedEmailRoutes); // Health check app.get('/api/health', (req, res) => { diff --git a/backend/src/middleware/auth.ts b/backend/src/middleware/auth.ts index 4c2d92c8..b94749f2 100644 --- a/backend/src/middleware/auth.ts +++ b/backend/src/middleware/auth.ts @@ -1,26 +1,64 @@ import { Response, NextFunction } from 'express'; import jwt from 'jsonwebtoken'; +import { PrismaClient } from '@prisma/client'; import { AuthRequest, JwtPayload } from '../types/index.js'; -export function authenticate( +const prisma = new PrismaClient(); + +export async function authenticate( req: AuthRequest, res: Response, next: NextFunction -): void { +): Promise { const authHeader = req.headers.authorization; - if (!authHeader || !authHeader.startsWith('Bearer ')) { + // Token aus Header oder Query-Parameter (für Downloads) + let token: string | null = null; + + if (authHeader && authHeader.startsWith('Bearer ')) { + token = authHeader.split(' ')[1]; + } else if (req.query.token && typeof req.query.token === 'string') { + // Fallback für Downloads: Token als Query-Parameter + token = req.query.token; + } + + if (!token) { res.status(401).json({ success: false, error: 'Nicht authentifiziert' }); return; } - const token = authHeader.split(' ')[1]; - try { const decoded = jwt.verify( token, process.env.JWT_SECRET || 'fallback-secret' ) as JwtPayload; + + // Prüfen ob Token durch Rechteänderung invalidiert wurde (nur für Mitarbeiter) + if (decoded.userId && decoded.iat) { + const user = await prisma.user.findUnique({ + where: { id: decoded.userId }, + select: { tokenInvalidatedAt: true, isActive: true }, + }); + + // Benutzer nicht gefunden oder deaktiviert + if (!user || !user.isActive) { + res.status(401).json({ success: false, error: 'Benutzer nicht mehr aktiv' }); + return; + } + + // Token wurde vor der Invalidierung ausgestellt + if (user.tokenInvalidatedAt) { + const tokenIssuedAt = decoded.iat * 1000; // iat ist in Sekunden, Date ist in Millisekunden + if (tokenIssuedAt < user.tokenInvalidatedAt.getTime()) { + res.status(401).json({ + success: false, + error: 'Ihre Berechtigungen wurden geändert. Bitte melden Sie sich erneut an.', + }); + return; + } + } + } + req.user = decoded; next(); } catch { diff --git a/backend/src/routes/appSetting.routes.ts b/backend/src/routes/appSetting.routes.ts index 58680f5f..a525fcd5 100644 --- a/backend/src/routes/appSetting.routes.ts +++ b/backend/src/routes/appSetting.routes.ts @@ -1,7 +1,22 @@ import { Router } from 'express'; +import multer from 'multer'; import * as appSettingController from '../controllers/appSetting.controller.js'; +import * as backupController from '../controllers/backup.controller.js'; import { authenticate, requirePermission } from '../middleware/auth.js'; +// Multer für Backup-Upload (in Memory speichern) +const backupUpload = multer({ + storage: multer.memoryStorage(), + limits: { fileSize: 500 * 1024 * 1024 }, // 500MB max + fileFilter: (req, file, cb) => { + if (file.mimetype === 'application/zip' || file.originalname.endsWith('.zip')) { + cb(null, true); + } else { + cb(new Error('Nur ZIP-Dateien sind erlaubt')); + } + }, +}); + const router = Router(); // Öffentliche Einstellungen (für alle authentifizierten Benutzer, inkl. Kunden) @@ -26,4 +41,63 @@ router.put( appSettingController.updateSettings ); +// ==================== BACKUP & RESTORE ==================== + +// Liste aller Backups +router.get( + '/backups', + authenticate, + requirePermission('settings:update'), + backupController.listBackups +); + +// Neues Backup erstellen +router.post( + '/backup', + authenticate, + requirePermission('settings:update'), + backupController.createBackup +); + +// Backup wiederherstellen +router.post( + '/backup/:name/restore', + authenticate, + requirePermission('settings:update'), + backupController.restoreBackup +); + +// Backup löschen +router.delete( + '/backup/:name', + authenticate, + requirePermission('settings:update'), + backupController.deleteBackup +); + +// Backup als ZIP herunterladen +router.get( + '/backup/:name/download', + authenticate, + requirePermission('settings:update'), + backupController.downloadBackup +); + +// Backup-ZIP hochladen +router.post( + '/backup/upload', + authenticate, + requirePermission('settings:update'), + backupUpload.single('backup'), + backupController.uploadBackup +); + +// Werkseinstellungen (alles löschen) +router.post( + '/factory-reset', + authenticate, + requirePermission('settings:update'), + backupController.factoryReset +); + export default router; diff --git a/backend/src/routes/cachedEmail.routes.ts b/backend/src/routes/cachedEmail.routes.ts new file mode 100644 index 00000000..715d2b13 --- /dev/null +++ b/backend/src/routes/cachedEmail.routes.ts @@ -0,0 +1,237 @@ +// ==================== CACHED EMAIL ROUTES ==================== + +import { Router } from 'express'; +import * as cachedEmailController from '../controllers/cachedEmail.controller.js'; +import { authenticate, requirePermission } from '../middleware/auth.js'; + +const router = Router(); + +// ==================== E-MAIL LISTEN ==================== + +// E-Mails für Kunden (mit optionalem Account-Filter) +// GET /api/customers/:customerId/emails?accountId=1&limit=50&offset=0 +router.get( + '/customers/:customerId/emails', + authenticate, + requirePermission('customers:read'), + cachedEmailController.getEmailsForCustomer +); + +// E-Mails für Vertrag +// GET /api/contracts/:contractId/emails?limit=50&offset=0 +router.get( + '/contracts/:contractId/emails', + authenticate, + requirePermission('contracts:read'), + cachedEmailController.getEmailsForContract +); + +// Ordner-Anzahlen für Vertrag (zugeordnete E-Mails) +// GET /api/contracts/:contractId/emails/folder-counts +router.get( + '/contracts/:contractId/emails/folder-counts', + authenticate, + requirePermission('contracts:read'), + cachedEmailController.getContractFolderCounts +); + +// Mailbox-Konten eines Kunden (für Dropdown) +// GET /api/customers/:customerId/mailbox-accounts +router.get( + '/customers/:customerId/mailbox-accounts', + authenticate, + requirePermission('customers:read'), + cachedEmailController.getMailboxAccounts +); + +// Ungelesene E-Mails zählen +// GET /api/emails/unread-count?customerId=1 oder ?contractId=1 +router.get( + '/emails/unread-count', + authenticate, + requirePermission('customers:read'), + cachedEmailController.getUnreadCount +); + +// ==================== EINZELNE E-MAIL ==================== + +// Einzelne E-Mail abrufen (mit Body, markiert als gelesen) +// GET /api/emails/:id +router.get( + '/emails/:id', + authenticate, + requirePermission('customers:read'), + cachedEmailController.getEmail +); + +// E-Mail in Papierkorb verschieben (nur User mit emails:delete Permission) +// DELETE /api/emails/:id +router.delete( + '/emails/:id', + authenticate, + requirePermission('emails:delete'), + cachedEmailController.deleteEmail +); + +// ==================== PAPIERKORB ==================== + +// Papierkorb-E-Mails für Kunden abrufen +// GET /api/customers/:customerId/emails/trash +router.get( + '/customers/:customerId/emails/trash', + authenticate, + requirePermission('emails:delete'), + cachedEmailController.getTrashEmails +); + +// Papierkorb-Anzahl für Kunden +// GET /api/customers/:customerId/emails/trash/count +router.get( + '/customers/:customerId/emails/trash/count', + authenticate, + requirePermission('emails:delete'), + cachedEmailController.getTrashCount +); + +// E-Mail aus Papierkorb wiederherstellen +// POST /api/emails/:id/restore +router.post( + '/emails/:id/restore', + authenticate, + requirePermission('emails:delete'), + cachedEmailController.restoreEmail +); + +// E-Mail endgültig löschen (nur aus Papierkorb) +// DELETE /api/emails/:id/permanent +router.delete( + '/emails/:id/permanent', + authenticate, + requirePermission('emails:delete'), + cachedEmailController.permanentDeleteEmail +); + +// E-Mail-Thread abrufen +// GET /api/emails/:id/thread +router.get( + '/emails/:id/thread', + authenticate, + requirePermission('customers:read'), + cachedEmailController.getThread +); + +// Als gelesen/ungelesen markieren +// PATCH /api/emails/:id/read +router.patch( + '/emails/:id/read', + authenticate, + requirePermission('customers:update'), + cachedEmailController.markAsRead +); + +// Stern umschalten +// POST /api/emails/:id/star +router.post( + '/emails/:id/star', + authenticate, + requirePermission('customers:update'), + cachedEmailController.toggleStar +); + +// ==================== ANHÄNGE ==================== + +// Anhang-Liste einer E-Mail +// GET /api/emails/:emailId/attachments +router.get( + '/emails/:emailId/attachments', + authenticate, + requirePermission('customers:read'), + cachedEmailController.getAttachments +); + +// Einzelnen Anhang herunterladen +// GET /api/emails/:emailId/attachments/:filename +router.get( + '/emails/:emailId/attachments/:filename', + authenticate, + requirePermission('customers:read'), + cachedEmailController.downloadAttachment +); + +// ==================== VERTRAGSZUORDNUNG ==================== + +// E-Mail Vertrag zuordnen +// POST /api/emails/:id/assign { contractId: number } +router.post( + '/emails/:id/assign', + authenticate, + requirePermission('contracts:update'), + cachedEmailController.assignToContract +); + +// Zuordnung aufheben +// DELETE /api/emails/:id/assign +router.delete( + '/emails/:id/assign', + authenticate, + requirePermission('contracts:update'), + cachedEmailController.unassignFromContract +); + +// ==================== STRESSFREI-EMAIL OPERATIONEN ==================== + +// E-Mails für ein Konto synchronisieren +// POST /api/stressfrei-emails/:id/sync?full=true +router.post( + '/stressfrei-emails/:id/sync', + authenticate, + requirePermission('customers:update'), + cachedEmailController.syncAccount +); + +// E-Mail senden +// POST /api/stressfrei-emails/:id/send { to, cc, subject, text, html, inReplyTo, references } +router.post( + '/stressfrei-emails/:id/send', + authenticate, + requirePermission('customers:update'), + cachedEmailController.sendEmailFromAccount +); + +// Mailbox nachträglich aktivieren +// POST /api/stressfrei-emails/:id/enable-mailbox +router.post( + '/stressfrei-emails/:id/enable-mailbox', + authenticate, + requirePermission('customers:update'), + cachedEmailController.enableMailbox +); + +// Mailbox-Status mit Provider synchronisieren +// POST /api/stressfrei-emails/:id/sync-mailbox-status +router.post( + '/stressfrei-emails/:id/sync-mailbox-status', + authenticate, + requirePermission('customers:read'), + cachedEmailController.syncMailboxStatus +); + +// Mailbox-Zugangsdaten abrufen (IMAP/SMTP) +// GET /api/stressfrei-emails/:id/credentials +router.get( + '/stressfrei-emails/:id/credentials', + authenticate, + requirePermission('customers:read'), + cachedEmailController.getMailboxCredentials +); + +// Ordner-Anzahlen für ein Konto (INBOX, SENT, ungelesen) +// GET /api/stressfrei-emails/:id/folder-counts +router.get( + '/stressfrei-emails/:id/folder-counts', + authenticate, + requirePermission('customers:read'), + cachedEmailController.getFolderCounts +); + +export default router; diff --git a/backend/src/routes/contractCategory.routes.ts b/backend/src/routes/contractCategory.routes.ts index 070b537e..e56d8dbd 100644 --- a/backend/src/routes/contractCategory.routes.ts +++ b/backend/src/routes/contractCategory.routes.ts @@ -4,10 +4,13 @@ import { authenticate, requirePermission } from '../middleware/auth.js'; const router = Router(); +// Lesen für alle authentifizierten Benutzer router.get('/', authenticate, contractCategoryController.getContractCategories); -router.post('/', authenticate, requirePermission('platforms:create'), contractCategoryController.createContractCategory); router.get('/:id', authenticate, contractCategoryController.getContractCategory); -router.put('/:id', authenticate, requirePermission('platforms:update'), contractCategoryController.updateContractCategory); -router.delete('/:id', authenticate, requirePermission('platforms:delete'), contractCategoryController.deleteContractCategory); + +// Ändern/Löschen nur mit Entwickler-Berechtigung (Vertragstypen erfordern Formular-Anpassungen) +router.post('/', authenticate, requirePermission('developer:access'), contractCategoryController.createContractCategory); +router.put('/:id', authenticate, requirePermission('developer:access'), contractCategoryController.updateContractCategory); +router.delete('/:id', authenticate, requirePermission('developer:access'), contractCategoryController.deleteContractCategory); export default router; diff --git a/backend/src/routes/stressfreiEmail.routes.ts b/backend/src/routes/stressfreiEmail.routes.ts index 5e58ae42..c0e39670 100644 --- a/backend/src/routes/stressfreiEmail.routes.ts +++ b/backend/src/routes/stressfreiEmail.routes.ts @@ -9,4 +9,7 @@ router.get('/:id', authenticate, requirePermission('customers:read'), stressfrei router.put('/:id', authenticate, requirePermission('customers:update'), stressfreiEmailController.updateEmail); router.delete('/:id', authenticate, requirePermission('customers:delete'), stressfreiEmailController.deleteEmail); +// Passwort zurücksetzen (generiert neues Passwort und setzt es beim Provider) +router.post('/:id/reset-password', authenticate, requirePermission('customers:update'), stressfreiEmailController.resetPassword); + export default router; diff --git a/backend/src/services/backup.service.ts b/backend/src/services/backup.service.ts new file mode 100644 index 00000000..121598f4 --- /dev/null +++ b/backend/src/services/backup.service.ts @@ -0,0 +1,1186 @@ +/** + * Datenbank Backup Service + * + * Ermöglicht Backup und Restore der Datenbank und Uploads über die Web-Oberfläche. + */ + +import { PrismaClient } from '@prisma/client'; +import * as fs from 'fs'; +import * as path from 'path'; +import archiver from 'archiver'; +import AdmZip from 'adm-zip'; +import bcrypt from 'bcryptjs'; + +const prisma = new PrismaClient(); + +// Verzeichnisse +const BACKUPS_DIR = path.join(__dirname, '../../prisma/backups'); +const UPLOADS_DIR = path.join(process.cwd(), 'uploads'); + +// Stelle sicher, dass das Backup-Verzeichnis existiert +if (!fs.existsSync(BACKUPS_DIR)) { + fs.mkdirSync(BACKUPS_DIR, { recursive: true }); +} + +export interface BackupInfo { + name: string; + timestamp: string; + totalRecords: number; + tables: { table: string; count: number }[]; + sizeBytes: number; + hasUploads: boolean; + uploadSizeBytes: number; +} + +export interface BackupResult { + success: boolean; + backupName?: string; + error?: string; +} + +export interface RestoreResult { + success: boolean; + restoredRecords?: number; + restoredFiles?: number; + error?: string; +} + +// Hilfsfunktion: Datum-Strings zu Date-Objekten konvertieren +function convertDates(obj: any): any { + if (obj === null || obj === undefined) return obj; + if (typeof obj === 'string') { + if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(obj)) { + return new Date(obj); + } + return obj; + } + if (Array.isArray(obj)) { + return obj.map(convertDates); + } + if (typeof obj === 'object') { + const result: any = {}; + for (const [key, value] of Object.entries(obj)) { + result[key] = convertDates(value); + } + return result; + } + return obj; +} + +// Hilfsfunktion: JSON-Datei lesen +function readJsonFile(filePath: string): T[] { + if (!fs.existsSync(filePath)) { + return []; + } + const content = fs.readFileSync(filePath, 'utf-8'); + return JSON.parse(content); +} + +// Hilfsfunktion: Ordnergröße berechnen (rekursiv) +function getDirectorySize(dirPath: string): number { + if (!fs.existsSync(dirPath)) return 0; + + let size = 0; + const items = fs.readdirSync(dirPath); + + for (const item of items) { + const itemPath = path.join(dirPath, item); + const stats = fs.statSync(itemPath); + + if (stats.isFile()) { + size += stats.size; + } else if (stats.isDirectory()) { + size += getDirectorySize(itemPath); + } + } + + return size; +} + +// Hilfsfunktion: Ordner rekursiv kopieren +function copyDirectory(src: string, dest: string): number { + if (!fs.existsSync(src)) return 0; + + let fileCount = 0; + fs.mkdirSync(dest, { recursive: true }); + + const items = fs.readdirSync(src); + for (const item of items) { + const srcPath = path.join(src, item); + const destPath = path.join(dest, item); + const stats = fs.statSync(srcPath); + + if (stats.isDirectory()) { + fileCount += copyDirectory(srcPath, destPath); + } else { + fs.copyFileSync(srcPath, destPath); + fileCount++; + } + } + + return fileCount; +} + +// Hilfsfunktion: Ordner rekursiv löschen +function deleteDirectory(dirPath: string): void { + if (!fs.existsSync(dirPath)) return; + + const items = fs.readdirSync(dirPath); + for (const item of items) { + const itemPath = path.join(dirPath, item); + const stats = fs.statSync(itemPath); + + if (stats.isDirectory()) { + deleteDirectory(itemPath); + } else { + fs.unlinkSync(itemPath); + } + } + + fs.rmdirSync(dirPath); +} + +/** + * Liste aller verfügbaren Backups + */ +export async function listBackups(): Promise { + const backups: BackupInfo[] = []; + + if (!fs.existsSync(BACKUPS_DIR)) { + return backups; + } + + const dirs = fs.readdirSync(BACKUPS_DIR) + .filter(f => { + const fullPath = path.join(BACKUPS_DIR, f); + return fs.statSync(fullPath).isDirectory() && f !== '.gitkeep' && !f.startsWith('.'); + }) + .sort() + .reverse(); + + for (const dir of dirs) { + const backupDir = path.join(BACKUPS_DIR, dir); + const infoPath = path.join(backupDir, '_backup-info.json'); + const uploadsPath = path.join(backupDir, 'uploads'); + + if (fs.existsSync(infoPath)) { + try { + const info = JSON.parse(fs.readFileSync(infoPath, 'utf-8')); + const hasUploads = fs.existsSync(uploadsPath); + const uploadSize = hasUploads ? getDirectorySize(uploadsPath) : 0; + + backups.push({ + name: dir, + timestamp: info.timestamp, + totalRecords: info.totalRecords, + tables: info.tables, + sizeBytes: getDirectorySize(backupDir), + hasUploads, + uploadSizeBytes: uploadSize, + }); + } catch { + backups.push({ + name: dir, + timestamp: dir, + totalRecords: 0, + tables: [], + sizeBytes: getDirectorySize(backupDir), + hasUploads: fs.existsSync(uploadsPath), + uploadSizeBytes: 0, + }); + } + } + } + + return backups; +} + +/** + * Neues Backup erstellen (inkl. Uploads) + */ +export async function createBackup(): Promise { + try { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19); + const backupDir = path.join(BACKUPS_DIR, timestamp); + + fs.mkdirSync(backupDir, { recursive: true }); + + // Tabellen in Abhängigkeitsreihenfolge + const tables = [ + { name: 'Permission', query: () => prisma.permission.findMany() }, + { name: 'Role', query: () => prisma.role.findMany() }, + { name: 'SalesPlatform', query: () => prisma.salesPlatform.findMany() }, + { name: 'ContractCategory', query: () => prisma.contractCategory.findMany() }, + { name: 'CancellationPeriod', query: () => prisma.cancellationPeriod.findMany() }, + { name: 'ContractDuration', query: () => prisma.contractDuration.findMany() }, + { name: 'AppSetting', query: () => prisma.appSetting.findMany() }, + { name: 'EmailProviderConfig', query: () => prisma.emailProviderConfig.findMany() }, + { name: 'Provider', query: () => prisma.provider.findMany() }, + { name: 'RolePermission', query: () => prisma.rolePermission.findMany() }, + { name: 'User', query: () => prisma.user.findMany() }, + { name: 'Customer', query: () => prisma.customer.findMany() }, + { name: 'Tariff', query: () => prisma.tariff.findMany() }, + { name: 'UserRole', query: () => prisma.userRole.findMany() }, + { name: 'CustomerRepresentative', query: () => prisma.customerRepresentative.findMany() }, + { name: 'StressfreiEmail', query: () => prisma.stressfreiEmail.findMany() }, + { name: 'Contract', query: () => prisma.contract.findMany() }, + { name: 'Meter', query: () => prisma.meter.findMany() }, + { name: 'CachedEmail', query: () => prisma.cachedEmail.findMany() }, + { name: 'ContractTask', query: () => prisma.contractTask.findMany() }, + { name: 'MeterReading', query: () => prisma.meterReading.findMany() }, + { name: 'ContractTaskSubtask', query: () => prisma.contractTaskSubtask.findMany() }, + { name: 'EnergyContractDetails', query: () => prisma.energyContractDetails.findMany() }, + { name: 'InternetContractDetails', query: () => prisma.internetContractDetails.findMany() }, + { name: 'MobileContractDetails', query: () => prisma.mobileContractDetails.findMany() }, + { name: 'TvContractDetails', query: () => prisma.tvContractDetails.findMany() }, + { name: 'CarInsuranceDetails', query: () => prisma.carInsuranceDetails.findMany() }, + { name: 'PhoneNumber', query: () => prisma.phoneNumber.findMany() }, + { name: 'SimCard', query: () => prisma.simCard.findMany() }, + { name: 'Address', query: () => prisma.address.findMany() }, + { name: 'BankCard', query: () => prisma.bankCard.findMany() }, + { name: 'IdentityDocument', query: () => prisma.identityDocument.findMany() }, + ]; + + let totalRecords = 0; + const stats: { table: string; count: number }[] = []; + + for (const table of tables) { + try { + const data = await table.query(); + const count = data.length; + totalRecords += count; + stats.push({ table: table.name, count }); + + const filePath = path.join(backupDir, `${table.name}.json`); + fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); + } catch { + stats.push({ table: table.name, count: 0 }); + } + } + + // Uploads-Ordner kopieren (falls vorhanden) + let uploadFileCount = 0; + if (fs.existsSync(UPLOADS_DIR)) { + const uploadsBackupDir = path.join(backupDir, 'uploads'); + uploadFileCount = copyDirectory(UPLOADS_DIR, uploadsBackupDir); + } + + // Backup-Info speichern + const backupInfo = { + timestamp: new Date().toISOString(), + totalRecords, + tables: stats, + uploadFiles: uploadFileCount, + }; + fs.writeFileSync(path.join(backupDir, '_backup-info.json'), JSON.stringify(backupInfo, null, 2)); + + return { success: true, backupName: timestamp }; + } catch (error: any) { + return { success: false, error: error.message }; + } +} + +/** + * Backup wiederherstellen (inkl. Uploads) + */ +export async function restoreBackup(backupName: string): Promise { + const backupDir = path.join(BACKUPS_DIR, backupName); + + if (!fs.existsSync(backupDir)) { + return { success: false, error: 'Backup nicht gefunden' }; + } + + try { + // Foreign Key Checks deaktivieren + await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 0'); + + // WICHTIG: Alle Tabellen vor dem Restore leeren, damit keine alten Daten übrig bleiben + console.log('[Restore] Lösche alle bestehenden Daten...'); + + // Detail-Tabellen + await prisma.carInsuranceDetails.deleteMany({}); + await prisma.tvContractDetails.deleteMany({}); + await prisma.simCard.deleteMany({}); + await prisma.mobileContractDetails.deleteMany({}); + await prisma.phoneNumber.deleteMany({}); + await prisma.internetContractDetails.deleteMany({}); + await prisma.energyContractDetails.deleteMany({}); + await prisma.meterReading.deleteMany({}); + + // E-Mail & Verträge + await prisma.cachedEmail.deleteMany({}); + await prisma.contractTaskSubtask.deleteMany({}); + await prisma.contractTask.deleteMany({}); + await prisma.contract.deleteMany({}); + + // Kunden-bezogene Daten + await prisma.stressfreiEmail.deleteMany({}); + await prisma.meter.deleteMany({}); + await prisma.identityDocument.deleteMany({}); + await prisma.bankCard.deleteMany({}); + await prisma.address.deleteMany({}); + await prisma.customerRepresentative.deleteMany({}); + + // Benutzer & Rollen + await prisma.userRole.deleteMany({}); + await prisma.user.deleteMany({}); + await prisma.customer.deleteMany({}); + + // Stammdaten + await prisma.tariff.deleteMany({}); + await prisma.provider.deleteMany({}); + await prisma.rolePermission.deleteMany({}); + await prisma.role.deleteMany({}); + await prisma.permission.deleteMany({}); + await prisma.salesPlatform.deleteMany({}); + await prisma.cancellationPeriod.deleteMany({}); + await prisma.contractDuration.deleteMany({}); + await prisma.contractCategory.deleteMany({}); + await prisma.emailProviderConfig.deleteMany({}); + await prisma.appSetting.deleteMany({}); + + console.log('[Restore] Alle Daten gelöscht, starte Wiederherstellung...'); + + // Restore-Reihenfolge + const restoreOrder = [ + { + name: 'Permission', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.permission.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Role', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.role.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'SalesPlatform', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.salesPlatform.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractCategory', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractCategory.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'CancellationPeriod', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.cancellationPeriod.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractDuration', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractDuration.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'AppSetting', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.appSetting.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'EmailProviderConfig', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.emailProviderConfig.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Provider', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.provider.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'RolePermission', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.rolePermission.upsert({ + where: { roleId_permissionId: { roleId: item.roleId, permissionId: item.permissionId } }, + update: {}, + create: convertDates(item), + }); + } + }, + }, + { + name: 'User', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.user.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Customer', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.customer.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Tariff', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.tariff.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'UserRole', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.userRole.upsert({ + where: { userId_roleId: { userId: item.userId, roleId: item.roleId } }, + update: {}, + create: convertDates(item), + }); + } + }, + }, + { + name: 'CustomerRepresentative', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.customerRepresentative.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'StressfreiEmail', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.stressfreiEmail.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Contract', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contract.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Meter', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.meter.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'CachedEmail', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.cachedEmail.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractTask', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractTask.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'MeterReading', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.meterReading.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'ContractTaskSubtask', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.contractTaskSubtask.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'EnergyContractDetails', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.energyContractDetails.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'InternetContractDetails', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.internetContractDetails.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'MobileContractDetails', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.mobileContractDetails.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'TvContractDetails', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.tvContractDetails.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'CarInsuranceDetails', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.carInsuranceDetails.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'PhoneNumber', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.phoneNumber.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'SimCard', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.simCard.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'Address', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.address.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'BankCard', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.bankCard.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + { + name: 'IdentityDocument', + restore: async (data: any[]) => { + for (const item of data) { + await prisma.identityDocument.upsert({ + where: { id: item.id }, + update: convertDates(item), + create: convertDates(item), + }); + } + }, + }, + ]; + + let totalRestored = 0; + + for (const table of restoreOrder) { + const filePath = path.join(backupDir, `${table.name}.json`); + const data = readJsonFile(filePath); + + if (data.length === 0) continue; + + try { + await table.restore(data); + totalRestored += data.length; + } catch { + // Fehler bei einzelner Tabelle, weitermachen + } + } + + // Foreign Key Checks wieder aktivieren + await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 1'); + + // Uploads wiederherstellen + let restoredFiles = 0; + const uploadsBackupDir = path.join(backupDir, 'uploads'); + if (fs.existsSync(uploadsBackupDir)) { + // Bestehenden Uploads-Ordner leeren (optional: könnte auch nur überschreiben) + if (fs.existsSync(UPLOADS_DIR)) { + deleteDirectory(UPLOADS_DIR); + } + restoredFiles = copyDirectory(uploadsBackupDir, UPLOADS_DIR); + } + + return { success: true, restoredRecords: totalRestored, restoredFiles }; + } catch (error: any) { + try { + await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 1'); + } catch {} + return { success: false, error: error.message }; + } +} + +/** + * Backup löschen + */ +export async function deleteBackup(backupName: string): Promise<{ success: boolean; error?: string }> { + const backupDir = path.join(BACKUPS_DIR, backupName); + + if (!fs.existsSync(backupDir)) { + return { success: false, error: 'Backup nicht gefunden' }; + } + + try { + deleteDirectory(backupDir); + return { success: true }; + } catch (error: any) { + return { success: false, error: error.message }; + } +} + +/** + * Backup als ZIP-Datei erstellen und Stream zurückgeben + */ +export async function createBackupZip(backupName: string): Promise<{ stream: archiver.Archiver; filename: string } | { error: string }> { + const backupDir = path.join(BACKUPS_DIR, backupName); + + if (!fs.existsSync(backupDir)) { + return { error: 'Backup nicht gefunden' }; + } + + const archive = archiver('zip', { zlib: { level: 9 } }); + + // Alle Dateien im Backup-Ordner hinzufügen + archive.directory(backupDir, false); + + return { + stream: archive, + filename: `opencrm-backup-${backupName}.zip`, + }; +} + +/** + * ZIP-Backup hochladen und extrahieren + */ +export async function uploadBackupZip(zipBuffer: Buffer): Promise { + try { + const zip = new AdmZip(zipBuffer); + const entries = zip.getEntries(); + + // Prüfen ob gültiges Backup (muss _backup-info.json enthalten) + const hasBackupInfo = entries.some(entry => entry.entryName === '_backup-info.json'); + if (!hasBackupInfo) { + return { success: false, error: 'Ungültiges Backup-Archiv: _backup-info.json fehlt' }; + } + + // Backup-Info lesen um Namen zu bestimmen + const infoEntry = entries.find(entry => entry.entryName === '_backup-info.json'); + let backupName: string; + + try { + const infoContent = infoEntry!.getData().toString('utf8'); + const info = JSON.parse(infoContent); + // Backup-Name aus Timestamp generieren + backupName = new Date(info.timestamp).toISOString().replace(/[:.]/g, '-').slice(0, 19); + } catch { + // Fallback: Aktueller Timestamp + backupName = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19) + '-uploaded'; + } + + const backupDir = path.join(BACKUPS_DIR, backupName); + + // Falls Backup mit diesem Namen existiert, Suffix hinzufügen + let finalBackupDir = backupDir; + let suffix = 1; + while (fs.existsSync(finalBackupDir)) { + finalBackupDir = `${backupDir}-${suffix}`; + suffix++; + } + + const finalBackupName = path.basename(finalBackupDir); + + // ZIP extrahieren + zip.extractAllTo(finalBackupDir, true); + + return { success: true, backupName: finalBackupName }; + } catch (error: any) { + return { success: false, error: error.message }; + } +} + +/** + * Pfad zum Backup-Verzeichnis zurückgeben + */ +export function getBackupsDir(): string { + return BACKUPS_DIR; +} + +/** + * Werkseinstellungen - Alle Daten löschen (außer Backups) + * + * Löscht alle Datenbankeinträge und Uploads, behält aber Backups. + * Erstellt einen Admin-Benutzer und notwendige Stammdaten. + */ +export async function factoryReset(): Promise<{ success: boolean; error?: string }> { + try { + // Foreign Key Checks deaktivieren + await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 0'); + + // Tabellen in korrekter Reihenfolge leeren (abhängige zuerst) + // Detail-Tabellen + await prisma.carInsuranceDetails.deleteMany({}); + await prisma.tvContractDetails.deleteMany({}); + await prisma.simCard.deleteMany({}); + await prisma.mobileContractDetails.deleteMany({}); + await prisma.phoneNumber.deleteMany({}); + await prisma.internetContractDetails.deleteMany({}); + await prisma.energyContractDetails.deleteMany({}); + await prisma.meterReading.deleteMany({}); + + // E-Mail & Verträge + await prisma.cachedEmail.deleteMany({}); + await prisma.contractTaskSubtask.deleteMany({}); + await prisma.contractTask.deleteMany({}); + await prisma.contract.deleteMany({}); + + // Kunden-bezogene Daten + await prisma.stressfreiEmail.deleteMany({}); + await prisma.meter.deleteMany({}); + await prisma.identityDocument.deleteMany({}); + await prisma.bankCard.deleteMany({}); + await prisma.address.deleteMany({}); + await prisma.customerRepresentative.deleteMany({}); + + // Benutzer & Rollen (außer Admin) + await prisma.userRole.deleteMany({}); + await prisma.user.deleteMany({}); + await prisma.customer.deleteMany({}); + + // Stammdaten + await prisma.tariff.deleteMany({}); + await prisma.provider.deleteMany({}); + await prisma.rolePermission.deleteMany({}); + await prisma.role.deleteMany({}); + await prisma.permission.deleteMany({}); + await prisma.salesPlatform.deleteMany({}); + await prisma.cancellationPeriod.deleteMany({}); + await prisma.contractDuration.deleteMany({}); + await prisma.contractCategory.deleteMany({}); + await prisma.emailProviderConfig.deleteMany({}); + await prisma.appSetting.deleteMany({}); + + // Foreign Key Checks wieder aktivieren + await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 1'); + + // Uploads-Verzeichnis leeren (aber nicht das Verzeichnis selbst) + if (fs.existsSync(UPLOADS_DIR)) { + const items = fs.readdirSync(UPLOADS_DIR); + for (const item of items) { + const itemPath = path.join(UPLOADS_DIR, item); + const stats = fs.statSync(itemPath); + if (stats.isDirectory()) { + deleteDirectory(itemPath); + } else { + fs.unlinkSync(itemPath); + } + } + } + + // Grundlegende Stammdaten neu anlegen (aus Seed) + // Berechtigungen - muss mit seed.ts übereinstimmen! + const resourcePermissions: Record = { + // Haupt-Ressourcen (CRUD) + customers: ['create', 'read', 'update', 'delete'], + contracts: ['create', 'read', 'update', 'delete'], + users: ['create', 'read', 'update', 'delete'], + platforms: ['create', 'read', 'update', 'delete'], + providers: ['create', 'read', 'update', 'delete'], + tariffs: ['create', 'read', 'update', 'delete'], + // Lookup-Tabellen (nur lesen) + 'contract-categories': ['read'], + 'cancellation-periods': ['read'], + 'contract-durations': ['read'], + // Einstellungen (nur lesen/ändern) + settings: ['read', 'update'], + // Spezial-Permissions + developer: ['access'], + emails: ['delete'], + }; + + for (const [resource, actions] of Object.entries(resourcePermissions)) { + for (const action of actions) { + await prisma.permission.create({ + data: { resource, action }, + }); + } + } + console.log('[FactoryReset] Berechtigungen erstellt'); + + // Admin-Rolle mit allen Berechtigungen (außer developer:access) + const allPermissions = await prisma.permission.findMany(); + const adminRole = await prisma.role.create({ + data: { + name: 'Admin', + description: 'Voller Zugriff auf alle Funktionen', + permissions: { + create: allPermissions + .filter(p => !(p.resource === 'developer' && p.action === 'access')) + .map(p => ({ permissionId: p.id })), + }, + }, + }); + + // Developer-Rolle - ALLE Berechtigungen inkl. developer:access + await prisma.role.create({ + data: { + name: 'Developer', + description: 'Voller Zugriff inkl. Entwickler-Tools', + permissions: { + create: allPermissions.map(p => ({ permissionId: p.id })), + }, + }, + }); + + // Mitarbeiter-Rolle - customers, contracts + read-only auf Stammdaten + const employeePermIds = allPermissions + .filter(p => + p.resource === 'customers' || + p.resource === 'contracts' || + (p.action === 'read' && ['platforms', 'providers', 'tariffs', 'contract-categories', 'cancellation-periods', 'contract-durations'].includes(p.resource)) + ) + .map(p => p.id); + await prisma.role.create({ + data: { + name: 'Mitarbeiter', + description: 'Kann Kunden und Verträge verwalten', + permissions: { + create: employeePermIds.map(id => ({ permissionId: id })), + }, + }, + }); + + // Nur-Lesen Rolle + const readOnlyResources = ['customers', 'contracts', 'platforms', 'providers', 'tariffs', 'contract-categories', 'cancellation-periods', 'contract-durations']; + const readOnlyPermIds = allPermissions + .filter(p => p.action === 'read' && readOnlyResources.includes(p.resource)) + .map(p => p.id); + await prisma.role.create({ + data: { + name: 'Mitarbeiter (Nur-Lesen)', + description: 'Kann nur lesen, keine Änderungen', + permissions: { + create: readOnlyPermIds.map(id => ({ permissionId: id })), + }, + }, + }); + + // Kunden-Rolle + await prisma.role.create({ + data: { + name: 'Kunde', + description: 'Kann nur eigene Daten lesen', + permissions: { + create: readOnlyPermIds.map(id => ({ permissionId: id })), + }, + }, + }); + console.log('[FactoryReset] Rollen erstellt'); + + // Standard Admin-Benutzer erstellen + console.log('[FactoryReset] Erstelle Admin-Benutzer...'); + const hashedPassword = await bcrypt.hash('admin', 10); + console.log('[FactoryReset] Passwort gehasht, Admin-Rolle ID:', adminRole.id); + + const adminUser = await prisma.user.create({ + data: { + email: 'admin@admin.com', + password: hashedPassword, + firstName: 'Admin', + lastName: 'User', + roles: { + create: [{ roleId: adminRole.id }], + }, + }, + }); + console.log('[FactoryReset] Admin-Benutzer erstellt mit ID:', adminUser.id); + + // Standard Kündigungsfristen (wie in seed.ts) + const cancellationPeriods = [ + { code: '14D', description: '14 Tage' }, + { code: '1M', description: '1 Monat' }, + { code: '2M', description: '2 Monate' }, + { code: '3M', description: '3 Monate' }, + { code: '6M', description: '6 Monate' }, + { code: '12M', description: '12 Monate' }, + { code: '1W', description: '1 Woche' }, + { code: '2W', description: '2 Wochen' }, + { code: '4W', description: '4 Wochen' }, + { code: '6W', description: '6 Wochen' }, + ]; + for (const cp of cancellationPeriods) { + await prisma.cancellationPeriod.create({ data: cp }); + } + console.log('[FactoryReset] Kündigungsfristen erstellt'); + + // Standard Vertragslaufzeiten (wie in seed.ts) + const contractDurations = [ + { code: '1M', description: '1 Monat' }, + { code: '3M', description: '3 Monate' }, + { code: '6M', description: '6 Monate' }, + { code: '12M', description: '12 Monate' }, + { code: '24M', description: '24 Monate' }, + { code: '36M', description: '36 Monate' }, + { code: '1J', description: '1 Jahr' }, + { code: '2J', description: '2 Jahre' }, + { code: '3J', description: '3 Jahre' }, + { code: '4J', description: '4 Jahre' }, + { code: '5J', description: '5 Jahre' }, + { code: 'UNBEFRISTET', description: 'Unbefristet' }, + ]; + for (const cd of contractDurations) { + await prisma.contractDuration.create({ data: cd }); + } + console.log('[FactoryReset] Vertragslaufzeiten erstellt'); + + // Standard Vertragstypen (wie in seed.ts - WICHTIG: Diese müssen mit den Formularen übereinstimmen!) + const contractCategories = [ + { code: 'ELECTRICITY', name: 'Strom', icon: 'Zap', color: '#FFC107', sortOrder: 1 }, + { code: 'GAS', name: 'Gas', icon: 'Flame', color: '#FF5722', sortOrder: 2 }, + { code: 'DSL', name: 'DSL', icon: 'Wifi', color: '#2196F3', sortOrder: 3 }, + { code: 'FIBER', name: 'Glasfaser', icon: 'Cable', color: '#9C27B0', sortOrder: 4 }, + { code: 'CABLE', name: 'Kabel Internet (Coax)', icon: 'Cable', color: '#00BCD4', sortOrder: 5 }, + { code: 'MOBILE', name: 'Mobilfunk', icon: 'Smartphone', color: '#4CAF50', sortOrder: 6 }, + { code: 'TV', name: 'TV', icon: 'Tv', color: '#E91E63', sortOrder: 7 }, + { code: 'CAR_INSURANCE', name: 'KFZ-Versicherung', icon: 'Car', color: '#607D8B', sortOrder: 8 }, + ]; + for (const cat of contractCategories) { + await prisma.contractCategory.create({ data: cat }); + } + console.log('[FactoryReset] Vertragstypen erstellt'); + + // Standard Vertriebsplattformen (wie in seed.ts) + const platforms = ['Moon Fachhandel', 'Verivox', 'Check24', 'Eigenvermittlung']; + for (const name of platforms) { + await prisma.salesPlatform.create({ data: { name, isActive: true } }); + } + console.log('[FactoryReset] Vertriebsplattformen erstellt'); + + // Standard Anbieter (wie in seed.ts) + const providers = [ + { + name: 'Vodafone', + portalUrl: 'https://www.vodafone.de/meinvodafone/account/login', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'Klarmobil', + portalUrl: 'https://www.klarmobil.de/login', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'Otelo', + portalUrl: 'https://www.otelo.de/mein-otelo/login', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'Congstar', + portalUrl: 'https://www.congstar.de/login/', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'Telekom', + portalUrl: 'https://www.telekom.de/kundencenter/startseite', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: 'O2', + portalUrl: 'https://www.o2online.de/ecare/selfcare', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + { + name: '1&1', + portalUrl: 'https://control-center.1und1.de/', + usernameFieldName: 'username', + passwordFieldName: 'password', + }, + ]; + for (const provider of providers) { + await prisma.provider.create({ data: { ...provider, isActive: true } }); + } + console.log('[FactoryReset] Anbieter erstellt'); + + // Standard App-Einstellungen (wie in seed.ts) + const appSettings = [ + { key: 'deadlineCriticalDays', value: '14' }, + { key: 'deadlineWarningDays', value: '42' }, + { key: 'deadlineOkDays', value: '90' }, + { key: 'companyName', value: 'OpenCRM' }, + { key: 'defaultEmailDomain', value: 'stressfrei-wechseln.de' }, + ]; + for (const setting of appSettings) { + await prisma.appSetting.create({ data: setting }); + } + console.log('[FactoryReset] App-Einstellungen erstellt'); + + return { success: true }; + } catch (error: any) { + try { + await prisma.$executeRawUnsafe('SET FOREIGN_KEY_CHECKS = 1'); + } catch {} + return { success: false, error: error.message }; + } +} diff --git a/backend/src/services/cachedEmail.service.ts b/backend/src/services/cachedEmail.service.ts new file mode 100644 index 00000000..a60d5b99 --- /dev/null +++ b/backend/src/services/cachedEmail.service.ts @@ -0,0 +1,957 @@ +// ==================== CACHED EMAIL SERVICE ==================== +// Service für E-Mail-Caching und Vertragszuordnung + +import { PrismaClient, CachedEmail, Prisma, EmailFolder } from '@prisma/client'; +import { decrypt } from '../utils/encryption.js'; +import { fetchEmails, ImapCredentials, FetchedEmail, moveToTrash, restoreFromTrash, permanentDelete } from './imapService.js'; +import { getImapSmtpSettings } from './emailProvider/emailProviderService.js'; + +const prisma = new PrismaClient(); + +// ==================== TYPES ==================== + +export interface CachedEmailWithRelations extends CachedEmail { + stressfreiEmail?: { + id: number; + email: string; + customerId: number; + }; + contract?: { + id: number; + contractNumber: string; + } | null; +} + +// Parameter für gesendete E-Mail +export interface SentEmailParams { + to: string[]; + cc?: string[]; + subject: string; + text?: string; + html?: string; + messageId: string; + contractId?: number; // Optional: Vertrag dem die E-Mail zugeordnet wird + attachmentNames?: string[]; // Namen der Anhänge + uid?: number; // UID im IMAP Sent-Ordner (für Attachment-Download) +} + +export interface SyncResult { + success: boolean; + newEmails: number; + totalEmails: number; + error?: string; +} + +export interface EmailListOptions { + stressfreiEmailId?: number; + customerId?: number; + contractId?: number; + folder?: string; + limit?: number; + offset?: number; + includeBody?: boolean; +} + +// ==================== SYNC FUNCTIONS ==================== + +// E-Mails für eine StressfreiEmail synchronisieren +export async function syncEmailsForAccount( + stressfreiEmailId: number, + options?: { folder?: string; fullSync?: boolean } +): Promise { + const folder = options?.folder || 'INBOX'; + const fullSync = options?.fullSync || false; + + try { + // StressfreiEmail mit Mailbox-Daten laden + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id: stressfreiEmailId }, + }); + + if (!stressfreiEmail) { + return { success: false, newEmails: 0, totalEmails: 0, error: 'StressfreiEmail nicht gefunden' }; + } + + if (!stressfreiEmail.hasMailbox || !stressfreiEmail.emailPasswordEncrypted) { + return { success: false, newEmails: 0, totalEmails: 0, error: 'Keine Mailbox für diese E-Mail-Adresse' }; + } + + // IMAP/SMTP-Einstellungen vom Provider holen + const settings = await getImapSmtpSettings(); + if (!settings) { + return { success: false, newEmails: 0, totalEmails: 0, error: 'Keine E-Mail-Provider-Einstellungen gefunden' }; + } + + // Passwort entschlüsseln + let password: string; + try { + password = decrypt(stressfreiEmail.emailPasswordEncrypted); + } catch { + return { success: false, newEmails: 0, totalEmails: 0, error: 'Passwort konnte nicht entschlüsselt werden' }; + } + + // IMAP-Credentials zusammenstellen + const credentials: ImapCredentials = { + host: settings.imapServer, + port: settings.imapPort, + user: stressfreiEmail.email, + password, + encryption: settings.imapEncryption, + allowSelfSignedCerts: settings.allowSelfSignedCerts, + }; + + // Folder-Mapping: IMAP-Ordner zu DB-Ordner + const dbFolder = folder.toUpperCase() === 'SENT' || folder.toLowerCase() === 'sent' + ? EmailFolder.SENT + : EmailFolder.INBOX; + + // Für inkrementellen Sync: Höchste UID des Ordners ermitteln + let sinceUid: number | undefined; + if (!fullSync) { + const lastEmail = await prisma.cachedEmail.findFirst({ + where: { stressfreiEmailId, folder: dbFolder }, + orderBy: { uid: 'desc' }, + select: { uid: true }, + }); + if (lastEmail) { + sinceUid = lastEmail.uid; + } + } + + // E-Mails vom IMAP-Server abrufen + const fetchedEmails = await fetchEmails(credentials, { + folder, + sinceUid, + limit: fullSync ? 500 : 100, // Mehr bei Full-Sync + }); + + // Neue E-Mails in DB speichern + let newCount = 0; + for (const email of fetchedEmails) { + const created = await upsertCachedEmail(stressfreiEmailId, email, dbFolder); + if (created) newCount++; + } + + // Gesamtzahl ermitteln + const totalEmails = await prisma.cachedEmail.count({ + where: { stressfreiEmailId }, + }); + + return { + success: true, + newEmails: newCount, + totalEmails, + }; + } catch (error) { + console.error('syncEmailsForAccount error:', error); + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + return { + success: false, + newEmails: 0, + totalEmails: 0, + error: errorMessage, + }; + } +} + +// Alle Ordner synchronisieren (INBOX + SENT) +export async function syncAllFoldersForAccount( + stressfreiEmailId: number, + options?: { fullSync?: boolean } +): Promise { + const fullSync = options?.fullSync || false; + + // INBOX synchronisieren + const inboxResult = await syncEmailsForAccount(stressfreiEmailId, { folder: 'INBOX', fullSync }); + + // SENT synchronisieren (Plesk verwendet "Sent" als Ordnername) + const sentResult = await syncEmailsForAccount(stressfreiEmailId, { folder: 'Sent', fullSync }); + + // Ergebnisse kombinieren + if (!inboxResult.success && !sentResult.success) { + return { + success: false, + newEmails: 0, + totalEmails: 0, + error: inboxResult.error || sentResult.error || 'Synchronisation fehlgeschlagen', + }; + } + + return { + success: true, + newEmails: inboxResult.newEmails + sentResult.newEmails, + totalEmails: inboxResult.totalEmails, + }; +} + +// Einzelne E-Mail in DB speichern/aktualisieren +async function upsertCachedEmail( + stressfreiEmailId: number, + email: FetchedEmail, + folder: EmailFolder = EmailFolder.INBOX +): Promise { + try { + // Prüfen ob bereits vorhanden (via messageId + folder) + // WICHTIG: Gleiche messageId kann in INBOX und SENT existieren (z.B. E-Mail an sich selbst) + const existing = await prisma.cachedEmail.findUnique({ + where: { + stressfreiEmailId_messageId_folder: { + stressfreiEmailId, + messageId: email.messageId, + folder, + }, + }, + }); + + if (existing) { + // Bereits vorhanden + return false; + } + + // Neue E-Mail anlegen + await prisma.cachedEmail.create({ + data: { + stressfreiEmailId, + folder, + messageId: email.messageId, + uid: email.uid, + subject: email.subject, + fromAddress: email.fromAddress, + fromName: email.fromName, + toAddresses: JSON.stringify(email.toAddresses), + ccAddresses: email.ccAddresses.length > 0 ? JSON.stringify(email.ccAddresses) : null, + receivedAt: email.date, + textBody: email.textBody, + htmlBody: email.htmlBody, + hasAttachments: email.hasAttachments, + attachmentNames: email.attachmentNames.length > 0 + ? JSON.stringify(email.attachmentNames) + : null, + isRead: folder === EmailFolder.SENT, // Gesendete E-Mails sind bereits gelesen + isStarred: false, + }, + }); + + return true; + } catch (error) { + // Duplikat-Fehler ignorieren (Race Condition) + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2002') { + return false; + } + throw error; + } +} + +// ==================== CRUD FUNCTIONS ==================== + +// E-Mails abrufen mit Optionen +export async function getCachedEmails( + options: EmailListOptions +): Promise { + const where: Prisma.CachedEmailWhereInput = { + isDeleted: false, // Gelöschte E-Mails ausschließen + }; + + if (options.stressfreiEmailId) { + where.stressfreiEmailId = options.stressfreiEmailId; + } + + if (options.customerId) { + where.stressfreiEmail = { + customerId: options.customerId, + }; + } + + if (options.contractId) { + where.contractId = options.contractId; + } + + // Folder-Filter (INBOX oder SENT) + if (options.folder === 'SENT') { + where.folder = EmailFolder.SENT; + } else if (options.folder === 'INBOX' || !options.folder) { + // Standard: Nur Posteingang + where.folder = EmailFolder.INBOX; + } + + // Body-Felder nur wenn explizit angefordert (spart Bandbreite) + const select: Prisma.CachedEmailSelect = { + id: true, + stressfreiEmailId: true, + folder: true, + messageId: true, + uid: true, + subject: true, + fromAddress: true, + fromName: true, + toAddresses: true, + ccAddresses: true, + receivedAt: true, + hasAttachments: true, + attachmentNames: true, + contractId: true, + assignedAt: true, + assignedBy: true, + isAutoAssigned: true, + isRead: true, + isStarred: true, + createdAt: true, + updatedAt: true, + stressfreiEmail: { + select: { + id: true, + email: true, + customerId: true, + }, + }, + contract: { + select: { + id: true, + contractNumber: true, + }, + }, + }; + + if (options.includeBody) { + select.textBody = true; + select.htmlBody = true; + } + + const emails = await prisma.cachedEmail.findMany({ + where, + select, + orderBy: { receivedAt: 'desc' }, + take: options.limit || 50, + skip: options.offset || 0, + }); + + return emails as CachedEmailWithRelations[]; +} + +// Einzelne E-Mail abrufen (mit Body) +export async function getCachedEmailById( + id: number +): Promise { + const email = await prisma.cachedEmail.findUnique({ + where: { id }, + include: { + stressfreiEmail: { + select: { + id: true, + email: true, + customerId: true, + }, + }, + contract: { + select: { + id: true, + contractNumber: true, + }, + }, + }, + }); + + return email as CachedEmailWithRelations | null; +} + +// E-Mail als gelesen markieren +export async function markEmailAsRead(id: number): Promise { + await prisma.cachedEmail.update({ + where: { id }, + data: { isRead: true }, + }); +} + +// E-Mail als ungelesen markieren +export async function markEmailAsUnread(id: number): Promise { + await prisma.cachedEmail.update({ + where: { id }, + data: { isRead: false }, + }); +} + +// E-Mail Stern setzen/entfernen +export async function toggleEmailStar(id: number): Promise { + const email = await prisma.cachedEmail.findUnique({ + where: { id }, + select: { isStarred: true }, + }); + + if (!email) { + throw new Error('E-Mail nicht gefunden'); + } + + const newValue = !email.isStarred; + await prisma.cachedEmail.update({ + where: { id }, + data: { isStarred: newValue }, + }); + + return newValue; +} + +// ==================== CONTRACT ASSIGNMENT ==================== + +// E-Mail einem Vertrag zuordnen +export async function assignEmailToContract( + emailId: number, + contractId: number, + userId?: number +): Promise { + // Prüfen ob E-Mail existiert + const email = await prisma.cachedEmail.findUnique({ + where: { id: emailId }, + }); + + if (!email) { + throw new Error('E-Mail nicht gefunden'); + } + + // Prüfen ob Vertrag existiert + const contract = await prisma.contract.findUnique({ + where: { id: contractId }, + }); + + if (!contract) { + throw new Error('Vertrag nicht gefunden'); + } + + // Zuordnung setzen (manuell) + const updated = await prisma.cachedEmail.update({ + where: { id: emailId }, + data: { + contractId, + assignedAt: new Date(), + assignedBy: userId || null, + isAutoAssigned: false, // Manuell zugeordnet + }, + include: { + stressfreiEmail: { + select: { + id: true, + email: true, + customerId: true, + }, + }, + contract: { + select: { + id: true, + contractNumber: true, + }, + }, + }, + }); + + return updated as CachedEmailWithRelations; +} + +// Vertragszuordnung aufheben +export async function unassignEmailFromContract( + emailId: number +): Promise { + const updated = await prisma.cachedEmail.update({ + where: { id: emailId }, + data: { + contractId: null, + assignedAt: null, + assignedBy: null, + }, + include: { + stressfreiEmail: { + select: { + id: true, + email: true, + customerId: true, + }, + }, + contract: { + select: { + id: true, + contractNumber: true, + }, + }, + }, + }); + + return updated as CachedEmailWithRelations; +} + +// ==================== HELPER FUNCTIONS ==================== + +// Anzahl ungelesener E-Mails für Kunde +export async function getUnreadCountForCustomer(customerId: number): Promise { + return prisma.cachedEmail.count({ + where: { + stressfreiEmail: { + customerId, + }, + isRead: false, + }, + }); +} + +// Anzahl ungelesener E-Mails für Vertrag +export async function getUnreadCountForContract(contractId: number): Promise { + return prisma.cachedEmail.count({ + where: { + contractId, + isRead: false, + }, + }); +} + +// E-Mail-Anzahl pro Ordner für ein Konto (total und ungelesen) +export async function getFolderCountsForAccount(stressfreiEmailId: number): Promise<{ + inbox: number; + inboxUnread: number; + sent: number; + sentUnread: number; + trash: number; + trashUnread: number; +}> { + const [inbox, inboxUnread, sent, sentUnread, trash, trashUnread] = await Promise.all([ + // INBOX total + prisma.cachedEmail.count({ + where: { stressfreiEmailId, folder: EmailFolder.INBOX, isDeleted: false }, + }), + // INBOX unread + prisma.cachedEmail.count({ + where: { stressfreiEmailId, folder: EmailFolder.INBOX, isDeleted: false, isRead: false }, + }), + // SENT total + prisma.cachedEmail.count({ + where: { stressfreiEmailId, folder: EmailFolder.SENT, isDeleted: false }, + }), + // SENT unread + prisma.cachedEmail.count({ + where: { stressfreiEmailId, folder: EmailFolder.SENT, isDeleted: false, isRead: false }, + }), + // TRASH total (isDeleted = true) + prisma.cachedEmail.count({ + where: { stressfreiEmailId, isDeleted: true }, + }), + // TRASH unread + prisma.cachedEmail.count({ + where: { stressfreiEmailId, isDeleted: true, isRead: false }, + }), + ]); + + return { inbox, inboxUnread, sent, sentUnread, trash, trashUnread }; +} + +// E-Mail-Anzahl pro Ordner für einen Vertrag (zugeordnete E-Mails) +export async function getFolderCountsForContract(contractId: number): Promise<{ + inbox: number; + inboxUnread: number; + sent: number; + sentUnread: number; +}> { + const [inbox, inboxUnread, sent, sentUnread] = await Promise.all([ + // INBOX total + prisma.cachedEmail.count({ + where: { contractId, folder: EmailFolder.INBOX, isDeleted: false }, + }), + // INBOX unread + prisma.cachedEmail.count({ + where: { contractId, folder: EmailFolder.INBOX, isDeleted: false, isRead: false }, + }), + // SENT total + prisma.cachedEmail.count({ + where: { contractId, folder: EmailFolder.SENT, isDeleted: false }, + }), + // SENT unread + prisma.cachedEmail.count({ + where: { contractId, folder: EmailFolder.SENT, isDeleted: false, isRead: false }, + }), + ]); + + return { inbox, inboxUnread, sent, sentUnread }; +} + +// Alle StressfreiEmails eines Kunden mit Mailbox +export async function getMailboxAccountsForCustomer(customerId: number) { + return prisma.stressfreiEmail.findMany({ + where: { + customerId, + hasMailbox: true, + }, + select: { + id: true, + email: true, + notes: true, + _count: { + select: { + cachedEmails: true, + }, + }, + }, + orderBy: { email: 'asc' }, + }); +} + +// E-Mail-Thread finden (basierend auf References/In-Reply-To) +export async function getEmailThread(emailId: number): Promise { + const email = await prisma.cachedEmail.findUnique({ + where: { id: emailId }, + }); + + if (!email) { + return []; + } + + // Suche nach E-Mails mit dem gleichen Betreff (vereinfachte Thread-Logik) + // In einer vollständigen Implementierung würde man References/In-Reply-To parsen + const baseSubject = email.subject?.replace(/^(Re|Fwd|Aw|Wg):\s*/gi, '') || ''; + + if (!baseSubject) { + return [email as CachedEmailWithRelations]; + } + + const thread = await prisma.cachedEmail.findMany({ + where: { + stressfreiEmailId: email.stressfreiEmailId, + OR: [ + { subject: baseSubject }, + { subject: { startsWith: `Re: ${baseSubject}` } }, + { subject: { startsWith: `Aw: ${baseSubject}` } }, + { subject: { startsWith: `Fwd: ${baseSubject}` } }, + { subject: { startsWith: `Wg: ${baseSubject}` } }, + ], + }, + include: { + stressfreiEmail: { + select: { + id: true, + email: true, + customerId: true, + }, + }, + contract: { + select: { + id: true, + contractNumber: true, + }, + }, + }, + orderBy: { receivedAt: 'asc' }, + }); + + return thread as CachedEmailWithRelations[]; +} + +// ==================== TRASH OPERATIONS ==================== + +export interface TrashOperationResult { + success: boolean; + error?: string; +} + +// E-Mail in Papierkorb verschieben (markiert als gelöscht + IMAP-Move) +export async function moveEmailToTrash(id: number): Promise { + // E-Mail mit StressfreiEmail laden + const email = await prisma.cachedEmail.findUnique({ + where: { id }, + include: { + stressfreiEmail: true, + }, + }); + + if (!email) { + return { success: false, error: 'E-Mail nicht gefunden' }; + } + + if (email.isDeleted) { + return { success: false, error: 'E-Mail ist bereits im Papierkorb' }; + } + + // IMAP-Einstellungen und Credentials laden + const settings = await getImapSmtpSettings(); + if (!settings) { + return { success: false, error: 'Keine E-Mail-Provider-Einstellungen' }; + } + + if (!email.stressfreiEmail.emailPasswordEncrypted) { + return { success: false, error: 'Keine Mailbox-Zugangsdaten' }; + } + + let password: string; + try { + password = decrypt(email.stressfreiEmail.emailPasswordEncrypted); + } catch { + return { success: false, error: 'Passwort konnte nicht entschlüsselt werden' }; + } + + const credentials: ImapCredentials = { + host: settings.imapServer, + port: settings.imapPort, + user: email.stressfreiEmail.email, + password, + encryption: settings.imapEncryption, + allowSelfSignedCerts: settings.allowSelfSignedCerts, + }; + + // Ordner bestimmen (INBOX oder Sent) + const sourceFolder = email.folder === 'SENT' ? 'Sent' : 'INBOX'; + + // Auf IMAP-Server in Trash verschieben + const imapResult = await moveToTrash(credentials, email.uid, sourceFolder); + + if (!imapResult.success) { + return { success: false, error: imapResult.error || 'IMAP-Fehler beim Verschieben' }; + } + + // In DB als gelöscht markieren (mit neuer UID im Trash) + await prisma.cachedEmail.update({ + where: { id }, + data: { + isDeleted: true, + deletedAt: new Date(), + uid: imapResult.newUid || email.uid, // Neue UID im Trash speichern + }, + }); + + return { success: true }; +} + +// E-Mail aus Papierkorb wiederherstellen +export async function restoreEmailFromTrash(id: number): Promise { + // E-Mail laden + const email = await prisma.cachedEmail.findUnique({ + where: { id }, + include: { + stressfreiEmail: true, + }, + }); + + if (!email) { + return { success: false, error: 'E-Mail nicht gefunden' }; + } + + if (!email.isDeleted) { + return { success: false, error: 'E-Mail ist nicht im Papierkorb' }; + } + + // IMAP-Einstellungen und Credentials + const settings = await getImapSmtpSettings(); + if (!settings) { + return { success: false, error: 'Keine E-Mail-Provider-Einstellungen' }; + } + + if (!email.stressfreiEmail.emailPasswordEncrypted) { + return { success: false, error: 'Keine Mailbox-Zugangsdaten' }; + } + + let password: string; + try { + password = decrypt(email.stressfreiEmail.emailPasswordEncrypted); + } catch { + return { success: false, error: 'Passwort konnte nicht entschlüsselt werden' }; + } + + const credentials: ImapCredentials = { + host: settings.imapServer, + port: settings.imapPort, + user: email.stressfreiEmail.email, + password, + encryption: settings.imapEncryption, + allowSelfSignedCerts: settings.allowSelfSignedCerts, + }; + + // Ziel-Ordner bestimmen (basierend auf originalem Ordner) + const targetFolder = email.folder === 'SENT' ? 'Sent' : 'INBOX'; + + // Auf IMAP-Server aus Trash wiederherstellen + const imapResult = await restoreFromTrash(credentials, email.uid, targetFolder); + + if (!imapResult.success) { + return { success: false, error: imapResult.error || 'IMAP-Fehler beim Wiederherstellen' }; + } + + // In DB als wiederhergestellt markieren + await prisma.cachedEmail.update({ + where: { id }, + data: { + isDeleted: false, + deletedAt: null, + uid: imapResult.newUid || email.uid, // Neue UID im wiederhergestellten Ordner + }, + }); + + return { success: true }; +} + +// E-Mail endgültig löschen (aus Papierkorb) +export async function permanentDeleteEmail(id: number): Promise { + // E-Mail laden + const email = await prisma.cachedEmail.findUnique({ + where: { id }, + include: { + stressfreiEmail: true, + }, + }); + + if (!email) { + return { success: false, error: 'E-Mail nicht gefunden' }; + } + + if (!email.isDeleted) { + return { success: false, error: 'E-Mail muss erst in den Papierkorb verschoben werden' }; + } + + // IMAP-Einstellungen und Credentials + const settings = await getImapSmtpSettings(); + if (!settings) { + return { success: false, error: 'Keine E-Mail-Provider-Einstellungen' }; + } + + if (!email.stressfreiEmail.emailPasswordEncrypted) { + return { success: false, error: 'Keine Mailbox-Zugangsdaten' }; + } + + let password: string; + try { + password = decrypt(email.stressfreiEmail.emailPasswordEncrypted); + } catch { + return { success: false, error: 'Passwort konnte nicht entschlüsselt werden' }; + } + + const credentials: ImapCredentials = { + host: settings.imapServer, + port: settings.imapPort, + user: email.stressfreiEmail.email, + password, + encryption: settings.imapEncryption, + allowSelfSignedCerts: settings.allowSelfSignedCerts, + }; + + // Auf IMAP-Server endgültig löschen (aus Trash) + const imapResult = await permanentDelete(credentials, email.uid); + + if (!imapResult.success) { + return { success: false, error: imapResult.error || 'IMAP-Fehler beim endgültigen Löschen' }; + } + + // Aus DB löschen + await prisma.cachedEmail.delete({ + where: { id }, + }); + + return { success: true }; +} + +// Papierkorb-E-Mails für einen Kunden abrufen +export async function getTrashEmails(customerId: number): Promise { + return prisma.cachedEmail.findMany({ + where: { + isDeleted: true, + stressfreiEmail: { + customerId, + }, + }, + include: { + stressfreiEmail: { + select: { + id: true, + email: true, + customerId: true, + }, + }, + contract: { + select: { + id: true, + contractNumber: true, + }, + }, + }, + orderBy: { deletedAt: 'desc' }, + }) as Promise; +} + +// Papierkorb-E-Mails zählen +export async function getTrashCount(customerId: number): Promise { + return prisma.cachedEmail.count({ + where: { + isDeleted: true, + stressfreiEmail: { + customerId, + }, + }, + }); +} + +// Legacy: E-Mail löschen (jetzt deprecated, nutze moveEmailToTrash) +export async function deleteCachedEmail(id: number): Promise { + // Zur Abwärtskompatibilität: In Papierkorb verschieben statt löschen + const result = await moveEmailToTrash(id); + if (!result.success) { + throw new Error(result.error || 'Fehler beim Löschen'); + } +} + +// Alle gecachten E-Mails für eine StressfreiEmail löschen (nur Cache, kein IMAP) +export async function clearCacheForAccount(stressfreiEmailId: number): Promise { + const result = await prisma.cachedEmail.deleteMany({ + where: { stressfreiEmailId }, + }); + return result.count; +} + +// ==================== SENT EMAILS ==================== + +// Gesendete E-Mail speichern +export async function createSentEmail( + stressfreiEmailId: number, + params: SentEmailParams +): Promise { + // StressfreiEmail laden um Absender-Info zu bekommen + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id: stressfreiEmailId }, + select: { email: true }, + }); + + if (!stressfreiEmail) { + throw new Error('StressfreiEmail nicht gefunden'); + } + + const hasAttachments = params.attachmentNames && params.attachmentNames.length > 0; + + const email = await prisma.cachedEmail.create({ + data: { + stressfreiEmailId, + folder: EmailFolder.SENT, + messageId: params.messageId, + uid: params.uid || 0, // UID vom IMAP Sent-Ordner (für Attachment-Download) + subject: params.subject || null, + fromAddress: stressfreiEmail.email, + fromName: null, + toAddresses: JSON.stringify(params.to), + ccAddresses: params.cc && params.cc.length > 0 ? JSON.stringify(params.cc) : null, + receivedAt: new Date(), // Sendezeitpunkt + textBody: params.text || null, + htmlBody: params.html || null, + hasAttachments: hasAttachments || false, + attachmentNames: hasAttachments ? JSON.stringify(params.attachmentNames) : null, + isRead: true, // Gesendete sind immer "gelesen" + isStarred: false, + // Vertragszuordnung falls angegeben (automatisch = aus Vertrag gesendet) + contractId: params.contractId || null, + assignedAt: params.contractId ? new Date() : null, + isAutoAssigned: params.contractId ? true : false, // Automatisch wenn aus Vertrag gesendet + }, + }); + + return email; +} + +// Anzahl E-Mails für Konto nach Ordner +export async function getEmailCountByFolder( + stressfreiEmailId: number, + folder: 'INBOX' | 'SENT' +): Promise { + return prisma.cachedEmail.count({ + where: { + stressfreiEmailId, + folder: folder === 'SENT' ? EmailFolder.SENT : EmailFolder.INBOX, + }, + }); +} diff --git a/backend/src/services/emailProvider/emailProviderService.ts b/backend/src/services/emailProvider/emailProviderService.ts index 445a1683..0646c8cd 100644 --- a/backend/src/services/emailProvider/emailProviderService.ts +++ b/backend/src/services/emailProvider/emailProviderService.ts @@ -8,6 +8,7 @@ import { EmailExistsResult, EmailOperationResult, CreateEmailParams, + MailEncryption, } from './types.js'; import { PleskEmailProvider } from './pleskProvider.js'; @@ -68,6 +69,10 @@ export interface CreateProviderConfigData { password?: string; domain: string; defaultForwardEmail?: string; + // Verschlüsselungs-Einstellungen + imapEncryption?: MailEncryption; + smtpEncryption?: MailEncryption; + allowSelfSignedCerts?: boolean; isActive?: boolean; isDefault?: boolean; } @@ -95,6 +100,9 @@ export async function createProviderConfig(data: CreateProviderConfigData) { passwordEncrypted, domain: data.domain, defaultForwardEmail: data.defaultForwardEmail || null, + imapEncryption: data.imapEncryption ?? 'SSL', + smtpEncryption: data.smtpEncryption ?? 'SSL', + allowSelfSignedCerts: data.allowSelfSignedCerts ?? false, isActive: data.isActive ?? true, isDefault: data.isDefault ?? false, }, @@ -123,6 +131,9 @@ export async function updateProviderConfig( if (data.domain !== undefined) updateData.domain = data.domain; if (data.defaultForwardEmail !== undefined) updateData.defaultForwardEmail = data.defaultForwardEmail || null; + if (data.imapEncryption !== undefined) updateData.imapEncryption = data.imapEncryption; + if (data.smtpEncryption !== undefined) updateData.smtpEncryption = data.smtpEncryption; + if (data.allowSelfSignedCerts !== undefined) updateData.allowSelfSignedCerts = data.allowSelfSignedCerts; if (data.isActive !== undefined) updateData.isActive = data.isActive; if (data.isDefault !== undefined) updateData.isDefault = data.isDefault; @@ -179,6 +190,13 @@ async function getProviderInstance(): Promise { password, domain: dbConfig.domain, defaultForwardEmail: dbConfig.defaultForwardEmail || undefined, + imapServer: dbConfig.imapServer || undefined, + imapPort: dbConfig.imapPort || undefined, + smtpServer: dbConfig.smtpServer || undefined, + smtpPort: dbConfig.smtpPort || undefined, + imapEncryption: dbConfig.imapEncryption as MailEncryption, + smtpEncryption: dbConfig.smtpEncryption as MailEncryption, + allowSelfSignedCerts: dbConfig.allowSelfSignedCerts, isActive: dbConfig.isActive, isDefault: dbConfig.isDefault, }; @@ -239,6 +257,169 @@ export async function provisionEmail( } } +// E-Mail mit echter Mailbox erstellen (IMAP/SMTP-Zugang) +export async function provisionEmailWithMailbox( + localPart: string, + customerEmail: string, + password: string +): Promise { + try { + const provider = await getProviderInstance(); + const config = await getActiveProviderConfig(); + + // Weiterleitungsziele zusammenstellen + const forwardTargets: string[] = [customerEmail]; + + // Unsere eigene Weiterleitungsadresse hinzufügen falls konfiguriert + if (config?.defaultForwardEmail) { + forwardTargets.push(config.defaultForwardEmail); + } + + // Prüfen ob existiert + const exists = await provider.emailExists(localPart); + if (exists.exists) { + return { + success: true, + message: `E-Mail ${exists.email} existiert bereits`, + email: exists.email, + }; + } + + // Mit Mailbox erstellen + const result = await provider.createEmailWithMailbox({ + localPart, + forwardTargets, + password, + }); + + return result; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + return { + success: false, + error: errorMessage, + }; + } +} + +// Mailbox für existierende E-Mail-Weiterleitung aktivieren +export async function enableMailboxForExistingEmail( + localPart: string, + password: string +): Promise { + try { + const provider = await getProviderInstance(); + + const result = await provider.enableMailboxForExisting({ + localPart, + password, + }); + + return result; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + return { + success: false, + error: errorMessage, + }; + } +} + +// Mailbox-Passwort beim Provider aktualisieren +export async function updateMailboxPassword( + localPart: string, + password: string +): Promise { + try { + const provider = await getProviderInstance(); + + const result = await provider.updateMailboxPassword({ + localPart, + password, + }); + + return result; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + return { + success: false, + error: errorMessage, + }; + } +} + +// IMAP/SMTP-Einstellungen vom aktiven Provider holen +export interface ImapSmtpSettings { + imapServer: string; + imapPort: number; + imapEncryption: MailEncryption; // SSL, STARTTLS oder NONE + smtpServer: string; + smtpPort: number; + smtpEncryption: MailEncryption; // SSL, STARTTLS oder NONE + allowSelfSignedCerts: boolean; // Selbstsignierte Zertifikate erlauben + domain: string; +} + +export async function getImapSmtpSettings(): Promise { + const config = await getActiveProviderConfig(); + if (!config) return null; + + // Default-Server: Hostname aus der apiUrl extrahieren (z.B. rs001871.fastrootserver.de aus https://rs001871.fastrootserver.de:8443) + // Der Plesk-Server ist gleichzeitig der Mail-Server + let defaultServer: string; + try { + const url = new URL(config.apiUrl); + defaultServer = url.hostname; + } catch { + // Fallback falls apiUrl ungültig + defaultServer = `mail.${config.domain}`; + } + + // Verschlüsselungs-Einstellungen + const imapEncryption = (config.imapEncryption ?? 'SSL') as MailEncryption; + const smtpEncryption = (config.smtpEncryption ?? 'SSL') as MailEncryption; + + // Ports basierend auf Verschlüsselung berechnen: + // SSL: IMAP 993, SMTP 465 + // STARTTLS: IMAP 143, SMTP 587 + // NONE: IMAP 143, SMTP 25 + // + // Standard-Ports werden IMMER basierend auf Verschlüsselung berechnet. + // Nur benutzerdefinierte Ports (nicht 993/143/465/587/25) werden aus der DB übernommen. + const getImapPort = (enc: MailEncryption, storedPort: number | null) => { + const standardPorts = [993, 143]; + // Wenn ein nicht-standard Port gespeichert ist, diesen verwenden + if (storedPort && !standardPorts.includes(storedPort)) { + return storedPort; + } + // Sonst basierend auf Verschlüsselung + return enc === 'SSL' ? 993 : 143; + }; + + const getSmtpPort = (enc: MailEncryption, storedPort: number | null) => { + const standardPorts = [465, 587, 25]; + // Wenn ein nicht-standard Port gespeichert ist, diesen verwenden + if (storedPort && !standardPorts.includes(storedPort)) { + return storedPort; + } + // Sonst basierend auf Verschlüsselung + if (enc === 'SSL') return 465; + if (enc === 'STARTTLS') return 587; + return 25; // NONE + }; + + return { + imapServer: config.imapServer || defaultServer, + imapPort: getImapPort(imapEncryption, config.imapPort), + imapEncryption, + smtpServer: config.smtpServer || defaultServer, + smtpPort: getSmtpPort(smtpEncryption, config.smtpPort), + smtpEncryption, + allowSelfSignedCerts: config.allowSelfSignedCerts ?? false, + domain: config.domain, + }; +} + // E-Mail löschen export async function deprovisionEmail(localPart: string): Promise { try { @@ -328,6 +509,13 @@ async function getProviderInstanceById(id: number): Promise { password, domain: dbConfig.domain, defaultForwardEmail: dbConfig.defaultForwardEmail || undefined, + imapServer: dbConfig.imapServer || undefined, + imapPort: dbConfig.imapPort || undefined, + smtpServer: dbConfig.smtpServer || undefined, + smtpPort: dbConfig.smtpPort || undefined, + imapEncryption: dbConfig.imapEncryption as MailEncryption, + smtpEncryption: dbConfig.smtpEncryption as MailEncryption, + allowSelfSignedCerts: dbConfig.allowSelfSignedCerts, isActive: dbConfig.isActive, isDefault: dbConfig.isDefault, }; diff --git a/backend/src/services/emailProvider/pleskProvider.ts b/backend/src/services/emailProvider/pleskProvider.ts index e3743844..55644202 100644 --- a/backend/src/services/emailProvider/pleskProvider.ts +++ b/backend/src/services/emailProvider/pleskProvider.ts @@ -7,6 +7,10 @@ import { EmailExistsResult, EmailOperationResult, CreateEmailParams, + CreateEmailWithMailboxParams, + CreateEmailWithMailboxResult, + EnableMailboxParams, + UpdateMailboxPasswordParams, RenameEmailParams, } from './types.js'; @@ -173,9 +177,20 @@ export class PleskEmailProvider implements IEmailProvider { // stdout sollte die Mail-Infos enthalten const exists = result.stdout?.toLowerCase().includes(localPart.toLowerCase()); + + // Mailbox-Status aus stdout parsen (Format: "Mailbox: true" oder "Mailbox: false") + let hasMailbox: boolean | undefined; + if (exists && result.stdout) { + const mailboxMatch = result.stdout.match(/Mailbox:\s*(true|false)/i); + if (mailboxMatch) { + hasMailbox = mailboxMatch[1].toLowerCase() === 'true'; + } + } + return { exists, email: exists ? email : undefined, + hasMailbox, }; } catch (error) { // HTTP-Fehler oder Netzwerkfehler @@ -231,6 +246,127 @@ export class PleskEmailProvider implements IEmailProvider { } } + async createEmailWithMailbox(params: CreateEmailWithMailboxParams): Promise { + const { localPart, forwardTargets, password } = params; + const email = `${localPart}@${this.config.domain}`; + + try { + // Prüfen ob schon existiert + const exists = await this.emailExists(localPart); + if (exists.exists) { + return { + success: false, + error: `E-Mail ${email} existiert bereits`, + }; + } + + // Plesk CLI API: Mail-Account mit echter Mailbox erstellen + // -mailbox true: Echte Mailbox (IMAP/SMTP-Zugang) + // -passwd: Passwort für die Mailbox + // -forwarding true: Zusätzlich Weiterleitung aktivieren + await this.request('POST', '/api/v2/cli/mail/call', { + params: [ + '--create', email, + '-mailbox', 'true', + '-passwd', password, + '-forwarding', 'true', + '-forwarding-addresses', `add:${forwardTargets.join(',')}`, + ], + }); + + return { + success: true, + message: `E-Mail ${email} mit Mailbox erfolgreich erstellt`, + email, + }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + console.error('Plesk createEmailWithMailbox error:', error); + return { + success: false, + error: `Fehler beim Erstellen der E-Mail mit Mailbox: ${errorMessage}`, + }; + } + } + + async enableMailboxForExisting(params: EnableMailboxParams): Promise { + const { localPart, password } = params; + const email = `${localPart}@${this.config.domain}`; + + try { + // Prüfen ob E-Mail existiert + const exists = await this.emailExists(localPart); + if (!exists.exists) { + return { + success: false, + error: `E-Mail ${email} nicht gefunden`, + }; + } + + // Plesk CLI API: Mailbox für existierende E-Mail aktivieren + // --update: Existierende E-Mail aktualisieren + // -mailbox true: Mailbox aktivieren + // -passwd: Passwort für die Mailbox setzen + await this.request('POST', '/api/v2/cli/mail/call', { + params: [ + '--update', email, + '-mailbox', 'true', + '-passwd', password, + ], + }); + + return { + success: true, + message: `Mailbox für ${email} erfolgreich aktiviert`, + }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + console.error('Plesk enableMailboxForExisting error:', error); + return { + success: false, + error: `Fehler beim Aktivieren der Mailbox: ${errorMessage}`, + }; + } + } + + async updateMailboxPassword(params: UpdateMailboxPasswordParams): Promise { + const { localPart, password } = params; + const email = `${localPart}@${this.config.domain}`; + + try { + // Prüfen ob E-Mail existiert + const exists = await this.emailExists(localPart); + if (!exists.exists) { + return { + success: false, + error: `E-Mail ${email} nicht gefunden`, + }; + } + + // Plesk CLI API: Passwort für existierende E-Mail aktualisieren + // --update: Existierende E-Mail aktualisieren + // -passwd: Neues Passwort setzen + await this.request('POST', '/api/v2/cli/mail/call', { + params: [ + '--update', email, + '-passwd', password, + ], + }); + + return { + success: true, + message: `Passwort für ${email} erfolgreich aktualisiert`, + }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler'; + console.error('Plesk updateMailboxPassword error:', error); + return { + success: false, + error: `Fehler beim Aktualisieren des Passworts: ${errorMessage}`, + }; + } + } + async deleteEmail(localPart: string): Promise { const email = `${localPart}@${this.config.domain}`; diff --git a/backend/src/services/emailProvider/types.ts b/backend/src/services/emailProvider/types.ts index 35f24436..5f78446e 100644 --- a/backend/src/services/emailProvider/types.ts +++ b/backend/src/services/emailProvider/types.ts @@ -1,5 +1,8 @@ // ==================== EMAIL PROVIDER TYPES ==================== +// Verschlüsselungstyp für E-Mail-Verbindungen +export type MailEncryption = 'SSL' | 'STARTTLS' | 'NONE'; + export interface EmailForwardTarget { email: string; } @@ -9,6 +12,27 @@ export interface CreateEmailParams { forwardTargets: string[]; // Weiterleitungsziele } +export interface CreateEmailWithMailboxParams { + localPart: string; // z.B. "max.mustermann" + forwardTargets: string[]; // Weiterleitungsziele + password: string; // Passwort für Mailbox (IMAP/SMTP) +} + +export interface CreateEmailWithMailboxResult extends EmailOperationResult { + // Erfolg: Mailbox-Informationen zurückgeben + email?: string; // Vollständige E-Mail-Adresse +} + +export interface EnableMailboxParams { + localPart: string; // z.B. "max.mustermann" + password: string; // Passwort für Mailbox (IMAP/SMTP) +} + +export interface UpdateMailboxPasswordParams { + localPart: string; // z.B. "max.mustermann" + password: string; // Neues Passwort für Mailbox +} + export interface RenameEmailParams { oldLocalPart: string; newLocalPart: string; @@ -17,6 +41,7 @@ export interface RenameEmailParams { export interface EmailExistsResult { exists: boolean; email?: string; + hasMailbox?: boolean; // true wenn echte Mailbox vorhanden } export interface EmailOperationResult { @@ -36,9 +61,18 @@ export interface IEmailProvider { // Prüft ob eine E-Mail-Adresse existiert emailExists(localPart: string): Promise; - // Erstellt eine neue E-Mail-Weiterleitung + // Erstellt eine neue E-Mail-Weiterleitung (ohne Mailbox) createEmail(params: CreateEmailParams): Promise; + // Erstellt eine neue E-Mail mit echter Mailbox (IMAP/SMTP-Zugang) + createEmailWithMailbox(params: CreateEmailWithMailboxParams): Promise; + + // Aktiviert Mailbox für eine existierende E-Mail-Weiterleitung + enableMailboxForExisting(params: EnableMailboxParams): Promise; + + // Aktualisiert das Passwort einer Mailbox + updateMailboxPassword(params: UpdateMailboxPasswordParams): Promise; + // Löscht eine E-Mail-Adresse deleteEmail(localPart: string): Promise; @@ -60,6 +94,15 @@ export interface EmailProviderConfig { password?: string; // Entschlüsselt domain: string; defaultForwardEmail?: string; + // IMAP/SMTP-Server für E-Mail-Client (optional, default: mail.{domain}) + imapServer?: string; + imapPort?: number; + smtpServer?: string; + smtpPort?: number; + // Verschlüsselungs-Einstellungen + imapEncryption?: MailEncryption; // SSL, STARTTLS oder NONE + smtpEncryption?: MailEncryption; // SSL, STARTTLS oder NONE + allowSelfSignedCerts?: boolean; // Selbstsignierte Zertifikate erlauben isActive: boolean; isDefault: boolean; } diff --git a/backend/src/services/imapService.ts b/backend/src/services/imapService.ts new file mode 100644 index 00000000..f44cb30b --- /dev/null +++ b/backend/src/services/imapService.ts @@ -0,0 +1,825 @@ +// ==================== IMAP SERVICE ==================== +// Service für IMAP-Zugriff auf Mailboxen + +import { ImapFlow, FetchMessageObject } from 'imapflow'; +import { simpleParser, ParsedMail, AddressObject } from 'mailparser'; + +// Verschlüsselungstyp +export type MailEncryption = 'SSL' | 'STARTTLS' | 'NONE'; + +export interface ImapCredentials { + host: string; + port: number; + user: string; + password: string; + encryption?: MailEncryption; // SSL, STARTTLS oder NONE (Standard: SSL) + allowSelfSignedCerts?: boolean; // Selbstsignierte Zertifikate erlauben +} + +export interface FetchedEmail { + uid: number; + messageId: string; + subject: string | null; + fromAddress: string; + fromName: string | null; + toAddresses: string[]; + ccAddresses: string[]; + date: Date; + textBody: string | null; + htmlBody: string | null; + hasAttachments: boolean; + attachmentNames: string[]; +} + +export interface FetchOptions { + folder?: string; // Default: 'INBOX' + since?: Date; // Nur E-Mails nach diesem Datum + limit?: number; // Max. Anzahl E-Mails + sinceUid?: number; // Nur E-Mails ab dieser UID (für inkrementellen Sync) +} + +// Helper: Adressen aus mailparser-Format extrahieren +function extractAddresses(addressObj: AddressObject | AddressObject[] | undefined): string[] { + if (!addressObj) return []; + + const addresses = Array.isArray(addressObj) ? addressObj : [addressObj]; + const result: string[] = []; + + for (const obj of addresses) { + if (obj.value) { + for (const addr of obj.value) { + if (addr.address) { + result.push(addr.address); + } + } + } + } + + return result; +} + +// Helper: Ersten Absender-Namen extrahieren +function extractFromName(addressObj: AddressObject | AddressObject[] | undefined): string | null { + if (!addressObj) return null; + + const addresses = Array.isArray(addressObj) ? addressObj : [addressObj]; + + for (const obj of addresses) { + if (obj.value && obj.value[0]) { + return obj.value[0].name || null; + } + } + + return null; +} + +// E-Mails aus einer Mailbox abrufen +export async function fetchEmails( + credentials: ImapCredentials, + options: FetchOptions = {} +): Promise { + const { + folder = 'INBOX', + since, + limit = 50, + sinceUid, + } = options; + + // Verschlüsselungs-Einstellungen basierend auf Modus + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + // ImapFlow-Optionen je nach Verschlüsselungstyp + // SSL: secure=true (implicit TLS, Port 993) + // STARTTLS: secure=false (upgrades to TLS, Port 143) + // NONE: secure=false + disableAutoIdle (no encryption, Port 143) + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + // TLS-Optionen nur wenn nicht NONE + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + // Debug-Logging + console.log(`[IMAP] Connecting to ${credentials.host}:${credentials.port} (${encryption}), user: ${credentials.user}`); + + const client = new ImapFlow(clientOptions); + + const emails: FetchedEmail[] = []; + + try { + await client.connect(); + console.log(`[IMAP] Connected successfully`); + + // Mailbox öffnen + await client.mailboxOpen(folder); + + // Suchkriterien zusammenstellen + let searchCriteria: { since?: Date; uid?: string } = {}; + + if (since) { + searchCriteria.since = since; + } + + // IMAP SEARCH ausführen + let uids: number[]; + + if (sinceUid) { + // Inkrementeller Sync: Nur E-Mails ab einer bestimmten UID + // IMAP UID-Range: "sinceUid:*" bedeutet alle E-Mails >= sinceUid + const messages = await client.search({ uid: `${sinceUid}:*` }, { uid: true }); + const messageArray = Array.isArray(messages) ? messages : []; + uids = messageArray.filter((uid: number) => uid > sinceUid); // Exkludiere die sinceUid selbst + } else if (since) { + // Nach Datum suchen + const messages = await client.search({ since }, { uid: true }); + uids = Array.isArray(messages) ? messages : []; + } else { + // Alle E-Mails (mit Limit) + const messages = await client.search({ all: true }, { uid: true }); + uids = Array.isArray(messages) ? messages : []; + } + + // Neueste zuerst (absteigend sortieren) + uids.sort((a, b) => b - a); + + // Limit anwenden + const limitedUids = uids.slice(0, limit); + + console.log(`[IMAP] Found ${uids.length} emails, fetching ${limitedUids.length}`); + + if (limitedUids.length === 0) { + console.log(`[IMAP] No emails to fetch`); + await client.logout(); + return []; + } + + // E-Mails abrufen + for await (const message of client.fetch(limitedUids, { + uid: true, + envelope: true, + source: true, // Vollständige E-Mail für Parsing + })) { + try { + // Source muss vorhanden sein + if (!message.source) { + console.error(`E-Mail UID ${message.uid} hat keine Source`); + continue; + } + + // E-Mail mit mailparser parsen + const parsed = await simpleParser(message.source) as ParsedMail; + + const email: FetchedEmail = { + uid: message.uid, + messageId: parsed.messageId || `${message.uid}@unknown`, + subject: parsed.subject || null, + fromAddress: extractAddresses(parsed.from)[0] || 'unknown@unknown', + fromName: extractFromName(parsed.from), + toAddresses: extractAddresses(parsed.to), + ccAddresses: extractAddresses(parsed.cc), + date: parsed.date || new Date(), + textBody: parsed.text || null, + htmlBody: parsed.html ? String(parsed.html) : null, + hasAttachments: (parsed.attachments?.length || 0) > 0, + attachmentNames: parsed.attachments?.map((a) => a.filename || 'unnamed') || [], + }; + + emails.push(email); + } catch (parseError) { + console.error(`Fehler beim Parsen von E-Mail UID ${message.uid}:`, parseError); + // E-Mail überspringen bei Parse-Fehlern + } + } + + await client.logout(); + } catch (error) { + // Verbindung sauber schließen bei Fehlern + try { + await client.logout(); + } catch { + // Ignorieren + } + + // Bessere Fehlermeldungen + if (error instanceof Error) { + const msg = error.message.toLowerCase(); + const errorCode = (error as NodeJS.ErrnoException).code?.toLowerCase() || ''; + + if (msg.includes('authentication') || msg.includes('login')) { + throw new Error('IMAP-Authentifizierung fehlgeschlagen - Zugangsdaten prüfen'); + } + if (msg.includes('econnrefused') || errorCode === 'econnrefused') { + throw new Error(`IMAP-Server nicht erreichbar: ${credentials.host}:${credentials.port} - Verbindung verweigert`); + } + if (msg.includes('timeout') || msg.includes('etimedout') || errorCode === 'etimedout') { + const enc = credentials.encryption ?? 'SSL'; + if (enc === 'STARTTLS' && credentials.port === 143) { + throw new Error(`IMAP Port 143 (STARTTLS) nicht erreichbar auf ${credentials.host}`); + } else if (enc === 'SSL' && credentials.port === 993) { + throw new Error(`IMAP Port 993 (SSL) nicht erreichbar auf ${credentials.host}`); + } else { + throw new Error(`IMAP-Verbindung zu ${credentials.host}:${credentials.port} fehlgeschlagen - Timeout`); + } + } + if (msg.includes('certificate') || msg.includes('cert')) { + throw new Error('IMAP SSL-Zertifikatfehler - Aktiviere "Selbstsignierte Zertifikate erlauben"'); + } + } + + throw error; + } + + return emails; +} + +// Verbindung testen +export async function testImapConnection(credentials: ImapCredentials): Promise { + // Verschlüsselungs-Einstellungen basierend auf Modus + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + const client = new ImapFlow(clientOptions); + + try { + await client.connect(); + await client.logout(); + } catch (error) { + // Verbindung sauber schließen bei Fehlern + try { + await client.logout(); + } catch { + // Ignorieren + } + + if (error instanceof Error) { + const msg = error.message.toLowerCase(); + const errorCode = (error as NodeJS.ErrnoException).code?.toLowerCase() || ''; + + if (msg.includes('authentication') || msg.includes('login')) { + throw new Error('IMAP-Authentifizierung fehlgeschlagen'); + } + if (msg.includes('econnrefused') || errorCode === 'econnrefused') { + throw new Error(`IMAP-Server nicht erreichbar: ${credentials.host}:${credentials.port} - Verbindung verweigert`); + } + if (msg.includes('timeout') || msg.includes('etimedout') || errorCode === 'etimedout') { + if (encryption === 'STARTTLS' && credentials.port === 143) { + throw new Error(`IMAP Port 143 (STARTTLS) nicht erreichbar auf ${credentials.host}`); + } else if (encryption === 'SSL' && credentials.port === 993) { + throw new Error(`IMAP Port 993 (SSL) nicht erreichbar auf ${credentials.host}`); + } else { + throw new Error(`IMAP-Verbindung zu ${credentials.host}:${credentials.port} fehlgeschlagen - Timeout`); + } + } + if (msg.includes('certificate') || msg.includes('cert')) { + throw new Error('IMAP SSL-Zertifikatfehler - Aktiviere "Selbstsignierte Zertifikate erlauben"'); + } + } + + throw error; + } +} + +// Höchste UID in einer Mailbox ermitteln (für inkrementellen Sync) +export async function getHighestUid( + credentials: ImapCredentials, + folder: string = 'INBOX' +): Promise { + // Verschlüsselungs-Einstellungen basierend auf Modus + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + const client = new ImapFlow(clientOptions); + + try { + await client.connect(); + const mailbox = await client.mailboxOpen(folder); + const highestUid = mailbox.uidNext ? mailbox.uidNext - 1 : 0; + await client.logout(); + return highestUid; + } catch (error) { + try { + await client.logout(); + } catch { + // Ignorieren + } + throw error; + } +} + +// Anhang-Interface +export interface EmailAttachmentData { + filename: string; + content: Buffer; + contentType: string; + size: number; +} + +// Anhang einer E-Mail per UID abrufen +export async function fetchAttachment( + credentials: ImapCredentials, + uid: number, + attachmentFilename: string, + folder: string = 'INBOX' +): Promise { + // Verschlüsselungs-Einstellungen basierend auf Modus + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + const client = new ImapFlow(clientOptions); + + try { + await client.connect(); + await client.mailboxOpen(folder); + + // E-Mail per UID abrufen + let attachment: EmailAttachmentData | null = null; + + for await (const message of client.fetch([uid], { + uid: true, + source: true, + })) { + if (!message.source) continue; + + // E-Mail parsen + const parsed = await simpleParser(message.source); + + // Anhang suchen + if (parsed.attachments) { + for (const att of parsed.attachments) { + const filename = att.filename || 'unnamed'; + if (filename === attachmentFilename) { + attachment = { + filename, + content: att.content, + contentType: att.contentType || 'application/octet-stream', + size: att.size, + }; + break; + } + } + } + } + + await client.logout(); + return attachment; + } catch (error) { + try { + await client.logout(); + } catch { + // Ignorieren + } + throw error; + } +} + +// Gesendete E-Mail im IMAP Sent-Ordner speichern (für Attachment-Download) +export interface AppendToSentParams { + rawEmail: Buffer | string; // RFC 5322 formatierte E-Mail + sentFolder?: string; // Standard: 'Sent' +} + +export interface AppendToSentResult { + success: boolean; + uid?: number; // UID der gespeicherten Nachricht + error?: string; +} + +export async function appendToSent( + credentials: ImapCredentials, + params: AppendToSentParams +): Promise { + const { rawEmail, sentFolder = 'Sent' } = params; + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + console.log(`[IMAP] Appending email to ${sentFolder} folder...`); + + const client = new ImapFlow(clientOptions); + + try { + await client.connect(); + + // E-Mail im Sent-Ordner speichern + const result = await client.append(sentFolder, rawEmail, ['\\Seen'], new Date()); + + await client.logout(); + + // append kann false zurückgeben bei Fehler + if (!result) { + return { success: false, error: 'IMAP append fehlgeschlagen' }; + } + + console.log(`[IMAP] Email appended successfully, UID: ${result.uid}`); + + return { + success: true, + uid: result.uid, + }; + } catch (error) { + try { + await client.logout(); + } catch { + // Ignorieren + } + + console.error('[IMAP] Error appending to Sent folder:', error); + + // Versuche mit alternativen Ordnernamen falls 'Sent' nicht existiert + if (sentFolder === 'Sent' && error instanceof Error) { + // Typische alternative Namen für Sent-Ordner + const alternativeNames = ['INBOX.Sent', 'Sent Messages', 'Sent Items']; + + for (const altFolder of alternativeNames) { + try { + const altClient = new ImapFlow(clientOptions); + await altClient.connect(); + const altResult = await altClient.append(altFolder, rawEmail, ['\\Seen'], new Date()); + await altClient.logout(); + + if (altResult) { + console.log(`[IMAP] Email appended to ${altFolder}, UID: ${altResult.uid}`); + return { success: true, uid: altResult.uid }; + } + } catch { + // Nächsten Namen versuchen + } + } + } + + return { + success: false, + error: error instanceof Error ? error.message : 'Fehler beim Speichern im Sent-Ordner', + }; + } +} + +// Alle Anhänge einer E-Mail per UID abrufen (Metadaten) +export async function fetchAttachmentList( + credentials: ImapCredentials, + uid: number, + folder: string = 'INBOX' +): Promise> { + // Verschlüsselungs-Einstellungen basierend auf Modus + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + const client = new ImapFlow(clientOptions); + const attachments: Array<{ filename: string; contentType: string; size: number }> = []; + + try { + await client.connect(); + await client.mailboxOpen(folder); + + for await (const message of client.fetch([uid], { + uid: true, + source: true, + })) { + if (!message.source) continue; + + const parsed = await simpleParser(message.source); + + if (parsed.attachments) { + for (const att of parsed.attachments) { + attachments.push({ + filename: att.filename || 'unnamed', + contentType: att.contentType || 'application/octet-stream', + size: att.size, + }); + } + } + } + + await client.logout(); + return attachments; + } catch (error) { + try { + await client.logout(); + } catch { + // Ignorieren + } + throw error; + } +} + +// ==================== TRASH OPERATIONS ==================== + +// Typische Namen für Trash-Ordner (verschiedene Server/Sprachen) +const TRASH_FOLDER_NAMES = ['Trash', 'INBOX.Trash', 'Deleted', 'Deleted Items', 'Deleted Messages', 'Papierkorb']; + +// Helper: Trash-Ordner finden +async function findTrashFolder(client: ImapFlow): Promise { + const mailboxes = await client.list(); + + for (const name of TRASH_FOLDER_NAMES) { + const found = mailboxes.find(m => + m.path.toLowerCase() === name.toLowerCase() || + m.name.toLowerCase() === name.toLowerCase() + ); + if (found) return found.path; + } + + // Suche nach Ordner mit \Trash Flag + const trashByFlag = mailboxes.find(m => m.specialUse === '\\Trash'); + if (trashByFlag) return trashByFlag.path; + + return null; +} + +export interface MoveToTrashResult { + success: boolean; + newUid?: number; // UID im Trash-Ordner + error?: string; +} + +// E-Mail in Papierkorb verschieben +export async function moveToTrash( + credentials: ImapCredentials, + uid: number, + sourceFolder: string = 'INBOX' +): Promise { + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + const client = new ImapFlow(clientOptions); + + try { + await client.connect(); + + // Trash-Ordner finden + const trashFolder = await findTrashFolder(client); + if (!trashFolder) { + await client.logout(); + return { success: false, error: 'Trash-Ordner nicht gefunden' }; + } + + // Source-Ordner öffnen + await client.mailboxOpen(sourceFolder); + + // E-Mail verschieben (kopieren + löschen) + const moveResult = await client.messageMove([uid], trashFolder, { uid: true }); + + await client.logout(); + + if (moveResult && moveResult.uidMap) { + // uidMap ist Map - alte UID -> neue UID + const newUid = moveResult.uidMap.get(uid); + console.log(`[IMAP] Email moved to ${trashFolder}, new UID: ${newUid}`); + return { success: true, newUid }; + } + + return { success: true }; + } catch (error) { + try { + await client.logout(); + } catch { + // Ignorieren + } + + console.error('[IMAP] Error moving to trash:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Fehler beim Verschieben in Papierkorb', + }; + } +} + +export interface RestoreFromTrashResult { + success: boolean; + newUid?: number; // UID im wiederhergestellten Ordner + error?: string; +} + +// E-Mail aus Papierkorb wiederherstellen +export async function restoreFromTrash( + credentials: ImapCredentials, + uid: number, + targetFolder: string = 'INBOX' +): Promise { + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + const client = new ImapFlow(clientOptions); + + try { + await client.connect(); + + // Trash-Ordner finden + const trashFolder = await findTrashFolder(client); + if (!trashFolder) { + await client.logout(); + return { success: false, error: 'Trash-Ordner nicht gefunden' }; + } + + // Trash-Ordner öffnen + await client.mailboxOpen(trashFolder); + + // E-Mail zurück verschieben + const moveResult = await client.messageMove([uid], targetFolder, { uid: true }); + + await client.logout(); + + if (moveResult && moveResult.uidMap) { + const newUid = moveResult.uidMap.get(uid); + console.log(`[IMAP] Email restored to ${targetFolder}, new UID: ${newUid}`); + return { success: true, newUid }; + } + + return { success: true }; + } catch (error) { + try { + await client.logout(); + } catch { + // Ignorieren + } + + console.error('[IMAP] Error restoring from trash:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Fehler beim Wiederherstellen', + }; + } +} + +export interface PermanentDeleteResult { + success: boolean; + error?: string; +} + +// E-Mail endgültig löschen (aus Trash-Ordner) +export async function permanentDelete( + credentials: ImapCredentials, + uid: number, + folder?: string // Optional: Ordner angeben, sonst wird Trash verwendet +): Promise { + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const clientOptions: ConstructorParameters[0] = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + logger: false, + }; + + if (encryption !== 'NONE') { + clientOptions.tls = { rejectUnauthorized }; + } + + const client = new ImapFlow(clientOptions); + + try { + await client.connect(); + + // Ordner bestimmen + let targetFolder: string | null | undefined = folder; + if (!targetFolder) { + targetFolder = await findTrashFolder(client); + if (!targetFolder) { + await client.logout(); + return { success: false, error: 'Trash-Ordner nicht gefunden' }; + } + } + + // Ordner öffnen + await client.mailboxOpen(targetFolder); + + // E-Mail als gelöscht markieren und expunge + await client.messageDelete([uid], { uid: true }); + + await client.logout(); + + console.log(`[IMAP] Email permanently deleted from ${targetFolder}, UID: ${uid}`); + return { success: true }; + } catch (error) { + try { + await client.logout(); + } catch { + // Ignorieren + } + + console.error('[IMAP] Error permanently deleting:', error); + return { + success: false, + error: error instanceof Error ? error.message : 'Fehler beim endgültigen Löschen', + }; + } +} diff --git a/backend/src/services/smtpService.ts b/backend/src/services/smtpService.ts new file mode 100644 index 00000000..355ad17a --- /dev/null +++ b/backend/src/services/smtpService.ts @@ -0,0 +1,304 @@ +// ==================== SMTP SERVICE ==================== +// Service für E-Mail-Versand via SMTP + +import nodemailer from 'nodemailer'; +import type { Transporter } from 'nodemailer'; +import MailComposer from 'nodemailer/lib/mail-composer'; + +// Verschlüsselungstyp +export type MailEncryption = 'SSL' | 'STARTTLS' | 'NONE'; + +export interface SmtpCredentials { + host: string; + port: number; + user: string; + password: string; + encryption?: MailEncryption; // SSL, STARTTLS oder NONE (Standard: SSL) + allowSelfSignedCerts?: boolean; // Selbstsignierte Zertifikate erlauben +} + +// Anhang-Interface +export interface EmailAttachment { + filename: string; + content: string; // Base64-kodierter Inhalt + contentType?: string; // MIME-Type (z.B. 'application/pdf') +} + +export interface SendEmailParams { + to: string | string[]; + cc?: string | string[]; + subject: string; + text?: string; + html?: string; + inReplyTo?: string; // Message-ID der E-Mail auf die geantwortet wird + references?: string[]; // Thread-Referenzen + attachments?: EmailAttachment[]; // Anhänge +} + +export interface SendEmailResult { + success: boolean; + messageId?: string; + rawEmail?: Buffer; // RFC 5322 formatierte E-Mail für IMAP-Speicherung + error?: string; +} + +// E-Mail senden +export async function sendEmail( + credentials: SmtpCredentials, + fromAddress: string, + params: SendEmailParams +): Promise { + // Verschlüsselungs-Einstellungen basierend auf Modus + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + // Transport-Optionen je nach Verschlüsselungstyp + // SSL: secure=true (implicit TLS, Port 465) + // STARTTLS: secure=false (upgrades to TLS, Port 587) + // NONE: secure=false + ignoreTLS=true (no encryption, Port 25) + const transportOptions: nodemailer.TransportOptions & { + host: string; + port: number; + secure: boolean; + auth: { user: string; pass: string }; + tls?: { rejectUnauthorized: boolean }; + ignoreTLS?: boolean; + requireTLS?: boolean; + connectionTimeout: number; + greetingTimeout: number; + socketTimeout: number; + } = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + connectionTimeout: 10000, + greetingTimeout: 10000, + socketTimeout: 30000, + }; + + // TLS-Optionen nur wenn nicht NONE + if (encryption !== 'NONE') { + transportOptions.tls = { rejectUnauthorized }; + } else { + // Keine Verschlüsselung: STARTTLS ignorieren + transportOptions.ignoreTLS = true; + } + + // Bei STARTTLS: requireTLS erzwingen + if (encryption === 'STARTTLS') { + transportOptions.requireTLS = true; + } + + // Debug-Logging für Entwicklung + console.log(`[SMTP] Connecting to ${credentials.host}:${credentials.port} (${encryption}), user: ${credentials.user}`); + + // Transporter erstellen + const transporter: Transporter = nodemailer.createTransport(transportOptions); + + try { + // E-Mail-Optionen zusammenstellen + const mailOptions: nodemailer.SendMailOptions = { + from: fromAddress, + to: Array.isArray(params.to) ? params.to.join(', ') : params.to, + subject: params.subject, + }; + + // CC hinzufügen falls vorhanden + if (params.cc) { + mailOptions.cc = Array.isArray(params.cc) ? params.cc.join(', ') : params.cc; + } + + // Body hinzufügen + if (params.html) { + mailOptions.html = params.html; + // Auch Text-Version für Clients ohne HTML-Support + mailOptions.text = params.text || stripHtml(params.html); + } else if (params.text) { + mailOptions.text = params.text; + } + + // Threading-Header für Antworten + if (params.inReplyTo) { + mailOptions.inReplyTo = params.inReplyTo; + } + if (params.references && params.references.length > 0) { + mailOptions.references = params.references.join(' '); + } + + // Anhänge hinzufügen + if (params.attachments && params.attachments.length > 0) { + mailOptions.attachments = params.attachments.map((att) => ({ + filename: att.filename, + content: Buffer.from(att.content, 'base64'), + contentType: att.contentType, + })); + } + + // E-Mail senden + const result = await transporter.sendMail(mailOptions); + + // Raw E-Mail für IMAP-Speicherung bauen (mit tatsächlicher Message-ID) + let rawEmail: Buffer | undefined; + try { + const composerOptions = { + ...mailOptions, + messageId: result.messageId, // Tatsächliche Message-ID vom Server + }; + const composer = new MailComposer(composerOptions); + rawEmail = await composer.compile().build(); + } catch (compileError) { + console.error('Error compiling raw email:', compileError); + // Nicht kritisch - E-Mail wurde trotzdem gesendet + } + + return { + success: true, + messageId: result.messageId, + rawEmail, + }; + } catch (error) { + console.error('SMTP sendEmail error:', error); + + // Bessere Fehlermeldungen + let errorMessage = 'Unbekannter Fehler beim E-Mail-Versand'; + + if (error instanceof Error) { + const msg = error.message.toLowerCase(); + const errorCode = (error as NodeJS.ErrnoException).code?.toLowerCase() || ''; + + if (msg.includes('authentication') || msg.includes('auth') || msg.includes('login')) { + errorMessage = 'SMTP-Authentifizierung fehlgeschlagen - Zugangsdaten prüfen'; + } else if (msg.includes('econnrefused') || errorCode === 'econnrefused') { + errorMessage = `SMTP-Server nicht erreichbar: ${credentials.host}:${credentials.port} - Verbindung verweigert`; + } else if (msg.includes('greeting never received') || msg.includes('etimedout') || errorCode === 'etimedout') { + // Detaillierte Fehlermeldung je nach Port/Verschlüsselung + const enc = credentials.encryption ?? 'SSL'; + if (enc === 'STARTTLS' && credentials.port === 587) { + errorMessage = `SMTP-Verbindung zu Port 587 fehlgeschlagen - STARTTLS (Submission) ist möglicherweise nicht aktiviert auf ${credentials.host}`; + } else if (enc === 'NONE' && credentials.port === 25) { + errorMessage = `SMTP-Verbindung zu Port 25 fehlgeschlagen - Port möglicherweise blockiert oder nicht erreichbar auf ${credentials.host}`; + } else { + errorMessage = `SMTP-Verbindung zu ${credentials.host}:${credentials.port} fehlgeschlagen - Port nicht erreichbar oder Timeout`; + } + } else if (msg.includes('timeout')) { + errorMessage = `SMTP-Verbindung: Zeitüberschreitung bei ${credentials.host}:${credentials.port}`; + } else if (msg.includes('recipient') || msg.includes('rejected')) { + errorMessage = 'Empfänger-Adresse wurde vom Server abgelehnt'; + } else if (msg.includes('certificate') || msg.includes('cert')) { + errorMessage = 'SSL-Zertifikatfehler - Aktiviere "Selbstsignierte Zertifikate erlauben" in den Provider-Einstellungen'; + } else if (msg.includes('socket close') || msg.includes('socket hang up') || msg.includes('econnreset') || errorCode === 'econnreset') { + // Server schließt Verbindung unerwartet - oft TLS-Problem bei STARTTLS + const enc = credentials.encryption ?? 'SSL'; + if (enc === 'STARTTLS') { + errorMessage = `SMTP-Verbindung abgebrochen bei STARTTLS - Aktiviere "Selbstsignierte Zertifikate erlauben" oder verwende SSL/TLS auf Port 465`; + } else { + errorMessage = `SMTP-Verbindung unerwartet geschlossen von ${credentials.host}:${credentials.port}`; + } + } else { + errorMessage = error.message; + } + } + + return { + success: false, + error: errorMessage, + }; + } finally { + // Transporter schließen + transporter.close(); + } +} + +// SMTP-Verbindung testen +export async function testSmtpConnection(credentials: SmtpCredentials): Promise { + // Verschlüsselungs-Einstellungen basierend auf Modus + const encryption = credentials.encryption ?? 'SSL'; + const rejectUnauthorized = !credentials.allowSelfSignedCerts; + + const transportOptions: nodemailer.TransportOptions & { + host: string; + port: number; + secure: boolean; + auth: { user: string; pass: string }; + tls?: { rejectUnauthorized: boolean }; + ignoreTLS?: boolean; + connectionTimeout: number; + greetingTimeout: number; + } = { + host: credentials.host, + port: credentials.port, + secure: encryption === 'SSL', + auth: { + user: credentials.user, + pass: credentials.password, + }, + connectionTimeout: 10000, + greetingTimeout: 10000, + }; + + if (encryption !== 'NONE') { + transportOptions.tls = { rejectUnauthorized }; + } else { + transportOptions.ignoreTLS = true; + } + + const transporter: Transporter = nodemailer.createTransport(transportOptions); + + try { + // Verbindung verifizieren + await transporter.verify(); + } catch (error) { + if (error instanceof Error) { + const msg = error.message.toLowerCase(); + const errorCode = (error as NodeJS.ErrnoException).code?.toLowerCase() || ''; + + if (msg.includes('authentication') || msg.includes('auth') || msg.includes('login')) { + throw new Error('SMTP-Authentifizierung fehlgeschlagen'); + } + if (msg.includes('econnrefused') || errorCode === 'econnrefused') { + throw new Error(`SMTP-Server nicht erreichbar: ${credentials.host}:${credentials.port} - Verbindung verweigert`); + } + if (msg.includes('greeting never received') || msg.includes('etimedout') || errorCode === 'etimedout') { + if (encryption === 'STARTTLS' && credentials.port === 587) { + throw new Error(`SMTP Port 587 (STARTTLS/Submission) ist nicht erreichbar - In Plesk unter Tools & Settings > Mail Server Settings aktivieren`); + } else if (encryption === 'NONE' && credentials.port === 25) { + throw new Error(`SMTP Port 25 ist nicht erreichbar auf ${credentials.host}`); + } else { + throw new Error(`SMTP-Verbindung zu ${credentials.host}:${credentials.port} fehlgeschlagen - Port nicht erreichbar`); + } + } + if (msg.includes('certificate') || msg.includes('cert')) { + throw new Error('SSL-Zertifikatfehler - Aktiviere "Selbstsignierte Zertifikate erlauben"'); + } + } + + throw error; + } finally { + transporter.close(); + } +} + +// Helper: HTML zu Text konvertieren (einfache Version) +function stripHtml(html: string): string { + return html + // Zeilenumbrüche für Block-Elemente + .replace(//gi, '\n') + .replace(/<\/p>/gi, '\n\n') + .replace(/<\/div>/gi, '\n') + .replace(/<\/li>/gi, '\n') + // Alle HTML-Tags entfernen + .replace(/<[^>]+>/g, '') + // HTML-Entities dekodieren + .replace(/ /g, ' ') + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + // Mehrfache Leerzeilen reduzieren + .replace(/\n{3,}/g, '\n\n') + .trim(); +} diff --git a/backend/src/services/stressfreiEmail.service.ts b/backend/src/services/stressfreiEmail.service.ts index 2ee9e007..3b906af8 100644 --- a/backend/src/services/stressfreiEmail.service.ts +++ b/backend/src/services/stressfreiEmail.service.ts @@ -1,4 +1,14 @@ import { PrismaClient } from '@prisma/client'; +import { encrypt, decrypt } from '../utils/encryption.js'; +import { + provisionEmail, + provisionEmailWithMailbox, + enableMailboxForExistingEmail, + checkEmailExists, + getProviderDomain, + updateMailboxPassword, +} from './emailProvider/emailProviderService.js'; +import { generateSecurePassword } from '../utils/passwordGenerator.js'; const prisma = new PrismaClient(); @@ -13,22 +23,116 @@ export async function getEmailsByCustomerId(customerId: number, includeInactive }); } +// Mit Mailbox-Status für E-Mail-Client +export async function getEmailsWithMailboxByCustomerId(customerId: number) { + return prisma.stressfreiEmail.findMany({ + where: { + customerId, + isActive: true, + hasMailbox: true, + }, + select: { + id: true, + email: true, + notes: true, + hasMailbox: true, + _count: { + select: { + cachedEmails: true, + }, + }, + }, + orderBy: { email: 'asc' }, + }); +} + export async function getEmailById(id: number) { return prisma.stressfreiEmail.findUnique({ where: { id }, }); } -export async function createEmail(data: { +// E-Mail mit Mailbox-Status laden +export async function getEmailWithMailboxById(id: number) { + return prisma.stressfreiEmail.findUnique({ + where: { id }, + select: { + id: true, + customerId: true, + email: true, + platform: true, + notes: true, + isActive: true, + hasMailbox: true, + emailPasswordEncrypted: true, + createdAt: true, + updatedAt: true, + }, + }); +} + +export interface CreateEmailData { customerId: number; email: string; platform?: string; notes?: string; -}) { + provisionAtProvider?: boolean; + createMailbox?: boolean; +} + +export async function createEmail(data: CreateEmailData) { + const { provisionAtProvider, createMailbox, ...emailData } = data; + + // Falls beim Provider anlegen gewünscht + if (provisionAtProvider) { + // Kunde laden für Weiterleitung + const customer = await prisma.customer.findUnique({ + where: { id: data.customerId }, + select: { email: true }, + }); + + if (!customer?.email) { + throw new Error('Kunde hat keine E-Mail-Adresse für Weiterleitung'); + } + + // LocalPart extrahieren + const localPart = data.email.split('@')[0]; + + if (createMailbox) { + // Mit echter Mailbox anlegen + const password = generateSecurePassword(); + const result = await provisionEmailWithMailbox(localPart, customer.email, password); + + if (!result.success) { + throw new Error(result.error || 'Fehler beim Anlegen der Mailbox'); + } + + // Passwort verschlüsseln und speichern + const passwordEncrypted = encrypt(password); + + return prisma.stressfreiEmail.create({ + data: { + ...emailData, + isActive: true, + hasMailbox: true, + emailPasswordEncrypted: passwordEncrypted, + }, + }); + } else { + // Nur Weiterleitung anlegen + const result = await provisionEmail(localPart, customer.email); + + if (!result.success && !result.message?.includes('existiert bereits')) { + throw new Error(result.error || 'Fehler beim Anlegen der E-Mail'); + } + } + } + return prisma.stressfreiEmail.create({ data: { - ...data, + ...emailData, isActive: true, + hasMailbox: createMailbox || false, }, }); } @@ -51,3 +155,136 @@ export async function updateEmail( export async function deleteEmail(id: number) { return prisma.stressfreiEmail.delete({ where: { id } }); } + +// Mailbox nachträglich aktivieren (für existierende E-Mail-Weiterleitung) +export async function enableMailbox(id: number): Promise<{ success: boolean; error?: string }> { + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id }, + }); + + if (!stressfreiEmail) { + return { success: false, error: 'StressfreiEmail nicht gefunden' }; + } + + if (stressfreiEmail.hasMailbox) { + return { success: false, error: 'Mailbox ist bereits aktiviert' }; + } + + const localPart = stressfreiEmail.email.split('@')[0]; + const password = generateSecurePassword(); + + // Mailbox für existierende E-Mail aktivieren (nicht neu erstellen!) + const result = await enableMailboxForExistingEmail(localPart, password); + + if (!result.success) { + return { success: false, error: result.error || 'Fehler beim Aktivieren der Mailbox' }; + } + + // Passwort verschlüsseln und speichern + const passwordEncrypted = encrypt(password); + + await prisma.stressfreiEmail.update({ + where: { id }, + data: { + hasMailbox: true, + emailPasswordEncrypted: passwordEncrypted, + }, + }); + + return { success: true }; +} + +// Mailbox-Status mit Provider synchronisieren +export async function syncMailboxStatus(id: number): Promise<{ + success: boolean; + hasMailbox?: boolean; + wasUpdated?: boolean; + error?: string +}> { + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id }, + select: { email: true, hasMailbox: true }, + }); + + if (!stressfreiEmail) { + return { success: false, error: 'StressfreiEmail nicht gefunden' }; + } + + const localPart = stressfreiEmail.email.split('@')[0]; + + // Provider-Status prüfen + const providerStatus = await checkEmailExists(localPart); + + if (!providerStatus.exists) { + return { success: true, hasMailbox: false, wasUpdated: false }; + } + + const providerHasMailbox = providerStatus.hasMailbox === true; + + // DB aktualisieren wenn Status abweicht + if (stressfreiEmail.hasMailbox !== providerHasMailbox) { + await prisma.stressfreiEmail.update({ + where: { id }, + data: { hasMailbox: providerHasMailbox }, + }); + console.log(`Mailbox-Status für ${stressfreiEmail.email} aktualisiert: ${stressfreiEmail.hasMailbox} -> ${providerHasMailbox}`); + return { success: true, hasMailbox: providerHasMailbox, wasUpdated: true }; + } + + return { success: true, hasMailbox: providerHasMailbox, wasUpdated: false }; +} + +// Passwort für IMAP/SMTP-Zugang entschlüsseln (nur für autorisierte Nutzung) +export async function getDecryptedPassword(id: number): Promise { + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id }, + select: { emailPasswordEncrypted: true }, + }); + + if (!stressfreiEmail?.emailPasswordEncrypted) { + return null; + } + + try { + return decrypt(stressfreiEmail.emailPasswordEncrypted); + } catch { + console.error('Fehler beim Entschlüsseln des Passworts'); + return null; + } +} + +// Passwort neu generieren und beim Provider setzen +export async function resetMailboxPassword(id: number): Promise<{ success: boolean; password?: string; error?: string }> { + const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ + where: { id }, + select: { email: true, hasMailbox: true }, + }); + + if (!stressfreiEmail) { + return { success: false, error: 'StressfreiEmail nicht gefunden' }; + } + + if (!stressfreiEmail.hasMailbox) { + return { success: false, error: 'Keine Mailbox für diese E-Mail-Adresse' }; + } + + // Neues Passwort generieren + const newPassword = generateSecurePassword(); + const localPart = stressfreiEmail.email.split('@')[0]; + + // Passwort beim Provider ändern + const providerResult = await updateMailboxPassword(localPart, newPassword); + if (!providerResult.success) { + return { success: false, error: providerResult.error || 'Fehler beim Aktualisieren des Passworts beim Provider' }; + } + + // Passwort verschlüsseln und lokal speichern + const passwordEncrypted = encrypt(newPassword); + + await prisma.stressfreiEmail.update({ + where: { id }, + data: { emailPasswordEncrypted: passwordEncrypted }, + }); + + return { success: true, password: newPassword }; +} diff --git a/backend/src/services/user.service.ts b/backend/src/services/user.service.ts index c0d68eb6..5582e50b 100644 --- a/backend/src/services/user.service.ts +++ b/backend/src/services/user.service.ts @@ -134,10 +134,11 @@ export async function createUser(data: { lastName: string; roleIds: number[]; customerId?: number; + hasDeveloperAccess?: boolean; }) { const hashedPassword = await bcrypt.hash(data.password, 10); - return prisma.user.create({ + const user = await prisma.user.create({ data: { email: data.email, password: hashedPassword, @@ -160,6 +161,13 @@ export async function createUser(data: { }, }, }); + + // Entwicklerzugriff setzen falls aktiviert + if (data.hasDeveloperAccess) { + await setUserDeveloperAccess(user.id, true); + } + + return user; } export async function updateUser( @@ -270,10 +278,28 @@ export async function updateUser( (userData as Record).password = await bcrypt.hash(password, 10); } - // Update user + // Prüfen ob Rollen geändert werden (für Zwangslogout) + let rolesChanged = false; + if (roleIds !== undefined) { + const currentRoles = await prisma.userRole.findMany({ + where: { userId: id }, + select: { roleId: true }, + }); + const currentRoleIds = currentRoles.map((r) => r.roleId).sort(); + const newRoleIds = [...roleIds].sort(); + rolesChanged = + currentRoleIds.length !== newRoleIds.length || + !currentRoleIds.every((id, i) => id === newRoleIds[i]); + } + + // Update user - bei Rollenänderung Token invalidieren await prisma.user.update({ where: { id }, - data: userData, + data: { + ...userData, + // Token invalidieren wenn Rollen geändert werden + ...(rolesChanged && { tokenInvalidatedAt: new Date() }), + }, }); // Update roles if provided @@ -338,12 +364,22 @@ async function setUserDeveloperAccess(userId: number, enabled: boolean) { await prisma.userRole.create({ data: { userId, roleId: developerRole.id }, }); + // Token invalidieren bei Rechteänderung + await prisma.user.update({ + where: { id: userId }, + data: { tokenInvalidatedAt: new Date() }, + }); } else if (!enabled && hasRole) { // Remove Developer role console.log('Removing Developer role'); await prisma.userRole.delete({ where: { userId_roleId: { userId, roleId: developerRole.id } }, }); + // Token invalidieren bei Rechteänderung + await prisma.user.update({ + where: { id: userId }, + data: { tokenInvalidatedAt: new Date() }, + }); } else { console.log('No action needed - enabled:', enabled, 'hasRole:', !!hasRole); } diff --git a/backend/src/types/index.ts b/backend/src/types/index.ts index 53dd15e7..e5d4d2b8 100644 --- a/backend/src/types/index.ts +++ b/backend/src/types/index.ts @@ -7,6 +7,7 @@ export interface JwtPayload { customerId?: number; // Eigene Kunden-ID (bei Kundenportal-Login) isCustomerPortal?: boolean; // Ist dies ein Kundenportal-Login? representedCustomerIds?: number[]; // IDs der Kunden, die dieser Kunde vertreten kann + iat?: number; // Token ausgestellt am (Unix Timestamp, automatisch von JWT) } export interface AuthRequest extends Request { diff --git a/backend/src/utils/passwordGenerator.ts b/backend/src/utils/passwordGenerator.ts new file mode 100644 index 00000000..3364ab3a --- /dev/null +++ b/backend/src/utils/passwordGenerator.ts @@ -0,0 +1,101 @@ +// ==================== PASSWORD GENERATOR ==================== +// Generiert sichere, zufällige Passwörter + +import { randomBytes } from 'crypto'; + +// Zeichensätze für Passwort-Generierung +const LOWERCASE = 'abcdefghijklmnopqrstuvwxyz'; +const UPPERCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; +const NUMBERS = '0123456789'; +const SPECIAL = '!@#$%^&*()_+-=[]{}|;:,.<>?'; + +// Standard-Passwortlänge +const DEFAULT_LENGTH = 16; + +export interface PasswordOptions { + length?: number; + includeLowercase?: boolean; + includeUppercase?: boolean; + includeNumbers?: boolean; + includeSpecial?: boolean; +} + +/** + * Generiert ein kryptografisch sicheres Passwort + */ +export function generateSecurePassword(options: PasswordOptions = {}): string { + const { + length = DEFAULT_LENGTH, + includeLowercase = true, + includeUppercase = true, + includeNumbers = true, + includeSpecial = true, + } = options; + + // Zeichensatz zusammenstellen + let charset = ''; + const requiredChars: string[] = []; + + if (includeLowercase) { + charset += LOWERCASE; + requiredChars.push(getRandomChar(LOWERCASE)); + } + if (includeUppercase) { + charset += UPPERCASE; + requiredChars.push(getRandomChar(UPPERCASE)); + } + if (includeNumbers) { + charset += NUMBERS; + requiredChars.push(getRandomChar(NUMBERS)); + } + if (includeSpecial) { + charset += SPECIAL; + requiredChars.push(getRandomChar(SPECIAL)); + } + + if (charset.length === 0) { + throw new Error('Mindestens ein Zeichensatz muss aktiviert sein'); + } + + // Restliche Zeichen auffüllen + const remainingLength = Math.max(0, length - requiredChars.length); + const randomChars: string[] = []; + + for (let i = 0; i < remainingLength; i++) { + randomChars.push(getRandomChar(charset)); + } + + // Alle Zeichen mischen (Fisher-Yates Shuffle) + const allChars = [...requiredChars, ...randomChars]; + for (let i = allChars.length - 1; i > 0; i--) { + const j = getRandomInt(i + 1); + [allChars[i], allChars[j]] = [allChars[j], allChars[i]]; + } + + return allChars.join(''); +} + +/** + * Generiert ein einfaches Passwort ohne Sonderzeichen (für APIs die das nicht mögen) + */ +export function generateSimplePassword(length = 12): string { + return generateSecurePassword({ + length, + includeLowercase: true, + includeUppercase: true, + includeNumbers: true, + includeSpecial: false, + }); +} + +// Kryptografisch sichere Zufallszahl +function getRandomInt(max: number): number { + const bytes = randomBytes(4); + const value = bytes.readUInt32BE(0); + return value % max; +} + +// Zufälliges Zeichen aus einem Zeichensatz +function getRandomChar(charset: string): string { + return charset[getRandomInt(charset.length)]; +} diff --git a/frontend/dist/assets/index-B7w5p8ZY.css b/frontend/dist/assets/index-B7w5p8ZY.css new file mode 100644 index 00000000..22e7a7cb --- /dev/null +++ b/frontend/dist/assets/index-B7w5p8ZY.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-3{left:.75rem}.left-4{left:1rem}.right-0{right:0}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.z-10{z-index:10}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-3{margin-top:.75rem;margin-bottom:.75rem}.-mb-6{margin-bottom:-1.5rem}.-mb-px{margin-bottom:-1px}.-ml-1{margin-left:-.25rem}.-mt-2{margin-top:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-10{margin-left:2.5rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-\[85vh\]{height:85vh}.h-full{height:100%}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-80{max-height:20rem}.max-h-\[600px\]{max-height:600px}.max-h-\[60vh\]{max-height:60vh}.max-h-\[90vh\]{max-height:90vh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2\/5{width:40%}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[90vw\]{width:90vw}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2rem * var(--tw-space-x-reverse));margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-0{border-left-width:0px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-blue-100{--tw-border-opacity: 1;border-color:rgb(219 234 254 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-green-300{--tw-border-opacity: 1;border-color:rgb(134 239 172 / var(--tw-border-opacity, 1))}.border-purple-300{--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-red-400{--tw-border-opacity: 1;border-color:rgb(248 113 113 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-600{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-yellow-300{--tw-border-opacity: 1;border-color:rgb(253 224 71 / var(--tw-border-opacity, 1))}.border-l-blue-500{--tw-border-opacity: 1;border-left-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/50{background-color:#00000080}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-50\/50{background-color:#f9fafb80}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-purple-600{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.fill-current{fill:currentColor}.\!p-4{padding:1rem!important}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-wider{letter-spacing:.05em}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-gray-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.ring-offset-2{--tw-ring-offset-width: 2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}body{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:h-5:after{content:var(--tw-content);height:1.25rem}.after\:w-5:after{content:var(--tw-content);width:1.25rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:border:after{content:var(--tw-content);border-width:1px}.after\:border-gray-300:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-blue-300:hover{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.hover\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.hover\:bg-green-100:hover{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-opacity-50:hover{--tw-bg-opacity: .5}.hover\:text-blue-600:hover{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-green-600:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:text-yellow-600:hover{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:border-red-500:focus{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus\:ring-gray-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1))}.focus\:ring-purple-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(168 85 247 / var(--tw-ring-opacity, 1))}.focus\:ring-red-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.group\/subtask:hover .group-hover\/subtask\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}.peer:checked~.peer-checked\:bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.peer:checked~.peer-checked\:after\:translate-x-full:after{content:var(--tw-content);--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:checked~.peer-checked\:after\:border-white:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\:ring-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.peer:focus~.peer-focus\:ring-blue-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1))}@media (min-width: 640px){.sm\:w-auto{width:auto}}@media (min-width: 768px){.md\:col-span-2{grid-column:span 2 / span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:col-span-1{grid-column:span 1 / span 1}.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:block{display:block}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}} diff --git a/frontend/dist/assets/index-CitfypIw.js b/frontend/dist/assets/index-CitfypIw.js new file mode 100644 index 00000000..06d2595d --- /dev/null +++ b/frontend/dist/assets/index-CitfypIw.js @@ -0,0 +1,678 @@ +var Lh=e=>{throw TypeError(e)};var vc=(e,t,n)=>t.has(e)||Lh("Cannot "+n);var D=(e,t,n)=>(vc(e,t,"read from private field"),n?n.call(e):t.get(e)),me=(e,t,n)=>t.has(e)?Lh("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),re=(e,t,n,r)=>(vc(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),be=(e,t,n)=>(vc(e,t,"access private method"),n);var xl=(e,t,n,r)=>({set _(a){re(e,t,a,n)},get _(){return D(e,t,r)}});function X0(e,t){for(var n=0;nr[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const i of a)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(a){const i={};return a.integrity&&(i.integrity=a.integrity),a.referrerPolicy&&(i.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?i.credentials="include":a.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(a){if(a.ep)return;a.ep=!0;const i=n(a);fetch(a.href,i)}})();function Y0(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var px={exports:{}},zo={},xx={exports:{}},Se={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Yi=Symbol.for("react.element"),ev=Symbol.for("react.portal"),tv=Symbol.for("react.fragment"),sv=Symbol.for("react.strict_mode"),nv=Symbol.for("react.profiler"),rv=Symbol.for("react.provider"),av=Symbol.for("react.context"),iv=Symbol.for("react.forward_ref"),lv=Symbol.for("react.suspense"),ov=Symbol.for("react.memo"),cv=Symbol.for("react.lazy"),Rh=Symbol.iterator;function uv(e){return e===null||typeof e!="object"?null:(e=Rh&&e[Rh]||e["@@iterator"],typeof e=="function"?e:null)}var gx={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},yx=Object.assign,vx={};function Oa(e,t,n){this.props=e,this.context=t,this.refs=vx,this.updater=n||gx}Oa.prototype.isReactComponent={};Oa.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Oa.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function jx(){}jx.prototype=Oa.prototype;function Dd(e,t,n){this.props=e,this.context=t,this.refs=vx,this.updater=n||gx}var Pd=Dd.prototype=new jx;Pd.constructor=Dd;yx(Pd,Oa.prototype);Pd.isPureReactComponent=!0;var Oh=Array.isArray,bx=Object.prototype.hasOwnProperty,Ad={current:null},Nx={key:!0,ref:!0,__self:!0,__source:!0};function wx(e,t,n){var r,a={},i=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&(i=""+t.key),t)bx.call(t,r)&&!Nx.hasOwnProperty(r)&&(a[r]=t[r]);var o=arguments.length-2;if(o===1)a.children=n;else if(1>>1,ue=R[fe];if(0>>1;fea(ke,ee))Aea(rt,ke)?(R[fe]=rt,R[Ae]=ee,fe=Ae):(R[fe]=ke,R[H]=ee,fe=H);else if(Aea(rt,ee))R[fe]=rt,R[Ae]=ee,fe=Ae;else break e}}return Q}function a(R,Q){var ee=R.sortIndex-Q.sortIndex;return ee!==0?ee:R.id-Q.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var l=Date,o=l.now();e.unstable_now=function(){return l.now()-o}}var c=[],u=[],d=1,h=null,p=3,m=!1,f=!1,y=!1,N=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,g=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function x(R){for(var Q=n(u);Q!==null;){if(Q.callback===null)r(u);else if(Q.startTime<=R)r(u),Q.sortIndex=Q.expirationTime,t(c,Q);else break;Q=n(u)}}function j(R){if(y=!1,x(R),!f)if(n(c)!==null)f=!0,C(k);else{var Q=n(u);Q!==null&&w(j,Q.startTime-R)}}function k(R,Q){f=!1,y&&(y=!1,v(S),S=-1),m=!0;var ee=p;try{for(x(Q),h=n(c);h!==null&&(!(h.expirationTime>Q)||R&&!_());){var fe=h.callback;if(typeof fe=="function"){h.callback=null,p=h.priorityLevel;var ue=fe(h.expirationTime<=Q);Q=e.unstable_now(),typeof ue=="function"?h.callback=ue:h===n(c)&&r(c),x(Q)}else r(c);h=n(c)}if(h!==null)var nt=!0;else{var H=n(u);H!==null&&w(j,H.startTime-Q),nt=!1}return nt}finally{h=null,p=ee,m=!1}}var F=!1,E=null,S=-1,P=5,A=-1;function _(){return!(e.unstable_now()-AR||125fe?(R.sortIndex=ee,t(u,R),n(c)===null&&R===n(u)&&(y?(v(S),S=-1):y=!0,w(j,ee-fe))):(R.sortIndex=ue,t(c,R),f||m||(f=!0,C(k))),R},e.unstable_shouldYield=_,e.unstable_wrapCallback=function(R){var Q=p;return function(){var ee=p;p=Q;try{return R.apply(this,arguments)}finally{p=ee}}}})(Dx);Ex.exports=Dx;var Nv=Ex.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var wv=b,os=Nv;function Z(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ru=Object.prototype.hasOwnProperty,Sv=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,_h={},$h={};function kv(e){return ru.call($h,e)?!0:ru.call(_h,e)?!1:Sv.test(e)?$h[e]=!0:(_h[e]=!0,!1)}function Cv(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Ev(e,t,n,r){if(t===null||typeof t>"u"||Cv(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function qt(e,t,n,r,a,i,l){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=l}var Pt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Pt[e]=new qt(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Pt[t]=new qt(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Pt[e]=new qt(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Pt[e]=new qt(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Pt[e]=new qt(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Pt[e]=new qt(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Pt[e]=new qt(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Pt[e]=new qt(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Pt[e]=new qt(e,5,!1,e.toLowerCase(),null,!1,!1)});var Td=/[\-:]([a-z])/g;function Fd(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Td,Fd);Pt[t]=new qt(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Td,Fd);Pt[t]=new qt(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Td,Fd);Pt[t]=new qt(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Pt[e]=new qt(e,1,!1,e.toLowerCase(),null,!1,!1)});Pt.xlinkHref=new qt("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Pt[e]=new qt(e,1,!1,e.toLowerCase(),null,!0,!0)});function Id(e,t,n,r){var a=Pt.hasOwnProperty(t)?Pt[t]:null;(a!==null?a.type!==0:r||!(2o||a[l]!==i[o]){var c=` +`+a[l].replace(" at new "," at ");return e.displayName&&c.includes("")&&(c=c.replace("",e.displayName)),c}while(1<=l&&0<=o);break}}}finally{Nc=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?ri(e):""}function Dv(e){switch(e.tag){case 5:return ri(e.type);case 16:return ri("Lazy");case 13:return ri("Suspense");case 19:return ri("SuspenseList");case 0:case 2:case 15:return e=wc(e.type,!1),e;case 11:return e=wc(e.type.render,!1),e;case 1:return e=wc(e.type,!0),e;default:return""}}function ou(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Gr:return"Fragment";case Wr:return"Portal";case au:return"Profiler";case Ld:return"StrictMode";case iu:return"Suspense";case lu:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Mx:return(e.displayName||"Context")+".Consumer";case Ax:return(e._context.displayName||"Context")+".Provider";case Rd:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Od:return t=e.displayName||null,t!==null?t:ou(e.type)||"Memo";case En:t=e._payload,e=e._init;try{return ou(e(t))}catch{}}return null}function Pv(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ou(t);case 8:return t===Ld?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function tr(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Fx(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Av(e){var t=Fx(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var a=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(l){r=""+l,i.call(this,l)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(l){r=""+l},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function vl(e){e._valueTracker||(e._valueTracker=Av(e))}function Ix(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Fx(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function so(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function cu(e,t){var n=t.checked;return Ze({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Bh(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=tr(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Lx(e,t){t=t.checked,t!=null&&Id(e,"checked",t,!1)}function uu(e,t){Lx(e,t);var n=tr(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?du(e,t.type,n):t.hasOwnProperty("defaultValue")&&du(e,t.type,tr(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Kh(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function du(e,t,n){(t!=="number"||so(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var ai=Array.isArray;function la(e,t,n,r){if(e=e.options,t){t={};for(var a=0;a"+t.valueOf().toString()+"",t=jl.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function wi(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var ui={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Mv=["Webkit","ms","Moz","O"];Object.keys(ui).forEach(function(e){Mv.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ui[t]=ui[e]})});function _x(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||ui.hasOwnProperty(e)&&ui[e]?(""+t).trim():t+"px"}function $x(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,a=_x(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,a):e[n]=a}}var Tv=Ze({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function fu(e,t){if(t){if(Tv[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(Z(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(Z(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(Z(61))}if(t.style!=null&&typeof t.style!="object")throw Error(Z(62))}}function pu(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var xu=null;function zd(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var gu=null,oa=null,ca=null;function Qh(e){if(e=sl(e)){if(typeof gu!="function")throw Error(Z(280));var t=e.stateNode;t&&(t=Ko(t),gu(e.stateNode,e.type,t))}}function Ux(e){oa?ca?ca.push(e):ca=[e]:oa=e}function Bx(){if(oa){var e=oa,t=ca;if(ca=oa=null,Qh(e),t)for(e=0;e>>=0,e===0?32:31-(Kv(e)/qv|0)|0}var bl=64,Nl=4194304;function ii(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function io(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,a=e.suspendedLanes,i=e.pingedLanes,l=n&268435455;if(l!==0){var o=l&~a;o!==0?r=ii(o):(i&=l,i!==0&&(r=ii(i)))}else l=n&~a,l!==0?r=ii(l):i!==0&&(r=ii(i));if(r===0)return 0;if(t!==0&&t!==r&&!(t&a)&&(a=r&-r,i=t&-t,a>=i||a===16&&(i&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function el(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Ts(t),e[t]=n}function Wv(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=mi),tf=" ",sf=!1;function og(e,t){switch(e){case"keyup":return Nj.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function cg(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Zr=!1;function Sj(e,t){switch(e){case"compositionend":return cg(t);case"keypress":return t.which!==32?null:(sf=!0,tf);case"textInput":return e=t.data,e===tf&&sf?null:e;default:return null}}function kj(e,t){if(Zr)return e==="compositionend"||!Qd&&og(e,t)?(e=ig(),Ul=Kd=Bn=null,Zr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=lf(n)}}function hg(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?hg(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function fg(){for(var e=window,t=so();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=so(e.document)}return t}function Hd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Ij(e){var t=fg(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&hg(n.ownerDocument.documentElement,n)){if(r!==null&&Hd(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var a=n.textContent.length,i=Math.min(r.start,a);r=r.end===void 0?i:Math.min(r.end,a),!e.extend&&i>r&&(a=r,r=i,i=a),a=of(n,i);var l=of(n,r);a&&l&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==l.node||e.focusOffset!==l.offset)&&(t=t.createRange(),t.setStart(a.node,a.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(l.node,l.offset)):(t.setEnd(l.node,l.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Jr=null,wu=null,fi=null,Su=!1;function cf(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Su||Jr==null||Jr!==so(r)||(r=Jr,"selectionStart"in r&&Hd(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),fi&&Pi(fi,r)||(fi=r,r=co(wu,"onSelect"),0ea||(e.current=Au[ea],Au[ea]=null,ea--)}function Oe(e,t){ea++,Au[ea]=e.current,e.current=t}var sr={},Lt=ar(sr),Xt=ar(!1),Pr=sr;function Da(e,t){var n=e.type.contextTypes;if(!n)return sr;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a={},i;for(i in n)a[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Yt(e){return e=e.childContextTypes,e!=null}function mo(){Ue(Xt),Ue(Lt)}function xf(e,t,n){if(Lt.current!==sr)throw Error(Z(168));Oe(Lt,t),Oe(Xt,n)}function wg(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var a in r)if(!(a in t))throw Error(Z(108,Pv(e)||"Unknown",a));return Ze({},n,r)}function ho(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||sr,Pr=Lt.current,Oe(Lt,e),Oe(Xt,Xt.current),!0}function gf(e,t,n){var r=e.stateNode;if(!r)throw Error(Z(169));n?(e=wg(e,t,Pr),r.__reactInternalMemoizedMergedChildContext=e,Ue(Xt),Ue(Lt),Oe(Lt,e)):Ue(Xt),Oe(Xt,n)}var tn=null,qo=!1,Oc=!1;function Sg(e){tn===null?tn=[e]:tn.push(e)}function Qj(e){qo=!0,Sg(e)}function ir(){if(!Oc&&tn!==null){Oc=!0;var e=0,t=Ie;try{var n=tn;for(Ie=1;e>=l,a-=l,on=1<<32-Ts(t)+a|n<S?(P=E,E=null):P=E.sibling;var A=p(v,E,x[S],j);if(A===null){E===null&&(E=P);break}e&&E&&A.alternate===null&&t(v,E),g=i(A,g,S),F===null?k=A:F.sibling=A,F=A,E=P}if(S===x.length)return n(v,E),Ve&&cr(v,S),k;if(E===null){for(;SS?(P=E,E=null):P=E.sibling;var _=p(v,E,A.value,j);if(_===null){E===null&&(E=P);break}e&&E&&_.alternate===null&&t(v,E),g=i(_,g,S),F===null?k=_:F.sibling=_,F=_,E=P}if(A.done)return n(v,E),Ve&&cr(v,S),k;if(E===null){for(;!A.done;S++,A=x.next())A=h(v,A.value,j),A!==null&&(g=i(A,g,S),F===null?k=A:F.sibling=A,F=A);return Ve&&cr(v,S),k}for(E=r(v,E);!A.done;S++,A=x.next())A=m(E,v,S,A.value,j),A!==null&&(e&&A.alternate!==null&&E.delete(A.key===null?S:A.key),g=i(A,g,S),F===null?k=A:F.sibling=A,F=A);return e&&E.forEach(function(L){return t(v,L)}),Ve&&cr(v,S),k}function N(v,g,x,j){if(typeof x=="object"&&x!==null&&x.type===Gr&&x.key===null&&(x=x.props.children),typeof x=="object"&&x!==null){switch(x.$$typeof){case yl:e:{for(var k=x.key,F=g;F!==null;){if(F.key===k){if(k=x.type,k===Gr){if(F.tag===7){n(v,F.sibling),g=a(F,x.props.children),g.return=v,v=g;break e}}else if(F.elementType===k||typeof k=="object"&&k!==null&&k.$$typeof===En&&jf(k)===F.type){n(v,F.sibling),g=a(F,x.props),g.ref=Ya(v,F,x),g.return=v,v=g;break e}n(v,F);break}else t(v,F);F=F.sibling}x.type===Gr?(g=Er(x.props.children,v.mode,j,x.key),g.return=v,v=g):(j=Gl(x.type,x.key,x.props,null,v.mode,j),j.ref=Ya(v,g,x),j.return=v,v=j)}return l(v);case Wr:e:{for(F=x.key;g!==null;){if(g.key===F)if(g.tag===4&&g.stateNode.containerInfo===x.containerInfo&&g.stateNode.implementation===x.implementation){n(v,g.sibling),g=a(g,x.children||[]),g.return=v,v=g;break e}else{n(v,g);break}else t(v,g);g=g.sibling}g=Vc(x,v.mode,j),g.return=v,v=g}return l(v);case En:return F=x._init,N(v,g,F(x._payload),j)}if(ai(x))return f(v,g,x,j);if(Wa(x))return y(v,g,x,j);Pl(v,x)}return typeof x=="string"&&x!==""||typeof x=="number"?(x=""+x,g!==null&&g.tag===6?(n(v,g.sibling),g=a(g,x),g.return=v,v=g):(n(v,g),g=qc(x,v.mode,j),g.return=v,v=g),l(v)):n(v,g)}return N}var Aa=Dg(!0),Pg=Dg(!1),xo=ar(null),go=null,na=null,Jd=null;function Xd(){Jd=na=go=null}function Yd(e){var t=xo.current;Ue(xo),e._currentValue=t}function Fu(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function da(e,t){go=e,Jd=na=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(Jt=!0),e.firstContext=null)}function vs(e){var t=e._currentValue;if(Jd!==e)if(e={context:e,memoizedValue:t,next:null},na===null){if(go===null)throw Error(Z(308));na=e,go.dependencies={lanes:0,firstContext:e}}else na=na.next=e;return t}var mr=null;function em(e){mr===null?mr=[e]:mr.push(e)}function Ag(e,t,n,r){var a=t.interleaved;return a===null?(n.next=n,em(t)):(n.next=a.next,a.next=n),t.interleaved=n,xn(e,r)}function xn(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var Dn=!1;function tm(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Mg(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function dn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Gn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,Pe&2){var a=r.pending;return a===null?t.next=t:(t.next=a.next,a.next=t),r.pending=t,xn(e,n)}return a=r.interleaved,a===null?(t.next=t,em(r)):(t.next=a.next,a.next=t),r.interleaved=t,xn(e,n)}function Kl(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,$d(e,n)}}function bf(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var a=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var l={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?a=i=l:i=i.next=l,n=n.next}while(n!==null);i===null?a=i=t:i=i.next=t}else a=i=t;n={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function yo(e,t,n,r){var a=e.updateQueue;Dn=!1;var i=a.firstBaseUpdate,l=a.lastBaseUpdate,o=a.shared.pending;if(o!==null){a.shared.pending=null;var c=o,u=c.next;c.next=null,l===null?i=u:l.next=u,l=c;var d=e.alternate;d!==null&&(d=d.updateQueue,o=d.lastBaseUpdate,o!==l&&(o===null?d.firstBaseUpdate=u:o.next=u,d.lastBaseUpdate=c))}if(i!==null){var h=a.baseState;l=0,d=u=c=null,o=i;do{var p=o.lane,m=o.eventTime;if((r&p)===p){d!==null&&(d=d.next={eventTime:m,lane:0,tag:o.tag,payload:o.payload,callback:o.callback,next:null});e:{var f=e,y=o;switch(p=t,m=n,y.tag){case 1:if(f=y.payload,typeof f=="function"){h=f.call(m,h,p);break e}h=f;break e;case 3:f.flags=f.flags&-65537|128;case 0:if(f=y.payload,p=typeof f=="function"?f.call(m,h,p):f,p==null)break e;h=Ze({},h,p);break e;case 2:Dn=!0}}o.callback!==null&&o.lane!==0&&(e.flags|=64,p=a.effects,p===null?a.effects=[o]:p.push(o))}else m={eventTime:m,lane:p,tag:o.tag,payload:o.payload,callback:o.callback,next:null},d===null?(u=d=m,c=h):d=d.next=m,l|=p;if(o=o.next,o===null){if(o=a.shared.pending,o===null)break;p=o,o=p.next,p.next=null,a.lastBaseUpdate=p,a.shared.pending=null}}while(!0);if(d===null&&(c=h),a.baseState=c,a.firstBaseUpdate=u,a.lastBaseUpdate=d,t=a.shared.interleaved,t!==null){a=t;do l|=a.lane,a=a.next;while(a!==t)}else i===null&&(a.shared.lanes=0);Tr|=l,e.lanes=l,e.memoizedState=h}}function Nf(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=_c.transition;_c.transition={};try{e(!1),t()}finally{Ie=n,_c.transition=r}}function Wg(){return js().memoizedState}function Zj(e,t,n){var r=Jn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Gg(e))Zg(t,n);else if(n=Ag(e,t,n,r),n!==null){var a=Bt();Fs(n,e,r,a),Jg(n,t,r)}}function Jj(e,t,n){var r=Jn(e),a={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Gg(e))Zg(t,a);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var l=t.lastRenderedState,o=i(l,n);if(a.hasEagerState=!0,a.eagerState=o,Is(o,l)){var c=t.interleaved;c===null?(a.next=a,em(t)):(a.next=c.next,c.next=a),t.interleaved=a;return}}catch{}finally{}n=Ag(e,t,a,r),n!==null&&(a=Bt(),Fs(n,e,r,a),Jg(n,t,r))}}function Gg(e){var t=e.alternate;return e===We||t!==null&&t===We}function Zg(e,t){pi=jo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Jg(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,$d(e,n)}}var bo={readContext:vs,useCallback:Mt,useContext:Mt,useEffect:Mt,useImperativeHandle:Mt,useInsertionEffect:Mt,useLayoutEffect:Mt,useMemo:Mt,useReducer:Mt,useRef:Mt,useState:Mt,useDebugValue:Mt,useDeferredValue:Mt,useTransition:Mt,useMutableSource:Mt,useSyncExternalStore:Mt,useId:Mt,unstable_isNewReconciler:!1},Xj={readContext:vs,useCallback:function(e,t){return zs().memoizedState=[e,t===void 0?null:t],e},useContext:vs,useEffect:Sf,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Vl(4194308,4,Kg.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Vl(4194308,4,e,t)},useInsertionEffect:function(e,t){return Vl(4,2,e,t)},useMemo:function(e,t){var n=zs();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=zs();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Zj.bind(null,We,e),[r.memoizedState,e]},useRef:function(e){var t=zs();return e={current:e},t.memoizedState=e},useState:wf,useDebugValue:cm,useDeferredValue:function(e){return zs().memoizedState=e},useTransition:function(){var e=wf(!1),t=e[0];return e=Gj.bind(null,e[1]),zs().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=We,a=zs();if(Ve){if(n===void 0)throw Error(Z(407));n=n()}else{if(n=t(),wt===null)throw Error(Z(349));Mr&30||Lg(r,t,n)}a.memoizedState=n;var i={value:n,getSnapshot:t};return a.queue=i,Sf(Og.bind(null,r,i,e),[e]),r.flags|=2048,Oi(9,Rg.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=zs(),t=wt.identifierPrefix;if(Ve){var n=cn,r=on;n=(r&~(1<<32-Ts(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Li++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),n==="select"&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[Ks]=t,e[Ti]=r,ly(e,t,!1,!1),t.stateNode=e;e:{switch(l=pu(n,r),n){case"dialog":_e("cancel",e),_e("close",e),a=r;break;case"iframe":case"object":case"embed":_e("load",e),a=r;break;case"video":case"audio":for(a=0;aFa&&(t.flags|=128,r=!0,ei(i,!1),t.lanes=4194304)}else{if(!r)if(e=vo(l),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),ei(i,!0),i.tail===null&&i.tailMode==="hidden"&&!l.alternate&&!Ve)return Tt(t),null}else 2*it()-i.renderingStartTime>Fa&&n!==1073741824&&(t.flags|=128,r=!0,ei(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(n=i.last,n!==null?n.sibling=l:t.child=l,i.last=l)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=it(),t.sibling=null,n=He.current,Oe(He,r?n&1|2:n&1),t):(Tt(t),null);case 22:case 23:return pm(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?ns&1073741824&&(Tt(t),t.subtreeFlags&6&&(t.flags|=8192)):Tt(t),null;case 24:return null;case 25:return null}throw Error(Z(156,t.tag))}function ib(e,t){switch(Gd(t),t.tag){case 1:return Yt(t.type)&&mo(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Ma(),Ue(Xt),Ue(Lt),rm(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return nm(t),null;case 13:if(Ue(He),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(Z(340));Pa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ue(He),null;case 4:return Ma(),null;case 10:return Yd(t.type._context),null;case 22:case 23:return pm(),null;case 24:return null;default:return null}}var Ml=!1,Ft=!1,lb=typeof WeakSet=="function"?WeakSet:Set,ie=null;function ra(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){tt(e,t,r)}else n.current=null}function Bu(e,t,n){try{n()}catch(r){tt(e,t,r)}}var Lf=!1;function ob(e,t){if(ku=lo,e=fg(),Hd(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var l=0,o=-1,c=-1,u=0,d=0,h=e,p=null;t:for(;;){for(var m;h!==n||a!==0&&h.nodeType!==3||(o=l+a),h!==i||r!==0&&h.nodeType!==3||(c=l+r),h.nodeType===3&&(l+=h.nodeValue.length),(m=h.firstChild)!==null;)p=h,h=m;for(;;){if(h===e)break t;if(p===n&&++u===a&&(o=l),p===i&&++d===r&&(c=l),(m=h.nextSibling)!==null)break;h=p,p=h.parentNode}h=m}n=o===-1||c===-1?null:{start:o,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(Cu={focusedElem:e,selectionRange:n},lo=!1,ie=t;ie!==null;)if(t=ie,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,ie=e;else for(;ie!==null;){t=ie;try{var f=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(f!==null){var y=f.memoizedProps,N=f.memoizedState,v=t.stateNode,g=v.getSnapshotBeforeUpdate(t.elementType===t.type?y:ws(t.type,y),N);v.__reactInternalSnapshotBeforeUpdate=g}break;case 3:var x=t.stateNode.containerInfo;x.nodeType===1?x.textContent="":x.nodeType===9&&x.documentElement&&x.removeChild(x.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(Z(163))}}catch(j){tt(t,t.return,j)}if(e=t.sibling,e!==null){e.return=t.return,ie=e;break}ie=t.return}return f=Lf,Lf=!1,f}function xi(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var a=r=r.next;do{if((a.tag&e)===e){var i=a.destroy;a.destroy=void 0,i!==void 0&&Bu(t,n,i)}a=a.next}while(a!==r)}}function Ho(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Ku(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function uy(e){var t=e.alternate;t!==null&&(e.alternate=null,uy(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ks],delete t[Ti],delete t[Pu],delete t[qj],delete t[Vj])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function dy(e){return e.tag===5||e.tag===3||e.tag===4}function Rf(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||dy(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function qu(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=uo));else if(r!==4&&(e=e.child,e!==null))for(qu(e,t,n),e=e.sibling;e!==null;)qu(e,t,n),e=e.sibling}function Vu(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Vu(e,t,n),e=e.sibling;e!==null;)Vu(e,t,n),e=e.sibling}var kt=null,Cs=!1;function kn(e,t,n){for(n=n.child;n!==null;)my(e,t,n),n=n.sibling}function my(e,t,n){if(Vs&&typeof Vs.onCommitFiberUnmount=="function")try{Vs.onCommitFiberUnmount(_o,n)}catch{}switch(n.tag){case 5:Ft||ra(n,t);case 6:var r=kt,a=Cs;kt=null,kn(e,t,n),kt=r,Cs=a,kt!==null&&(Cs?(e=kt,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):kt.removeChild(n.stateNode));break;case 18:kt!==null&&(Cs?(e=kt,n=n.stateNode,e.nodeType===8?Rc(e.parentNode,n):e.nodeType===1&&Rc(e,n),Ei(e)):Rc(kt,n.stateNode));break;case 4:r=kt,a=Cs,kt=n.stateNode.containerInfo,Cs=!0,kn(e,t,n),kt=r,Cs=a;break;case 0:case 11:case 14:case 15:if(!Ft&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){a=r=r.next;do{var i=a,l=i.destroy;i=i.tag,l!==void 0&&(i&2||i&4)&&Bu(n,t,l),a=a.next}while(a!==r)}kn(e,t,n);break;case 1:if(!Ft&&(ra(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(o){tt(n,t,o)}kn(e,t,n);break;case 21:kn(e,t,n);break;case 22:n.mode&1?(Ft=(r=Ft)||n.memoizedState!==null,kn(e,t,n),Ft=r):kn(e,t,n);break;default:kn(e,t,n)}}function Of(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new lb),t.forEach(function(r){var a=gb.bind(null,e,r);n.has(r)||(n.add(r),r.then(a,a))})}}function Ns(e,t){var n=t.deletions;if(n!==null)for(var r=0;ra&&(a=l),r&=~i}if(r=a,r=it()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*ub(r/1960))-r,10e?16:e,Kn===null)var r=!1;else{if(e=Kn,Kn=null,So=0,Pe&6)throw Error(Z(331));var a=Pe;for(Pe|=4,ie=e.current;ie!==null;){var i=ie,l=i.child;if(ie.flags&16){var o=i.deletions;if(o!==null){for(var c=0;cit()-hm?Cr(e,0):mm|=n),es(e,t)}function jy(e,t){t===0&&(e.mode&1?(t=Nl,Nl<<=1,!(Nl&130023424)&&(Nl=4194304)):t=1);var n=Bt();e=xn(e,t),e!==null&&(el(e,t,n),es(e,n))}function xb(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),jy(e,n)}function gb(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(Z(314))}r!==null&&r.delete(t),jy(e,n)}var by;by=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Xt.current)Jt=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return Jt=!1,rb(e,t,n);Jt=!!(e.flags&131072)}else Jt=!1,Ve&&t.flags&1048576&&kg(t,po,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Ql(e,t),e=t.pendingProps;var a=Da(t,Lt.current);da(t,n),a=im(null,t,r,e,a,n);var i=lm();return t.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Yt(r)?(i=!0,ho(t)):i=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,tm(t),a.updater=Qo,t.stateNode=a,a._reactInternals=t,Lu(t,r,e,n),t=zu(null,t,r,!0,i,n)):(t.tag=0,Ve&&i&&Wd(t),$t(null,t,a,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Ql(e,t),e=t.pendingProps,a=r._init,r=a(r._payload),t.type=r,a=t.tag=vb(r),e=ws(r,e),a){case 0:t=Ou(null,t,r,e,n);break e;case 1:t=Tf(null,t,r,e,n);break e;case 11:t=Af(null,t,r,e,n);break e;case 14:t=Mf(null,t,r,ws(r.type,e),n);break e}throw Error(Z(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ws(r,a),Ou(e,t,r,a,n);case 1:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ws(r,a),Tf(e,t,r,a,n);case 3:e:{if(ry(t),e===null)throw Error(Z(387));r=t.pendingProps,i=t.memoizedState,a=i.element,Mg(e,t),yo(t,r,null,n);var l=t.memoizedState;if(r=l.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){a=Ta(Error(Z(423)),t),t=Ff(e,t,r,n,a);break e}else if(r!==a){a=Ta(Error(Z(424)),t),t=Ff(e,t,r,n,a);break e}else for(is=Wn(t.stateNode.containerInfo.firstChild),ls=t,Ve=!0,Es=null,n=Pg(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(Pa(),r===a){t=gn(e,t,n);break e}$t(e,t,r,n)}t=t.child}return t;case 5:return Tg(t),e===null&&Tu(t),r=t.type,a=t.pendingProps,i=e!==null?e.memoizedProps:null,l=a.children,Eu(r,a)?l=null:i!==null&&Eu(r,i)&&(t.flags|=32),ny(e,t),$t(e,t,l,n),t.child;case 6:return e===null&&Tu(t),null;case 13:return ay(e,t,n);case 4:return sm(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=Aa(t,null,r,n):$t(e,t,r,n),t.child;case 11:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ws(r,a),Af(e,t,r,a,n);case 7:return $t(e,t,t.pendingProps,n),t.child;case 8:return $t(e,t,t.pendingProps.children,n),t.child;case 12:return $t(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,i=t.memoizedProps,l=a.value,Oe(xo,r._currentValue),r._currentValue=l,i!==null)if(Is(i.value,l)){if(i.children===a.children&&!Xt.current){t=gn(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var o=i.dependencies;if(o!==null){l=i.child;for(var c=o.firstContext;c!==null;){if(c.context===r){if(i.tag===1){c=dn(-1,n&-n),c.tag=2;var u=i.updateQueue;if(u!==null){u=u.shared;var d=u.pending;d===null?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=n,c=i.alternate,c!==null&&(c.lanes|=n),Fu(i.return,n,t),o.lanes|=n;break}c=c.next}}else if(i.tag===10)l=i.type===t.type?null:i.child;else if(i.tag===18){if(l=i.return,l===null)throw Error(Z(341));l.lanes|=n,o=l.alternate,o!==null&&(o.lanes|=n),Fu(l,n,t),l=i.sibling}else l=i.child;if(l!==null)l.return=i;else for(l=i;l!==null;){if(l===t){l=null;break}if(i=l.sibling,i!==null){i.return=l.return,l=i;break}l=l.return}i=l}$t(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,da(t,n),a=vs(a),r=r(a),t.flags|=1,$t(e,t,r,n),t.child;case 14:return r=t.type,a=ws(r,t.pendingProps),a=ws(r.type,a),Mf(e,t,r,a,n);case 15:return ty(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ws(r,a),Ql(e,t),t.tag=1,Yt(r)?(e=!0,ho(t)):e=!1,da(t,n),Xg(t,r,a),Lu(t,r,a,n),zu(null,t,r,!0,e,n);case 19:return iy(e,t,n);case 22:return sy(e,t,n)}throw Error(Z(156,t.tag))};function Ny(e,t){return Gx(e,t)}function yb(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function xs(e,t,n,r){return new yb(e,t,n,r)}function gm(e){return e=e.prototype,!(!e||!e.isReactComponent)}function vb(e){if(typeof e=="function")return gm(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Rd)return 11;if(e===Od)return 14}return 2}function Xn(e,t){var n=e.alternate;return n===null?(n=xs(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Gl(e,t,n,r,a,i){var l=2;if(r=e,typeof e=="function")gm(e)&&(l=1);else if(typeof e=="string")l=5;else e:switch(e){case Gr:return Er(n.children,a,i,t);case Ld:l=8,a|=8;break;case au:return e=xs(12,n,t,a|2),e.elementType=au,e.lanes=i,e;case iu:return e=xs(13,n,t,a),e.elementType=iu,e.lanes=i,e;case lu:return e=xs(19,n,t,a),e.elementType=lu,e.lanes=i,e;case Tx:return Go(n,a,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ax:l=10;break e;case Mx:l=9;break e;case Rd:l=11;break e;case Od:l=14;break e;case En:l=16,r=null;break e}throw Error(Z(130,e==null?e:typeof e,""))}return t=xs(l,n,t,a),t.elementType=e,t.type=r,t.lanes=i,t}function Er(e,t,n,r){return e=xs(7,e,r,t),e.lanes=n,e}function Go(e,t,n,r){return e=xs(22,e,r,t),e.elementType=Tx,e.lanes=n,e.stateNode={isHidden:!1},e}function qc(e,t,n){return e=xs(6,e,null,t),e.lanes=n,e}function Vc(e,t,n){return t=xs(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function jb(e,t,n,r,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=kc(0),this.expirationTimes=kc(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=kc(0),this.identifierPrefix=r,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function ym(e,t,n,r,a,i,l,o,c){return e=new jb(e,t,n,o,c),t===1?(t=1,i===!0&&(t|=8)):t=0,i=xs(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},tm(i),e}function bb(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Cy)}catch(e){console.error(e)}}Cy(),Cx.exports=cs;var Cb=Cx.exports,Vf=Cb;nu.createRoot=Vf.createRoot,nu.hydrateRoot=Vf.hydrateRoot;/** + * @remix-run/router v1.23.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function _i(){return _i=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function Nm(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function Db(){return Math.random().toString(36).substr(2,8)}function Hf(e,t){return{usr:e.state,key:e.key,idx:t}}function Zu(e,t,n,r){return n===void 0&&(n=null),_i({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?$a(t):t,{state:n,key:t&&t.key||r||Db()})}function Eo(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&n!=="?"&&(t+=n.charAt(0)==="?"?n:"?"+n),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function $a(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function Pb(e,t,n,r){r===void 0&&(r={});let{window:a=document.defaultView,v5Compat:i=!1}=r,l=a.history,o=qn.Pop,c=null,u=d();u==null&&(u=0,l.replaceState(_i({},l.state,{idx:u}),""));function d(){return(l.state||{idx:null}).idx}function h(){o=qn.Pop;let N=d(),v=N==null?null:N-u;u=N,c&&c({action:o,location:y.location,delta:v})}function p(N,v){o=qn.Push;let g=Zu(y.location,N,v);u=d()+1;let x=Hf(g,u),j=y.createHref(g);try{l.pushState(x,"",j)}catch(k){if(k instanceof DOMException&&k.name==="DataCloneError")throw k;a.location.assign(j)}i&&c&&c({action:o,location:y.location,delta:1})}function m(N,v){o=qn.Replace;let g=Zu(y.location,N,v);u=d();let x=Hf(g,u),j=y.createHref(g);l.replaceState(x,"",j),i&&c&&c({action:o,location:y.location,delta:0})}function f(N){let v=a.location.origin!=="null"?a.location.origin:a.location.href,g=typeof N=="string"?N:Eo(N);return g=g.replace(/ $/,"%20"),Ge(v,"No window.location.(origin|href) available to create URL for href: "+g),new URL(g,v)}let y={get action(){return o},get location(){return e(a,l)},listen(N){if(c)throw new Error("A history only accepts one active listener");return a.addEventListener(Qf,h),c=N,()=>{a.removeEventListener(Qf,h),c=null}},createHref(N){return t(a,N)},createURL:f,encodeLocation(N){let v=f(N);return{pathname:v.pathname,search:v.search,hash:v.hash}},push:p,replace:m,go(N){return l.go(N)}};return y}var Wf;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(Wf||(Wf={}));function Ab(e,t,n){return n===void 0&&(n="/"),Mb(e,t,n)}function Mb(e,t,n,r){let a=typeof t=="string"?$a(t):t,i=Ia(a.pathname||"/",n);if(i==null)return null;let l=Ey(e);Tb(l);let o=null;for(let c=0;o==null&&c{let c={relativePath:o===void 0?i.path||"":o,caseSensitive:i.caseSensitive===!0,childrenIndex:l,route:i};c.relativePath.startsWith("/")&&(Ge(c.relativePath.startsWith(r),'Absolute route path "'+c.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),c.relativePath=c.relativePath.slice(r.length));let u=Yn([r,c.relativePath]),d=n.concat(c);i.children&&i.children.length>0&&(Ge(i.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+u+'".')),Ey(i.children,t,d,u)),!(i.path==null&&!i.index)&&t.push({path:u,score:_b(u,i.index),routesMeta:d})};return e.forEach((i,l)=>{var o;if(i.path===""||!((o=i.path)!=null&&o.includes("?")))a(i,l);else for(let c of Dy(i.path))a(i,l,c)}),t}function Dy(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,a=n.endsWith("?"),i=n.replace(/\?$/,"");if(r.length===0)return a?[i,""]:[i];let l=Dy(r.join("/")),o=[];return o.push(...l.map(c=>c===""?i:[i,c].join("/"))),a&&o.push(...l),o.map(c=>e.startsWith("/")&&c===""?"/":c)}function Tb(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:$b(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}const Fb=/^:[\w-]+$/,Ib=3,Lb=2,Rb=1,Ob=10,zb=-2,Gf=e=>e==="*";function _b(e,t){let n=e.split("/"),r=n.length;return n.some(Gf)&&(r+=zb),t&&(r+=Lb),n.filter(a=>!Gf(a)).reduce((a,i)=>a+(Fb.test(i)?Ib:i===""?Rb:Ob),r)}function $b(e,t){return e.length===t.length&&e.slice(0,-1).every((r,a)=>r===t[a])?e[e.length-1]-t[t.length-1]:0}function Ub(e,t,n){let{routesMeta:r}=e,a={},i="/",l=[];for(let o=0;o{let{paramName:p,isOptional:m}=d;if(p==="*"){let y=o[h]||"";l=i.slice(0,i.length-y.length).replace(/(.)\/+$/,"$1")}const f=o[h];return m&&!f?u[p]=void 0:u[p]=(f||"").replace(/%2F/g,"/"),u},{}),pathname:i,pathnameBase:l,pattern:e}}function Bb(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!0),Nm(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(l,o,c)=>(r.push({paramName:o,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),a+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?a+="\\/*$":e!==""&&e!=="/"&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}function Kb(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return Nm(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function Ia(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}const qb=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Vb=e=>qb.test(e);function Qb(e,t){t===void 0&&(t="/");let{pathname:n,search:r="",hash:a=""}=typeof e=="string"?$a(e):e,i;if(n)if(Vb(n))i=n;else{if(n.includes("//")){let l=n;n=n.replace(/\/\/+/g,"/"),Nm(!1,"Pathnames cannot have embedded double slashes - normalizing "+(l+" -> "+n))}n.startsWith("/")?i=Zf(n.substring(1),"/"):i=Zf(n,t)}else i=t;return{pathname:i,search:Gb(r),hash:Zb(a)}}function Zf(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(a=>{a===".."?n.length>1&&n.pop():a!=="."&&n.push(a)}),n.length>1?n.join("/"):"/"}function Qc(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+n+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function Hb(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function wm(e,t){let n=Hb(e);return t?n.map((r,a)=>a===n.length-1?r.pathname:r.pathnameBase):n.map(r=>r.pathnameBase)}function Sm(e,t,n,r){r===void 0&&(r=!1);let a;typeof e=="string"?a=$a(e):(a=_i({},e),Ge(!a.pathname||!a.pathname.includes("?"),Qc("?","pathname","search",a)),Ge(!a.pathname||!a.pathname.includes("#"),Qc("#","pathname","hash",a)),Ge(!a.search||!a.search.includes("#"),Qc("#","search","hash",a)));let i=e===""||a.pathname==="",l=i?"/":a.pathname,o;if(l==null)o=n;else{let h=t.length-1;if(!r&&l.startsWith("..")){let p=l.split("/");for(;p[0]==="..";)p.shift(),h-=1;a.pathname=p.join("/")}o=h>=0?t[h]:"/"}let c=Qb(a,o),u=l&&l!=="/"&&l.endsWith("/"),d=(i||l===".")&&n.endsWith("/");return!c.pathname.endsWith("/")&&(u||d)&&(c.pathname+="/"),c}const Yn=e=>e.join("/").replace(/\/\/+/g,"/"),Wb=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),Gb=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,Zb=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function Jb(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Py=["post","put","patch","delete"];new Set(Py);const Xb=["get",...Py];new Set(Xb);/** + * React Router v6.30.3 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function $i(){return $i=Object.assign?Object.assign.bind():function(e){for(var t=1;t{o.current=!0}),b.useCallback(function(u,d){if(d===void 0&&(d={}),!o.current)return;if(typeof u=="number"){r.go(u);return}let h=Sm(u,JSON.parse(l),i,d.relative==="path");e==null&&t!=="/"&&(h.pathname=h.pathname==="/"?t:Yn([t,h.pathname])),(d.replace?r.replace:r.push)(h,d.state,d)},[t,r,l,i,e])}const tN=b.createContext(null);function sN(e){let t=b.useContext(Ws).outlet;return t&&b.createElement(tN.Provider,{value:e},t)}function sc(){let{matches:e}=b.useContext(Ws),t=e[e.length-1];return t?t.params:{}}function nc(e,t){let{relative:n}=t===void 0?{}:t,{future:r}=b.useContext(Nn),{matches:a}=b.useContext(Ws),{pathname:i}=wn(),l=JSON.stringify(wm(a,r.v7_relativeSplatPath));return b.useMemo(()=>Sm(e,JSON.parse(l),i,n==="path"),[e,l,i,n])}function nN(e,t){return rN(e,t)}function rN(e,t,n,r){Ua()||Ge(!1);let{navigator:a}=b.useContext(Nn),{matches:i}=b.useContext(Ws),l=i[i.length-1],o=l?l.params:{};l&&l.pathname;let c=l?l.pathnameBase:"/";l&&l.route;let u=wn(),d;if(t){var h;let N=typeof t=="string"?$a(t):t;c==="/"||(h=N.pathname)!=null&&h.startsWith(c)||Ge(!1),d=N}else d=u;let p=d.pathname||"/",m=p;if(c!=="/"){let N=c.replace(/^\//,"").split("/");m="/"+p.replace(/^\//,"").split("/").slice(N.length).join("/")}let f=Ab(e,{pathname:m}),y=cN(f&&f.map(N=>Object.assign({},N,{params:Object.assign({},o,N.params),pathname:Yn([c,a.encodeLocation?a.encodeLocation(N.pathname).pathname:N.pathname]),pathnameBase:N.pathnameBase==="/"?c:Yn([c,a.encodeLocation?a.encodeLocation(N.pathnameBase).pathname:N.pathnameBase])})),i,n,r);return t&&y?b.createElement(tc.Provider,{value:{location:$i({pathname:"/",search:"",hash:"",state:null,key:"default"},d),navigationType:qn.Pop}},y):y}function aN(){let e=hN(),t=Jb(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,a={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return b.createElement(b.Fragment,null,b.createElement("h2",null,"Unexpected Application Error!"),b.createElement("h3",{style:{fontStyle:"italic"}},t),n?b.createElement("pre",{style:a},n):null,null)}const iN=b.createElement(aN,null);class lN extends b.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,n){return n.location!==t.location||n.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:n.error,location:n.location,revalidation:t.revalidation||n.revalidation}}componentDidCatch(t,n){console.error("React Router caught the following error during render",t,n)}render(){return this.state.error!==void 0?b.createElement(Ws.Provider,{value:this.props.routeContext},b.createElement(My.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function oN(e){let{routeContext:t,match:n,children:r}=e,a=b.useContext(ec);return a&&a.static&&a.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(a.staticContext._deepestRenderedBoundaryId=n.route.id),b.createElement(Ws.Provider,{value:t},r)}function cN(e,t,n,r){var a;if(t===void 0&&(t=[]),n===void 0&&(n=null),r===void 0&&(r=null),e==null){var i;if(!n)return null;if(n.errors)e=n.matches;else if((i=r)!=null&&i.v7_partialHydration&&t.length===0&&!n.initialized&&n.matches.length>0)e=n.matches;else return null}let l=e,o=(a=n)==null?void 0:a.errors;if(o!=null){let d=l.findIndex(h=>h.route.id&&(o==null?void 0:o[h.route.id])!==void 0);d>=0||Ge(!1),l=l.slice(0,Math.min(l.length,d+1))}let c=!1,u=-1;if(n&&r&&r.v7_partialHydration)for(let d=0;d=0?l=l.slice(0,u+1):l=[l[0]];break}}}return l.reduceRight((d,h,p)=>{let m,f=!1,y=null,N=null;n&&(m=o&&h.route.id?o[h.route.id]:void 0,y=h.route.errorElement||iN,c&&(u<0&&p===0?(pN("route-fallback"),f=!0,N=null):u===p&&(f=!0,N=h.route.hydrateFallbackElement||null)));let v=t.concat(l.slice(0,p+1)),g=()=>{let x;return m?x=y:f?x=N:h.route.Component?x=b.createElement(h.route.Component,null):h.route.element?x=h.route.element:x=d,b.createElement(oN,{match:h,routeContext:{outlet:d,matches:v,isDataRoute:n!=null},children:x})};return n&&(h.route.ErrorBoundary||h.route.errorElement||p===0)?b.createElement(lN,{location:n.location,revalidation:n.revalidation,component:y,error:m,children:g(),routeContext:{outlet:null,matches:v,isDataRoute:!0}}):g()},null)}var Fy=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(Fy||{}),Iy=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(Iy||{});function uN(e){let t=b.useContext(ec);return t||Ge(!1),t}function dN(e){let t=b.useContext(Ay);return t||Ge(!1),t}function mN(e){let t=b.useContext(Ws);return t||Ge(!1),t}function Ly(e){let t=mN(),n=t.matches[t.matches.length-1];return n.route.id||Ge(!1),n.route.id}function hN(){var e;let t=b.useContext(My),n=dN(),r=Ly();return t!==void 0?t:(e=n.errors)==null?void 0:e[r]}function fN(){let{router:e}=uN(Fy.UseNavigateStable),t=Ly(Iy.UseNavigateStable),n=b.useRef(!1);return Ty(()=>{n.current=!0}),b.useCallback(function(a,i){i===void 0&&(i={}),n.current&&(typeof a=="number"?e.navigate(a):e.navigate(a,$i({fromRouteId:t},i)))},[e,t])}const Jf={};function pN(e,t,n){Jf[e]||(Jf[e]=!0)}function xN(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function ia(e){let{to:t,replace:n,state:r,relative:a}=e;Ua()||Ge(!1);let{future:i,static:l}=b.useContext(Nn),{matches:o}=b.useContext(Ws),{pathname:c}=wn(),u=Vt(),d=Sm(t,wm(o,i.v7_relativeSplatPath),c,a==="path"),h=JSON.stringify(d);return b.useEffect(()=>u(JSON.parse(h),{replace:n,state:r,relative:a}),[u,h,a,n,r]),null}function gN(e){return sN(e.context)}function Te(e){Ge(!1)}function yN(e){let{basename:t="/",children:n=null,location:r,navigationType:a=qn.Pop,navigator:i,static:l=!1,future:o}=e;Ua()&&Ge(!1);let c=t.replace(/^\/*/,"/"),u=b.useMemo(()=>({basename:c,navigator:i,static:l,future:$i({v7_relativeSplatPath:!1},o)}),[c,o,i,l]);typeof r=="string"&&(r=$a(r));let{pathname:d="/",search:h="",hash:p="",state:m=null,key:f="default"}=r,y=b.useMemo(()=>{let N=Ia(d,c);return N==null?null:{location:{pathname:N,search:h,hash:p,state:m,key:f},navigationType:a}},[c,d,h,p,m,f,a]);return y==null?null:b.createElement(Nn.Provider,{value:u},b.createElement(tc.Provider,{children:n,value:y}))}function vN(e){let{children:t,location:n}=e;return nN(Xu(t),n)}new Promise(()=>{});function Xu(e,t){t===void 0&&(t=[]);let n=[];return b.Children.forEach(e,(r,a)=>{if(!b.isValidElement(r))return;let i=[...t,a];if(r.type===b.Fragment){n.push.apply(n,Xu(r.props.children,i));return}r.type!==Te&&Ge(!1),!r.props.index||!r.props.children||Ge(!1);let l={id:r.props.id||i.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(l.children=Xu(r.props.children,i)),n.push(l)}),n}/** + * React Router DOM v6.30.3 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Do(){return Do=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(n[a]=e[a]);return n}function jN(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function bN(e,t){return e.button===0&&(!t||t==="_self")&&!jN(e)}function Yu(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(a=>[n,a]):[[n,r]])},[]))}function NN(e,t){let n=Yu(e);return t&&t.forEach((r,a)=>{n.has(a)||t.getAll(a).forEach(i=>{n.append(a,i)})}),n}const wN=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],SN=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],kN="6";try{window.__reactRouterVersion=kN}catch{}const CN=b.createContext({isTransitioning:!1}),EN="startTransition",Xf=pv[EN];function DN(e){let{basename:t,children:n,future:r,window:a}=e,i=b.useRef();i.current==null&&(i.current=Eb({window:a,v5Compat:!0}));let l=i.current,[o,c]=b.useState({action:l.action,location:l.location}),{v7_startTransition:u}=r||{},d=b.useCallback(h=>{u&&Xf?Xf(()=>c(h)):c(h)},[c,u]);return b.useLayoutEffect(()=>l.listen(d),[l,d]),b.useEffect(()=>xN(r),[r]),b.createElement(yN,{basename:t,children:n,location:o.location,navigationType:o.action,navigator:l,future:r})}const PN=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",AN=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Ne=b.forwardRef(function(t,n){let{onClick:r,relative:a,reloadDocument:i,replace:l,state:o,target:c,to:u,preventScrollReset:d,viewTransition:h}=t,p=Ry(t,wN),{basename:m}=b.useContext(Nn),f,y=!1;if(typeof u=="string"&&AN.test(u)&&(f=u,PN))try{let x=new URL(window.location.href),j=u.startsWith("//")?new URL(x.protocol+u):new URL(u),k=Ia(j.pathname,m);j.origin===x.origin&&k!=null?u=k+j.search+j.hash:y=!0}catch{}let N=Yb(u,{relative:a}),v=TN(u,{replace:l,state:o,target:c,preventScrollReset:d,relative:a,viewTransition:h});function g(x){r&&r(x),x.defaultPrevented||v(x)}return b.createElement("a",Do({},p,{href:f||N,onClick:y||i?r:g,ref:n,target:c}))}),Hc=b.forwardRef(function(t,n){let{"aria-current":r="page",caseSensitive:a=!1,className:i="",end:l=!1,style:o,to:c,viewTransition:u,children:d}=t,h=Ry(t,SN),p=nc(c,{relative:h.relative}),m=wn(),f=b.useContext(Ay),{navigator:y,basename:N}=b.useContext(Nn),v=f!=null&&FN(p)&&u===!0,g=y.encodeLocation?y.encodeLocation(p).pathname:p.pathname,x=m.pathname,j=f&&f.navigation&&f.navigation.location?f.navigation.location.pathname:null;a||(x=x.toLowerCase(),j=j?j.toLowerCase():null,g=g.toLowerCase()),j&&N&&(j=Ia(j,N)||j);const k=g!=="/"&&g.endsWith("/")?g.length-1:g.length;let F=x===g||!l&&x.startsWith(g)&&x.charAt(k)==="/",E=j!=null&&(j===g||!l&&j.startsWith(g)&&j.charAt(g.length)==="/"),S={isActive:F,isPending:E,isTransitioning:v},P=F?r:void 0,A;typeof i=="function"?A=i(S):A=[i,F?"active":null,E?"pending":null,v?"transitioning":null].filter(Boolean).join(" ");let _=typeof o=="function"?o(S):o;return b.createElement(Ne,Do({},h,{"aria-current":P,className:A,ref:n,style:_,to:c,viewTransition:u}),typeof d=="function"?d(S):d)});var ed;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(ed||(ed={}));var Yf;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Yf||(Yf={}));function MN(e){let t=b.useContext(ec);return t||Ge(!1),t}function TN(e,t){let{target:n,replace:r,state:a,preventScrollReset:i,relative:l,viewTransition:o}=t===void 0?{}:t,c=Vt(),u=wn(),d=nc(e,{relative:l});return b.useCallback(h=>{if(bN(h,n)){h.preventDefault();let p=r!==void 0?r:Eo(u)===Eo(d);c(e,{replace:p,state:a,preventScrollReset:i,relative:l,viewTransition:o})}},[u,c,d,r,a,n,e,i,l,o])}function rc(e){let t=b.useRef(Yu(e)),n=b.useRef(!1),r=wn(),a=b.useMemo(()=>NN(r.search,n.current?null:t.current),[r.search]),i=Vt(),l=b.useCallback((o,c)=>{const u=Yu(typeof o=="function"?o(a):o);n.current=!0,i("?"+u,c)},[i,a]);return[a,l]}function FN(e,t){t===void 0&&(t={});let n=b.useContext(CN);n==null&&Ge(!1);let{basename:r}=MN(ed.useViewTransitionState),a=nc(e,{relative:t.relative});if(!n.isTransitioning)return!1;let i=Ia(n.currentLocation.pathname,r)||n.currentLocation.pathname,l=Ia(n.nextLocation.pathname,r)||n.nextLocation.pathname;return Ju(a.pathname,l)!=null||Ju(a.pathname,i)!=null}var Ba=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},IN={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},Fn,Ed,rx,LN=(rx=class{constructor(){me(this,Fn,IN);me(this,Ed,!1)}setTimeoutProvider(e){re(this,Fn,e)}setTimeout(e,t){return D(this,Fn).setTimeout(e,t)}clearTimeout(e){D(this,Fn).clearTimeout(e)}setInterval(e,t){return D(this,Fn).setInterval(e,t)}clearInterval(e){D(this,Fn).clearInterval(e)}},Fn=new WeakMap,Ed=new WeakMap,rx),fr=new LN;function RN(e){setTimeout(e,0)}var Ir=typeof window>"u"||"Deno"in globalThis;function Ut(){}function ON(e,t){return typeof e=="function"?e(t):e}function td(e){return typeof e=="number"&&e>=0&&e!==1/0}function Oy(e,t){return Math.max(e+(t||0)-Date.now(),0)}function er(e,t){return typeof e=="function"?e(t):e}function ms(e,t){return typeof e=="function"?e(t):e}function ep(e,t){const{type:n="all",exact:r,fetchStatus:a,predicate:i,queryKey:l,stale:o}=e;if(l){if(r){if(t.queryHash!==km(l,t.options))return!1}else if(!Ui(t.queryKey,l))return!1}if(n!=="all"){const c=t.isActive();if(n==="active"&&!c||n==="inactive"&&c)return!1}return!(typeof o=="boolean"&&t.isStale()!==o||a&&a!==t.state.fetchStatus||i&&!i(t))}function tp(e,t){const{exact:n,status:r,predicate:a,mutationKey:i}=e;if(i){if(!t.options.mutationKey)return!1;if(n){if(Lr(t.options.mutationKey)!==Lr(i))return!1}else if(!Ui(t.options.mutationKey,i))return!1}return!(r&&t.state.status!==r||a&&!a(t))}function km(e,t){return((t==null?void 0:t.queryKeyHashFn)||Lr)(e)}function Lr(e){return JSON.stringify(e,(t,n)=>sd(n)?Object.keys(n).sort().reduce((r,a)=>(r[a]=n[a],r),{}):n)}function Ui(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(n=>Ui(e[n],t[n])):!1}var zN=Object.prototype.hasOwnProperty;function zy(e,t,n=0){if(e===t)return e;if(n>500)return t;const r=sp(e)&&sp(t);if(!r&&!(sd(e)&&sd(t)))return t;const i=(r?e:Object.keys(e)).length,l=r?t:Object.keys(t),o=l.length,c=r?new Array(o):{};let u=0;for(let d=0;d{fr.setTimeout(t,e)})}function nd(e,t,n){return typeof n.structuralSharing=="function"?n.structuralSharing(e,t):n.structuralSharing!==!1?zy(e,t):t}function $N(e,t,n=0){const r=[...e,t];return n&&r.length>n?r.slice(1):r}function UN(e,t,n=0){const r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var Cm=Symbol();function _y(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===Cm?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function Em(e,t){return typeof e=="function"?e(...t):!!e}function BN(e,t,n){let r=!1,a;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(a??(a=t()),r||(r=!0,a.aborted?n():a.addEventListener("abort",n,{once:!0})),a)}),e}var gr,In,pa,ax,KN=(ax=class extends Ba{constructor(){super();me(this,gr);me(this,In);me(this,pa);re(this,pa,t=>{if(!Ir&&window.addEventListener){const n=()=>t();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){D(this,In)||this.setEventListener(D(this,pa))}onUnsubscribe(){var t;this.hasListeners()||((t=D(this,In))==null||t.call(this),re(this,In,void 0))}setEventListener(t){var n;re(this,pa,t),(n=D(this,In))==null||n.call(this),re(this,In,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){D(this,gr)!==t&&(re(this,gr,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(n=>{n(t)})}isFocused(){var t;return typeof D(this,gr)=="boolean"?D(this,gr):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},gr=new WeakMap,In=new WeakMap,pa=new WeakMap,ax),Dm=new KN;function rd(){let e,t;const n=new Promise((a,i)=>{e=a,t=i});n.status="pending",n.catch(()=>{});function r(a){Object.assign(n,a),delete n.resolve,delete n.reject}return n.resolve=a=>{r({status:"fulfilled",value:a}),e(a)},n.reject=a=>{r({status:"rejected",reason:a}),t(a)},n}var qN=RN;function VN(){let e=[],t=0,n=o=>{o()},r=o=>{o()},a=qN;const i=o=>{t?e.push(o):a(()=>{n(o)})},l=()=>{const o=e;e=[],o.length&&a(()=>{r(()=>{o.forEach(c=>{n(c)})})})};return{batch:o=>{let c;t++;try{c=o()}finally{t--,t||l()}return c},batchCalls:o=>(...c)=>{i(()=>{o(...c)})},schedule:i,setNotifyFunction:o=>{n=o},setBatchNotifyFunction:o=>{r=o},setScheduler:o=>{a=o}}}var ft=VN(),xa,Ln,ga,ix,QN=(ix=class extends Ba{constructor(){super();me(this,xa,!0);me(this,Ln);me(this,ga);re(this,ga,t=>{if(!Ir&&window.addEventListener){const n=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",r)}}})}onSubscribe(){D(this,Ln)||this.setEventListener(D(this,ga))}onUnsubscribe(){var t;this.hasListeners()||((t=D(this,Ln))==null||t.call(this),re(this,Ln,void 0))}setEventListener(t){var n;re(this,ga,t),(n=D(this,Ln))==null||n.call(this),re(this,Ln,t(this.setOnline.bind(this)))}setOnline(t){D(this,xa)!==t&&(re(this,xa,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return D(this,xa)}},xa=new WeakMap,Ln=new WeakMap,ga=new WeakMap,ix),Ao=new QN;function HN(e){return Math.min(1e3*2**e,3e4)}function $y(e){return(e??"online")==="online"?Ao.isOnline():!0}var ad=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function Uy(e){let t=!1,n=0,r;const a=rd(),i=()=>a.status!=="pending",l=y=>{var N;if(!i()){const v=new ad(y);p(v),(N=e.onCancel)==null||N.call(e,v)}},o=()=>{t=!0},c=()=>{t=!1},u=()=>Dm.isFocused()&&(e.networkMode==="always"||Ao.isOnline())&&e.canRun(),d=()=>$y(e.networkMode)&&e.canRun(),h=y=>{i()||(r==null||r(),a.resolve(y))},p=y=>{i()||(r==null||r(),a.reject(y))},m=()=>new Promise(y=>{var N;r=v=>{(i()||u())&&y(v)},(N=e.onPause)==null||N.call(e)}).then(()=>{var y;r=void 0,i()||(y=e.onContinue)==null||y.call(e)}),f=()=>{if(i())return;let y;const N=n===0?e.initialPromise:void 0;try{y=N??e.fn()}catch(v){y=Promise.reject(v)}Promise.resolve(y).then(h).catch(v=>{var F;if(i())return;const g=e.retry??(Ir?0:3),x=e.retryDelay??HN,j=typeof x=="function"?x(n,v):x,k=g===!0||typeof g=="number"&&nu()?void 0:m()).then(()=>{t?p(v):f()})})};return{promise:a,status:()=>a.status,cancel:l,continue:()=>(r==null||r(),a),cancelRetry:o,continueRetry:c,canStart:d,start:()=>(d()?f():m().then(f),a)}}var yr,lx,By=(lx=class{constructor(){me(this,yr)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),td(this.gcTime)&&re(this,yr,fr.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Ir?1/0:5*60*1e3))}clearGcTimeout(){D(this,yr)&&(fr.clearTimeout(D(this,yr)),re(this,yr,void 0))}},yr=new WeakMap,lx),vr,ya,ds,jr,vt,Wi,br,Ss,Ys,ox,WN=(ox=class extends By{constructor(t){super();me(this,Ss);me(this,vr);me(this,ya);me(this,ds);me(this,jr);me(this,vt);me(this,Wi);me(this,br);re(this,br,!1),re(this,Wi,t.defaultOptions),this.setOptions(t.options),this.observers=[],re(this,jr,t.client),re(this,ds,D(this,jr).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,re(this,vr,ap(this.options)),this.state=t.state??D(this,vr),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var t;return(t=D(this,vt))==null?void 0:t.promise}setOptions(t){if(this.options={...D(this,Wi),...t},this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const n=ap(this.options);n.data!==void 0&&(this.setState(rp(n.data,n.dataUpdatedAt)),re(this,vr,n))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&D(this,ds).remove(this)}setData(t,n){const r=nd(this.state.data,t,this.options);return be(this,Ss,Ys).call(this,{data:r,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),r}setState(t,n){be(this,Ss,Ys).call(this,{type:"setState",state:t,setStateOptions:n})}cancel(t){var r,a;const n=(r=D(this,vt))==null?void 0:r.promise;return(a=D(this,vt))==null||a.cancel(t),n?n.then(Ut).catch(Ut):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(D(this,vr))}isActive(){return this.observers.some(t=>ms(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Cm||this.state.dataUpdateCount+this.state.errorUpdateCount===0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>er(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!Oy(this.state.dataUpdatedAt,t)}onFocus(){var n;const t=this.observers.find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(n=D(this,vt))==null||n.continue()}onOnline(){var n;const t=this.observers.find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(n=D(this,vt))==null||n.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),D(this,ds).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(n=>n!==t),this.observers.length||(D(this,vt)&&(D(this,br)?D(this,vt).cancel({revert:!0}):D(this,vt).cancelRetry()),this.scheduleGc()),D(this,ds).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||be(this,Ss,Ys).call(this,{type:"invalidate"})}async fetch(t,n){var c,u,d,h,p,m,f,y,N,v,g,x;if(this.state.fetchStatus!=="idle"&&((c=D(this,vt))==null?void 0:c.status())!=="rejected"){if(this.state.data!==void 0&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if(D(this,vt))return D(this,vt).continueRetry(),D(this,vt).promise}if(t&&this.setOptions(t),!this.options.queryFn){const j=this.observers.find(k=>k.options.queryFn);j&&this.setOptions(j.options)}const r=new AbortController,a=j=>{Object.defineProperty(j,"signal",{enumerable:!0,get:()=>(re(this,br,!0),r.signal)})},i=()=>{const j=_y(this.options,n),F=(()=>{const E={client:D(this,jr),queryKey:this.queryKey,meta:this.meta};return a(E),E})();return re(this,br,!1),this.options.persister?this.options.persister(j,F,this):j(F)},o=(()=>{const j={fetchOptions:n,options:this.options,queryKey:this.queryKey,client:D(this,jr),state:this.state,fetchFn:i};return a(j),j})();(u=this.options.behavior)==null||u.onFetch(o,this),re(this,ya,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((d=o.fetchOptions)==null?void 0:d.meta))&&be(this,Ss,Ys).call(this,{type:"fetch",meta:(h=o.fetchOptions)==null?void 0:h.meta}),re(this,vt,Uy({initialPromise:n==null?void 0:n.initialPromise,fn:o.fetchFn,onCancel:j=>{j instanceof ad&&j.revert&&this.setState({...D(this,ya),fetchStatus:"idle"}),r.abort()},onFail:(j,k)=>{be(this,Ss,Ys).call(this,{type:"failed",failureCount:j,error:k})},onPause:()=>{be(this,Ss,Ys).call(this,{type:"pause"})},onContinue:()=>{be(this,Ss,Ys).call(this,{type:"continue"})},retry:o.options.retry,retryDelay:o.options.retryDelay,networkMode:o.options.networkMode,canRun:()=>!0}));try{const j=await D(this,vt).start();if(j===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(j),(m=(p=D(this,ds).config).onSuccess)==null||m.call(p,j,this),(y=(f=D(this,ds).config).onSettled)==null||y.call(f,j,this.state.error,this),j}catch(j){if(j instanceof ad){if(j.silent)return D(this,vt).promise;if(j.revert){if(this.state.data===void 0)throw j;return this.state.data}}throw be(this,Ss,Ys).call(this,{type:"error",error:j}),(v=(N=D(this,ds).config).onError)==null||v.call(N,j,this),(x=(g=D(this,ds).config).onSettled)==null||x.call(g,this.state.data,j,this),j}finally{this.scheduleGc()}}},vr=new WeakMap,ya=new WeakMap,ds=new WeakMap,jr=new WeakMap,vt=new WeakMap,Wi=new WeakMap,br=new WeakMap,Ss=new WeakSet,Ys=function(t){const n=r=>{switch(t.type){case"failed":return{...r,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,...Ky(r.data,this.options),fetchMeta:t.meta??null};case"success":const a={...r,...rp(t.data,t.dataUpdatedAt),dataUpdateCount:r.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return re(this,ya,t.manual?a:void 0),a;case"error":const i=t.error;return{...r,error:i,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:i,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=n(this.state),ft.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),D(this,ds).notify({query:this,type:"updated",action:t})})},ox);function Ky(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:$y(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function rp(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function ap(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var Ht,Ee,Gi,Ot,Nr,va,nn,Rn,Zi,ja,ba,wr,Sr,On,Na,Fe,oi,id,ld,od,cd,ud,dd,md,qy,cx,GN=(cx=class extends Ba{constructor(t,n){super();me(this,Fe);me(this,Ht);me(this,Ee);me(this,Gi);me(this,Ot);me(this,Nr);me(this,va);me(this,nn);me(this,Rn);me(this,Zi);me(this,ja);me(this,ba);me(this,wr);me(this,Sr);me(this,On);me(this,Na,new Set);this.options=n,re(this,Ht,t),re(this,Rn,null),re(this,nn,rd()),this.bindMethods(),this.setOptions(n)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(D(this,Ee).addObserver(this),ip(D(this,Ee),this.options)?be(this,Fe,oi).call(this):this.updateResult(),be(this,Fe,cd).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return hd(D(this,Ee),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return hd(D(this,Ee),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,be(this,Fe,ud).call(this),be(this,Fe,dd).call(this),D(this,Ee).removeObserver(this)}setOptions(t){const n=this.options,r=D(this,Ee);if(this.options=D(this,Ht).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof ms(this.options.enabled,D(this,Ee))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");be(this,Fe,md).call(this),D(this,Ee).setOptions(this.options),n._defaulted&&!Po(this.options,n)&&D(this,Ht).getQueryCache().notify({type:"observerOptionsUpdated",query:D(this,Ee),observer:this});const a=this.hasListeners();a&&lp(D(this,Ee),r,this.options,n)&&be(this,Fe,oi).call(this),this.updateResult(),a&&(D(this,Ee)!==r||ms(this.options.enabled,D(this,Ee))!==ms(n.enabled,D(this,Ee))||er(this.options.staleTime,D(this,Ee))!==er(n.staleTime,D(this,Ee)))&&be(this,Fe,id).call(this);const i=be(this,Fe,ld).call(this);a&&(D(this,Ee)!==r||ms(this.options.enabled,D(this,Ee))!==ms(n.enabled,D(this,Ee))||i!==D(this,On))&&be(this,Fe,od).call(this,i)}getOptimisticResult(t){const n=D(this,Ht).getQueryCache().build(D(this,Ht),t),r=this.createResult(n,t);return JN(this,r)&&(re(this,Ot,r),re(this,va,this.options),re(this,Nr,D(this,Ee).state)),r}getCurrentResult(){return D(this,Ot)}trackResult(t,n){return new Proxy(t,{get:(r,a)=>(this.trackProp(a),n==null||n(a),a==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&D(this,nn).status==="pending"&&D(this,nn).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(r,a))})}trackProp(t){D(this,Na).add(t)}getCurrentQuery(){return D(this,Ee)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const n=D(this,Ht).defaultQueryOptions(t),r=D(this,Ht).getQueryCache().build(D(this,Ht),n);return r.fetch().then(()=>this.createResult(r,n))}fetch(t){return be(this,Fe,oi).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),D(this,Ot)))}createResult(t,n){var P;const r=D(this,Ee),a=this.options,i=D(this,Ot),l=D(this,Nr),o=D(this,va),u=t!==r?t.state:D(this,Gi),{state:d}=t;let h={...d},p=!1,m;if(n._optimisticResults){const A=this.hasListeners(),_=!A&&ip(t,n),L=A&&lp(t,r,n,a);(_||L)&&(h={...h,...Ky(d.data,t.options)}),n._optimisticResults==="isRestoring"&&(h.fetchStatus="idle")}let{error:f,errorUpdatedAt:y,status:N}=h;m=h.data;let v=!1;if(n.placeholderData!==void 0&&m===void 0&&N==="pending"){let A;i!=null&&i.isPlaceholderData&&n.placeholderData===(o==null?void 0:o.placeholderData)?(A=i.data,v=!0):A=typeof n.placeholderData=="function"?n.placeholderData((P=D(this,ba))==null?void 0:P.state.data,D(this,ba)):n.placeholderData,A!==void 0&&(N="success",m=nd(i==null?void 0:i.data,A,n),p=!0)}if(n.select&&m!==void 0&&!v)if(i&&m===(l==null?void 0:l.data)&&n.select===D(this,Zi))m=D(this,ja);else try{re(this,Zi,n.select),m=n.select(m),m=nd(i==null?void 0:i.data,m,n),re(this,ja,m),re(this,Rn,null)}catch(A){re(this,Rn,A)}D(this,Rn)&&(f=D(this,Rn),m=D(this,ja),y=Date.now(),N="error");const g=h.fetchStatus==="fetching",x=N==="pending",j=N==="error",k=x&&g,F=m!==void 0,S={status:N,fetchStatus:h.fetchStatus,isPending:x,isSuccess:N==="success",isError:j,isInitialLoading:k,isLoading:k,data:m,dataUpdatedAt:h.dataUpdatedAt,error:f,errorUpdatedAt:y,failureCount:h.fetchFailureCount,failureReason:h.fetchFailureReason,errorUpdateCount:h.errorUpdateCount,isFetched:h.dataUpdateCount>0||h.errorUpdateCount>0,isFetchedAfterMount:h.dataUpdateCount>u.dataUpdateCount||h.errorUpdateCount>u.errorUpdateCount,isFetching:g,isRefetching:g&&!x,isLoadingError:j&&!F,isPaused:h.fetchStatus==="paused",isPlaceholderData:p,isRefetchError:j&&F,isStale:Pm(t,n),refetch:this.refetch,promise:D(this,nn),isEnabled:ms(n.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const A=S.data!==void 0,_=S.status==="error"&&!A,L=O=>{_?O.reject(S.error):A&&O.resolve(S.data)},V=()=>{const O=re(this,nn,S.promise=rd());L(O)},q=D(this,nn);switch(q.status){case"pending":t.queryHash===r.queryHash&&L(q);break;case"fulfilled":(_||S.data!==q.value)&&V();break;case"rejected":(!_||S.error!==q.reason)&&V();break}}return S}updateResult(){const t=D(this,Ot),n=this.createResult(D(this,Ee),this.options);if(re(this,Nr,D(this,Ee).state),re(this,va,this.options),D(this,Nr).data!==void 0&&re(this,ba,D(this,Ee)),Po(n,t))return;re(this,Ot,n);const r=()=>{if(!t)return!0;const{notifyOnChangeProps:a}=this.options,i=typeof a=="function"?a():a;if(i==="all"||!i&&!D(this,Na).size)return!0;const l=new Set(i??D(this,Na));return this.options.throwOnError&&l.add("error"),Object.keys(D(this,Ot)).some(o=>{const c=o;return D(this,Ot)[c]!==t[c]&&l.has(c)})};be(this,Fe,qy).call(this,{listeners:r()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&be(this,Fe,cd).call(this)}},Ht=new WeakMap,Ee=new WeakMap,Gi=new WeakMap,Ot=new WeakMap,Nr=new WeakMap,va=new WeakMap,nn=new WeakMap,Rn=new WeakMap,Zi=new WeakMap,ja=new WeakMap,ba=new WeakMap,wr=new WeakMap,Sr=new WeakMap,On=new WeakMap,Na=new WeakMap,Fe=new WeakSet,oi=function(t){be(this,Fe,md).call(this);let n=D(this,Ee).fetch(this.options,t);return t!=null&&t.throwOnError||(n=n.catch(Ut)),n},id=function(){be(this,Fe,ud).call(this);const t=er(this.options.staleTime,D(this,Ee));if(Ir||D(this,Ot).isStale||!td(t))return;const r=Oy(D(this,Ot).dataUpdatedAt,t)+1;re(this,wr,fr.setTimeout(()=>{D(this,Ot).isStale||this.updateResult()},r))},ld=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(D(this,Ee)):this.options.refetchInterval)??!1},od=function(t){be(this,Fe,dd).call(this),re(this,On,t),!(Ir||ms(this.options.enabled,D(this,Ee))===!1||!td(D(this,On))||D(this,On)===0)&&re(this,Sr,fr.setInterval(()=>{(this.options.refetchIntervalInBackground||Dm.isFocused())&&be(this,Fe,oi).call(this)},D(this,On)))},cd=function(){be(this,Fe,id).call(this),be(this,Fe,od).call(this,be(this,Fe,ld).call(this))},ud=function(){D(this,wr)&&(fr.clearTimeout(D(this,wr)),re(this,wr,void 0))},dd=function(){D(this,Sr)&&(fr.clearInterval(D(this,Sr)),re(this,Sr,void 0))},md=function(){const t=D(this,Ht).getQueryCache().build(D(this,Ht),this.options);if(t===D(this,Ee))return;const n=D(this,Ee);re(this,Ee,t),re(this,Gi,t.state),this.hasListeners()&&(n==null||n.removeObserver(this),t.addObserver(this))},qy=function(t){ft.batch(()=>{t.listeners&&this.listeners.forEach(n=>{n(D(this,Ot))}),D(this,Ht).getQueryCache().notify({query:D(this,Ee),type:"observerResultsUpdated"})})},cx);function ZN(e,t){return ms(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&t.retryOnMount===!1)}function ip(e,t){return ZN(e,t)||e.state.data!==void 0&&hd(e,t,t.refetchOnMount)}function hd(e,t,n){if(ms(t.enabled,e)!==!1&&er(t.staleTime,e)!=="static"){const r=typeof n=="function"?n(e):n;return r==="always"||r!==!1&&Pm(e,t)}return!1}function lp(e,t,n,r){return(e!==t||ms(r.enabled,e)===!1)&&(!n.suspense||e.state.status!=="error")&&Pm(e,n)}function Pm(e,t){return ms(t.enabled,e)!==!1&&e.isStaleByTime(er(t.staleTime,e))}function JN(e,t){return!Po(e.getCurrentResult(),t)}function op(e){return{onFetch:(t,n)=>{var d,h,p,m,f;const r=t.options,a=(p=(h=(d=t.fetchOptions)==null?void 0:d.meta)==null?void 0:h.fetchMore)==null?void 0:p.direction,i=((m=t.state.data)==null?void 0:m.pages)||[],l=((f=t.state.data)==null?void 0:f.pageParams)||[];let o={pages:[],pageParams:[]},c=0;const u=async()=>{let y=!1;const N=x=>{BN(x,()=>t.signal,()=>y=!0)},v=_y(t.options,t.fetchOptions),g=async(x,j,k)=>{if(y)return Promise.reject();if(j==null&&x.pages.length)return Promise.resolve(x);const E=(()=>{const _={client:t.client,queryKey:t.queryKey,pageParam:j,direction:k?"backward":"forward",meta:t.options.meta};return N(_),_})(),S=await v(E),{maxPages:P}=t.options,A=k?UN:$N;return{pages:A(x.pages,S,P),pageParams:A(x.pageParams,j,P)}};if(a&&i.length){const x=a==="backward",j=x?XN:cp,k={pages:i,pageParams:l},F=j(r,k);o=await g(k,F,x)}else{const x=e??i.length;do{const j=c===0?l[0]??r.initialPageParam:cp(r,o);if(c>0&&j==null)break;o=await g(o,j),c++}while(c{var y,N;return(N=(y=t.options).persister)==null?void 0:N.call(y,u,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n)}:t.fetchFn=u}}}function cp(e,{pages:t,pageParams:n}){const r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function XN(e,{pages:t,pageParams:n}){var r;return t.length>0?(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,n[0],n):void 0}var Ji,$s,zt,kr,Us,Cn,ux,YN=(ux=class extends By{constructor(t){super();me(this,Us);me(this,Ji);me(this,$s);me(this,zt);me(this,kr);re(this,Ji,t.client),this.mutationId=t.mutationId,re(this,zt,t.mutationCache),re(this,$s,[]),this.state=t.state||Vy(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){D(this,$s).includes(t)||(D(this,$s).push(t),this.clearGcTimeout(),D(this,zt).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){re(this,$s,D(this,$s).filter(n=>n!==t)),this.scheduleGc(),D(this,zt).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){D(this,$s).length||(this.state.status==="pending"?this.scheduleGc():D(this,zt).remove(this))}continue(){var t;return((t=D(this,kr))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var l,o,c,u,d,h,p,m,f,y,N,v,g,x,j,k,F,E,S,P;const n=()=>{be(this,Us,Cn).call(this,{type:"continue"})},r={client:D(this,Ji),meta:this.options.meta,mutationKey:this.options.mutationKey};re(this,kr,Uy({fn:()=>this.options.mutationFn?this.options.mutationFn(t,r):Promise.reject(new Error("No mutationFn found")),onFail:(A,_)=>{be(this,Us,Cn).call(this,{type:"failed",failureCount:A,error:_})},onPause:()=>{be(this,Us,Cn).call(this,{type:"pause"})},onContinue:n,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>D(this,zt).canRun(this)}));const a=this.state.status==="pending",i=!D(this,kr).canStart();try{if(a)n();else{be(this,Us,Cn).call(this,{type:"pending",variables:t,isPaused:i}),await((o=(l=D(this,zt).config).onMutate)==null?void 0:o.call(l,t,this,r));const _=await((u=(c=this.options).onMutate)==null?void 0:u.call(c,t,r));_!==this.state.context&&be(this,Us,Cn).call(this,{type:"pending",context:_,variables:t,isPaused:i})}const A=await D(this,kr).start();return await((h=(d=D(this,zt).config).onSuccess)==null?void 0:h.call(d,A,t,this.state.context,this,r)),await((m=(p=this.options).onSuccess)==null?void 0:m.call(p,A,t,this.state.context,r)),await((y=(f=D(this,zt).config).onSettled)==null?void 0:y.call(f,A,null,this.state.variables,this.state.context,this,r)),await((v=(N=this.options).onSettled)==null?void 0:v.call(N,A,null,t,this.state.context,r)),be(this,Us,Cn).call(this,{type:"success",data:A}),A}catch(A){try{await((x=(g=D(this,zt).config).onError)==null?void 0:x.call(g,A,t,this.state.context,this,r))}catch(_){Promise.reject(_)}try{await((k=(j=this.options).onError)==null?void 0:k.call(j,A,t,this.state.context,r))}catch(_){Promise.reject(_)}try{await((E=(F=D(this,zt).config).onSettled)==null?void 0:E.call(F,void 0,A,this.state.variables,this.state.context,this,r))}catch(_){Promise.reject(_)}try{await((P=(S=this.options).onSettled)==null?void 0:P.call(S,void 0,A,t,this.state.context,r))}catch(_){Promise.reject(_)}throw be(this,Us,Cn).call(this,{type:"error",error:A}),A}finally{D(this,zt).runNext(this)}}},Ji=new WeakMap,$s=new WeakMap,zt=new WeakMap,kr=new WeakMap,Us=new WeakSet,Cn=function(t){const n=r=>{switch(t.type){case"failed":return{...r,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...r,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:t.error,failureCount:r.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=n(this.state),ft.batch(()=>{D(this,$s).forEach(r=>{r.onMutationUpdate(t)}),D(this,zt).notify({mutation:this,type:"updated",action:t})})},ux);function Vy(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var rn,ks,Xi,dx,ew=(dx=class extends Ba{constructor(t={}){super();me(this,rn);me(this,ks);me(this,Xi);this.config=t,re(this,rn,new Set),re(this,ks,new Map),re(this,Xi,0)}build(t,n,r){const a=new YN({client:t,mutationCache:this,mutationId:++xl(this,Xi)._,options:t.defaultMutationOptions(n),state:r});return this.add(a),a}add(t){D(this,rn).add(t);const n=Il(t);if(typeof n=="string"){const r=D(this,ks).get(n);r?r.push(t):D(this,ks).set(n,[t])}this.notify({type:"added",mutation:t})}remove(t){if(D(this,rn).delete(t)){const n=Il(t);if(typeof n=="string"){const r=D(this,ks).get(n);if(r)if(r.length>1){const a=r.indexOf(t);a!==-1&&r.splice(a,1)}else r[0]===t&&D(this,ks).delete(n)}}this.notify({type:"removed",mutation:t})}canRun(t){const n=Il(t);if(typeof n=="string"){const r=D(this,ks).get(n),a=r==null?void 0:r.find(i=>i.state.status==="pending");return!a||a===t}else return!0}runNext(t){var r;const n=Il(t);if(typeof n=="string"){const a=(r=D(this,ks).get(n))==null?void 0:r.find(i=>i!==t&&i.state.isPaused);return(a==null?void 0:a.continue())??Promise.resolve()}else return Promise.resolve()}clear(){ft.batch(()=>{D(this,rn).forEach(t=>{this.notify({type:"removed",mutation:t})}),D(this,rn).clear(),D(this,ks).clear()})}getAll(){return Array.from(D(this,rn))}find(t){const n={exact:!0,...t};return this.getAll().find(r=>tp(n,r))}findAll(t={}){return this.getAll().filter(n=>tp(t,n))}notify(t){ft.batch(()=>{this.listeners.forEach(n=>{n(t)})})}resumePausedMutations(){const t=this.getAll().filter(n=>n.state.isPaused);return ft.batch(()=>Promise.all(t.map(n=>n.continue().catch(Ut))))}},rn=new WeakMap,ks=new WeakMap,Xi=new WeakMap,dx);function Il(e){var t;return(t=e.options.scope)==null?void 0:t.id}var an,zn,Wt,ln,hn,Zl,fd,mx,tw=(mx=class extends Ba{constructor(n,r){super();me(this,hn);me(this,an);me(this,zn);me(this,Wt);me(this,ln);re(this,an,n),this.setOptions(r),this.bindMethods(),be(this,hn,Zl).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(n){var a;const r=this.options;this.options=D(this,an).defaultMutationOptions(n),Po(this.options,r)||D(this,an).getMutationCache().notify({type:"observerOptionsUpdated",mutation:D(this,Wt),observer:this}),r!=null&&r.mutationKey&&this.options.mutationKey&&Lr(r.mutationKey)!==Lr(this.options.mutationKey)?this.reset():((a=D(this,Wt))==null?void 0:a.state.status)==="pending"&&D(this,Wt).setOptions(this.options)}onUnsubscribe(){var n;this.hasListeners()||(n=D(this,Wt))==null||n.removeObserver(this)}onMutationUpdate(n){be(this,hn,Zl).call(this),be(this,hn,fd).call(this,n)}getCurrentResult(){return D(this,zn)}reset(){var n;(n=D(this,Wt))==null||n.removeObserver(this),re(this,Wt,void 0),be(this,hn,Zl).call(this),be(this,hn,fd).call(this)}mutate(n,r){var a;return re(this,ln,r),(a=D(this,Wt))==null||a.removeObserver(this),re(this,Wt,D(this,an).getMutationCache().build(D(this,an),this.options)),D(this,Wt).addObserver(this),D(this,Wt).execute(n)}},an=new WeakMap,zn=new WeakMap,Wt=new WeakMap,ln=new WeakMap,hn=new WeakSet,Zl=function(){var r;const n=((r=D(this,Wt))==null?void 0:r.state)??Vy();re(this,zn,{...n,isPending:n.status==="pending",isSuccess:n.status==="success",isError:n.status==="error",isIdle:n.status==="idle",mutate:this.mutate,reset:this.reset})},fd=function(n){ft.batch(()=>{var r,a,i,l,o,c,u,d;if(D(this,ln)&&this.hasListeners()){const h=D(this,zn).variables,p=D(this,zn).context,m={client:D(this,an),meta:this.options.meta,mutationKey:this.options.mutationKey};if((n==null?void 0:n.type)==="success"){try{(a=(r=D(this,ln)).onSuccess)==null||a.call(r,n.data,h,p,m)}catch(f){Promise.reject(f)}try{(l=(i=D(this,ln)).onSettled)==null||l.call(i,n.data,null,h,p,m)}catch(f){Promise.reject(f)}}else if((n==null?void 0:n.type)==="error"){try{(c=(o=D(this,ln)).onError)==null||c.call(o,n.error,h,p,m)}catch(f){Promise.reject(f)}try{(d=(u=D(this,ln)).onSettled)==null||d.call(u,void 0,n.error,h,p,m)}catch(f){Promise.reject(f)}}}this.listeners.forEach(h=>{h(D(this,zn))})})},mx),Bs,hx,sw=(hx=class extends Ba{constructor(t={}){super();me(this,Bs);this.config=t,re(this,Bs,new Map)}build(t,n,r){const a=n.queryKey,i=n.queryHash??km(a,n);let l=this.get(i);return l||(l=new WN({client:t,queryKey:a,queryHash:i,options:t.defaultQueryOptions(n),state:r,defaultOptions:t.getQueryDefaults(a)}),this.add(l)),l}add(t){D(this,Bs).has(t.queryHash)||(D(this,Bs).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const n=D(this,Bs).get(t.queryHash);n&&(t.destroy(),n===t&&D(this,Bs).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){ft.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return D(this,Bs).get(t)}getAll(){return[...D(this,Bs).values()]}find(t){const n={exact:!0,...t};return this.getAll().find(r=>ep(n,r))}findAll(t={}){const n=this.getAll();return Object.keys(t).length>0?n.filter(r=>ep(t,r)):n}notify(t){ft.batch(()=>{this.listeners.forEach(n=>{n(t)})})}onFocus(){ft.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){ft.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Bs=new WeakMap,hx),Ye,_n,$n,wa,Sa,Un,ka,Ca,fx,nw=(fx=class{constructor(e={}){me(this,Ye);me(this,_n);me(this,$n);me(this,wa);me(this,Sa);me(this,Un);me(this,ka);me(this,Ca);re(this,Ye,e.queryCache||new sw),re(this,_n,e.mutationCache||new ew),re(this,$n,e.defaultOptions||{}),re(this,wa,new Map),re(this,Sa,new Map),re(this,Un,0)}mount(){xl(this,Un)._++,D(this,Un)===1&&(re(this,ka,Dm.subscribe(async e=>{e&&(await this.resumePausedMutations(),D(this,Ye).onFocus())})),re(this,Ca,Ao.subscribe(async e=>{e&&(await this.resumePausedMutations(),D(this,Ye).onOnline())})))}unmount(){var e,t;xl(this,Un)._--,D(this,Un)===0&&((e=D(this,ka))==null||e.call(this),re(this,ka,void 0),(t=D(this,Ca))==null||t.call(this),re(this,Ca,void 0))}isFetching(e){return D(this,Ye).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return D(this,_n).findAll({...e,status:"pending"}).length}getQueryData(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=D(this,Ye).get(t.queryHash))==null?void 0:n.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),n=D(this,Ye).build(this,t),r=n.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(er(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return D(this,Ye).findAll(e).map(({queryKey:t,state:n})=>{const r=n.data;return[t,r]})}setQueryData(e,t,n){const r=this.defaultQueryOptions({queryKey:e}),a=D(this,Ye).get(r.queryHash),i=a==null?void 0:a.state.data,l=ON(t,i);if(l!==void 0)return D(this,Ye).build(this,r).setData(l,{...n,manual:!0})}setQueriesData(e,t,n){return ft.batch(()=>D(this,Ye).findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,n)]))}getQueryState(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=D(this,Ye).get(t.queryHash))==null?void 0:n.state}removeQueries(e){const t=D(this,Ye);ft.batch(()=>{t.findAll(e).forEach(n=>{t.remove(n)})})}resetQueries(e,t){const n=D(this,Ye);return ft.batch(()=>(n.findAll(e).forEach(r=>{r.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const n={revert:!0,...t},r=ft.batch(()=>D(this,Ye).findAll(e).map(a=>a.cancel(n)));return Promise.all(r).then(Ut).catch(Ut)}invalidateQueries(e,t={}){return ft.batch(()=>(D(this,Ye).findAll(e).forEach(n=>{n.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const n={...t,cancelRefetch:t.cancelRefetch??!0},r=ft.batch(()=>D(this,Ye).findAll(e).filter(a=>!a.isDisabled()&&!a.isStatic()).map(a=>{let i=a.fetch(void 0,n);return n.throwOnError||(i=i.catch(Ut)),a.state.fetchStatus==="paused"?Promise.resolve():i}));return Promise.all(r).then(Ut)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const n=D(this,Ye).build(this,t);return n.isStaleByTime(er(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Ut).catch(Ut)}fetchInfiniteQuery(e){return e.behavior=op(e.pages),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Ut).catch(Ut)}ensureInfiniteQueryData(e){return e.behavior=op(e.pages),this.ensureQueryData(e)}resumePausedMutations(){return Ao.isOnline()?D(this,_n).resumePausedMutations():Promise.resolve()}getQueryCache(){return D(this,Ye)}getMutationCache(){return D(this,_n)}getDefaultOptions(){return D(this,$n)}setDefaultOptions(e){re(this,$n,e)}setQueryDefaults(e,t){D(this,wa).set(Lr(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...D(this,wa).values()],n={};return t.forEach(r=>{Ui(e,r.queryKey)&&Object.assign(n,r.defaultOptions)}),n}setMutationDefaults(e,t){D(this,Sa).set(Lr(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...D(this,Sa).values()],n={};return t.forEach(r=>{Ui(e,r.mutationKey)&&Object.assign(n,r.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;const t={...D(this,$n).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=km(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===Cm&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...D(this,$n).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){D(this,Ye).clear(),D(this,_n).clear()}},Ye=new WeakMap,_n=new WeakMap,$n=new WeakMap,wa=new WeakMap,Sa=new WeakMap,Un=new WeakMap,ka=new WeakMap,Ca=new WeakMap,fx),Qy=b.createContext(void 0),pe=e=>{const t=b.useContext(Qy);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},rw=({client:e,children:t})=>(b.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),s.jsx(Qy.Provider,{value:e,children:t})),Hy=b.createContext(!1),aw=()=>b.useContext(Hy);Hy.Provider;function iw(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var lw=b.createContext(iw()),ow=()=>b.useContext(lw),cw=(e,t,n)=>{const r=n!=null&&n.state.error&&typeof e.throwOnError=="function"?Em(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},uw=e=>{b.useEffect(()=>{e.clearReset()},[e])},dw=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:a})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(a&&e.data===void 0||Em(n,[e.error,r])),mw=e=>{if(e.suspense){const n=a=>a==="static"?a:Math.max(a??1e3,1e3),r=e.staleTime;e.staleTime=typeof r=="function"?(...a)=>n(r(...a)):n(r),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},hw=(e,t)=>e.isLoading&&e.isFetching&&!t,fw=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,up=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function pw(e,t,n){var p,m,f,y;const r=aw(),a=ow(),i=pe(),l=i.defaultQueryOptions(e);(m=(p=i.getDefaultOptions().queries)==null?void 0:p._experimental_beforeQuery)==null||m.call(p,l);const o=i.getQueryCache().get(l.queryHash);l._optimisticResults=r?"isRestoring":"optimistic",mw(l),cw(l,a,o),uw(a);const c=!i.getQueryCache().get(l.queryHash),[u]=b.useState(()=>new t(i,l)),d=u.getOptimisticResult(l),h=!r&&e.subscribed!==!1;if(b.useSyncExternalStore(b.useCallback(N=>{const v=h?u.subscribe(ft.batchCalls(N)):Ut;return u.updateResult(),v},[u,h]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),b.useEffect(()=>{u.setOptions(l)},[l,u]),fw(l,d))throw up(l,u,a);if(dw({result:d,errorResetBoundary:a,throwOnError:l.throwOnError,query:o,suspense:l.suspense}))throw d.error;if((y=(f=i.getDefaultOptions().queries)==null?void 0:f._experimental_afterQuery)==null||y.call(f,l,d),l.experimental_prefetchInRender&&!Ir&&hw(d,r)){const N=c?up(l,u,a):o==null?void 0:o.promise;N==null||N.catch(Ut).finally(()=>{u.updateResult()})}return l.notifyOnChangeProps?d:u.trackResult(d)}function he(e,t){return pw(e,GN)}function W(e,t){const n=pe(),[r]=b.useState(()=>new tw(n,e));b.useEffect(()=>{r.setOptions(e)},[r,e]);const a=b.useSyncExternalStore(b.useCallback(l=>r.subscribe(ft.batchCalls(l)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),i=b.useCallback((l,o)=>{r.mutate(l,o).catch(Ut)},[r]);if(a.error&&Em(r.options.throwOnError,[a.error]))throw a.error;return{...a,mutate:i,mutateAsync:a.mutate}}let xw={data:""},gw=e=>{if(typeof window=="object"){let t=(e?e.querySelector("#_goober"):window._goober)||Object.assign(document.createElement("style"),{innerHTML:" ",id:"_goober"});return t.nonce=window.__nonce__,t.parentNode||(e||document.head).appendChild(t),t.firstChild}return e||xw},yw=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,vw=/\/\*[^]*?\*\/| +/g,dp=/\n+/g,Mn=(e,t)=>{let n="",r="",a="";for(let i in e){let l=e[i];i[0]=="@"?i[1]=="i"?n=i+" "+l+";":r+=i[1]=="f"?Mn(l,i):i+"{"+Mn(l,i[1]=="k"?"":t)+"}":typeof l=="object"?r+=Mn(l,t?t.replace(/([^,])+/g,o=>i.replace(/([^,]*:\S+\([^)]*\))|([^,])+/g,c=>/&/.test(c)?c.replace(/&/g,o):o?o+" "+c:c)):i):l!=null&&(i=/^--/.test(i)?i:i.replace(/[A-Z]/g,"-$&").toLowerCase(),a+=Mn.p?Mn.p(i,l):i+":"+l+";")}return n+(t&&a?t+"{"+a+"}":a)+r},Js={},Wy=e=>{if(typeof e=="object"){let t="";for(let n in e)t+=n+Wy(e[n]);return t}return e},jw=(e,t,n,r,a)=>{let i=Wy(e),l=Js[i]||(Js[i]=(c=>{let u=0,d=11;for(;u>>0;return"go"+d})(i));if(!Js[l]){let c=i!==e?e:(u=>{let d,h,p=[{}];for(;d=yw.exec(u.replace(vw,""));)d[4]?p.shift():d[3]?(h=d[3].replace(dp," ").trim(),p.unshift(p[0][h]=p[0][h]||{})):p[0][d[1]]=d[2].replace(dp," ").trim();return p[0]})(e);Js[l]=Mn(a?{["@keyframes "+l]:c}:c,n?"":"."+l)}let o=n&&Js.g?Js.g:null;return n&&(Js.g=Js[l]),((c,u,d,h)=>{h?u.data=u.data.replace(h,c):u.data.indexOf(c)===-1&&(u.data=d?c+u.data:u.data+c)})(Js[l],t,r,o),l},bw=(e,t,n)=>e.reduce((r,a,i)=>{let l=t[i];if(l&&l.call){let o=l(n),c=o&&o.props&&o.props.className||/^go/.test(o)&&o;l=c?"."+c:o&&typeof o=="object"?o.props?"":Mn(o,""):o===!1?"":o}return r+a+(l??"")},"");function ac(e){let t=this||{},n=e.call?e(t.p):e;return jw(n.unshift?n.raw?bw(n,[].slice.call(arguments,1),t.p):n.reduce((r,a)=>Object.assign(r,a&&a.call?a(t.p):a),{}):n,gw(t.target),t.g,t.o,t.k)}let Gy,pd,xd;ac.bind({g:1});let yn=ac.bind({k:1});function Nw(e,t,n,r){Mn.p=t,Gy=e,pd=n,xd=r}function lr(e,t){let n=this||{};return function(){let r=arguments;function a(i,l){let o=Object.assign({},i),c=o.className||a.className;n.p=Object.assign({theme:pd&&pd()},o),n.o=/ *go\d+/.test(c),o.className=ac.apply(n,r)+(c?" "+c:"");let u=e;return e[0]&&(u=o.as||e,delete o.as),xd&&u[0]&&xd(o),Gy(u,o)}return a}}var ww=e=>typeof e=="function",Mo=(e,t)=>ww(e)?e(t):e,Sw=(()=>{let e=0;return()=>(++e).toString()})(),Zy=(()=>{let e;return()=>{if(e===void 0&&typeof window<"u"){let t=matchMedia("(prefers-reduced-motion: reduce)");e=!t||t.matches}return e}})(),kw=20,Am="default",Jy=(e,t)=>{let{toastLimit:n}=e.settings;switch(t.type){case 0:return{...e,toasts:[t.toast,...e.toasts].slice(0,n)};case 1:return{...e,toasts:e.toasts.map(l=>l.id===t.toast.id?{...l,...t.toast}:l)};case 2:let{toast:r}=t;return Jy(e,{type:e.toasts.find(l=>l.id===r.id)?1:0,toast:r});case 3:let{toastId:a}=t;return{...e,toasts:e.toasts.map(l=>l.id===a||a===void 0?{...l,dismissed:!0,visible:!1}:l)};case 4:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(l=>l.id!==t.toastId)};case 5:return{...e,pausedAt:t.time};case 6:let i=t.time-(e.pausedAt||0);return{...e,pausedAt:void 0,toasts:e.toasts.map(l=>({...l,pauseDuration:l.pauseDuration+i}))}}},Jl=[],Xy={toasts:[],pausedAt:void 0,settings:{toastLimit:kw}},qs={},Yy=(e,t=Am)=>{qs[t]=Jy(qs[t]||Xy,e),Jl.forEach(([n,r])=>{n===t&&r(qs[t])})},e0=e=>Object.keys(qs).forEach(t=>Yy(e,t)),Cw=e=>Object.keys(qs).find(t=>qs[t].toasts.some(n=>n.id===e)),ic=(e=Am)=>t=>{Yy(t,e)},Ew={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},Dw=(e={},t=Am)=>{let[n,r]=b.useState(qs[t]||Xy),a=b.useRef(qs[t]);b.useEffect(()=>(a.current!==qs[t]&&r(qs[t]),Jl.push([t,r]),()=>{let l=Jl.findIndex(([o])=>o===t);l>-1&&Jl.splice(l,1)}),[t]);let i=n.toasts.map(l=>{var o,c,u;return{...e,...e[l.type],...l,removeDelay:l.removeDelay||((o=e[l.type])==null?void 0:o.removeDelay)||(e==null?void 0:e.removeDelay),duration:l.duration||((c=e[l.type])==null?void 0:c.duration)||(e==null?void 0:e.duration)||Ew[l.type],style:{...e.style,...(u=e[l.type])==null?void 0:u.style,...l.style}}});return{...n,toasts:i}},Pw=(e,t="blank",n)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:t,ariaProps:{role:"status","aria-live":"polite"},message:e,pauseDuration:0,...n,id:(n==null?void 0:n.id)||Sw()}),rl=e=>(t,n)=>{let r=Pw(t,e,n);return ic(r.toasterId||Cw(r.id))({type:2,toast:r}),r.id},pt=(e,t)=>rl("blank")(e,t);pt.error=rl("error");pt.success=rl("success");pt.loading=rl("loading");pt.custom=rl("custom");pt.dismiss=(e,t)=>{let n={type:3,toastId:e};t?ic(t)(n):e0(n)};pt.dismissAll=e=>pt.dismiss(void 0,e);pt.remove=(e,t)=>{let n={type:4,toastId:e};t?ic(t)(n):e0(n)};pt.removeAll=e=>pt.remove(void 0,e);pt.promise=(e,t,n)=>{let r=pt.loading(t.loading,{...n,...n==null?void 0:n.loading});return typeof e=="function"&&(e=e()),e.then(a=>{let i=t.success?Mo(t.success,a):void 0;return i?pt.success(i,{id:r,...n,...n==null?void 0:n.success}):pt.dismiss(r),a}).catch(a=>{let i=t.error?Mo(t.error,a):void 0;i?pt.error(i,{id:r,...n,...n==null?void 0:n.error}):pt.dismiss(r)}),e};var Aw=1e3,Mw=(e,t="default")=>{let{toasts:n,pausedAt:r}=Dw(e,t),a=b.useRef(new Map).current,i=b.useCallback((h,p=Aw)=>{if(a.has(h))return;let m=setTimeout(()=>{a.delete(h),l({type:4,toastId:h})},p);a.set(h,m)},[]);b.useEffect(()=>{if(r)return;let h=Date.now(),p=n.map(m=>{if(m.duration===1/0)return;let f=(m.duration||0)+m.pauseDuration-(h-m.createdAt);if(f<0){m.visible&&pt.dismiss(m.id);return}return setTimeout(()=>pt.dismiss(m.id,t),f)});return()=>{p.forEach(m=>m&&clearTimeout(m))}},[n,r,t]);let l=b.useCallback(ic(t),[t]),o=b.useCallback(()=>{l({type:5,time:Date.now()})},[l]),c=b.useCallback((h,p)=>{l({type:1,toast:{id:h,height:p}})},[l]),u=b.useCallback(()=>{r&&l({type:6,time:Date.now()})},[r,l]),d=b.useCallback((h,p)=>{let{reverseOrder:m=!1,gutter:f=8,defaultPosition:y}=p||{},N=n.filter(x=>(x.position||y)===(h.position||y)&&x.height),v=N.findIndex(x=>x.id===h.id),g=N.filter((x,j)=>jx.visible).slice(...m?[g+1]:[0,g]).reduce((x,j)=>x+(j.height||0)+f,0)},[n]);return b.useEffect(()=>{n.forEach(h=>{if(h.dismissed)i(h.id,h.removeDelay);else{let p=a.get(h.id);p&&(clearTimeout(p),a.delete(h.id))}})},[n,i]),{toasts:n,handlers:{updateHeight:c,startPause:o,endPause:u,calculateOffset:d}}},Tw=yn` +from { + transform: scale(0) rotate(45deg); + opacity: 0; +} +to { + transform: scale(1) rotate(45deg); + opacity: 1; +}`,Fw=yn` +from { + transform: scale(0); + opacity: 0; +} +to { + transform: scale(1); + opacity: 1; +}`,Iw=yn` +from { + transform: scale(0) rotate(90deg); + opacity: 0; +} +to { + transform: scale(1) rotate(90deg); + opacity: 1; +}`,Lw=lr("div")` + width: 20px; + opacity: 0; + height: 20px; + border-radius: 10px; + background: ${e=>e.primary||"#ff4b4b"}; + position: relative; + transform: rotate(45deg); + + animation: ${Tw} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) + forwards; + animation-delay: 100ms; + + &:after, + &:before { + content: ''; + animation: ${Fw} 0.15s ease-out forwards; + animation-delay: 150ms; + position: absolute; + border-radius: 3px; + opacity: 0; + background: ${e=>e.secondary||"#fff"}; + bottom: 9px; + left: 4px; + height: 2px; + width: 12px; + } + + &:before { + animation: ${Iw} 0.15s ease-out forwards; + animation-delay: 180ms; + transform: rotate(90deg); + } +`,Rw=yn` + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +`,Ow=lr("div")` + width: 12px; + height: 12px; + box-sizing: border-box; + border: 2px solid; + border-radius: 100%; + border-color: ${e=>e.secondary||"#e0e0e0"}; + border-right-color: ${e=>e.primary||"#616161"}; + animation: ${Rw} 1s linear infinite; +`,zw=yn` +from { + transform: scale(0) rotate(45deg); + opacity: 0; +} +to { + transform: scale(1) rotate(45deg); + opacity: 1; +}`,_w=yn` +0% { + height: 0; + width: 0; + opacity: 0; +} +40% { + height: 0; + width: 6px; + opacity: 1; +} +100% { + opacity: 1; + height: 10px; +}`,$w=lr("div")` + width: 20px; + opacity: 0; + height: 20px; + border-radius: 10px; + background: ${e=>e.primary||"#61d345"}; + position: relative; + transform: rotate(45deg); + + animation: ${zw} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) + forwards; + animation-delay: 100ms; + &:after { + content: ''; + box-sizing: border-box; + animation: ${_w} 0.2s ease-out forwards; + opacity: 0; + animation-delay: 200ms; + position: absolute; + border-right: 2px solid; + border-bottom: 2px solid; + border-color: ${e=>e.secondary||"#fff"}; + bottom: 6px; + left: 6px; + height: 10px; + width: 6px; + } +`,Uw=lr("div")` + position: absolute; +`,Bw=lr("div")` + position: relative; + display: flex; + justify-content: center; + align-items: center; + min-width: 20px; + min-height: 20px; +`,Kw=yn` +from { + transform: scale(0.6); + opacity: 0.4; +} +to { + transform: scale(1); + opacity: 1; +}`,qw=lr("div")` + position: relative; + transform: scale(0.6); + opacity: 0.4; + min-width: 20px; + animation: ${Kw} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275) + forwards; +`,Vw=({toast:e})=>{let{icon:t,type:n,iconTheme:r}=e;return t!==void 0?typeof t=="string"?b.createElement(qw,null,t):t:n==="blank"?null:b.createElement(Bw,null,b.createElement(Ow,{...r}),n!=="loading"&&b.createElement(Uw,null,n==="error"?b.createElement(Lw,{...r}):b.createElement($w,{...r})))},Qw=e=>` +0% {transform: translate3d(0,${e*-200}%,0) scale(.6); opacity:.5;} +100% {transform: translate3d(0,0,0) scale(1); opacity:1;} +`,Hw=e=>` +0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;} +100% {transform: translate3d(0,${e*-150}%,-1px) scale(.6); opacity:0;} +`,Ww="0%{opacity:0;} 100%{opacity:1;}",Gw="0%{opacity:1;} 100%{opacity:0;}",Zw=lr("div")` + display: flex; + align-items: center; + background: #fff; + color: #363636; + line-height: 1.3; + will-change: transform; + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05); + max-width: 350px; + pointer-events: auto; + padding: 8px 10px; + border-radius: 8px; +`,Jw=lr("div")` + display: flex; + justify-content: center; + margin: 4px 10px; + color: inherit; + flex: 1 1 auto; + white-space: pre-line; +`,Xw=(e,t)=>{let n=e.includes("top")?1:-1,[r,a]=Zy()?[Ww,Gw]:[Qw(n),Hw(n)];return{animation:t?`${yn(r)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${yn(a)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},Yw=b.memo(({toast:e,position:t,style:n,children:r})=>{let a=e.height?Xw(e.position||t||"top-center",e.visible):{opacity:0},i=b.createElement(Vw,{toast:e}),l=b.createElement(Jw,{...e.ariaProps},Mo(e.message,e));return b.createElement(Zw,{className:e.className,style:{...a,...n,...e.style}},typeof r=="function"?r({icon:i,message:l}):b.createElement(b.Fragment,null,i,l))});Nw(b.createElement);var e1=({id:e,className:t,style:n,onHeightUpdate:r,children:a})=>{let i=b.useCallback(l=>{if(l){let o=()=>{let c=l.getBoundingClientRect().height;r(e,c)};o(),new MutationObserver(o).observe(l,{subtree:!0,childList:!0,characterData:!0})}},[e,r]);return b.createElement("div",{ref:i,className:t,style:n},a)},t1=(e,t)=>{let n=e.includes("top"),r=n?{top:0}:{bottom:0},a=e.includes("center")?{justifyContent:"center"}:e.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:Zy()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${t*(n?1:-1)}px)`,...r,...a}},s1=ac` + z-index: 9999; + > * { + pointer-events: auto; + } +`,Ll=16,n1=({reverseOrder:e,position:t="top-center",toastOptions:n,gutter:r,children:a,toasterId:i,containerStyle:l,containerClassName:o})=>{let{toasts:c,handlers:u}=Mw(n,i);return b.createElement("div",{"data-rht-toaster":i||"",style:{position:"fixed",zIndex:9999,top:Ll,left:Ll,right:Ll,bottom:Ll,pointerEvents:"none",...l},className:o,onMouseEnter:u.startPause,onMouseLeave:u.endPause},c.map(d=>{let h=d.position||t,p=u.calculateOffset(d,{reverseOrder:e,gutter:r,defaultPosition:t}),m=t1(h,p);return b.createElement(e1,{id:d.id,key:d.id,onHeightUpdate:u.updateHeight,className:d.visible?s1:"",style:m},d.type==="custom"?Mo(d.message,d):a?a(d):b.createElement(Yw,{toast:d,position:h}))}))},ps=pt;function t0(e,t){return function(){return e.apply(t,arguments)}}const{toString:r1}=Object.prototype,{getPrototypeOf:Mm}=Object,{iterator:lc,toStringTag:s0}=Symbol,oc=(e=>t=>{const n=r1.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Ls=e=>(e=e.toLowerCase(),t=>oc(t)===e),cc=e=>t=>typeof t===e,{isArray:Ka}=Array,La=cc("undefined");function al(e){return e!==null&&!La(e)&&e.constructor!==null&&!La(e.constructor)&&ts(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const n0=Ls("ArrayBuffer");function a1(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&n0(e.buffer),t}const i1=cc("string"),ts=cc("function"),r0=cc("number"),il=e=>e!==null&&typeof e=="object",l1=e=>e===!0||e===!1,Xl=e=>{if(oc(e)!=="object")return!1;const t=Mm(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(s0 in e)&&!(lc in e)},o1=e=>{if(!il(e)||al(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},c1=Ls("Date"),u1=Ls("File"),d1=Ls("Blob"),m1=Ls("FileList"),h1=e=>il(e)&&ts(e.pipe),f1=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||ts(e.append)&&((t=oc(e))==="formdata"||t==="object"&&ts(e.toString)&&e.toString()==="[object FormData]"))},p1=Ls("URLSearchParams"),[x1,g1,y1,v1]=["ReadableStream","Request","Response","Headers"].map(Ls),j1=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function ll(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,a;if(typeof e!="object"&&(e=[e]),Ka(e))for(r=0,a=e.length;r0;)if(a=n[r],t===a.toLowerCase())return a;return null}const pr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,i0=e=>!La(e)&&e!==pr;function gd(){const{caseless:e,skipUndefined:t}=i0(this)&&this||{},n={},r=(a,i)=>{const l=e&&a0(n,i)||i;Xl(n[l])&&Xl(a)?n[l]=gd(n[l],a):Xl(a)?n[l]=gd({},a):Ka(a)?n[l]=a.slice():(!t||!La(a))&&(n[l]=a)};for(let a=0,i=arguments.length;a(ll(t,(a,i)=>{n&&ts(a)?e[i]=t0(a,n):e[i]=a},{allOwnKeys:r}),e),N1=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),w1=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},S1=(e,t,n,r)=>{let a,i,l;const o={};if(t=t||{},e==null)return t;do{for(a=Object.getOwnPropertyNames(e),i=a.length;i-- >0;)l=a[i],(!r||r(l,e,t))&&!o[l]&&(t[l]=e[l],o[l]=!0);e=n!==!1&&Mm(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},k1=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},C1=e=>{if(!e)return null;if(Ka(e))return e;let t=e.length;if(!r0(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},E1=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&Mm(Uint8Array)),D1=(e,t)=>{const r=(e&&e[lc]).call(e);let a;for(;(a=r.next())&&!a.done;){const i=a.value;t.call(e,i[0],i[1])}},P1=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},A1=Ls("HTMLFormElement"),M1=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,a){return r.toUpperCase()+a}),mp=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),T1=Ls("RegExp"),l0=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};ll(n,(a,i)=>{let l;(l=t(a,i,e))!==!1&&(r[i]=l||a)}),Object.defineProperties(e,r)},F1=e=>{l0(e,(t,n)=>{if(ts(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(ts(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},I1=(e,t)=>{const n={},r=a=>{a.forEach(i=>{n[i]=!0})};return Ka(e)?r(e):r(String(e).split(t)),n},L1=()=>{},R1=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function O1(e){return!!(e&&ts(e.append)&&e[s0]==="FormData"&&e[lc])}const z1=e=>{const t=new Array(10),n=(r,a)=>{if(il(r)){if(t.indexOf(r)>=0)return;if(al(r))return r;if(!("toJSON"in r)){t[a]=r;const i=Ka(r)?[]:{};return ll(r,(l,o)=>{const c=n(l,a+1);!La(c)&&(i[o]=c)}),t[a]=void 0,i}}return r};return n(e,0)},_1=Ls("AsyncFunction"),$1=e=>e&&(il(e)||ts(e))&&ts(e.then)&&ts(e.catch),o0=((e,t)=>e?setImmediate:t?((n,r)=>(pr.addEventListener("message",({source:a,data:i})=>{a===pr&&i===n&&r.length&&r.shift()()},!1),a=>{r.push(a),pr.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",ts(pr.postMessage)),U1=typeof queueMicrotask<"u"?queueMicrotask.bind(pr):typeof process<"u"&&process.nextTick||o0,B1=e=>e!=null&&ts(e[lc]),U={isArray:Ka,isArrayBuffer:n0,isBuffer:al,isFormData:f1,isArrayBufferView:a1,isString:i1,isNumber:r0,isBoolean:l1,isObject:il,isPlainObject:Xl,isEmptyObject:o1,isReadableStream:x1,isRequest:g1,isResponse:y1,isHeaders:v1,isUndefined:La,isDate:c1,isFile:u1,isBlob:d1,isRegExp:T1,isFunction:ts,isStream:h1,isURLSearchParams:p1,isTypedArray:E1,isFileList:m1,forEach:ll,merge:gd,extend:b1,trim:j1,stripBOM:N1,inherits:w1,toFlatObject:S1,kindOf:oc,kindOfTest:Ls,endsWith:k1,toArray:C1,forEachEntry:D1,matchAll:P1,isHTMLForm:A1,hasOwnProperty:mp,hasOwnProp:mp,reduceDescriptors:l0,freezeMethods:F1,toObjectSet:I1,toCamelCase:M1,noop:L1,toFiniteNumber:R1,findKey:a0,global:pr,isContextDefined:i0,isSpecCompliantForm:O1,toJSONObject:z1,isAsyncFn:_1,isThenable:$1,setImmediate:o0,asap:U1,isIterable:B1};function je(e,t,n,r,a){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),a&&(this.response=a,this.status=a.status?a.status:null)}U.inherits(je,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:U.toJSONObject(this.config),code:this.code,status:this.status}}});const c0=je.prototype,u0={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{u0[e]={value:e}});Object.defineProperties(je,u0);Object.defineProperty(c0,"isAxiosError",{value:!0});je.from=(e,t,n,r,a,i)=>{const l=Object.create(c0);U.toFlatObject(e,l,function(d){return d!==Error.prototype},u=>u!=="isAxiosError");const o=e&&e.message?e.message:"Error",c=t==null&&e?e.code:t;return je.call(l,o,c,n,r,a),e&&l.cause==null&&Object.defineProperty(l,"cause",{value:e,configurable:!0}),l.name=e&&e.name||"Error",i&&Object.assign(l,i),l};const K1=null;function yd(e){return U.isPlainObject(e)||U.isArray(e)}function d0(e){return U.endsWith(e,"[]")?e.slice(0,-2):e}function hp(e,t,n){return e?e.concat(t).map(function(a,i){return a=d0(a),!n&&i?"["+a+"]":a}).join(n?".":""):t}function q1(e){return U.isArray(e)&&!e.some(yd)}const V1=U.toFlatObject(U,{},null,function(t){return/^is[A-Z]/.test(t)});function uc(e,t,n){if(!U.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=U.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,N){return!U.isUndefined(N[y])});const r=n.metaTokens,a=n.visitor||d,i=n.dots,l=n.indexes,c=(n.Blob||typeof Blob<"u"&&Blob)&&U.isSpecCompliantForm(t);if(!U.isFunction(a))throw new TypeError("visitor must be a function");function u(f){if(f===null)return"";if(U.isDate(f))return f.toISOString();if(U.isBoolean(f))return f.toString();if(!c&&U.isBlob(f))throw new je("Blob is not supported. Use a Buffer instead.");return U.isArrayBuffer(f)||U.isTypedArray(f)?c&&typeof Blob=="function"?new Blob([f]):Buffer.from(f):f}function d(f,y,N){let v=f;if(f&&!N&&typeof f=="object"){if(U.endsWith(y,"{}"))y=r?y:y.slice(0,-2),f=JSON.stringify(f);else if(U.isArray(f)&&q1(f)||(U.isFileList(f)||U.endsWith(y,"[]"))&&(v=U.toArray(f)))return y=d0(y),v.forEach(function(x,j){!(U.isUndefined(x)||x===null)&&t.append(l===!0?hp([y],j,i):l===null?y:y+"[]",u(x))}),!1}return yd(f)?!0:(t.append(hp(N,y,i),u(f)),!1)}const h=[],p=Object.assign(V1,{defaultVisitor:d,convertValue:u,isVisitable:yd});function m(f,y){if(!U.isUndefined(f)){if(h.indexOf(f)!==-1)throw Error("Circular reference detected in "+y.join("."));h.push(f),U.forEach(f,function(v,g){(!(U.isUndefined(v)||v===null)&&a.call(t,v,U.isString(g)?g.trim():g,y,p))===!0&&m(v,y?y.concat(g):[g])}),h.pop()}}if(!U.isObject(e))throw new TypeError("data must be an object");return m(e),t}function fp(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Tm(e,t){this._pairs=[],e&&uc(e,this,t)}const m0=Tm.prototype;m0.append=function(t,n){this._pairs.push([t,n])};m0.toString=function(t){const n=t?function(r){return t.call(this,r,fp)}:fp;return this._pairs.map(function(a){return n(a[0])+"="+n(a[1])},"").join("&")};function Q1(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function h0(e,t,n){if(!t)return e;const r=n&&n.encode||Q1;U.isFunction(n)&&(n={serialize:n});const a=n&&n.serialize;let i;if(a?i=a(t,n):i=U.isURLSearchParams(t)?t.toString():new Tm(t,n).toString(r),i){const l=e.indexOf("#");l!==-1&&(e=e.slice(0,l)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class pp{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){U.forEach(this.handlers,function(r){r!==null&&t(r)})}}const f0={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},H1=typeof URLSearchParams<"u"?URLSearchParams:Tm,W1=typeof FormData<"u"?FormData:null,G1=typeof Blob<"u"?Blob:null,Z1={isBrowser:!0,classes:{URLSearchParams:H1,FormData:W1,Blob:G1},protocols:["http","https","file","blob","url","data"]},Fm=typeof window<"u"&&typeof document<"u",vd=typeof navigator=="object"&&navigator||void 0,J1=Fm&&(!vd||["ReactNative","NativeScript","NS"].indexOf(vd.product)<0),X1=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Y1=Fm&&window.location.href||"http://localhost",e2=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Fm,hasStandardBrowserEnv:J1,hasStandardBrowserWebWorkerEnv:X1,navigator:vd,origin:Y1},Symbol.toStringTag,{value:"Module"})),It={...e2,...Z1};function t2(e,t){return uc(e,new It.classes.URLSearchParams,{visitor:function(n,r,a,i){return It.isNode&&U.isBuffer(n)?(this.append(r,n.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)},...t})}function s2(e){return U.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function n2(e){const t={},n=Object.keys(e);let r;const a=n.length;let i;for(r=0;r=n.length;return l=!l&&U.isArray(a)?a.length:l,c?(U.hasOwnProp(a,l)?a[l]=[a[l],r]:a[l]=r,!o):((!a[l]||!U.isObject(a[l]))&&(a[l]=[]),t(n,r,a[l],i)&&U.isArray(a[l])&&(a[l]=n2(a[l])),!o)}if(U.isFormData(e)&&U.isFunction(e.entries)){const n={};return U.forEachEntry(e,(r,a)=>{t(s2(r),a,n,0)}),n}return null}function r2(e,t,n){if(U.isString(e))try{return(t||JSON.parse)(e),U.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const ol={transitional:f0,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",a=r.indexOf("application/json")>-1,i=U.isObject(t);if(i&&U.isHTMLForm(t)&&(t=new FormData(t)),U.isFormData(t))return a?JSON.stringify(p0(t)):t;if(U.isArrayBuffer(t)||U.isBuffer(t)||U.isStream(t)||U.isFile(t)||U.isBlob(t)||U.isReadableStream(t))return t;if(U.isArrayBufferView(t))return t.buffer;if(U.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let o;if(i){if(r.indexOf("application/x-www-form-urlencoded")>-1)return t2(t,this.formSerializer).toString();if((o=U.isFileList(t))||r.indexOf("multipart/form-data")>-1){const c=this.env&&this.env.FormData;return uc(o?{"files[]":t}:t,c&&new c,this.formSerializer)}}return i||a?(n.setContentType("application/json",!1),r2(t)):t}],transformResponse:[function(t){const n=this.transitional||ol.transitional,r=n&&n.forcedJSONParsing,a=this.responseType==="json";if(U.isResponse(t)||U.isReadableStream(t))return t;if(t&&U.isString(t)&&(r&&!this.responseType||a)){const l=!(n&&n.silentJSONParsing)&&a;try{return JSON.parse(t,this.parseReviver)}catch(o){if(l)throw o.name==="SyntaxError"?je.from(o,je.ERR_BAD_RESPONSE,this,null,this.response):o}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:It.classes.FormData,Blob:It.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};U.forEach(["delete","get","head","post","put","patch"],e=>{ol.headers[e]={}});const a2=U.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),i2=e=>{const t={};let n,r,a;return e&&e.split(` +`).forEach(function(l){a=l.indexOf(":"),n=l.substring(0,a).trim().toLowerCase(),r=l.substring(a+1).trim(),!(!n||t[n]&&a2[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},xp=Symbol("internals");function si(e){return e&&String(e).trim().toLowerCase()}function Yl(e){return e===!1||e==null?e:U.isArray(e)?e.map(Yl):String(e)}function l2(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const o2=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Wc(e,t,n,r,a){if(U.isFunction(r))return r.call(this,t,n);if(a&&(t=n),!!U.isString(t)){if(U.isString(r))return t.indexOf(r)!==-1;if(U.isRegExp(r))return r.test(t)}}function c2(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function u2(e,t){const n=U.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(a,i,l){return this[r].call(this,t,a,i,l)},configurable:!0})})}let ss=class{constructor(t){t&&this.set(t)}set(t,n,r){const a=this;function i(o,c,u){const d=si(c);if(!d)throw new Error("header name must be a non-empty string");const h=U.findKey(a,d);(!h||a[h]===void 0||u===!0||u===void 0&&a[h]!==!1)&&(a[h||c]=Yl(o))}const l=(o,c)=>U.forEach(o,(u,d)=>i(u,d,c));if(U.isPlainObject(t)||t instanceof this.constructor)l(t,n);else if(U.isString(t)&&(t=t.trim())&&!o2(t))l(i2(t),n);else if(U.isObject(t)&&U.isIterable(t)){let o={},c,u;for(const d of t){if(!U.isArray(d))throw TypeError("Object iterator must return a key-value pair");o[u=d[0]]=(c=o[u])?U.isArray(c)?[...c,d[1]]:[c,d[1]]:d[1]}l(o,n)}else t!=null&&i(n,t,r);return this}get(t,n){if(t=si(t),t){const r=U.findKey(this,t);if(r){const a=this[r];if(!n)return a;if(n===!0)return l2(a);if(U.isFunction(n))return n.call(this,a,r);if(U.isRegExp(n))return n.exec(a);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=si(t),t){const r=U.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Wc(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let a=!1;function i(l){if(l=si(l),l){const o=U.findKey(r,l);o&&(!n||Wc(r,r[o],o,n))&&(delete r[o],a=!0)}}return U.isArray(t)?t.forEach(i):i(t),a}clear(t){const n=Object.keys(this);let r=n.length,a=!1;for(;r--;){const i=n[r];(!t||Wc(this,this[i],i,t,!0))&&(delete this[i],a=!0)}return a}normalize(t){const n=this,r={};return U.forEach(this,(a,i)=>{const l=U.findKey(r,i);if(l){n[l]=Yl(a),delete n[i];return}const o=t?c2(i):String(i).trim();o!==i&&delete n[i],n[o]=Yl(a),r[o]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return U.forEach(this,(r,a)=>{r!=null&&r!==!1&&(n[a]=t&&U.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(a=>r.set(a)),r}static accessor(t){const r=(this[xp]=this[xp]={accessors:{}}).accessors,a=this.prototype;function i(l){const o=si(l);r[o]||(u2(a,l),r[o]=!0)}return U.isArray(t)?t.forEach(i):i(t),this}};ss.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);U.reduceDescriptors(ss.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});U.freezeMethods(ss);function Gc(e,t){const n=this||ol,r=t||n,a=ss.from(r.headers);let i=r.data;return U.forEach(e,function(o){i=o.call(n,i,a.normalize(),t?t.status:void 0)}),a.normalize(),i}function x0(e){return!!(e&&e.__CANCEL__)}function qa(e,t,n){je.call(this,e??"canceled",je.ERR_CANCELED,t,n),this.name="CanceledError"}U.inherits(qa,je,{__CANCEL__:!0});function g0(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new je("Request failed with status code "+n.status,[je.ERR_BAD_REQUEST,je.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function d2(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function m2(e,t){e=e||10;const n=new Array(e),r=new Array(e);let a=0,i=0,l;return t=t!==void 0?t:1e3,function(c){const u=Date.now(),d=r[i];l||(l=u),n[a]=c,r[a]=u;let h=i,p=0;for(;h!==a;)p+=n[h++],h=h%e;if(a=(a+1)%e,a===i&&(i=(i+1)%e),u-l{n=d,a=null,i&&(clearTimeout(i),i=null),e(...u)};return[(...u)=>{const d=Date.now(),h=d-n;h>=r?l(u,d):(a=u,i||(i=setTimeout(()=>{i=null,l(a)},r-h)))},()=>a&&l(a)]}const To=(e,t,n=3)=>{let r=0;const a=m2(50,250);return h2(i=>{const l=i.loaded,o=i.lengthComputable?i.total:void 0,c=l-r,u=a(c),d=l<=o;r=l;const h={loaded:l,total:o,progress:o?l/o:void 0,bytes:c,rate:u||void 0,estimated:u&&o&&d?(o-l)/u:void 0,event:i,lengthComputable:o!=null,[t?"download":"upload"]:!0};e(h)},n)},gp=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},yp=e=>(...t)=>U.asap(()=>e(...t)),f2=It.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,It.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(It.origin),It.navigator&&/(msie|trident)/i.test(It.navigator.userAgent)):()=>!0,p2=It.hasStandardBrowserEnv?{write(e,t,n,r,a,i,l){if(typeof document>"u")return;const o=[`${e}=${encodeURIComponent(t)}`];U.isNumber(n)&&o.push(`expires=${new Date(n).toUTCString()}`),U.isString(r)&&o.push(`path=${r}`),U.isString(a)&&o.push(`domain=${a}`),i===!0&&o.push("secure"),U.isString(l)&&o.push(`SameSite=${l}`),document.cookie=o.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function x2(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function g2(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function y0(e,t,n){let r=!x2(t);return e&&(r||n==!1)?g2(e,t):t}const vp=e=>e instanceof ss?{...e}:e;function Rr(e,t){t=t||{};const n={};function r(u,d,h,p){return U.isPlainObject(u)&&U.isPlainObject(d)?U.merge.call({caseless:p},u,d):U.isPlainObject(d)?U.merge({},d):U.isArray(d)?d.slice():d}function a(u,d,h,p){if(U.isUndefined(d)){if(!U.isUndefined(u))return r(void 0,u,h,p)}else return r(u,d,h,p)}function i(u,d){if(!U.isUndefined(d))return r(void 0,d)}function l(u,d){if(U.isUndefined(d)){if(!U.isUndefined(u))return r(void 0,u)}else return r(void 0,d)}function o(u,d,h){if(h in t)return r(u,d);if(h in e)return r(void 0,u)}const c={url:i,method:i,data:i,baseURL:l,transformRequest:l,transformResponse:l,paramsSerializer:l,timeout:l,timeoutMessage:l,withCredentials:l,withXSRFToken:l,adapter:l,responseType:l,xsrfCookieName:l,xsrfHeaderName:l,onUploadProgress:l,onDownloadProgress:l,decompress:l,maxContentLength:l,maxBodyLength:l,beforeRedirect:l,transport:l,httpAgent:l,httpsAgent:l,cancelToken:l,socketPath:l,responseEncoding:l,validateStatus:o,headers:(u,d,h)=>a(vp(u),vp(d),h,!0)};return U.forEach(Object.keys({...e,...t}),function(d){const h=c[d]||a,p=h(e[d],t[d],d);U.isUndefined(p)&&h!==o||(n[d]=p)}),n}const v0=e=>{const t=Rr({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:a,xsrfCookieName:i,headers:l,auth:o}=t;if(t.headers=l=ss.from(l),t.url=h0(y0(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),o&&l.set("Authorization","Basic "+btoa((o.username||"")+":"+(o.password?unescape(encodeURIComponent(o.password)):""))),U.isFormData(n)){if(It.hasStandardBrowserEnv||It.hasStandardBrowserWebWorkerEnv)l.setContentType(void 0);else if(U.isFunction(n.getHeaders)){const c=n.getHeaders(),u=["content-type","content-length"];Object.entries(c).forEach(([d,h])=>{u.includes(d.toLowerCase())&&l.set(d,h)})}}if(It.hasStandardBrowserEnv&&(r&&U.isFunction(r)&&(r=r(t)),r||r!==!1&&f2(t.url))){const c=a&&i&&p2.read(i);c&&l.set(a,c)}return t},y2=typeof XMLHttpRequest<"u",v2=y2&&function(e){return new Promise(function(n,r){const a=v0(e);let i=a.data;const l=ss.from(a.headers).normalize();let{responseType:o,onUploadProgress:c,onDownloadProgress:u}=a,d,h,p,m,f;function y(){m&&m(),f&&f(),a.cancelToken&&a.cancelToken.unsubscribe(d),a.signal&&a.signal.removeEventListener("abort",d)}let N=new XMLHttpRequest;N.open(a.method.toUpperCase(),a.url,!0),N.timeout=a.timeout;function v(){if(!N)return;const x=ss.from("getAllResponseHeaders"in N&&N.getAllResponseHeaders()),k={data:!o||o==="text"||o==="json"?N.responseText:N.response,status:N.status,statusText:N.statusText,headers:x,config:e,request:N};g0(function(E){n(E),y()},function(E){r(E),y()},k),N=null}"onloadend"in N?N.onloadend=v:N.onreadystatechange=function(){!N||N.readyState!==4||N.status===0&&!(N.responseURL&&N.responseURL.indexOf("file:")===0)||setTimeout(v)},N.onabort=function(){N&&(r(new je("Request aborted",je.ECONNABORTED,e,N)),N=null)},N.onerror=function(j){const k=j&&j.message?j.message:"Network Error",F=new je(k,je.ERR_NETWORK,e,N);F.event=j||null,r(F),N=null},N.ontimeout=function(){let j=a.timeout?"timeout of "+a.timeout+"ms exceeded":"timeout exceeded";const k=a.transitional||f0;a.timeoutErrorMessage&&(j=a.timeoutErrorMessage),r(new je(j,k.clarifyTimeoutError?je.ETIMEDOUT:je.ECONNABORTED,e,N)),N=null},i===void 0&&l.setContentType(null),"setRequestHeader"in N&&U.forEach(l.toJSON(),function(j,k){N.setRequestHeader(k,j)}),U.isUndefined(a.withCredentials)||(N.withCredentials=!!a.withCredentials),o&&o!=="json"&&(N.responseType=a.responseType),u&&([p,f]=To(u,!0),N.addEventListener("progress",p)),c&&N.upload&&([h,m]=To(c),N.upload.addEventListener("progress",h),N.upload.addEventListener("loadend",m)),(a.cancelToken||a.signal)&&(d=x=>{N&&(r(!x||x.type?new qa(null,e,N):x),N.abort(),N=null)},a.cancelToken&&a.cancelToken.subscribe(d),a.signal&&(a.signal.aborted?d():a.signal.addEventListener("abort",d)));const g=d2(a.url);if(g&&It.protocols.indexOf(g)===-1){r(new je("Unsupported protocol "+g+":",je.ERR_BAD_REQUEST,e));return}N.send(i||null)})},j2=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,a;const i=function(u){if(!a){a=!0,o();const d=u instanceof Error?u:this.reason;r.abort(d instanceof je?d:new qa(d instanceof Error?d.message:d))}};let l=t&&setTimeout(()=>{l=null,i(new je(`timeout ${t} of ms exceeded`,je.ETIMEDOUT))},t);const o=()=>{e&&(l&&clearTimeout(l),l=null,e.forEach(u=>{u.unsubscribe?u.unsubscribe(i):u.removeEventListener("abort",i)}),e=null)};e.forEach(u=>u.addEventListener("abort",i));const{signal:c}=r;return c.unsubscribe=()=>U.asap(o),c}},b2=function*(e,t){let n=e.byteLength;if(n{const a=N2(e,t);let i=0,l,o=c=>{l||(l=!0,r&&r(c))};return new ReadableStream({async pull(c){try{const{done:u,value:d}=await a.next();if(u){o(),c.close();return}let h=d.byteLength;if(n){let p=i+=h;n(p)}c.enqueue(new Uint8Array(d))}catch(u){throw o(u),u}},cancel(c){return o(c),a.return()}},{highWaterMark:2})},bp=64*1024,{isFunction:Rl}=U,S2=(({Request:e,Response:t})=>({Request:e,Response:t}))(U.global),{ReadableStream:Np,TextEncoder:wp}=U.global,Sp=(e,...t)=>{try{return!!e(...t)}catch{return!1}},k2=e=>{e=U.merge.call({skipUndefined:!0},S2,e);const{fetch:t,Request:n,Response:r}=e,a=t?Rl(t):typeof fetch=="function",i=Rl(n),l=Rl(r);if(!a)return!1;const o=a&&Rl(Np),c=a&&(typeof wp=="function"?(f=>y=>f.encode(y))(new wp):async f=>new Uint8Array(await new n(f).arrayBuffer())),u=i&&o&&Sp(()=>{let f=!1;const y=new n(It.origin,{body:new Np,method:"POST",get duplex(){return f=!0,"half"}}).headers.has("Content-Type");return f&&!y}),d=l&&o&&Sp(()=>U.isReadableStream(new r("").body)),h={stream:d&&(f=>f.body)};a&&["text","arrayBuffer","blob","formData","stream"].forEach(f=>{!h[f]&&(h[f]=(y,N)=>{let v=y&&y[f];if(v)return v.call(y);throw new je(`Response type '${f}' is not supported`,je.ERR_NOT_SUPPORT,N)})});const p=async f=>{if(f==null)return 0;if(U.isBlob(f))return f.size;if(U.isSpecCompliantForm(f))return(await new n(It.origin,{method:"POST",body:f}).arrayBuffer()).byteLength;if(U.isArrayBufferView(f)||U.isArrayBuffer(f))return f.byteLength;if(U.isURLSearchParams(f)&&(f=f+""),U.isString(f))return(await c(f)).byteLength},m=async(f,y)=>{const N=U.toFiniteNumber(f.getContentLength());return N??p(y)};return async f=>{let{url:y,method:N,data:v,signal:g,cancelToken:x,timeout:j,onDownloadProgress:k,onUploadProgress:F,responseType:E,headers:S,withCredentials:P="same-origin",fetchOptions:A}=v0(f),_=t||fetch;E=E?(E+"").toLowerCase():"text";let L=j2([g,x&&x.toAbortSignal()],j),V=null;const q=L&&L.unsubscribe&&(()=>{L.unsubscribe()});let O;try{if(F&&u&&N!=="get"&&N!=="head"&&(O=await m(S,v))!==0){let fe=new n(y,{method:"POST",body:v,duplex:"half"}),ue;if(U.isFormData(v)&&(ue=fe.headers.get("content-type"))&&S.setContentType(ue),fe.body){const[nt,H]=gp(O,To(yp(F)));v=jp(fe.body,bp,nt,H)}}U.isString(P)||(P=P?"include":"omit");const C=i&&"credentials"in n.prototype,w={...A,signal:L,method:N.toUpperCase(),headers:S.normalize().toJSON(),body:v,duplex:"half",credentials:C?P:void 0};V=i&&new n(y,w);let R=await(i?_(V,A):_(y,w));const Q=d&&(E==="stream"||E==="response");if(d&&(k||Q&&q)){const fe={};["status","statusText","headers"].forEach(ke=>{fe[ke]=R[ke]});const ue=U.toFiniteNumber(R.headers.get("content-length")),[nt,H]=k&&gp(ue,To(yp(k),!0))||[];R=new r(jp(R.body,bp,nt,()=>{H&&H(),q&&q()}),fe)}E=E||"text";let ee=await h[U.findKey(h,E)||"text"](R,f);return!Q&&q&&q(),await new Promise((fe,ue)=>{g0(fe,ue,{data:ee,headers:ss.from(R.headers),status:R.status,statusText:R.statusText,config:f,request:V})})}catch(C){throw q&&q(),C&&C.name==="TypeError"&&/Load failed|fetch/i.test(C.message)?Object.assign(new je("Network Error",je.ERR_NETWORK,f,V),{cause:C.cause||C}):je.from(C,C&&C.code,f,V)}}},C2=new Map,j0=e=>{let t=e&&e.env||{};const{fetch:n,Request:r,Response:a}=t,i=[r,a,n];let l=i.length,o=l,c,u,d=C2;for(;o--;)c=i[o],u=d.get(c),u===void 0&&d.set(c,u=o?new Map:k2(t)),d=u;return u};j0();const Im={http:K1,xhr:v2,fetch:{get:j0}};U.forEach(Im,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const kp=e=>`- ${e}`,E2=e=>U.isFunction(e)||e===null||e===!1;function D2(e,t){e=U.isArray(e)?e:[e];const{length:n}=e;let r,a;const i={};for(let l=0;l`adapter ${c} `+(u===!1?"is not supported by the environment":"is not available in the build"));let o=n?l.length>1?`since : +`+l.map(kp).join(` +`):" "+kp(l[0]):"as no adapter specified";throw new je("There is no suitable adapter to dispatch the request "+o,"ERR_NOT_SUPPORT")}return a}const b0={getAdapter:D2,adapters:Im};function Zc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new qa(null,e)}function Cp(e){return Zc(e),e.headers=ss.from(e.headers),e.data=Gc.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),b0.getAdapter(e.adapter||ol.adapter,e)(e).then(function(r){return Zc(e),r.data=Gc.call(e,e.transformResponse,r),r.headers=ss.from(r.headers),r},function(r){return x0(r)||(Zc(e),r&&r.response&&(r.response.data=Gc.call(e,e.transformResponse,r.response),r.response.headers=ss.from(r.response.headers))),Promise.reject(r)})}const N0="1.13.2",dc={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{dc[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const Ep={};dc.transitional=function(t,n,r){function a(i,l){return"[Axios v"+N0+"] Transitional option '"+i+"'"+l+(r?". "+r:"")}return(i,l,o)=>{if(t===!1)throw new je(a(l," has been removed"+(n?" in "+n:"")),je.ERR_DEPRECATED);return n&&!Ep[l]&&(Ep[l]=!0,console.warn(a(l," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(i,l,o):!0}};dc.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function P2(e,t,n){if(typeof e!="object")throw new je("options must be an object",je.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let a=r.length;for(;a-- >0;){const i=r[a],l=t[i];if(l){const o=e[i],c=o===void 0||l(o,i,e);if(c!==!0)throw new je("option "+i+" must be "+c,je.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new je("Unknown option "+i,je.ERR_BAD_OPTION)}}const eo={assertOptions:P2,validators:dc},Os=eo.validators;let Dr=class{constructor(t){this.defaults=t||{},this.interceptors={request:new pp,response:new pp}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let a={};Error.captureStackTrace?Error.captureStackTrace(a):a=new Error;const i=a.stack?a.stack.replace(/^.+\n/,""):"";try{r.stack?i&&!String(r.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(r.stack+=` +`+i):r.stack=i}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Rr(this.defaults,n);const{transitional:r,paramsSerializer:a,headers:i}=n;r!==void 0&&eo.assertOptions(r,{silentJSONParsing:Os.transitional(Os.boolean),forcedJSONParsing:Os.transitional(Os.boolean),clarifyTimeoutError:Os.transitional(Os.boolean)},!1),a!=null&&(U.isFunction(a)?n.paramsSerializer={serialize:a}:eo.assertOptions(a,{encode:Os.function,serialize:Os.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),eo.assertOptions(n,{baseUrl:Os.spelling("baseURL"),withXsrfToken:Os.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let l=i&&U.merge(i.common,i[n.method]);i&&U.forEach(["delete","get","head","post","put","patch","common"],f=>{delete i[f]}),n.headers=ss.concat(l,i);const o=[];let c=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(n)===!1||(c=c&&y.synchronous,o.unshift(y.fulfilled,y.rejected))});const u=[];this.interceptors.response.forEach(function(y){u.push(y.fulfilled,y.rejected)});let d,h=0,p;if(!c){const f=[Cp.bind(this),void 0];for(f.unshift(...o),f.push(...u),p=f.length,d=Promise.resolve(n);h{if(!r._listeners)return;let i=r._listeners.length;for(;i-- >0;)r._listeners[i](a);r._listeners=null}),this.promise.then=a=>{let i;const l=new Promise(o=>{r.subscribe(o),i=o}).then(a);return l.cancel=function(){r.unsubscribe(i)},l},t(function(i,l,o){r.reason||(r.reason=new qa(i,l,o),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new w0(function(a){t=a}),cancel:t}}};function M2(e){return function(n){return e.apply(null,n)}}function T2(e){return U.isObject(e)&&e.isAxiosError===!0}const jd={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(jd).forEach(([e,t])=>{jd[t]=e});function S0(e){const t=new Dr(e),n=t0(Dr.prototype.request,t);return U.extend(n,Dr.prototype,t,{allOwnKeys:!0}),U.extend(n,t,null,{allOwnKeys:!0}),n.create=function(a){return S0(Rr(e,a))},n}const lt=S0(ol);lt.Axios=Dr;lt.CanceledError=qa;lt.CancelToken=A2;lt.isCancel=x0;lt.VERSION=N0;lt.toFormData=uc;lt.AxiosError=je;lt.Cancel=lt.CanceledError;lt.all=function(t){return Promise.all(t)};lt.spread=M2;lt.isAxiosError=T2;lt.mergeConfig=Rr;lt.AxiosHeaders=ss;lt.formToJSON=e=>p0(U.isHTMLForm(e)?new FormData(e):e);lt.getAdapter=b0.getAdapter;lt.HttpStatusCode=jd;lt.default=lt;const{Axios:lC,AxiosError:oC,CanceledError:cC,isCancel:uC,CancelToken:dC,VERSION:mC,all:hC,Cancel:fC,isAxiosError:pC,spread:xC,toFormData:gC,AxiosHeaders:yC,HttpStatusCode:vC,formToJSON:jC,getAdapter:bC,mergeConfig:NC}=lt,z=lt.create({baseURL:"/api",headers:{"Content-Type":"application/json"}});z.interceptors.request.use(e=>{const t=localStorage.getItem("token");return t&&(e.headers.Authorization=`Bearer ${t}`),e});z.interceptors.response.use(e=>e,e=>{var a,i,l,o,c,u,d;const t=((i=(a=e.config)==null?void 0:a.url)==null?void 0:i.includes("/auth/login"))||((o=(l=e.config)==null?void 0:l.url)==null?void 0:o.includes("/auth/customer-login"));((c=e.response)==null?void 0:c.status)===401&&!t&&(localStorage.removeItem("token"),localStorage.removeItem("user"),window.location.href="/login");const n=((d=(u=e.response)==null?void 0:u.data)==null?void 0:d.error)||e.message||"Ein Fehler ist aufgetreten",r=new Error(n);return Promise.reject(r)});const Ol={login:async(e,t)=>(await z.post("/auth/login",{email:e,password:t})).data,customerLogin:async(e,t)=>(await z.post("/auth/customer-login",{email:e,password:t})).data,me:async()=>(await z.get("/auth/me")).data},Nt={getAll:async e=>(await z.get("/customers",{params:e})).data,getById:async e=>(await z.get(`/customers/${e}`)).data,create:async e=>(await z.post("/customers",e)).data,update:async(e,t)=>(await z.put(`/customers/${e}`,t)).data,delete:async e=>(await z.delete(`/customers/${e}`)).data,getPortalSettings:async e=>(await z.get(`/customers/${e}/portal`)).data,updatePortalSettings:async(e,t)=>(await z.put(`/customers/${e}/portal`,t)).data,setPortalPassword:async(e,t)=>(await z.post(`/customers/${e}/portal/password`,{password:t})).data,getPortalPassword:async e=>(await z.get(`/customers/${e}/portal/password`)).data,getRepresentatives:async e=>(await z.get(`/customers/${e}/representatives`)).data,addRepresentative:async(e,t,n)=>(await z.post(`/customers/${e}/representatives`,{representativeId:t,notes:n})).data,removeRepresentative:async(e,t)=>(await z.delete(`/customers/${e}/representatives/${t}`)).data,searchForRepresentative:async(e,t)=>(await z.get(`/customers/${e}/representatives/search`,{params:{search:t}})).data},bd={getByCustomer:async e=>(await z.get(`/customers/${e}/addresses`)).data,create:async(e,t)=>(await z.post(`/customers/${e}/addresses`,t)).data,update:async(e,t)=>(await z.put(`/addresses/${e}`,t)).data,delete:async e=>(await z.delete(`/addresses/${e}`)).data},Fo={getByCustomer:async(e,t=!1)=>(await z.get(`/customers/${e}/bank-cards`,{params:{showInactive:t}})).data,create:async(e,t)=>(await z.post(`/customers/${e}/bank-cards`,t)).data,update:async(e,t)=>(await z.put(`/bank-cards/${e}`,t)).data,delete:async e=>(await z.delete(`/bank-cards/${e}`)).data},Io={getByCustomer:async(e,t=!1)=>(await z.get(`/customers/${e}/documents`,{params:{showInactive:t}})).data,create:async(e,t)=>(await z.post(`/customers/${e}/documents`,t)).data,update:async(e,t)=>(await z.put(`/documents/${e}`,t)).data,delete:async e=>(await z.delete(`/documents/${e}`)).data},Hs={getByCustomer:async(e,t=!1)=>(await z.get(`/customers/${e}/meters`,{params:{showInactive:t}})).data,create:async(e,t)=>(await z.post(`/customers/${e}/meters`,t)).data,update:async(e,t)=>(await z.put(`/meters/${e}`,t)).data,delete:async e=>(await z.delete(`/meters/${e}`)).data,getReadings:async e=>(await z.get(`/meters/${e}/readings`)).data,addReading:async(e,t)=>(await z.post(`/meters/${e}/readings`,t)).data,updateReading:async(e,t,n)=>(await z.put(`/meters/${e}/readings/${t}`,n)).data,deleteReading:async(e,t)=>(await z.delete(`/meters/${e}/readings/${t}`)).data},Ds={getByCustomer:async(e,t=!1)=>(await z.get(`/customers/${e}/stressfrei-emails`,{params:{includeInactive:t}})).data,create:async(e,t)=>(await z.post(`/customers/${e}/stressfrei-emails`,t)).data,update:async(e,t)=>(await z.put(`/stressfrei-emails/${e}`,t)).data,delete:async e=>(await z.delete(`/stressfrei-emails/${e}`)).data,enableMailbox:async e=>(await z.post(`/stressfrei-emails/${e}/enable-mailbox`)).data,syncMailboxStatus:async e=>(await z.post(`/stressfrei-emails/${e}/sync-mailbox-status`)).data,getMailboxCredentials:async e=>(await z.get(`/stressfrei-emails/${e}/credentials`)).data,resetPassword:async e=>(await z.post(`/stressfrei-emails/${e}/reset-password`)).data,syncEmails:async(e,t=!1)=>(await z.post(`/stressfrei-emails/${e}/sync`,{},{params:{full:t}})).data,sendEmail:async(e,t)=>(await z.post(`/stressfrei-emails/${e}/send`,t)).data,getFolderCounts:async e=>(await z.get(`/stressfrei-emails/${e}/folder-counts`)).data},qe={getForCustomer:async(e,t)=>(await z.get(`/customers/${e}/emails`,{params:t})).data,getForContract:async(e,t)=>(await z.get(`/contracts/${e}/emails`,{params:t})).data,getContractFolderCounts:async e=>(await z.get(`/contracts/${e}/emails/folder-counts`)).data,getMailboxAccounts:async e=>(await z.get(`/customers/${e}/mailbox-accounts`)).data,getById:async e=>(await z.get(`/emails/${e}`)).data,getThread:async e=>(await z.get(`/emails/${e}/thread`)).data,markAsRead:async(e,t)=>(await z.patch(`/emails/${e}/read`,{isRead:t})).data,toggleStar:async e=>(await z.post(`/emails/${e}/star`)).data,assignToContract:async(e,t)=>(await z.post(`/emails/${e}/assign`,{contractId:t})).data,unassignFromContract:async e=>(await z.delete(`/emails/${e}/assign`)).data,delete:async e=>(await z.delete(`/emails/${e}`)).data,getAttachmentUrl:(e,t,n)=>{const r=localStorage.getItem("token"),a=encodeURIComponent(t),i=n?"&view=true":"";return`${z.defaults.baseURL}/emails/${e}/attachments/${a}?token=${r}${i}`},getUnreadCount:async e=>(await z.get("/emails/unread-count",{params:e})).data,getTrash:async e=>(await z.get(`/customers/${e}/emails/trash`)).data,getTrashCount:async e=>(await z.get(`/customers/${e}/emails/trash/count`)).data,restore:async e=>(await z.post(`/emails/${e}/restore`)).data,permanentDelete:async e=>(await z.delete(`/emails/${e}/permanent`)).data},$e={getAll:async e=>(await z.get("/contracts",{params:e})).data,getById:async e=>(await z.get(`/contracts/${e}`)).data,create:async e=>(await z.post("/contracts",e)).data,update:async(e,t)=>(await z.put(`/contracts/${e}`,t)).data,delete:async e=>(await z.delete(`/contracts/${e}`)).data,createFollowUp:async e=>(await z.post(`/contracts/${e}/follow-up`)).data,getPassword:async e=>(await z.get(`/contracts/${e}/password`)).data,getSimCardCredentials:async e=>(await z.get(`/contracts/simcard/${e}/credentials`)).data,getInternetCredentials:async e=>(await z.get(`/contracts/${e}/internet-credentials`)).data,getSipCredentials:async e=>(await z.get(`/contracts/phonenumber/${e}/sip-credentials`)).data,getCockpit:async()=>(await z.get("/contracts/cockpit")).data},st={getAll:async e=>(await z.get("/tasks",{params:e})).data,getStats:async()=>(await z.get("/tasks/stats")).data,getByContract:async(e,t)=>(await z.get(`/contracts/${e}/tasks`,{params:{status:t}})).data,create:async(e,t)=>(await z.post(`/contracts/${e}/tasks`,t)).data,update:async(e,t)=>(await z.put(`/tasks/${e}`,t)).data,complete:async e=>(await z.post(`/tasks/${e}/complete`)).data,reopen:async e=>(await z.post(`/tasks/${e}/reopen`)).data,delete:async e=>(await z.delete(`/tasks/${e}`)).data,createSubtask:async(e,t)=>(await z.post(`/tasks/${e}/subtasks`,{title:t})).data,createReply:async(e,t)=>(await z.post(`/tasks/${e}/reply`,{title:t})).data,updateSubtask:async(e,t)=>(await z.put(`/subtasks/${e}`,{title:t})).data,completeSubtask:async e=>(await z.post(`/subtasks/${e}/complete`)).data,reopenSubtask:async e=>(await z.post(`/subtasks/${e}/reopen`)).data,deleteSubtask:async e=>(await z.delete(`/subtasks/${e}`)).data,createSupportTicket:async(e,t)=>(await z.post(`/contracts/${e}/support-ticket`,t)).data},Or={getPublic:async()=>(await z.get("/settings/public")).data,getAll:async()=>(await z.get("/settings")).data,update:async e=>(await z.put("/settings",e)).data,updateOne:async(e,t)=>(await z.put(`/settings/${e}`,{value:t})).data},or={list:async()=>(await z.get("/settings/backups")).data,create:async()=>(await z.post("/settings/backup")).data,restore:async e=>(await z.post(`/settings/backup/${e}/restore`)).data,delete:async e=>(await z.delete(`/settings/backup/${e}`)).data,getDownloadUrl:e=>`/api/settings/backup/${e}/download`,upload:async e=>{const t=new FormData;return t.append("backup",e),(await z.post("/settings/backup/upload",t,{headers:{"Content-Type":"multipart/form-data"}})).data},factoryReset:async()=>(await z.post("/settings/factory-reset")).data},Bi={getAll:async(e=!1)=>(await z.get("/platforms",{params:{includeInactive:e}})).data,getById:async e=>(await z.get(`/platforms/${e}`)).data,create:async e=>(await z.post("/platforms",e)).data,update:async(e,t)=>(await z.put(`/platforms/${e}`,t)).data,delete:async e=>(await z.delete(`/platforms/${e}`)).data},Ki={getAll:async(e=!1)=>(await z.get("/cancellation-periods",{params:{includeInactive:e}})).data,getById:async e=>(await z.get(`/cancellation-periods/${e}`)).data,create:async e=>(await z.post("/cancellation-periods",e)).data,update:async(e,t)=>(await z.put(`/cancellation-periods/${e}`,t)).data,delete:async e=>(await z.delete(`/cancellation-periods/${e}`)).data},qi={getAll:async(e=!1)=>(await z.get("/contract-durations",{params:{includeInactive:e}})).data,getById:async e=>(await z.get(`/contract-durations/${e}`)).data,create:async e=>(await z.post("/contract-durations",e)).data,update:async(e,t)=>(await z.put(`/contract-durations/${e}`,t)).data,delete:async e=>(await z.delete(`/contract-durations/${e}`)).data},Vi={getAll:async(e=!1)=>(await z.get("/contract-categories",{params:{includeInactive:e}})).data,getById:async e=>(await z.get(`/contract-categories/${e}`)).data,create:async e=>(await z.post("/contract-categories",e)).data,update:async(e,t)=>(await z.put(`/contract-categories/${e}`,t)).data,delete:async e=>(await z.delete(`/contract-categories/${e}`)).data},Ra={getAll:async(e=!1)=>(await z.get("/providers",{params:{includeInactive:e}})).data,getById:async e=>(await z.get(`/providers/${e}`)).data,create:async e=>(await z.post("/providers",e)).data,update:async(e,t)=>(await z.put(`/providers/${e}`,t)).data,delete:async e=>(await z.delete(`/providers/${e}`)).data,getTariffs:async(e,t=!1)=>(await z.get(`/providers/${e}/tariffs`,{params:{includeInactive:t}})).data,createTariff:async(e,t)=>(await z.post(`/providers/${e}/tariffs`,t)).data},k0={getById:async e=>(await z.get(`/tariffs/${e}`)).data,update:async(e,t)=>(await z.put(`/tariffs/${e}`,t)).data,delete:async e=>(await z.delete(`/tariffs/${e}`)).data},et={uploadBankCardDocument:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/bank-cards/${e}`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},uploadIdentityDocument:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/documents/${e}`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteBankCardDocument:async e=>(await z.delete(`/upload/bank-cards/${e}`)).data,deleteIdentityDocument:async e=>(await z.delete(`/upload/documents/${e}`)).data,uploadBusinessRegistration:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/customers/${e}/business-registration`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteBusinessRegistration:async e=>(await z.delete(`/upload/customers/${e}/business-registration`)).data,uploadCommercialRegister:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/customers/${e}/commercial-register`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCommercialRegister:async e=>(await z.delete(`/upload/customers/${e}/commercial-register`)).data,uploadPrivacyPolicy:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/customers/${e}/privacy-policy`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},deletePrivacyPolicy:async e=>(await z.delete(`/upload/customers/${e}/privacy-policy`)).data,uploadCancellationLetter:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/contracts/${e}/cancellation-letter`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCancellationLetter:async e=>(await z.delete(`/upload/contracts/${e}/cancellation-letter`)).data,uploadCancellationConfirmation:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/contracts/${e}/cancellation-confirmation`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCancellationConfirmation:async e=>(await z.delete(`/upload/contracts/${e}/cancellation-confirmation`)).data,uploadCancellationLetterOptions:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/contracts/${e}/cancellation-letter-options`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCancellationLetterOptions:async e=>(await z.delete(`/upload/contracts/${e}/cancellation-letter-options`)).data,uploadCancellationConfirmationOptions:async(e,t)=>{const n=new FormData;return n.append("document",t),(await z.post(`/upload/contracts/${e}/cancellation-confirmation-options`,n,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCancellationConfirmationOptions:async e=>(await z.delete(`/upload/contracts/${e}/cancellation-confirmation-options`)).data},vi={getAll:async e=>(await z.get("/users",{params:e})).data,getById:async e=>(await z.get(`/users/${e}`)).data,create:async e=>(await z.post("/users",e)).data,update:async(e,t)=>(await z.put(`/users/${e}`,t)).data,delete:async e=>(await z.delete(`/users/${e}`)).data,getRoles:async()=>(await z.get("/users/roles/list")).data},ci={getSchema:async()=>(await z.get("/developer/schema")).data,getTableData:async(e,t=1,n=50)=>(await z.get(`/developer/table/${e}`,{params:{page:t,limit:n}})).data,updateRow:async(e,t,n)=>(await z.put(`/developer/table/${e}/${t}`,n)).data,deleteRow:async(e,t)=>(await z.delete(`/developer/table/${e}/${t}`)).data,getReference:async e=>(await z.get(`/developer/reference/${e}`)).data},sn={getConfigs:async()=>(await z.get("/email-providers/configs")).data,getConfig:async e=>(await z.get(`/email-providers/configs/${e}`)).data,createConfig:async e=>(await z.post("/email-providers/configs",e)).data,updateConfig:async(e,t)=>(await z.put(`/email-providers/configs/${e}`,t)).data,deleteConfig:async e=>(await z.delete(`/email-providers/configs/${e}`)).data,testConnection:async e=>{const t=e!=null&&e.testData?{...e.testData}:e!=null&&e.id?{id:e.id}:{};return(await z.post("/email-providers/test-connection",t)).data},getDomain:async()=>(await z.get("/email-providers/domain")).data,checkEmailExists:async e=>(await z.get(`/email-providers/check/${e}`)).data,provisionEmail:async(e,t)=>(await z.post("/email-providers/provision",{localPart:e,customerEmail:t})).data,deprovisionEmail:async e=>(await z.delete(`/email-providers/deprovision/${e}`)).data},C0=b.createContext(null);function F2({children:e}){const[t,n]=b.useState(null),[r,a]=b.useState(!0),[i,l]=b.useState(()=>localStorage.getItem("developerMode")==="true"),o=y=>{l(y),localStorage.setItem("developerMode",String(y))};b.useEffect(()=>{var y;console.log("useEffect check - user:",t==null?void 0:t.email,"developerMode:",i,"has developer:access:",(y=t==null?void 0:t.permissions)==null?void 0:y.includes("developer:access")),t&&i&&!t.permissions.includes("developer:access")&&(console.log("Disabling developer mode because user lacks developer:access permission"),o(!1))},[t,i]),b.useEffect(()=>{localStorage.getItem("token")?Ol.me().then(N=>{N.success&&N.data?n(N.data):localStorage.removeItem("token")}).catch(()=>{localStorage.removeItem("token")}).finally(()=>{a(!1)}):a(!1)},[]);const c=async(y,N)=>{const v=await Ol.login(y,N);if(v.success&&v.data)localStorage.setItem("token",v.data.token),n(v.data.user);else throw new Error(v.error||"Login fehlgeschlagen")},u=async(y,N)=>{const v=await Ol.customerLogin(y,N);if(v.success&&v.data)localStorage.setItem("token",v.data.token),n(v.data.user);else throw new Error(v.error||"Login fehlgeschlagen")},d=()=>{localStorage.removeItem("token"),n(null)},h=async()=>{var N;if(localStorage.getItem("token"))try{const v=await Ol.me();console.log("refreshUser response:",v),console.log("permissions:",(N=v.data)==null?void 0:N.permissions),v.success&&v.data&&n(v.data)}catch(v){console.error("refreshUser error:",v)}},p=y=>t?t.permissions.includes(y):!1,m=!!(t!=null&&t.customerId),f=!!(t!=null&&t.isCustomerPortal);return s.jsx(C0.Provider,{value:{user:t,isLoading:r,isAuthenticated:!!t,login:c,customerLogin:u,logout:d,hasPermission:p,isCustomer:m,isCustomerPortal:f,developerMode:i,setDeveloperMode:o,refreshUser:h},children:e})}function Be(){const e=b.useContext(C0);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}const Jc={scrollToTopThreshold:.7},E0=b.createContext(void 0),Dp="opencrm_app_settings";function I2({children:e}){const[t,n]=b.useState(()=>{const a=localStorage.getItem(Dp);if(a)try{return{...Jc,...JSON.parse(a)}}catch{return Jc}return Jc});b.useEffect(()=>{localStorage.setItem(Dp,JSON.stringify(t))},[t]);const r=a=>{n(i=>({...i,...a}))};return s.jsx(E0.Provider,{value:{settings:t,updateSettings:r},children:e})}function D0(){const e=b.useContext(E0);if(!e)throw new Error("useAppSettings must be used within AppSettingsProvider");return e}function L2(){const{pathname:e}=wn();return b.useEffect(()=>{window.scrollTo(0,0)},[e]),null}/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const R2=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),P0=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var O2={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const z2=b.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:a="",children:i,iconNode:l,...o},c)=>b.createElement("svg",{ref:c,...O2,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:P0("lucide",a),...o},[...l.map(([u,d])=>b.createElement(u,d)),...Array.isArray(i)?i:[i]]));/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const se=(e,t)=>{const n=b.forwardRef(({className:r,...a},i)=>b.createElement(z2,{ref:i,iconNode:t,className:P0(`lucide-${R2(e)}`,r),...a}));return n.displayName=`${e}`,n};/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _2=se("Archive",[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8",key:"1s80jp"}],["path",{d:"M10 12h4",key:"a56b0p"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Gs=se("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const A0=se("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $2=se("Building2",[["path",{d:"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z",key:"1b4qmf"}],["path",{d:"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",key:"i71pzd"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2",key:"10jefs"}],["path",{d:"M10 6h4",key:"1itunk"}],["path",{d:"M10 10h4",key:"tcdvrf"}],["path",{d:"M10 14h4",key:"kelpxr"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const U2=se("Cable",[["path",{d:"M17 21v-2a1 1 0 0 1-1-1v-1a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1",key:"10bnsj"}],["path",{d:"M19 15V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V9",key:"1eqmu1"}],["path",{d:"M21 21v-2h-4",key:"14zm7j"}],["path",{d:"M3 5h4V3",key:"z442eg"}],["path",{d:"M7 5a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1V3",key:"ebdjd7"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const M0=se("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const T0=se("Car",[["path",{d:"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2",key:"5owen"}],["circle",{cx:"7",cy:"17",r:"2",key:"u2ysq9"}],["path",{d:"M9 17h6",key:"r8uit2"}],["circle",{cx:"17",cy:"17",r:"2",key:"axvx0g"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Nd=se("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mc=se("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const B2=se("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rs=se("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const F0=se("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const un=se("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gs=se("CircleCheckBig",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Pp=se("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const to=se("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Qi=se("ClipboardList",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}],["path",{d:"M12 11h4",key:"1jrz19"}],["path",{d:"M12 16h4",key:"n85exb"}],["path",{d:"M8 11h.01",key:"1dfujw"}],["path",{d:"M8 16h.01",key:"18s6g9"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vn=se("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hc=se("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const I0=se("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const K2=se("CreditCard",[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fc=se("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ms=se("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Lm=se("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Et=se("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const De=se("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const at=se("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const q2=se("FileType",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M9 13v-1h6v1",key:"1bb014"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"M11 18h2",key:"12mj7e"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const L0=se("Flame",[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const V2=se("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const R0=se("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ap=se("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Rm=se("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Q2=se("GripVertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Mp=se("HardDrive",[["line",{x1:"22",x2:"2",y1:"12",y2:"12",key:"1y58io"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}],["line",{x1:"6",x2:"6.01",y1:"16",y2:"16",key:"sgf278"}],["line",{x1:"10",x2:"10.01",y1:"16",y2:"16",key:"1l4acy"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Lo=se("Inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const H2=se("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const W2=se("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const G2=se("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Tp=se("Link2",[["path",{d:"M9 17H7A5 5 0 0 1 7 7h2",key:"8i5ue5"}],["path",{d:"M15 7h2a5 5 0 1 1 0 10h-2",key:"1b9ql8"}],["line",{x1:"8",x2:"16",y1:"12",y2:"12",key:"1jonct"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Z2=se("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const O0=se("MailOpen",[["path",{d:"M21.2 8.4c.5.38.8.97.8 1.6v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V10a2 2 0 0 1 .8-1.6l8-6a2 2 0 0 1 2.4 0l8 6Z",key:"1jhwl8"}],["path",{d:"m22 10-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 10",key:"1qfld7"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mn=se("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const J2=se("MapPin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const X2=se("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Hi=se("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Y2=se("Move",[["path",{d:"M12 2v20",key:"t6zp3m"}],["path",{d:"m15 19-3 3-3-3",key:"11eu04"}],["path",{d:"m19 9 3 3-3 3",key:"1mg7y2"}],["path",{d:"M2 12h20",key:"9i4pu4"}],["path",{d:"m5 9-3 3 3 3",key:"j64kie"}],["path",{d:"m9 5 3-3 3 3",key:"l8vdw6"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const eS=se("Network",[["rect",{x:"16",y:"16",width:"6",height:"6",rx:"1",key:"4q2zg0"}],["rect",{x:"2",y:"16",width:"6",height:"6",rx:"1",key:"8cvhb9"}],["rect",{x:"9",y:"2",width:"6",height:"6",rx:"1",key:"1egb70"}],["path",{d:"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3",key:"1jsf9p"}],["path",{d:"M12 12V8",key:"2874zd"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const pc=se("Paperclip",[["path",{d:"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48",key:"1u3ebp"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Re=se("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Qr=se("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const tS=se("Reply",[["polyline",{points:"9 17 4 12 9 7",key:"hvgpf2"}],["path",{d:"M20 18v-2a4 4 0 0 0-4-4H4",key:"5vmcpk"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const sS=se("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nS=se("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cl=se("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ul=se("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const z0=se("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Om=se("Smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Je=se("SquarePen",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zm=se("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rS=se("Store",[["path",{d:"m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7",key:"ztvudi"}],["path",{d:"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8",key:"1b2hhj"}],["path",{d:"M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4",key:"2ebpfo"}],["path",{d:"M2 7h20",key:"1fcdvo"}],["path",{d:"M22 7v3a2 2 0 0 1-2 2a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 16 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 12 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 8 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 4 12a2 2 0 0 1-2-2V7",key:"6c3vgh"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const aS=se("Table",[["path",{d:"M12 3v18",key:"108xh3"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ve=se("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nr=se("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _0=se("Tv",[["rect",{width:"20",height:"15",x:"2",y:"7",rx:"2",ry:"2",key:"10ag99"}],["polyline",{points:"17 2 12 7 7 2",key:"11pgbg"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $0=se("Undo2",[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wd=se("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const iS=se("UserCog",[["circle",{cx:"18",cy:"15",r:"3",key:"gjjjvw"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M10 15H6a4 4 0 0 0-4 4v2",key:"1nfge6"}],["path",{d:"m21.7 16.4-.9-.3",key:"12j9ji"}],["path",{d:"m15.2 13.9-.9-.3",key:"1fdjdi"}],["path",{d:"m16.6 18.7.3-.9",key:"heedtr"}],["path",{d:"m19.1 12.2.3-.9",key:"1af3ki"}],["path",{d:"m19.6 18.7-.4-1",key:"1x9vze"}],["path",{d:"m16.8 12.3-.4-1",key:"vqeiwj"}],["path",{d:"m14.3 16.6 1-.4",key:"1qlj63"}],["path",{d:"m20.7 13.8 1-.4",key:"1v5t8k"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const lS=se("UserPlus",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _m=se("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ha=se("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Fp=se("WifiOff",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fa=se("Wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jn=se("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const $m=se("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const oS=se("ZoomIn",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]]);/** + * @license lucide-react v0.454.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const cS=se("ZoomOut",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]]);function uS(){const{user:e,logout:t,hasPermission:n,isCustomer:r,developerMode:a}=Be(),i=[{to:"/",icon:G2,label:"Dashboard",show:!0,end:!0},{to:"/customers",icon:ha,label:"Kunden",show:n("customers:read")&&!r},{to:"/contracts",icon:at,label:"Verträge",show:n("contracts:read"),end:!0},{to:"/contracts/cockpit",icon:un,label:"Vertrags-Cockpit",show:n("contracts:read")&&!r},{to:"/tasks",icon:r?Hi:Qi,label:r?"Support-Anfragen":"Aufgaben",show:n("contracts:read")}],l=[{to:"/developer/database",icon:fc,label:"Datenbankstruktur"}];return s.jsxs("aside",{className:"w-64 bg-gray-900 text-white min-h-screen flex flex-col",children:[s.jsx("div",{className:"p-4 border-b border-gray-800",children:s.jsx("h1",{className:"text-xl font-bold",children:"OpenCRM"})}),s.jsxs("nav",{className:"flex-1 p-4 overflow-y-auto",children:[s.jsx("ul",{className:"space-y-2",children:i.filter(o=>o.show).map(o=>s.jsx("li",{children:s.jsxs(Hc,{to:o.to,end:o.end,className:({isActive:c})=>`flex items-center gap-3 px-4 py-2 rounded-lg transition-colors ${c?"bg-blue-600 text-white":"text-gray-300 hover:bg-gray-800"}`,children:[s.jsx(o.icon,{className:"w-5 h-5"}),o.label]})},o.to))}),a&&n("developer:access")&&s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"mt-6 mb-2 px-4",children:s.jsxs("p",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider flex items-center gap-2",children:[s.jsx(hc,{className:"w-3 h-3"}),"Entwickler"]})}),s.jsx("ul",{className:"space-y-2",children:l.map(o=>s.jsx("li",{children:s.jsxs(Hc,{to:o.to,className:({isActive:c})=>`flex items-center gap-3 px-4 py-2 rounded-lg transition-colors ${c?"bg-purple-600 text-white":"text-purple-300 hover:bg-gray-800"}`,children:[s.jsx(o.icon,{className:"w-5 h-5"}),o.label]})},o.to))})]}),s.jsx("div",{className:"mt-6 pt-6 border-t border-gray-800",children:s.jsxs(Hc,{to:"/settings",className:({isActive:o})=>`flex items-center gap-3 px-4 py-2 rounded-lg transition-colors ${o?"bg-blue-600 text-white":"text-gray-300 hover:bg-gray-800"}`,children:[s.jsx(z0,{className:"w-5 h-5"}),"Einstellungen"]})})]}),s.jsxs("div",{className:"p-4 border-t border-gray-800",children:[s.jsxs("div",{className:"mb-4 text-sm",children:[s.jsx("p",{className:"text-gray-400",children:"Angemeldet als"}),s.jsxs("p",{className:"font-medium",children:[e==null?void 0:e.firstName," ",e==null?void 0:e.lastName]})]}),s.jsxs("button",{onClick:t,className:"flex items-center gap-3 w-full px-4 py-2 text-gray-300 hover:bg-gray-800 rounded-lg transition-colors",children:[s.jsx(Z2,{className:"w-5 h-5"}),"Abmelden"]})]})]})}function dS(){const{settings:e}=D0(),[t,n]=b.useState(!1);b.useEffect(()=>{const a=()=>{window.scrollY>window.innerHeight*e.scrollToTopThreshold?n(!0):n(!1)};return window.addEventListener("scroll",a),()=>window.removeEventListener("scroll",a)},[e.scrollToTopThreshold]);const r=()=>{window.scrollTo({top:0,behavior:"smooth"})};return t?s.jsx("button",{onClick:r,className:"fixed bottom-6 right-6 p-3 bg-gray-200 hover:bg-gray-300 text-gray-600 rounded-full shadow-md transition-all duration-300 opacity-70 hover:opacity-100 z-50","aria-label":"Nach oben scrollen",title:"Nach oben",children:s.jsx(F0,{className:"w-5 h-5"})}):null}function mS(){return s.jsxs("div",{className:"flex min-h-screen",children:[s.jsx(uS,{}),s.jsx("main",{className:"flex-1 p-8 overflow-auto",children:s.jsx(gN,{})}),s.jsx(dS,{})]})}const T=b.forwardRef(({className:e="",variant:t="primary",size:n="md",children:r,disabled:a,...i},l)=>{const o="inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed",c={primary:"bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500",secondary:"bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-500",danger:"bg-red-600 text-white hover:bg-red-700 focus:ring-red-500",ghost:"bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-gray-500"},u={sm:"px-3 py-1.5 text-sm",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"};return s.jsx("button",{ref:l,className:`${o} ${c[t]} ${u[n]} ${e}`,disabled:a,...i,children:r})});T.displayName="Button";const K=b.forwardRef(({className:e="",label:t,error:n,id:r,onClear:a,...i},l)=>{const o=r||i.name,c=i.type==="date",u=i.value!==void 0&&i.value!==null&&i.value!=="",d=c&&a&&u;return s.jsxs("div",{className:"w-full",children:[t&&s.jsx("label",{htmlFor:o,className:"block text-sm font-medium text-gray-700 mb-1",children:t}),s.jsxs("div",{className:d?"flex gap-2":"",children:[s.jsx("input",{ref:l,id:o,className:`block w-full px-3 py-2 border rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${n?"border-red-500":"border-gray-300"} ${e}`,...i}),d&&s.jsx("button",{type:"button",onClick:a,className:"px-3 py-2 text-gray-400 hover:text-red-500 hover:bg-red-50 border border-gray-300 rounded-lg transition-colors",title:"Datum löschen",children:s.jsx(ve,{className:"w-4 h-4"})})]}),n&&s.jsx("p",{className:"mt-1 text-sm text-red-600",children:n})]})});K.displayName="Input";function X({children:e,className:t="",title:n,actions:r}){return s.jsxs("div",{className:`bg-white rounded-lg shadow ${t}`,children:[(n||r)&&s.jsxs("div",{className:"px-6 py-4 border-b border-gray-200 flex items-center justify-between",children:[n&&s.jsx("div",{className:"text-lg font-medium text-gray-900",children:n}),r&&s.jsx("div",{className:"flex items-center gap-2",children:r})]}),s.jsx("div",{className:"p-6",children:e})]})}function hS(){const[e,t]=b.useState(""),[n,r]=b.useState(""),[a,i]=b.useState(""),[l,o]=b.useState(!1),{login:c,customerLogin:u}=Be(),d=Vt(),h=async p=>{p.preventDefault(),i(""),o(!0);try{await c(e,n),d("/");return}catch{}try{await u(e,n),d("/")}catch{i("Ungültige Anmeldedaten"),o(!1)}};return s.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-100",children:s.jsxs(X,{className:"w-full max-w-md",children:[s.jsxs("div",{className:"text-center mb-8",children:[s.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"OpenCRM"}),s.jsx("p",{className:"text-gray-600 mt-2",children:"Melden Sie sich an"})]}),a&&s.jsx("div",{className:"mb-4 p-4 bg-red-50 border border-red-200 text-red-700 rounded-lg",children:a}),s.jsxs("form",{onSubmit:h,className:"space-y-4",children:[s.jsx(K,{label:"E-Mail",type:"email",value:e,onChange:p=>t(p.target.value),required:!0,autoComplete:"email"}),s.jsx(K,{label:"Passwort",type:"password",value:n,onChange:p=>r(p.target.value),required:!0,autoComplete:"current-password"}),s.jsx(T,{type:"submit",className:"w-full",disabled:l,children:l?"Anmeldung...":"Anmelden"})]})]})})}function ot({isOpen:e,onClose:t,title:n,children:r,size:a="md"}){if(b.useEffect(()=>(e?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow=""}),[e]),!e)return null;const i={sm:"max-w-md",md:"max-w-lg",lg:"max-w-2xl",xl:"max-w-4xl"};return s.jsx("div",{className:"fixed inset-0 z-50 overflow-y-auto",children:s.jsxs("div",{className:"flex min-h-full items-center justify-center p-4",children:[s.jsx("div",{className:"fixed inset-0 bg-black/50",onClick:t}),s.jsxs("div",{className:`relative bg-white rounded-lg shadow-xl w-full ${i[a]}`,children:[s.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b",children:[s.jsx("h2",{className:"text-lg font-semibold",children:n}),s.jsx(T,{variant:"ghost",size:"sm",onClick:t,children:s.jsx(jn,{className:"w-5 h-5"})})]}),s.jsx("div",{className:"p-6",children:r})]})]})})}function fS(){var S,P,A,_,L,V;const{user:e,isCustomer:t,isCustomerPortal:n}=Be(),[r,a]=b.useState(!1),{data:i,isLoading:l}=he({queryKey:["app-settings-public"],queryFn:()=>Or.getPublic(),enabled:n,staleTime:0}),o=!l&&((S=i==null?void 0:i.data)==null?void 0:S.customerSupportTicketsEnabled)==="true",{data:c}=he({queryKey:["customers-count"],queryFn:()=>Nt.getAll({limit:1}),enabled:!t}),{data:u}=he({queryKey:["contracts",t?e==null?void 0:e.customerId:void 0],queryFn:()=>$e.getAll(t?{customerId:e==null?void 0:e.customerId}:{limit:1})}),{data:d}=he({queryKey:["contracts-active",t?e==null?void 0:e.customerId:void 0],queryFn:()=>$e.getAll({status:"ACTIVE",...t?{customerId:e==null?void 0:e.customerId}:{limit:1}})}),{data:h}=he({queryKey:["contracts-pending",t?e==null?void 0:e.customerId:void 0],queryFn:()=>$e.getAll({status:"PENDING",...t?{customerId:e==null?void 0:e.customerId}:{limit:1}})}),{data:p}=he({queryKey:["task-stats"],queryFn:()=>st.getStats()}),{data:m}=he({queryKey:["contract-cockpit"],queryFn:()=>$e.getCockpit(),enabled:!t,staleTime:0}),{ownContracts:f,representedContracts:y}=b.useMemo(()=>{if(!n||!(u!=null&&u.data))return{ownContracts:[],representedContracts:[]};const q=[],O={};for(const C of u.data)if(C.customerId===(e==null?void 0:e.customerId))q.push(C);else{const w=C.customerId;if(!O[w]){const R=C.customer?C.customer.companyName||`${C.customer.firstName} ${C.customer.lastName}`:`Kunde ${w}`;O[w]={customerName:R,contracts:[]}}O[w].contracts.push(C)}return{ownContracts:q,representedContracts:Object.values(O).sort((C,w)=>C.customerName.localeCompare(w.customerName))}},[u==null?void 0:u.data,n,e==null?void 0:e.customerId]),N=b.useMemo(()=>f.filter(q=>q.status==="ACTIVE").length,[f]),v=b.useMemo(()=>f.filter(q=>q.status==="PENDING").length,[f]),g=b.useMemo(()=>f.filter(q=>q.status==="EXPIRED").length,[f]),x=b.useMemo(()=>y.reduce((q,O)=>q+O.contracts.length,0),[y]),j=b.useMemo(()=>y.reduce((q,O)=>q+O.contracts.filter(C=>C.status==="ACTIVE").length,0),[y]),k=b.useMemo(()=>y.reduce((q,O)=>q+O.contracts.filter(C=>C.status==="EXPIRED").length,0),[y]),F=((P=p==null?void 0:p.data)==null?void 0:P.openCount)||0,E=q=>s.jsx(X,{className:q.link?"cursor-pointer hover:shadow-md transition-shadow":"",children:q.link?s.jsx(Ne,{to:q.link,className:"block",children:s.jsxs("div",{className:"flex items-center",children:[s.jsx("div",{className:`p-3 rounded-lg ${q.color}`,children:s.jsx(q.icon,{className:"w-6 h-6 text-white"})}),s.jsxs("div",{className:"ml-4",children:[s.jsx("p",{className:"text-sm text-gray-500",children:q.label}),s.jsx("p",{className:"text-2xl font-bold",children:q.value})]})]})}):s.jsxs("div",{className:"flex items-center",children:[s.jsx("div",{className:`p-3 rounded-lg ${q.color}`,children:s.jsx(q.icon,{className:"w-6 h-6 text-white"})}),s.jsxs("div",{className:"ml-4",children:[s.jsx("p",{className:"text-sm text-gray-500",children:q.label}),s.jsx("p",{className:"text-2xl font-bold",children:q.value})]})]})},q.label);return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsxs("h1",{className:"text-2xl font-bold",children:["Willkommen, ",e==null?void 0:e.firstName,"!"]}),n&&o&&s.jsxs(T,{onClick:()=>a(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Support-Anfrage"]})]}),n?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"mb-6",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx(_m,{className:"w-5 h-5 text-blue-600"}),s.jsx("h2",{className:"text-lg font-semibold",children:"Meine Verträge"})]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[E({label:"Eigene Verträge",value:f.length,icon:at,color:"bg-blue-500",link:"/contracts"}),E({label:"Davon aktiv",value:N,icon:gs,color:"bg-green-500"}),E({label:"Davon ausstehend",value:v,icon:vn,color:"bg-yellow-500"}),E({label:"Davon abgelaufen",value:g,icon:Pp,color:"bg-red-500"})]})]}),x>0&&s.jsxs("div",{className:"mb-6",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx(ha,{className:"w-5 h-5 text-purple-600"}),s.jsx("h2",{className:"text-lg font-semibold",children:"Fremdverträge"})]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[E({label:"Fremdverträge",value:x,icon:ha,color:"bg-purple-500",link:"/contracts"}),E({label:"Davon aktiv",value:j,icon:gs,color:"bg-green-500"}),s.jsx("div",{className:"hidden lg:block"}),E({label:"Davon abgelaufen",value:k,icon:Pp,color:"bg-red-500"})]})]}),s.jsxs("div",{className:"mb-6",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx(Hi,{className:"w-5 h-5 text-orange-600"}),s.jsx("h2",{className:"text-lg font-semibold",children:"Support-Anfragen"})]}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:E({label:"Offene Anfragen",value:F,icon:Hi,color:"bg-orange-500",link:"/tasks"})})]})]}):s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-6",children:[E({label:"Kunden",value:((A=c==null?void 0:c.pagination)==null?void 0:A.total)||0,icon:ha,color:"bg-blue-500",link:"/customers"}),E({label:"Verträge gesamt",value:((_=u==null?void 0:u.pagination)==null?void 0:_.total)||0,icon:at,color:"bg-purple-500",link:"/contracts"}),E({label:"Aktive Verträge",value:((L=d==null?void 0:d.pagination)==null?void 0:L.total)||0,icon:gs,color:"bg-green-500"}),E({label:"Ausstehende Verträge",value:((V=h==null?void 0:h.pagination)==null?void 0:V.total)||0,icon:un,color:"bg-yellow-500"})]}),(m==null?void 0:m.data)&&s.jsxs("div",{className:"mb-6",children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(un,{className:"w-5 h-5 text-red-500"}),s.jsx("h2",{className:"text-lg font-semibold",children:"Vertrags-Cockpit"})]}),s.jsx(Ne,{to:"/contracts/cockpit",className:"text-sm text-blue-600 hover:underline",children:"Alle anzeigen"})]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[s.jsx(X,{className:"cursor-pointer hover:shadow-md transition-shadow",children:s.jsx(Ne,{to:"/contracts/cockpit?filter=critical",className:"block",children:s.jsxs("div",{className:"flex items-center",children:[s.jsx("div",{className:"p-3 rounded-lg bg-red-100",children:s.jsx(un,{className:"w-6 h-6 text-red-500"})}),s.jsxs("div",{className:"ml-4",children:[s.jsxs("p",{className:"text-sm text-gray-500",children:["Kritisch (<",m.data.thresholds.criticalDays," Tage)"]}),s.jsx("p",{className:"text-2xl font-bold text-red-600",children:m.data.summary.criticalCount})]})]})})}),s.jsx(X,{className:"cursor-pointer hover:shadow-md transition-shadow",children:s.jsx(Ne,{to:"/contracts/cockpit?filter=warning",className:"block",children:s.jsxs("div",{className:"flex items-center",children:[s.jsx("div",{className:"p-3 rounded-lg bg-yellow-100",children:s.jsx(nr,{className:"w-6 h-6 text-yellow-500"})}),s.jsxs("div",{className:"ml-4",children:[s.jsxs("p",{className:"text-sm text-gray-500",children:["Warnung (<",m.data.thresholds.warningDays," Tage)"]}),s.jsx("p",{className:"text-2xl font-bold text-yellow-600",children:m.data.summary.warningCount})]})]})})}),s.jsx(X,{className:"cursor-pointer hover:shadow-md transition-shadow",children:s.jsx(Ne,{to:"/contracts/cockpit?filter=ok",className:"block",children:s.jsxs("div",{className:"flex items-center",children:[s.jsx("div",{className:"p-3 rounded-lg bg-green-100",children:s.jsx(gs,{className:"w-6 h-6 text-green-500"})}),s.jsxs("div",{className:"ml-4",children:[s.jsxs("p",{className:"text-sm text-gray-500",children:["OK (<",m.data.thresholds.okDays," Tage)"]}),s.jsx("p",{className:"text-2xl font-bold text-green-600",children:m.data.summary.okCount})]})]})})}),s.jsx(X,{className:"cursor-pointer hover:shadow-md transition-shadow",children:s.jsx(Ne,{to:"/contracts/cockpit",className:"block",children:s.jsxs("div",{className:"flex items-center",children:[s.jsx("div",{className:"p-3 rounded-lg bg-gray-100",children:s.jsx(at,{className:"w-6 h-6 text-gray-500"})}),s.jsxs("div",{className:"ml-4",children:[s.jsx("p",{className:"text-sm text-gray-500",children:"Handlungsbedarf"}),s.jsx("p",{className:"text-2xl font-bold text-gray-600",children:m.data.summary.totalContracts})]})]})})})]})]}),s.jsxs("div",{className:"mb-6",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[s.jsx(Qi,{className:"w-5 h-5 text-orange-600"}),s.jsx("h2",{className:"text-lg font-semibold",children:"Aufgaben"})]}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:E({label:"Offene Aufgaben",value:F,icon:Qi,color:"bg-orange-500",link:"/tasks"})})]})]}),n&&s.jsx(pS,{isOpen:r,onClose:()=>a(!1)})]})}function pS({isOpen:e,onClose:t}){const{user:n}=Be(),r=Vt(),a=pe(),[i,l]=b.useState("own"),[o,c]=b.useState(null),[u,d]=b.useState(""),[h,p]=b.useState(""),[m,f]=b.useState(!1),[y,N]=b.useState(""),{data:v}=he({queryKey:["contracts",n==null?void 0:n.customerId],queryFn:()=>$e.getAll({customerId:n==null?void 0:n.customerId}),enabled:e}),g=b.useMemo(()=>{if(!(v!=null&&v.data))return{own:[],represented:{}};const S=[],P={};for(const A of v.data)if(A.customerId===(n==null?void 0:n.customerId))S.push(A);else{if(!P[A.customerId]){const _=A.customer?A.customer.companyName||`${A.customer.firstName} ${A.customer.lastName}`:`Kunde ${A.customerId}`;P[A.customerId]={name:_,contracts:[]}}P[A.customerId].contracts.push(A)}return{own:S,represented:P}},[v==null?void 0:v.data,n==null?void 0:n.customerId]),x=Object.keys(g.represented).length>0,j=b.useMemo(()=>{var S;return i==="own"?g.own:((S=g.represented[i])==null?void 0:S.contracts)||[]},[i,g]),k=b.useMemo(()=>{if(!y)return j;const S=y.toLowerCase();return j.filter(P=>P.contractNumber.toLowerCase().includes(S)||(P.providerName||"").toLowerCase().includes(S)||(P.tariffName||"").toLowerCase().includes(S))},[j,y]),F=async()=>{if(!(!o||!u.trim())){f(!0);try{await st.createSupportTicket(o,{title:u.trim(),description:h.trim()||void 0}),a.invalidateQueries({queryKey:["task-stats"]}),a.invalidateQueries({queryKey:["all-tasks"]}),t(),d(""),p(""),c(null),l("own"),r(`/contracts/${o}`)}catch(S){console.error("Fehler beim Erstellen der Support-Anfrage:",S),alert("Fehler beim Erstellen der Support-Anfrage. Bitte versuchen Sie es erneut.")}finally{f(!1)}}},E=()=>{d(""),p(""),c(null),l("own"),N(""),t()};return s.jsx(ot,{isOpen:e,onClose:E,title:"Neue Support-Anfrage",children:s.jsxs("div",{className:"space-y-4",children:[x&&s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Kunde"}),s.jsxs("select",{value:i,onChange:S=>{const P=S.target.value;l(P==="own"?"own":parseInt(P)),c(null),N("")},className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500",children:[s.jsx("option",{value:"own",children:"Eigene Verträge"}),Object.entries(g.represented).map(([S,{name:P}])=>s.jsx("option",{value:S,children:P},S))]})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Vertrag *"}),s.jsx(K,{placeholder:"Vertrag suchen...",value:y,onChange:S=>N(S.target.value),className:"mb-2"}),s.jsx("div",{className:"max-h-48 overflow-y-auto border rounded-lg",children:k.length>0?k.map(S=>s.jsxs("div",{onClick:()=>c(S.id),className:`p-3 cursor-pointer border-b last:border-b-0 hover:bg-gray-50 ${o===S.id?"bg-blue-50 border-blue-200":""}`,children:[s.jsx("div",{className:"font-medium",children:S.contractNumber}),s.jsxs("div",{className:"text-sm text-gray-500",children:[S.providerName||"Kein Anbieter",S.tariffName&&` - ${S.tariffName}`]})]},S.id)):s.jsx("div",{className:"p-3 text-gray-500 text-center",children:"Keine Verträge gefunden."})})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Titel *"}),s.jsx(K,{value:u,onChange:S=>d(S.target.value),placeholder:"Kurze Beschreibung Ihres Anliegens"})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Beschreibung"}),s.jsx("textarea",{value:h,onChange:S=>p(S.target.value),placeholder:"Detaillierte Beschreibung (optional)",rows:4,className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),s.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[s.jsx(T,{variant:"secondary",onClick:E,children:"Abbrechen"}),s.jsx(T,{onClick:F,disabled:!o||!u.trim()||m,children:m?"Wird erstellt...":"Anfrage erstellen"})]})]})})}function ge({children:e,variant:t="default",className:n="",onClick:r}){const a={default:"bg-gray-100 text-gray-800",success:"bg-green-100 text-green-800",warning:"bg-yellow-100 text-yellow-800",danger:"bg-red-100 text-red-800",info:"bg-blue-100 text-blue-800"};return s.jsx("span",{className:`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${a[t]} ${n}`,onClick:r,children:e})}function xS(){const[e,t]=b.useState(""),[n,r]=b.useState(""),[a,i]=b.useState(1),{hasPermission:l}=Be(),{data:o,isLoading:c}=he({queryKey:["customers",e,n,a],queryFn:()=>Nt.getAll({search:e,type:n||void 0,page:a,limit:20})});return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsx("h1",{className:"text-2xl font-bold",children:"Kunden"}),l("customers:create")&&s.jsx(Ne,{to:"/customers/new",children:s.jsxs(T,{children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neuer Kunde"]})})]}),s.jsx(X,{className:"mb-6",children:s.jsxs("div",{className:"flex gap-2 items-center",children:[s.jsx(K,{placeholder:"Suchen...",value:e,onChange:u=>t(u.target.value),className:"flex-1"}),s.jsxs("select",{value:n,onChange:u=>r(u.target.value),className:"px-3 py-2 border border-gray-300 rounded-lg w-28 flex-shrink-0",children:[s.jsx("option",{value:"",children:"Alle"}),s.jsx("option",{value:"PRIVATE",children:"Privat"}),s.jsx("option",{value:"BUSINESS",children:"Firma"})]}),s.jsx(T,{variant:"secondary",className:"flex-shrink-0",children:s.jsx(cl,{className:"w-4 h-4"})})]})}),s.jsx(X,{children:c?s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):o!=null&&o.data&&o.data.length>0?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"border-b",children:[s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Kundennr."}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Name"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Typ"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"E-Mail"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Verträge"}),s.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),s.jsx("tbody",{children:o.data.map(u=>{var d;return s.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[s.jsx("td",{className:"py-3 px-4 font-mono text-sm",children:u.customerNumber}),s.jsx("td",{className:"py-3 px-4",children:u.type==="BUSINESS"&&u.companyName?u.companyName:`${u.firstName} ${u.lastName}`}),s.jsx("td",{className:"py-3 px-4",children:s.jsx(ge,{variant:u.type==="BUSINESS"?"info":"default",children:u.type==="BUSINESS"?"Firma":"Privat"})}),s.jsx("td",{className:"py-3 px-4",children:u.email||"-"}),s.jsx("td",{className:"py-3 px-4",children:((d=u._count)==null?void 0:d.contracts)||0}),s.jsx("td",{className:"py-3 px-4 text-right",children:s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(Ne,{to:`/customers/${u.id}`,children:s.jsx(T,{variant:"ghost",size:"sm",children:s.jsx(De,{className:"w-4 h-4"})})}),l("customers:update")&&s.jsx(Ne,{to:`/customers/${u.id}/edit`,children:s.jsx(T,{variant:"ghost",size:"sm",children:s.jsx(Je,{className:"w-4 h-4"})})})]})})]},u.id)})})]})}),o.pagination&&o.pagination.totalPages>1&&s.jsxs("div",{className:"mt-4 flex items-center justify-between",children:[s.jsxs("p",{className:"text-sm text-gray-500",children:["Seite ",o.pagination.page," von ",o.pagination.totalPages," (",o.pagination.total," Einträge)"]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>i(u=>Math.max(1,u-1)),disabled:a===1,children:"Zurück"}),s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>i(u=>u+1),disabled:a>=o.pagination.totalPages,children:"Weiter"})]})]})]}):s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Kunden gefunden."})})]})}function gS({emails:e,selectedEmailId:t,onSelectEmail:n,onEmailDeleted:r,isLoading:a,folder:i="INBOX",accountId:l}){const o=i==="SENT",[c,u]=b.useState(null),{hasPermission:d}=Be(),h=E=>{if(o)try{const S=JSON.parse(E.toAddresses);if(S.length>0)return`An: ${S[0]}${S.length>1?` (+${S.length-1})`:""}`}catch{return"An: (Unbekannt)"}return E.fromName||E.fromAddress},p=pe(),m=W({mutationFn:E=>qe.toggleStar(E),onSuccess:(E,S)=>{p.invalidateQueries({queryKey:["emails"]}),p.invalidateQueries({queryKey:["email",S]})}}),f=W({mutationFn:({emailId:E,isRead:S})=>qe.markAsRead(E,S),onSuccess:(E,S)=>{p.invalidateQueries({queryKey:["emails"]}),p.invalidateQueries({queryKey:["email",S.emailId]}),l&&p.invalidateQueries({queryKey:["folder-counts",l]})}}),y=W({mutationFn:E=>qe.delete(E),onSuccess:(E,S)=>{p.invalidateQueries({queryKey:["emails"]}),l&&p.invalidateQueries({queryKey:["folder-counts",l]}),ps.success("E-Mail in Papierkorb verschoben"),u(null),r==null||r(S)},onError:E=>{console.error("Delete error:",E),ps.error(E.message||"Fehler beim Löschen der E-Mail"),u(null)}}),N=(E,S)=>{E.stopPropagation(),u(S)},v=E=>{E.stopPropagation(),c&&y.mutate(c)},g=E=>{E.stopPropagation(),u(null)},x=E=>{const S=new Date(E),P=new Date;return S.toDateString()===P.toDateString()?S.toLocaleTimeString("de-DE",{hour:"2-digit",minute:"2-digit"}):S.toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit"})},j=(E,S)=>{E.stopPropagation(),m.mutate(S)},k=(E,S)=>{E.stopPropagation(),f.mutate({emailId:S.id,isRead:!S.isRead})},F=E=>{E.isRead||f.mutate({emailId:E.id,isRead:!0}),n(E)};return a?s.jsx("div",{className:"flex items-center justify-center h-64",children:s.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"})}):e.length===0?s.jsxs("div",{className:"flex flex-col items-center justify-center h-64 text-gray-500",children:[s.jsx(mn,{className:"w-12 h-12 mb-2 opacity-50"}),s.jsx("p",{children:"Keine E-Mails vorhanden"})]}):s.jsxs("div",{className:"divide-y divide-gray-200",children:[e.map(E=>s.jsxs("div",{onClick:()=>F(E),className:["flex items-start gap-3 p-3 cursor-pointer transition-colors",t===E.id?"bg-blue-100":["hover:bg-gray-100",E.isRead?"bg-gray-50/50":"bg-white"].join(" ")].join(" "),style:{borderLeft:t===E.id?"4px solid #2563eb":"4px solid transparent"},children:[s.jsx("button",{onClick:S=>k(S,E),className:` + flex-shrink-0 mt-1 p-1 -ml-1 rounded hover:bg-gray-200 + ${E.isRead?"text-gray-400":"text-blue-600"} + `,title:E.isRead?"Als ungelesen markieren":"Als gelesen markieren",children:E.isRead?s.jsx(O0,{className:"w-4 h-4"}):s.jsx(mn,{className:"w-4 h-4"})}),s.jsx("button",{onClick:S=>j(S,E.id),className:` + flex-shrink-0 mt-1 p-1 -ml-1 rounded hover:bg-gray-200 + ${E.isStarred?"text-yellow-500":"text-gray-400"} + `,title:E.isStarred?"Stern entfernen":"Als wichtig markieren",children:s.jsx(zm,{className:`w-4 h-4 ${E.isStarred?"fill-current":""}`})}),d("emails:delete")&&s.jsx("button",{onClick:S=>N(S,E.id),className:"flex-shrink-0 mt-1 p-1 -ml-1 rounded hover:bg-red-100 text-gray-400 hover:text-red-600",title:"E-Mail löschen",children:s.jsx(ve,{className:"w-4 h-4"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center justify-between gap-2 mb-1",children:[s.jsx("span",{className:`text-sm truncate ${E.isRead?"text-gray-700":"font-semibold text-gray-900"}`,children:h(E)}),s.jsx("span",{className:"text-xs text-gray-500 flex-shrink-0",children:x(E.receivedAt)})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-sm truncate ${E.isRead?"text-gray-600":"font-medium text-gray-900"}`,children:E.subject||"(Kein Betreff)"}),E.hasAttachments&&s.jsx(pc,{className:"w-3 h-3 text-gray-400 flex-shrink-0"})]}),E.contract&&s.jsx("div",{className:"mt-1",children:s.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-green-100 text-green-800",children:E.contract.contractNumber})})]}),s.jsx(rs,{className:"w-4 h-4 text-gray-400 flex-shrink-0 mt-2"})]},E.id)),c&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsxs("div",{className:"bg-white rounded-lg shadow-xl p-6 max-w-md mx-4",children:[s.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"E-Mail löschen?"}),s.jsx("p",{className:"text-gray-600 mb-4",children:"Die E-Mail wird in den Papierkorb verschoben."}),s.jsxs("div",{className:"flex justify-end gap-3",children:[s.jsx(T,{variant:"secondary",onClick:g,disabled:y.isPending,children:"Abbrechen"}),s.jsx(T,{variant:"danger",onClick:v,disabled:y.isPending,children:y.isPending?"Löschen...":"Löschen"})]})]})})]})}function U0({email:e,onReply:t,onAssignContract:n,onDeleted:r,isSentFolder:a=!1,isContractView:i=!1,isTrashView:l=!1,onRestored:o,accountId:c}){const[u,d]=b.useState(!0),[h,p]=b.useState(e.isStarred),[m,f]=b.useState(!1),[y,N]=b.useState(!1),[v,g]=b.useState(!1),x=pe(),{hasPermission:j}=Be();b.useEffect(()=>{p(e.isStarred)},[e.id,e.isStarred]);const k=W({mutationFn:()=>qe.toggleStar(e.id),onMutate:()=>{p(C=>!C)},onSuccess:()=>{x.invalidateQueries({queryKey:["emails"]}),x.invalidateQueries({queryKey:["email",e.id]})},onError:()=>{p(e.isStarred)}}),F=W({mutationFn:()=>qe.unassignFromContract(e.id),onSuccess:()=>{x.invalidateQueries({queryKey:["emails"]}),x.invalidateQueries({queryKey:["email",e.id]})}}),E=W({mutationFn:()=>qe.delete(e.id),onSuccess:()=>{x.invalidateQueries({queryKey:["emails"]}),c&&x.invalidateQueries({queryKey:["folder-counts",c]}),e.contractId&&x.invalidateQueries({queryKey:["contract-folder-counts",e.contractId]}),ps.success("E-Mail in Papierkorb verschoben"),f(!1),r==null||r()},onError:C=>{console.error("Delete error:",C),ps.error(C.message||"Fehler beim Löschen der E-Mail"),f(!1)}}),S=W({mutationFn:()=>qe.restore(e.id),onSuccess:()=>{x.invalidateQueries({queryKey:["emails"]}),c&&x.invalidateQueries({queryKey:["folder-counts",c]}),e.contractId&&x.invalidateQueries({queryKey:["contract-folder-counts",e.contractId]}),ps.success("E-Mail wiederhergestellt"),N(!1),o==null||o()},onError:C=>{console.error("Restore error:",C),ps.error(C.message||"Fehler beim Wiederherstellen der E-Mail"),N(!1)}}),P=W({mutationFn:()=>qe.permanentDelete(e.id),onSuccess:()=>{x.invalidateQueries({queryKey:["emails"]}),c&&x.invalidateQueries({queryKey:["folder-counts",c]}),ps.success("E-Mail endgültig gelöscht"),g(!1),r==null||r()},onError:C=>{console.error("Permanent delete error:",C),ps.error(C.message||"Fehler beim endgültigen Löschen der E-Mail"),g(!1)}}),A=C=>new Date(C).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"}),_=C=>{try{return JSON.parse(C)}catch{return[]}},L=C=>{if(!C)return[];try{return JSON.parse(C)}catch{return[]}},V=_(e.toAddresses),q=e.ccAddresses?_(e.ccAddresses):[],O=L(e.attachmentNames);return s.jsxs("div",{className:"flex flex-col h-full",children:[s.jsxs("div",{className:"p-4 border-b border-gray-200 space-y-3",children:[s.jsxs("div",{className:"flex items-start justify-between gap-4",children:[s.jsx("h2",{className:"text-lg font-semibold text-gray-900",children:e.subject||"(Kein Betreff)"}),s.jsx("div",{className:"flex items-center gap-2 flex-shrink-0",children:l?s.jsxs(s.Fragment,{children:[s.jsxs(T,{variant:"secondary",size:"sm",onClick:()=>N(!0),title:"Wiederherstellen",children:[s.jsx($0,{className:"w-4 h-4 mr-1"}),"Wiederherstellen"]}),s.jsxs(T,{variant:"danger",size:"sm",onClick:()=>g(!0),title:"Endgültig löschen",children:[s.jsx(ve,{className:"w-4 h-4 mr-1"}),"Endgültig löschen"]})]}):s.jsxs(s.Fragment,{children:[s.jsx("button",{onClick:()=>k.mutate(),className:`p-2 rounded-lg hover:bg-gray-100 ${h?"text-yellow-500":"text-gray-400"}`,title:h?"Stern entfernen":"Als wichtig markieren",children:s.jsx(zm,{className:`w-5 h-5 ${h?"fill-current":""}`})}),s.jsxs(T,{variant:"secondary",size:"sm",onClick:t,children:[s.jsx(tS,{className:"w-4 h-4 mr-1"}),"Antworten"]}),j("emails:delete")&&s.jsx(T,{variant:"danger",size:"sm",onClick:()=>f(!0),title:"E-Mail löschen",children:s.jsx(ve,{className:"w-4 h-4"})})]})})]}),s.jsxs("div",{className:"text-sm space-y-1",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-gray-500 w-12",children:"Von:"}),s.jsxs("span",{className:"font-medium text-gray-900",children:[e.fromName&&`${e.fromName} `,s.jsxs("span",{className:"text-gray-600",children:["<",e.fromAddress,">"]})]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-gray-500 w-12",children:"An:"}),s.jsx("span",{className:"text-gray-700",children:V.join(", ")})]}),q.length>0&&s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-gray-500 w-12",children:"CC:"}),s.jsx("span",{className:"text-gray-700",children:q.join(", ")})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-gray-500 w-12",children:"Am:"}),s.jsx("span",{className:"text-gray-700",children:A(e.receivedAt)})]})]}),s.jsx("div",{className:"flex items-center gap-2 pt-2",children:e.contract?s.jsxs("div",{className:"flex items-center gap-2 px-3 py-2 bg-green-50 border border-green-200 rounded-lg",children:[s.jsx(Tp,{className:"w-4 h-4 text-green-600"}),s.jsxs("span",{className:"text-sm text-green-800",children:["Zugeordnet zu:"," ",s.jsx(Ne,{to:`/contracts/${e.contract.id}`,className:"font-medium hover:underline",children:e.contract.contractNumber})]}),!(i&&a)&&!e.isAutoAssigned&&s.jsx("button",{onClick:()=>F.mutate(),className:"ml-2 p-1 hover:bg-green-100 rounded",title:"Zuordnung aufheben",children:s.jsx(jn,{className:"w-4 h-4 text-green-600"})})]}):!i&&s.jsxs(T,{variant:"secondary",size:"sm",onClick:n,children:[s.jsx(Tp,{className:"w-4 h-4 mr-1"}),"Vertrag zuordnen"]})}),O.length>0&&s.jsxs("div",{className:"pt-2",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(pc,{className:"w-4 h-4 text-gray-400"}),s.jsxs("span",{className:"text-sm text-gray-500",children:[O.length," Anhang",O.length>1?"e":""]})]}),s.jsx("div",{className:"flex flex-wrap gap-2",children:O.map((C,w)=>s.jsxs("div",{className:"inline-flex items-center gap-1 px-3 py-2 bg-gray-100 rounded-lg text-sm text-gray-700",children:[s.jsx("span",{className:"max-w-[200px] truncate mr-1",children:C}),s.jsx("a",{href:qe.getAttachmentUrl(e.id,C,!0),target:"_blank",rel:"noopener noreferrer",className:"p-1 hover:bg-gray-200 rounded transition-colors",title:`${C} öffnen`,children:s.jsx(Lm,{className:"w-4 h-4 text-gray-500"})}),s.jsx("a",{href:qe.getAttachmentUrl(e.id,C),download:C,className:"p-1 hover:bg-gray-200 rounded transition-colors",title:`${C} herunterladen`,children:s.jsx(Ms,{className:"w-4 h-4 text-gray-500"})})]},w))})]})]}),e.htmlBody&&e.textBody&&s.jsxs("div",{className:"px-4 py-2 border-b border-gray-200 flex items-center gap-2",children:[s.jsx("button",{onClick:()=>d(!0),className:`px-3 py-1 text-sm rounded ${u?"bg-blue-100 text-blue-700":"text-gray-600 hover:bg-gray-100"}`,children:"HTML"}),s.jsx("button",{onClick:()=>d(!1),className:`px-3 py-1 text-sm rounded ${u?"text-gray-600 hover:bg-gray-100":"bg-blue-100 text-blue-700"}`,children:"Text"})]}),s.jsx("div",{className:"flex-1 overflow-auto p-4",children:u&&e.htmlBody?s.jsx("div",{className:"prose prose-sm max-w-none",dangerouslySetInnerHTML:{__html:e.htmlBody}}):s.jsx("pre",{className:"whitespace-pre-wrap text-sm text-gray-700 font-sans",children:e.textBody||"Kein Inhalt"})}),m&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsxs("div",{className:"bg-white rounded-lg shadow-xl p-6 max-w-md mx-4",children:[s.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"E-Mail löschen?"}),s.jsx("p",{className:"text-gray-600 mb-4",children:"Die E-Mail wird in den Papierkorb verschoben."}),s.jsxs("div",{className:"flex justify-end gap-3",children:[s.jsx(T,{variant:"secondary",onClick:()=>f(!1),disabled:E.isPending,children:"Abbrechen"}),s.jsx(T,{variant:"danger",onClick:()=>E.mutate(),disabled:E.isPending,children:E.isPending?"Löschen...":"Löschen"})]})]})}),y&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsxs("div",{className:"bg-white rounded-lg shadow-xl p-6 max-w-md mx-4",children:[s.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"E-Mail wiederherstellen?"}),s.jsxs("p",{className:"text-gray-600 mb-4",children:["Die E-Mail wird wieder in den ursprünglichen Ordner (",e.folder==="SENT"?"Gesendet":"Posteingang",") verschoben."]}),s.jsxs("div",{className:"flex justify-end gap-3",children:[s.jsx(T,{variant:"secondary",onClick:()=>N(!1),disabled:S.isPending,children:"Abbrechen"}),s.jsx(T,{variant:"primary",onClick:()=>S.mutate(),disabled:S.isPending,children:S.isPending?"Wird wiederhergestellt...":"Wiederherstellen"})]})]})}),v&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsxs("div",{className:"bg-white rounded-lg shadow-xl p-6 max-w-md mx-4",children:[s.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"E-Mail endgültig löschen?"}),s.jsx("p",{className:"text-gray-600 mb-4",children:"Diese Aktion kann nicht rückgängig gemacht werden. Die E-Mail wird unwiderruflich gelöscht."}),s.jsxs("div",{className:"flex justify-end gap-3",children:[s.jsx(T,{variant:"secondary",onClick:()=>g(!1),disabled:P.isPending,children:"Abbrechen"}),s.jsx(T,{variant:"danger",onClick:()=>P.mutate(),disabled:P.isPending,children:P.isPending?"Wird gelöscht...":"Endgültig löschen"})]})]})})]})}function B0({isOpen:e,onClose:t,account:n,replyTo:r,onSuccess:a,contractId:i}){const[l,o]=b.useState(""),[c,u]=b.useState(""),[d,h]=b.useState(""),[p,m]=b.useState(""),[f,y]=b.useState([]),[N,v]=b.useState(null),g=b.useRef(null);b.useEffect(()=>{if(e){if(r){o(r.fromAddress||"");const L=r.subject||"",V=/^(Re|Aw|Fwd|Wg):\s*/i.test(L);h(V?L:`Re: ${L}`);const q=new Date(r.receivedAt).toLocaleString("de-DE"),O=r.textBody?` + +--- Ursprüngliche Nachricht --- +Von: ${r.fromName||r.fromAddress} +Am: ${q} + +${r.textBody}`:"";m(O)}else o(""),h(""),m("");u(""),y([]),v(null)}},[e,r]);const x=10*1024*1024,j=25*1024*1024,k=L=>new Promise((V,q)=>{const O=new FileReader;O.readAsDataURL(L),O.onload=()=>{const w=O.result.split(",")[1];V(w)},O.onerror=q}),F=async L=>{const V=L.target.files;if(!V)return;const q=[];let O=f.reduce((C,w)=>C+w.content.length*.75,0);for(const C of Array.from(V)){if(C.size>x){v(`Datei "${C.name}" ist zu groß (max. 10 MB)`);continue}if(O+C.size>j){v("Maximale Gesamtgröße der Anhänge erreicht (25 MB)");break}try{const w=await k(C);q.push({filename:C.name,content:w,contentType:C.type||"application/octet-stream"}),O+=C.size}catch{v(`Fehler beim Lesen von "${C.name}"`)}}q.length>0&&y(C=>[...C,...q]),g.current&&(g.current.value="")},E=L=>{y(V=>V.filter((q,O)=>O!==L))},S=L=>{const V=L.length*.75;return V<1024?`${Math.round(V)} B`:V<1024*1024?`${(V/1024).toFixed(1)} KB`:`${(V/(1024*1024)).toFixed(1)} MB`},P=W({mutationFn:()=>Ds.sendEmail(n.id,{to:l.split(",").map(L=>L.trim()).filter(Boolean),cc:c?c.split(",").map(L=>L.trim()).filter(Boolean):void 0,subject:d,text:p,inReplyTo:r==null?void 0:r.messageId,references:r!=null&&r.messageId?[r.messageId]:void 0,attachments:f.length>0?f:void 0,contractId:i}),onSuccess:()=>{a==null||a(),A()},onError:L=>{v(L instanceof Error?L.message:"Fehler beim Senden")}}),A=()=>{t()},_=()=>{if(!l.trim()){v("Bitte Empfänger angeben");return}if(!d.trim()){v("Bitte Betreff angeben");return}v(null),P.mutate()};return s.jsx(ot,{isOpen:e,onClose:A,title:r?"Antworten":"Neue E-Mail",size:"lg",children:s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Von"}),s.jsx("div",{className:"px-3 py-2 bg-gray-100 rounded-lg text-sm text-gray-700",children:n.email})]}),s.jsxs("div",{children:[s.jsxs("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:["An ",s.jsx("span",{className:"text-red-500",children:"*"})]}),s.jsx("input",{type:"text",value:l,onChange:L=>o(L.target.value),placeholder:"empfaenger@example.com",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"}),s.jsx("p",{className:"mt-1 text-xs text-gray-500",children:"Mehrere Empfänger mit Komma trennen"})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"CC"}),s.jsx("input",{type:"text",value:c,onChange:L=>u(L.target.value),placeholder:"cc@example.com",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"})]}),s.jsxs("div",{children:[s.jsxs("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:["Betreff ",s.jsx("span",{className:"text-red-500",children:"*"})]}),s.jsx("input",{type:"text",value:d,onChange:L=>h(L.target.value),placeholder:"Betreff eingeben",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Nachricht"}),s.jsx("textarea",{value:p,onChange:L=>m(L.target.value),rows:10,placeholder:"Ihre Nachricht...",className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none"})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Anhänge"}),s.jsx("input",{type:"file",ref:g,onChange:F,multiple:!0,className:"hidden"}),s.jsxs("button",{type:"button",onClick:()=>{var L;return(L=g.current)==null?void 0:L.click()},className:"inline-flex items-center px-3 py-2 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors",children:[s.jsx(pc,{className:"w-4 h-4 mr-2"}),"Datei anhängen"]}),f.length>0&&s.jsx("div",{className:"mt-2 space-y-2",children:f.map((L,V)=>s.jsxs("div",{className:"flex items-center justify-between px-3 py-2 bg-gray-50 rounded-lg",children:[s.jsxs("div",{className:"flex items-center min-w-0",children:[s.jsx(at,{className:"w-4 h-4 text-gray-500 mr-2 flex-shrink-0"}),s.jsx("span",{className:"text-sm text-gray-700 truncate",children:L.filename}),s.jsxs("span",{className:"ml-2 text-xs text-gray-500 flex-shrink-0",children:["(",S(L.content),")"]})]}),s.jsx("button",{type:"button",onClick:()=>E(V),className:"ml-2 p-1 text-gray-400 hover:text-red-500 transition-colors",title:"Anhang entfernen",children:s.jsx(jn,{className:"w-4 h-4"})})]},V))}),s.jsx("p",{className:"mt-1 text-xs text-gray-500",children:"Max. 10 MB pro Datei, 25 MB gesamt"})]}),N&&s.jsx("div",{className:"p-3 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700",children:N}),s.jsxs("div",{className:"flex justify-end gap-3 pt-4",children:[s.jsx(T,{variant:"secondary",onClick:A,children:"Abbrechen"}),s.jsxs(T,{onClick:_,disabled:P.isPending,children:[s.jsx(ul,{className:"w-4 h-4 mr-2"}),P.isPending?"Wird gesendet...":"Senden"]})]})]})})}function yS({isOpen:e,onClose:t,email:n,customerId:r,onSuccess:a}){const[i,l]=b.useState(""),[o,c]=b.useState(null),u=pe(),{data:d,isLoading:h}=he({queryKey:["contracts","customer",r],queryFn:()=>$e.getAll({customerId:r}),enabled:e}),m=((d==null?void 0:d.data)||[]).filter(g=>{var j,k,F,E;if(!i)return!0;const x=i.toLowerCase();return g.contractNumber.toLowerCase().includes(x)||((k=(j=g.contractCategory)==null?void 0:j.name)==null?void 0:k.toLowerCase().includes(x))||((E=(F=g.provider)==null?void 0:F.name)==null?void 0:E.toLowerCase().includes(x))}),f=W({mutationFn:g=>qe.assignToContract(n.id,g),onSuccess:(g,x)=>{u.invalidateQueries({queryKey:["emails"]}),u.invalidateQueries({queryKey:["email",n.id]}),u.invalidateQueries({queryKey:["contract-folder-counts",x]}),a==null||a(),y()}}),y=()=>{l(""),c(null),t()},N=()=>{o&&f.mutate(o)},v=g=>g?new Date(g).toLocaleDateString("de-DE"):"-";return s.jsx(ot,{isOpen:e,onClose:y,title:"E-Mail Vertrag zuordnen",size:"lg",children:s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{className:"p-3 bg-gray-50 rounded-lg",children:[s.jsxs("p",{className:"text-sm text-gray-600",children:[s.jsx("span",{className:"font-medium",children:"Betreff:"})," ",n.subject||"(Kein Betreff)"]}),s.jsxs("p",{className:"text-sm text-gray-600",children:[s.jsx("span",{className:"font-medium",children:"Von:"})," ",n.fromAddress]})]}),s.jsxs("div",{className:"relative",children:[s.jsx(cl,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"}),s.jsx("input",{type:"text",value:i,onChange:g=>l(g.target.value),placeholder:"Vertrag suchen...",className:"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"})]}),s.jsx("div",{className:"border border-gray-200 rounded-lg max-h-80 overflow-auto",children:h?s.jsx("div",{className:"flex items-center justify-center py-8",children:s.jsx("div",{className:"animate-spin rounded-full h-6 w-6 border-b-2 border-blue-600"})}):m.length===0?s.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-gray-500",children:[s.jsx(at,{className:"w-8 h-8 mb-2 opacity-50"}),s.jsx("p",{className:"text-sm",children:"Keine Verträge gefunden"})]}):s.jsx("div",{className:"divide-y divide-gray-200",children:m.map(g=>{var x;return s.jsx("div",{onClick:()=>c(g.id),className:` + flex items-center gap-3 p-3 cursor-pointer transition-colors + ${o===g.id?"bg-blue-50 border-l-2 border-l-blue-500":"hover:bg-gray-50"} + `,children:s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"font-medium text-gray-900",children:g.contractNumber}),s.jsx("span",{className:` + px-2 py-0.5 text-xs rounded-full + ${g.status==="ACTIVE"?"bg-green-100 text-green-800":g.status==="PENDING"?"bg-yellow-100 text-yellow-800":g.status==="CANCELLED"?"bg-red-100 text-red-800":"bg-gray-100 text-gray-800"} + `,children:g.status})]}),s.jsxs("div",{className:"text-sm text-gray-600 truncate",children:[(x=g.contractCategory)==null?void 0:x.name,g.provider&&` - ${g.provider.name}`]}),s.jsxs("div",{className:"text-xs text-gray-500",children:["Start: ",v(g.startDate)]})]})},g.id)})})}),s.jsxs("div",{className:"flex justify-end gap-3 pt-4",children:[s.jsx(T,{variant:"secondary",onClick:y,children:"Abbrechen"}),s.jsx(T,{onClick:N,disabled:!o||f.isPending,children:f.isPending?"Wird zugeordnet...":"Zuordnen"})]})]})})}function vS({emails:e,selectedEmailId:t,onSelectEmail:n,onEmailRestored:r,onEmailDeleted:a,isLoading:i}){const[l,o]=b.useState(null),[c,u]=b.useState(null),d=pe(),h=j=>{if(j.folder==="SENT")try{const k=JSON.parse(j.toAddresses);if(k.length>0)return`An: ${k[0]}${k.length>1?` (+${k.length-1})`:""}`}catch{return"An: (Unbekannt)"}return j.fromName||j.fromAddress},p=W({mutationFn:j=>qe.restore(j),onSuccess:(j,k)=>{d.invalidateQueries({queryKey:["emails"]}),ps.success("E-Mail wiederhergestellt"),o(null),u(null),r==null||r(k)},onError:j=>{console.error("Restore error:",j),ps.error(j.message||"Fehler beim Wiederherstellen"),o(null),u(null)}}),m=W({mutationFn:j=>qe.permanentDelete(j),onSuccess:(j,k)=>{d.invalidateQueries({queryKey:["emails"]}),ps.success("E-Mail endgültig gelöscht"),o(null),u(null),a==null||a(k)},onError:j=>{console.error("Permanent delete error:",j),ps.error(j.message||"Fehler beim endgültigen Löschen"),o(null),u(null)}}),f=(j,k)=>{j.stopPropagation(),o(k),u("restore")},y=(j,k)=>{j.stopPropagation(),o(k),u("delete")},N=j=>{j.stopPropagation(),l&&c&&(c==="restore"?p.mutate(l):m.mutate(l))},v=j=>{j.stopPropagation(),o(null),u(null)},g=j=>new Date(j).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit"}),x=j=>{if(!j)return"";const k=new Date(j),F=new Date;return k.toDateString()===F.toDateString()?`Gelöscht um ${k.toLocaleTimeString("de-DE",{hour:"2-digit",minute:"2-digit"})}`:`Gelöscht am ${k.toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit"})}`};return i?s.jsx("div",{className:"flex items-center justify-center h-64",children:s.jsx("div",{className:"animate-spin rounded-full h-8 w-8 border-b-2 border-red-600"})}):e.length===0?s.jsxs("div",{className:"flex flex-col items-center justify-center h-64 text-gray-500",children:[s.jsx(ve,{className:"w-12 h-12 mb-2 opacity-50"}),s.jsx("p",{children:"Papierkorb ist leer"})]}):s.jsxs("div",{className:"divide-y divide-gray-200",children:[e.map(j=>s.jsxs("div",{onClick:()=>n(j),className:["flex items-start gap-3 p-3 cursor-pointer transition-colors",t===j.id?"bg-red-100":"hover:bg-gray-100 bg-gray-50/50"].join(" "),style:{borderLeft:t===j.id?"4px solid #dc2626":"4px solid transparent"},children:[s.jsx("div",{className:"flex-shrink-0 mt-1 p-1 -ml-1 text-gray-400",title:j.folder==="SENT"?"Aus Gesendet":"Aus Posteingang",children:j.folder==="SENT"?s.jsx(ul,{className:"w-4 h-4"}):s.jsx(Lo,{className:"w-4 h-4"})}),s.jsx("button",{onClick:k=>f(k,j.id),className:"flex-shrink-0 mt-1 p-1 -ml-1 rounded hover:bg-green-100 text-gray-400 hover:text-green-600",title:"Wiederherstellen",children:s.jsx($0,{className:"w-4 h-4"})}),s.jsx("button",{onClick:k=>y(k,j.id),className:"flex-shrink-0 mt-1 p-1 -ml-1 rounded hover:bg-red-100 text-gray-400 hover:text-red-600",title:"Endgültig löschen",children:s.jsx(ve,{className:"w-4 h-4"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center justify-between gap-2 mb-1",children:[s.jsx("span",{className:"text-sm truncate text-gray-700",children:h(j)}),s.jsx("span",{className:"text-xs text-gray-500 flex-shrink-0",children:g(j.receivedAt)})]}),s.jsx("div",{className:"text-sm truncate text-gray-600",children:j.subject||"(Kein Betreff)"}),s.jsx("div",{className:"text-xs text-red-500 mt-1",children:x(j.deletedAt)})]}),s.jsx(rs,{className:"w-4 h-4 text-gray-400 flex-shrink-0 mt-2"})]},j.id)),l&&c&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsxs("div",{className:"bg-white rounded-lg shadow-xl p-6 max-w-md mx-4",children:[s.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:c==="restore"?"E-Mail wiederherstellen?":"E-Mail endgültig löschen?"}),s.jsx("p",{className:"text-gray-600 mb-4",children:c==="restore"?"Die E-Mail wird wieder in den ursprünglichen Ordner verschoben.":"Die E-Mail wird unwiderruflich gelöscht. Diese Aktion kann nicht rückgängig gemacht werden."}),s.jsxs("div",{className:"flex justify-end gap-3",children:[s.jsx(T,{variant:"secondary",onClick:v,disabled:p.isPending||m.isPending,children:"Abbrechen"}),s.jsx(T,{variant:c==="restore"?"primary":"danger",onClick:N,disabled:p.isPending||m.isPending,children:p.isPending||m.isPending?"Wird ausgeführt...":c==="restore"?"Wiederherstellen":"Endgültig löschen"})]})]})})]})}function jS({customerId:e}){const[t,n]=b.useState(null),[r,a]=b.useState("INBOX"),[i,l]=b.useState(null),[o,c]=b.useState(!1),[u,d]=b.useState(!1),[h,p]=b.useState(null),m=pe(),{hasPermission:f}=Be(),y=f("emails:delete"),{data:N,isLoading:v}=he({queryKey:["mailbox-accounts",e],queryFn:()=>qe.getMailboxAccounts(e)}),g=(N==null?void 0:N.data)||[];b.useEffect(()=>{g.length>0&&!t&&n(g[0].id)},[g,t]);const x=g.find(ue=>ue.id===t),{data:j,isLoading:k,refetch:F}=he({queryKey:["emails","customer",e,t,r],queryFn:()=>qe.getForCustomer(e,{accountId:t||void 0,folder:r}),enabled:!!t&&r!=="TRASH"}),E=(j==null?void 0:j.data)||[],{data:S,isLoading:P}=he({queryKey:["emails","trash",e],queryFn:()=>qe.getTrash(e),enabled:r==="TRASH"&&y}),A=(S==null?void 0:S.data)||[],{data:_}=he({queryKey:["folder-counts",t],queryFn:()=>Ds.getFolderCounts(t),enabled:!!t}),L=(_==null?void 0:_.data)||{inbox:0,inboxUnread:0,sent:0,sentUnread:0,trash:0,trashUnread:0},{data:V}=he({queryKey:["email",i==null?void 0:i.id],queryFn:()=>qe.getById(i.id),enabled:!!(i!=null&&i.id)}),q=(V==null?void 0:V.data)||i,O=W({mutationFn:ue=>Ds.syncEmails(ue),onSuccess:()=>{m.invalidateQueries({queryKey:["emails"]}),m.invalidateQueries({queryKey:["folder-counts",t]}),m.invalidateQueries({queryKey:["mailbox-accounts",e]})}}),C=()=>{t&&O.mutate(t)},w=ue=>{l(ue)},R=()=>{p(q||null),c(!0)},Q=()=>{p(null),c(!0)},ee=()=>{d(!0)};if(!v&&g.length===0)return s.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-gray-500",children:[s.jsx(mn,{className:"w-16 h-16 mb-4 opacity-30"}),s.jsx("h3",{className:"text-lg font-medium text-gray-900 mb-2",children:"Keine E-Mail-Konten vorhanden"}),s.jsx("p",{className:"text-sm text-center max-w-md",children:"Erstellen Sie eine Stressfrei-Wechseln E-Mail-Adresse mit aktivierter Mailbox, um E-Mails hier empfangen und versenden zu können."})]});const fe=ue=>{a(ue),l(null)};return s.jsxs("div",{className:"flex flex-col h-full",style:{minHeight:"600px"},children:[s.jsxs("div",{className:"flex items-center justify-between gap-4 p-4 border-b border-gray-200 bg-gray-50",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(Lo,{className:"w-5 h-5 text-gray-500"}),s.jsx("select",{value:t||"",onChange:ue=>{n(Number(ue.target.value)),l(null)},className:"px-3 py-2 border border-gray-300 rounded-lg bg-white focus:ring-2 focus:ring-blue-500 focus:border-transparent text-sm",children:g.map(ue=>s.jsx("option",{value:ue.id,children:ue.email},ue.id))})]}),s.jsxs("div",{className:"flex items-center gap-1 bg-gray-200 rounded-lg p-1",children:[s.jsxs("button",{onClick:()=>fe("INBOX"),className:`flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors ${r==="INBOX"?"bg-white text-blue-600 shadow-sm font-medium":"text-gray-600 hover:text-gray-900"}`,children:[s.jsx(Lo,{className:"w-4 h-4"}),"Posteingang",L.inbox>0&&s.jsx("span",{className:`ml-1 px-1.5 py-0.5 text-xs rounded-full cursor-help ${L.inboxUnread>0?"bg-blue-100 text-blue-600 font-medium":"bg-gray-100 text-gray-500"}`,title:`${L.inboxUnread} ungelesen / ${L.inbox} gesamt`,children:L.inboxUnread>0?`${L.inboxUnread}/${L.inbox}`:L.inbox})]}),s.jsxs("button",{onClick:()=>fe("SENT"),className:`flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors ${r==="SENT"?"bg-white text-blue-600 shadow-sm font-medium":"text-gray-600 hover:text-gray-900"}`,children:[s.jsx(ul,{className:"w-4 h-4"}),"Gesendet",L.sent>0&&s.jsx("span",{className:`ml-1 px-1.5 py-0.5 text-xs rounded-full cursor-help ${L.sentUnread>0?"bg-blue-100 text-blue-600 font-medium":"bg-gray-100 text-gray-500"}`,title:`${L.sentUnread} ungelesen / ${L.sent} gesamt`,children:L.sentUnread>0?`${L.sentUnread}/${L.sent}`:L.sent})]}),y&&s.jsxs("button",{onClick:()=>fe("TRASH"),className:`flex items-center gap-1.5 px-3 py-1.5 text-sm rounded-md transition-colors ${r==="TRASH"?"bg-white text-red-600 shadow-sm font-medium":"text-gray-600 hover:text-gray-900"}`,children:[s.jsx(ve,{className:"w-4 h-4"}),"Papierkorb",L.trash>0&&s.jsx("span",{className:`ml-1 px-1.5 py-0.5 text-xs rounded-full cursor-help ${L.trashUnread>0?"bg-red-100 text-red-600 font-medium":"bg-gray-100 text-gray-500"}`,title:`${L.trashUnread} ungelesen / ${L.trash} gesamt`,children:L.trashUnread>0?`${L.trashUnread}/${L.trash}`:L.trash})]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[r!=="TRASH"&&s.jsxs(T,{variant:"secondary",size:"sm",onClick:C,disabled:O.isPending||!t,children:[s.jsx(Qr,{className:`w-4 h-4 mr-1 ${O.isPending?"animate-spin":""}`}),O.isPending?"Sync...":"Synchronisieren"]}),s.jsxs(T,{size:"sm",onClick:Q,disabled:!x,children:[s.jsx(Re,{className:"w-4 h-4 mr-1"}),"Neue E-Mail"]})]})]}),s.jsxs("div",{className:"flex flex-1 overflow-hidden",children:[s.jsx("div",{className:"w-1/3 border-r border-gray-200 overflow-auto",children:r==="TRASH"?s.jsx(vS,{emails:A,selectedEmailId:i==null?void 0:i.id,onSelectEmail:w,onEmailRestored:ue=>{(i==null?void 0:i.id)===ue&&l(null),m.invalidateQueries({queryKey:["emails"]}),m.invalidateQueries({queryKey:["folder-counts",t]})},onEmailDeleted:ue=>{(i==null?void 0:i.id)===ue&&l(null),m.invalidateQueries({queryKey:["emails","trash"]}),m.invalidateQueries({queryKey:["folder-counts",t]})},isLoading:P}):s.jsx(gS,{emails:E,selectedEmailId:i==null?void 0:i.id,onSelectEmail:w,onEmailDeleted:ue=>{(i==null?void 0:i.id)===ue&&l(null),m.invalidateQueries({queryKey:["folder-counts",t]})},isLoading:k,folder:r,accountId:t})}),s.jsx("div",{className:"flex-1 overflow-auto",children:q?s.jsx(U0,{email:q,onReply:R,onAssignContract:ee,onDeleted:()=>{l(null),m.invalidateQueries({queryKey:["emails"]}),m.invalidateQueries({queryKey:["folder-counts",t]})},isSentFolder:r==="SENT",isTrashView:r==="TRASH",onRestored:()=>{l(null),m.invalidateQueries({queryKey:["emails"]}),m.invalidateQueries({queryKey:["folder-counts",t]})},accountId:t||void 0}):s.jsxs("div",{className:"flex flex-col items-center justify-center h-full text-gray-500",children:[s.jsx(mn,{className:"w-12 h-12 mb-2 opacity-30"}),s.jsx("p",{children:"Wählen Sie eine E-Mail aus"})]})})]}),x&&s.jsx(B0,{isOpen:o,onClose:()=>{c(!1),p(null)},account:x,replyTo:h||void 0,onSuccess:()=>{m.invalidateQueries({queryKey:["emails","customer",e,t,"SENT"]}),m.invalidateQueries({queryKey:["folder-counts",t]}),r==="SENT"&&F()}}),q&&s.jsx(yS,{isOpen:u,onClose:()=>d(!1),email:q,customerId:e,onSuccess:()=>{F()}})]})}function bS({contractId:e,customerId:t}){const[n,r]=b.useState("INBOX"),[a,i]=b.useState(null),[l,o]=b.useState(!1),[c,u]=b.useState(null),d=pe(),{data:h,isLoading:p,refetch:m}=he({queryKey:["emails","contract",e,n],queryFn:()=>qe.getForContract(e,{folder:n})}),f=(h==null?void 0:h.data)||[],{data:y}=he({queryKey:["contract-folder-counts",e],queryFn:()=>qe.getContractFolderCounts(e)}),N=(y==null?void 0:y.data)||{inbox:0,inboxUnread:0,sent:0,sentUnread:0},{data:v}=he({queryKey:["mailbox-accounts",t],queryFn:()=>qe.getMailboxAccounts(t)}),x=((v==null?void 0:v.data)||[])[0],{data:j}=he({queryKey:["email",a==null?void 0:a.id],queryFn:()=>qe.getById(a.id),enabled:!!(a!=null&&a.id)}),k=(j==null?void 0:j.data)||a,F=W({mutationFn:R=>qe.toggleStar(R),onSuccess:(R,Q)=>{d.invalidateQueries({queryKey:["emails","contract",e]}),d.invalidateQueries({queryKey:["email",Q]})}}),E=W({mutationFn:({emailId:R,isRead:Q})=>qe.markAsRead(R,Q),onSuccess:(R,Q)=>{d.invalidateQueries({queryKey:["emails","contract",e]}),d.invalidateQueries({queryKey:["email",Q.emailId]}),d.invalidateQueries({queryKey:["contract-folder-counts",e]})}}),S=W({mutationFn:R=>qe.unassignFromContract(R),onSuccess:()=>{d.invalidateQueries({queryKey:["emails","contract",e]}),d.invalidateQueries({queryKey:["contract-folder-counts",e]}),i(null)}}),P=R=>{const Q=new Date(R),ee=new Date;return Q.toDateString()===ee.toDateString()?Q.toLocaleTimeString("de-DE",{hour:"2-digit",minute:"2-digit"}):Q.toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit"})},A=(R,Q)=>{R.stopPropagation(),F.mutate(Q)},_=(R,Q)=>{R.stopPropagation(),E.mutate({emailId:Q.id,isRead:!Q.isRead})},L=R=>{R.isRead||E.mutate({emailId:R.id,isRead:!0}),i(R)},V=()=>{u(k||null),o(!0)},q=()=>{u(null),o(!0)},O=(R,Q)=>{R.stopPropagation(),(a==null?void 0:a.id)===Q&&i(null),S.mutate(Q)},C=R=>{r(R),i(null)},w=R=>{if(n==="SENT")try{const Q=JSON.parse(R.toAddresses);if(Q.length>0)return`An: ${Q[0]}${Q.length>1?` (+${Q.length-1})`:""}`}catch{return"An: (Unbekannt)"}return R.fromName||R.fromAddress};return s.jsxs(X,{title:s.jsxs("div",{className:"flex items-center gap-4",children:[s.jsx("span",{children:"E-Mails"}),s.jsxs("div",{className:"flex items-center gap-1 bg-gray-200 rounded-lg p-1",children:[s.jsxs("button",{onClick:()=>C("INBOX"),className:`flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md transition-colors ${n==="INBOX"?"bg-white text-blue-600 shadow-sm font-medium":"text-gray-600 hover:text-gray-900"}`,children:[s.jsx(Lo,{className:"w-3.5 h-3.5"}),"Empfangen",N.inbox>0&&s.jsx("span",{className:`ml-1 px-1.5 py-0.5 text-xs rounded-full cursor-help ${N.inboxUnread>0?"bg-blue-100 text-blue-600 font-medium":"bg-gray-100 text-gray-500"}`,title:`${N.inboxUnread} ungelesen / ${N.inbox} gesamt`,children:N.inboxUnread>0?`${N.inboxUnread}/${N.inbox}`:N.inbox})]}),s.jsxs("button",{onClick:()=>C("SENT"),className:`flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md transition-colors ${n==="SENT"?"bg-white text-blue-600 shadow-sm font-medium":"text-gray-600 hover:text-gray-900"}`,children:[s.jsx(ul,{className:"w-3.5 h-3.5"}),"Gesendet",N.sent>0&&s.jsx("span",{className:`ml-1 px-1.5 py-0.5 text-xs rounded-full cursor-help ${N.sentUnread>0?"bg-blue-100 text-blue-600 font-medium":"bg-gray-100 text-gray-500"}`,title:`${N.sentUnread} ungelesen / ${N.sent} gesamt`,children:N.sentUnread>0?`${N.sentUnread}/${N.sent}`:N.sent})]})]})]}),actions:x&&s.jsxs(T,{variant:"secondary",size:"sm",onClick:q,children:[s.jsx(Re,{className:"w-4 h-4 mr-1"}),"Neue E-Mail"]}),children:[p?s.jsx("div",{className:"flex items-center justify-center py-8",children:s.jsx("div",{className:"animate-spin rounded-full h-6 w-6 border-b-2 border-blue-600"})}):f.length===0?s.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-gray-500",children:[s.jsx(mn,{className:"w-10 h-10 mb-2 opacity-30"}),s.jsx("p",{className:"text-sm",children:n==="INBOX"?"Keine E-Mails zugeordnet":"Keine E-Mails über diesen Vertrag gesendet"}),n==="INBOX"&&s.jsx("p",{className:"text-xs mt-1",children:"E-Mails können im E-Mail-Tab des Kunden zugeordnet werden"})]}):s.jsxs("div",{className:"flex -mx-6 -mb-6",style:{minHeight:"400px"},children:[s.jsx("div",{className:"w-2/5 border-r border-gray-200 overflow-auto",children:s.jsx("div",{className:"divide-y divide-gray-200",children:f.map(R=>s.jsxs("div",{onClick:()=>L(R),className:["flex items-start gap-2 p-3 cursor-pointer transition-colors",(a==null?void 0:a.id)===R.id?"bg-blue-100":["hover:bg-gray-100",R.isRead?"bg-gray-50/50":"bg-white"].join(" ")].join(" "),style:{borderLeft:(a==null?void 0:a.id)===R.id?"4px solid #2563eb":"4px solid transparent"},children:[s.jsx("button",{onClick:Q=>_(Q,R),className:` + flex-shrink-0 mt-1 p-1 -ml-1 rounded hover:bg-gray-200 + ${R.isRead?"text-gray-400":"text-blue-600"} + `,title:R.isRead?"Als ungelesen markieren":"Als gelesen markieren",children:R.isRead?s.jsx(O0,{className:"w-4 h-4"}):s.jsx(mn,{className:"w-4 h-4"})}),s.jsx("button",{onClick:Q=>A(Q,R.id),className:` + flex-shrink-0 mt-1 p-1 -ml-1 rounded hover:bg-gray-200 + ${R.isStarred?"text-yellow-500":"text-gray-400"} + `,title:R.isStarred?"Stern entfernen":"Als wichtig markieren",children:s.jsx(zm,{className:`w-4 h-4 ${R.isStarred?"fill-current":""}`})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center justify-between gap-2 mb-1",children:[s.jsx("span",{className:`text-sm truncate ${R.isRead?"text-gray-700":"font-semibold text-gray-900"}`,children:w(R)}),s.jsx("span",{className:"text-xs text-gray-500 flex-shrink-0",children:P(R.receivedAt)})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`text-sm truncate ${R.isRead?"text-gray-600":"font-medium text-gray-900"}`,children:R.subject||"(Kein Betreff)"}),R.hasAttachments&&s.jsx(pc,{className:"w-3 h-3 text-gray-400 flex-shrink-0"})]})]}),(n==="INBOX"||n==="SENT"&&!R.isAutoAssigned)&&s.jsx("button",{onClick:Q=>O(Q,R.id),className:"flex-shrink-0 mt-1 p-1 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded",title:"Zuordnung aufheben",children:s.jsx(jn,{className:"w-4 h-4"})}),s.jsx(rs,{className:"w-4 h-4 text-gray-400 flex-shrink-0 mt-2"})]},R.id))})}),s.jsx("div",{className:"flex-1 overflow-auto",children:k&&a?s.jsx(U0,{email:k,onReply:V,onAssignContract:()=>{},onDeleted:()=>{i(null),d.invalidateQueries({queryKey:["emails","contract",e]}),d.invalidateQueries({queryKey:["contract-folder-counts",e]})},isSentFolder:n==="SENT",isContractView:!0,accountId:k==null?void 0:k.stressfreiEmailId}):s.jsxs("div",{className:"flex flex-col items-center justify-center h-full text-gray-500",children:[s.jsx(mn,{className:"w-12 h-12 mb-2 opacity-30"}),s.jsx("p",{children:"Wählen Sie eine E-Mail aus"})]})})]}),x&&s.jsx(B0,{isOpen:l,onClose:()=>{o(!1),u(null)},account:x,replyTo:c||void 0,contractId:e,onSuccess:()=>{d.invalidateQueries({queryKey:["emails","contract",e,"SENT"]}),d.invalidateQueries({queryKey:["contract-folder-counts",e]}),n==="SENT"&&m()}})]})}function NS({tabs:e,defaultTab:t}){var a,i;const[n,r]=b.useState(t||((a=e[0])==null?void 0:a.id));return s.jsxs("div",{children:[s.jsx("div",{className:"border-b border-gray-200",children:s.jsx("nav",{className:"flex -mb-px space-x-8",children:e.map(l=>s.jsx("button",{onClick:()=>r(l.id),className:`py-4 px-1 border-b-2 font-medium text-sm whitespace-nowrap ${n===l.id?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}`,children:l.label},l.id))})}),s.jsx("div",{className:"mt-4",children:(i=e.find(l=>l.id===n))==null?void 0:i.content})]})}const Le=b.forwardRef(({className:e="",label:t,error:n,options:r,id:a,placeholder:i="Bitte wählen...",...l},o)=>{const c=a||l.name,u=/\bw-\d+\b|\bw-\[|\bflex-/.test(e);return s.jsxs("div",{className:u?e:"w-full",children:[t&&s.jsx("label",{htmlFor:c,className:"block text-sm font-medium text-gray-700 mb-1",children:t}),s.jsxs("select",{ref:o,id:c,className:`block w-full px-3 py-2 border rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${n?"border-red-500":"border-gray-300"}`,...l,children:[s.jsx("option",{value:"",children:i}),r.map(d=>s.jsx("option",{value:d.value,children:d.label},d.value))]}),n&&s.jsx("p",{className:"mt-1 text-sm text-red-600",children:n})]})});Le.displayName="Select";function bt({onUpload:e,existingFile:t,accept:n=".pdf,.jpg,.jpeg,.png",label:r="Dokument hochladen",disabled:a=!1}){const i=b.useRef(null),[l,o]=b.useState(!1),[c,u]=b.useState(!1),d=async y=>{if(y){o(!0);try{await e(y)}catch(N){console.error("Upload failed:",N),alert("Upload fehlgeschlagen")}finally{o(!1)}}},h=y=>{var v;const N=(v=y.target.files)==null?void 0:v[0];N&&d(N)},p=y=>{var v;y.preventDefault(),u(!1);const N=(v=y.dataTransfer.files)==null?void 0:v[0];N&&d(N)},m=y=>{y.preventDefault(),u(!0)},f=()=>{u(!1)};return s.jsxs("div",{className:"space-y-2",children:[t?!a&&s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>{var y;return(y=i.current)==null?void 0:y.click()},disabled:l,children:l?"Wird hochgeladen...":"Ersetzen"}):s.jsx("div",{className:`border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors ${c?"border-blue-500 bg-blue-50":"border-gray-300 hover:border-gray-400"} ${a?"opacity-50 cursor-not-allowed":""}`,onClick:()=>{var y;return!a&&((y=i.current)==null?void 0:y.click())},onDrop:a?void 0:p,onDragOver:a?void 0:m,onDragLeave:a?void 0:f,children:l?s.jsxs("div",{className:"text-gray-500",children:[s.jsx("div",{className:"animate-spin w-6 h-6 border-2 border-blue-500 border-t-transparent rounded-full mx-auto mb-2"}),"Wird hochgeladen..."]}):s.jsxs(s.Fragment,{children:[s.jsx(wd,{className:"w-6 h-6 text-gray-400 mx-auto mb-2"}),s.jsx("p",{className:"text-sm text-gray-600",children:r}),s.jsx("p",{className:"text-xs text-gray-400 mt-1",children:"PDF, JPG oder PNG (max. 10MB)"})]})}),s.jsx("input",{ref:i,type:"file",accept:n,onChange:h,className:"hidden",disabled:a||l})]})}function ce({value:e,className:t="",size:n="sm",title:r="In Zwischenablage kopieren"}){const[a,i]=b.useState(!1),l=async c=>{c.preventDefault(),c.stopPropagation();try{await navigator.clipboard.writeText(e),i(!0),setTimeout(()=>i(!1),1500)}catch(u){console.error("Failed to copy:",u)}},o=n==="sm"?"w-3.5 h-3.5":"w-4 h-4";return s.jsx("button",{type:"button",onClick:l,className:`inline-flex items-center justify-center p-1 rounded transition-colors ${a?"text-green-600 bg-green-50":"text-gray-400 hover:text-blue-600 hover:bg-blue-50"} ${t}`,title:a?"Kopiert!":r,children:a?s.jsx(Nd,{className:o}):s.jsx(I0,{className:o})})}function K0({values:e,separator:t=` +`,children:n,className:r=""}){const a=e.filter(i=>i!=null&&i!=="").map(String).join(t);return a?s.jsxs("div",{className:`relative group ${r}`,children:[n,s.jsx(ce,{value:a,className:"absolute top-0 right-0 opacity-60 group-hover:opacity-100",title:"Alles kopieren"})]}):s.jsx(s.Fragment,{children:n})}function wS(){var R,Q;const{id:e}=sc(),t=Vt(),n=pe(),{hasPermission:r}=Be(),[a]=rc(),i=parseInt(e),l=a.get("tab")||"addresses",[o,c]=b.useState(!1),[u,d]=b.useState(!1),[h,p]=b.useState(!1),[m,f]=b.useState(!1),[y,N]=b.useState(!1),[v,g]=b.useState(!1),[x,j]=b.useState(null),[k,F]=b.useState(null),[E,S]=b.useState(null),[P,A]=b.useState(null),[_,L]=b.useState(null),{data:V,isLoading:q}=he({queryKey:["customer",e],queryFn:()=>Nt.getById(i)}),O=W({mutationFn:()=>Nt.delete(i),onSuccess:()=>{t("/customers")}});if(q)return s.jsx("div",{className:"text-center py-8",children:"Laden..."});if(!(V!=null&&V.data))return s.jsx("div",{className:"text-center py-8 text-red-600",children:"Kunde nicht gefunden"});const C=V.data,w=[{id:"addresses",label:"Adressen",content:s.jsx(CS,{customerId:i,addresses:C.addresses||[],canEdit:r("customers:update"),onAdd:()=>c(!0),onEdit:ee=>S(ee)})},{id:"bankcards",label:"Bankkarten",content:s.jsx(ES,{customerId:i,bankCards:C.bankCards||[],canEdit:r("customers:update"),showInactive:v,onToggleInactive:()=>g(!v),onAdd:()=>d(!0),onEdit:ee=>j(ee)})},{id:"documents",label:"Ausweise",content:s.jsx(DS,{customerId:i,documents:C.identityDocuments||[],canEdit:r("customers:update"),showInactive:v,onToggleInactive:()=>g(!v),onAdd:()=>p(!0),onEdit:ee=>F(ee)})},{id:"meters",label:"Zähler",content:s.jsx(PS,{customerId:i,meters:C.meters||[],canEdit:r("customers:update"),showInactive:v,onToggleInactive:()=>g(!v),onAdd:()=>f(!0),onEdit:ee=>A(ee)})},{id:"stressfrei",label:"Stressfrei-Wechseln",content:s.jsx(FS,{customerId:i,emails:C.stressfreiEmails||[],canEdit:r("customers:update"),showInactive:v,onToggleInactive:()=>g(!v),onAdd:()=>N(!0),onEdit:ee=>L(ee)})},{id:"emails",label:"E-Mail-Postfach",content:s.jsx(jS,{customerId:i})},{id:"contracts",label:"Verträge",content:s.jsx(AS,{customerId:i,contracts:C.contracts||[]})},...r("customers:update")?[{id:"portal",label:"Portal",content:s.jsx(TS,{customerId:i,canEdit:r("customers:update")})}]:[]];return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsxs("div",{children:[s.jsx("h1",{className:"text-2xl font-bold",children:C.type==="BUSINESS"&&C.companyName?C.companyName:`${C.firstName} ${C.lastName}`}),s.jsxs("p",{className:"text-gray-500 font-mono flex items-center gap-1",children:[C.customerNumber,s.jsx(ce,{value:C.customerNumber})]})]}),s.jsxs("div",{className:"flex gap-2",children:[r("customers:update")&&s.jsx(Ne,{to:`/customers/${e}/edit`,children:s.jsxs(T,{variant:"secondary",children:[s.jsx(Je,{className:"w-4 h-4 mr-2"}),"Bearbeiten"]})}),r("customers:delete")&&s.jsxs(T,{variant:"danger",onClick:()=>{confirm("Kunde wirklich löschen?")&&O.mutate()},children:[s.jsx(ve,{className:"w-4 h-4 mr-2"}),"Löschen"]})]})]}),s.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6",children:[s.jsx(X,{title:"Stammdaten",className:"lg:col-span-2",children:s.jsxs("dl",{className:"grid grid-cols-2 gap-4",children:[s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Typ"}),s.jsx("dd",{children:s.jsx(ge,{variant:C.type==="BUSINESS"?"info":"default",children:C.type==="BUSINESS"?"Geschäftskunde":"Privatkunde"})})]}),C.salutation&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Anrede"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[C.salutation,s.jsx(ce,{value:C.salutation})]})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vorname"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[C.firstName,s.jsx(ce,{value:C.firstName})]})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Nachname"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[C.lastName,s.jsx(ce,{value:C.lastName})]})]}),C.companyName&&s.jsxs("div",{className:"col-span-2",children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Firma"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[C.companyName,s.jsx(ce,{value:C.companyName})]})]}),C.foundingDate&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Gründungsdatum"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[new Date(C.foundingDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"}),s.jsx(ce,{value:new Date(C.foundingDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]})]}),C.birthDate&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Geburtsdatum"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[new Date(C.birthDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"}),s.jsx(ce,{value:new Date(C.birthDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]})]}),C.birthPlace&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Geburtsort"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[C.birthPlace,s.jsx(ce,{value:C.birthPlace})]})]})]})}),s.jsx(X,{title:"Kontakt",children:s.jsxs("dl",{className:"space-y-3",children:[C.email&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"E-Mail"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[s.jsx("a",{href:`mailto:${C.email}`,className:"text-blue-600 hover:underline",children:C.email}),s.jsx(ce,{value:C.email})]})]}),C.phone&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Telefon"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[s.jsx("a",{href:`tel:${C.phone}`,className:"text-blue-600 hover:underline",children:C.phone}),s.jsx(ce,{value:C.phone})]})]}),C.mobile&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Mobil"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[s.jsx("a",{href:`tel:${C.mobile}`,className:"text-blue-600 hover:underline",children:C.mobile}),s.jsx(ce,{value:C.mobile})]})]})]})})]}),C.type==="BUSINESS"&&s.jsx(SS,{customer:C,canEdit:r("customers:update"),onUpdate:()=>n.invalidateQueries({queryKey:["customer",e]})}),s.jsx(kS,{customer:C,canEdit:r("customers:update"),onUpdate:()=>n.invalidateQueries({queryKey:["customer",e]})}),C.notes&&s.jsx(X,{title:"Notizen",className:"mb-6",children:s.jsx("p",{className:"whitespace-pre-wrap",children:C.notes})}),s.jsx(X,{children:s.jsx(NS,{tabs:w,defaultTab:l})}),s.jsx(Ip,{isOpen:o,onClose:()=>c(!1),customerId:i}),s.jsx(Ip,{isOpen:!!E,onClose:()=>S(null),customerId:i,address:E}),s.jsx(Lp,{isOpen:u,onClose:()=>d(!1),customerId:i}),s.jsx(Lp,{isOpen:!!x,onClose:()=>j(null),customerId:i,bankCard:x}),s.jsx(Rp,{isOpen:h,onClose:()=>p(!1),customerId:i}),s.jsx(Rp,{isOpen:!!k,onClose:()=>F(null),customerId:i,document:k}),s.jsx(Op,{isOpen:m,onClose:()=>f(!1),customerId:i}),s.jsx(Op,{isOpen:!!P,onClose:()=>A(null),customerId:i,meter:P}),s.jsx(_p,{isOpen:y,onClose:()=>N(!1),customerId:i,customerEmail:(R=V==null?void 0:V.data)==null?void 0:R.email}),s.jsx(_p,{isOpen:!!_,onClose:()=>L(null),customerId:i,email:_,customerEmail:(Q=V==null?void 0:V.data)==null?void 0:Q.email})]})}function SS({customer:e,canEdit:t,onUpdate:n}){const r=async c=>{try{await et.uploadBusinessRegistration(e.id,c),n()}catch(u){console.error("Upload fehlgeschlagen:",u),alert("Upload fehlgeschlagen")}},a=async()=>{if(confirm("Gewerbeanmeldung wirklich löschen?"))try{await et.deleteBusinessRegistration(e.id),n()}catch(c){console.error("Löschen fehlgeschlagen:",c),alert("Löschen fehlgeschlagen")}},i=async c=>{try{await et.uploadCommercialRegister(e.id,c),n()}catch(u){console.error("Upload fehlgeschlagen:",u),alert("Upload fehlgeschlagen")}},l=async()=>{if(confirm("Handelsregisterauszug wirklich löschen?"))try{await et.deleteCommercialRegister(e.id),n()}catch(c){console.error("Löschen fehlgeschlagen:",c),alert("Löschen fehlgeschlagen")}};return!(e.taxNumber||e.commercialRegisterNumber||e.businessRegistrationPath||e.commercialRegisterPath)&&!t?null:s.jsxs(X,{title:"Geschäftsdaten",className:"mb-6",children:[s.jsxs("dl",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.taxNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Steuernummer"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[e.taxNumber,s.jsx(ce,{value:e.taxNumber})]})]}),e.commercialRegisterNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Handelsregisternummer"}),s.jsxs("dd",{className:"flex items-center gap-1",children:[e.commercialRegisterNumber,s.jsx(ce,{value:e.commercialRegisterNumber})]})]})]}),s.jsxs("div",{className:"mt-4 pt-4 border-t grid grid-cols-1 md:grid-cols-2 gap-6",children:[s.jsxs("div",{children:[s.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-2",children:"Gewerbeanmeldung"}),e.businessRegistrationPath?s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsxs("a",{href:`/api${e.businessRegistrationPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${e.businessRegistrationPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),t&&s.jsxs(s.Fragment,{children:[s.jsx(bt,{onUpload:r,existingFile:e.businessRegistrationPath,accept:".pdf",label:"Ersetzen"}),s.jsxs("button",{onClick:a,className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]})]}):t?s.jsx(bt,{onUpload:r,accept:".pdf",label:"PDF hochladen"}):s.jsx("p",{className:"text-sm text-gray-400",children:"Nicht vorhanden"})]}),s.jsxs("div",{children:[s.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-2",children:"Handelsregisterauszug"}),e.commercialRegisterPath?s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsxs("a",{href:`/api${e.commercialRegisterPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${e.commercialRegisterPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),t&&s.jsxs(s.Fragment,{children:[s.jsx(bt,{onUpload:i,existingFile:e.commercialRegisterPath,accept:".pdf",label:"Ersetzen"}),s.jsxs("button",{onClick:l,className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]})]}):t?s.jsx(bt,{onUpload:i,accept:".pdf",label:"PDF hochladen"}):s.jsx("p",{className:"text-sm text-gray-400",children:"Nicht vorhanden"})]})]})]})}function kS({customer:e,canEdit:t,onUpdate:n}){const r=async i=>{try{await et.uploadPrivacyPolicy(e.id,i),n()}catch(l){console.error("Upload fehlgeschlagen:",l),alert("Upload fehlgeschlagen")}},a=async()=>{if(confirm("Datenschutzerklärung wirklich löschen?"))try{await et.deletePrivacyPolicy(e.id),n()}catch(i){console.error("Löschen fehlgeschlagen:",i),alert("Löschen fehlgeschlagen")}};return!e.privacyPolicyPath&&!t?null:s.jsx(X,{title:"Dokumente",className:"mb-6",children:s.jsxs("div",{children:[s.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-2",children:"Datenschutzerklärung"}),e.privacyPolicyPath?s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsxs("a",{href:`/api${e.privacyPolicyPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${e.privacyPolicyPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),t&&s.jsxs(s.Fragment,{children:[s.jsx(bt,{onUpload:r,existingFile:e.privacyPolicyPath,accept:".pdf",label:"Ersetzen"}),s.jsxs("button",{onClick:a,className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]})]}):t?s.jsx(bt,{onUpload:r,accept:".pdf",label:"PDF hochladen"}):s.jsx("p",{className:"text-sm text-gray-400",children:"Nicht vorhanden"})]})})}function CS({customerId:e,addresses:t,canEdit:n,onAdd:r,onEdit:a}){const i=pe(),l=W({mutationFn:bd.delete,onSuccess:()=>i.invalidateQueries({queryKey:["customer",e.toString()]})});return s.jsxs("div",{children:[n&&s.jsx("div",{className:"mb-4",children:s.jsxs(T,{size:"sm",onClick:r,children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Adresse hinzufügen"]})}),t.length>0?s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:t.map(o=>s.jsxs("div",{className:"border rounded-lg p-4",children:[s.jsxs("div",{className:"flex items-start justify-between",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(J2,{className:"w-4 h-4 text-gray-400"}),s.jsx(ge,{variant:o.type==="BILLING"?"info":"default",children:o.type==="BILLING"?"Rechnung":"Liefer-/Meldeadresse"}),o.isDefault&&s.jsx(ge,{variant:"success",children:"Standard"})]}),n&&s.jsxs("div",{className:"flex gap-1",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>a(o),title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Adresse wirklich löschen?")&&l.mutate(o.id)},title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]}),s.jsxs(K0,{values:[`${o.street} ${o.houseNumber}`,`${o.postalCode} ${o.city}`,o.country],children:[s.jsxs("p",{children:[o.street," ",o.houseNumber]}),s.jsxs("p",{children:[o.postalCode," ",o.city]}),s.jsx("p",{className:"text-gray-500",children:o.country})]})]},o.id))}):s.jsx("p",{className:"text-gray-500",children:"Keine Adressen vorhanden."})]})}function ES({customerId:e,bankCards:t,canEdit:n,showInactive:r,onToggleInactive:a,onAdd:i,onEdit:l}){const o=pe(),c=W({mutationFn:({id:m,data:f})=>Fo.update(m,f),onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),u=W({mutationFn:Fo.delete,onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),d=async(m,f)=>{try{await et.uploadBankCardDocument(m,f),o.invalidateQueries({queryKey:["customer",e.toString()]})}catch(y){console.error("Upload fehlgeschlagen:",y),alert("Upload fehlgeschlagen")}},h=async m=>{if(confirm("Dokument wirklich löschen?"))try{await et.deleteBankCardDocument(m),o.invalidateQueries({queryKey:["customer",e.toString()]})}catch(f){console.error("Löschen fehlgeschlagen:",f),alert("Löschen fehlgeschlagen")}},p=r?t:t.filter(m=>m.isActive);return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[n&&s.jsxs(T,{size:"sm",onClick:i,children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Bankkarte hinzufügen"]}),s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:r,onChange:a,className:"rounded"}),"Inaktive anzeigen"]})]}),p.length>0?s.jsx("div",{className:"space-y-4",children:p.map(m=>s.jsxs("div",{className:`border rounded-lg p-4 ${m.isActive?"":"opacity-50 bg-gray-50"}`,children:[s.jsxs("div",{className:"flex items-start justify-between",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(K2,{className:"w-4 h-4 text-gray-400"}),!m.isActive&&s.jsx(ge,{variant:"danger",children:"Inaktiv"}),m.expiryDate&&new Date(m.expiryDate)l(m),title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),m.isActive?s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Bankkarte deaktivieren?")&&c.mutate({id:m.id,data:{isActive:!1}})},title:"Deaktivieren",children:s.jsx(Et,{className:"w-4 h-4"})}):s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Bankkarte wieder aktivieren?")&&c.mutate({id:m.id,data:{isActive:!0}})},title:"Aktivieren",children:s.jsx(De,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Bankkarte wirklich löschen?")&&u.mutate(m.id)},title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]}),s.jsxs("p",{className:"font-medium flex items-center gap-1",children:[m.accountHolder,s.jsx(ce,{value:m.accountHolder})]}),s.jsxs("p",{className:"font-mono flex items-center gap-1",children:[m.iban,s.jsx(ce,{value:m.iban})]}),m.bic&&s.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:["BIC: ",m.bic,s.jsx(ce,{value:m.bic})]}),m.bankName&&s.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:[m.bankName,s.jsx(ce,{value:m.bankName})]}),m.expiryDate&&s.jsxs("p",{className:"text-sm text-gray-500",children:["Gültig bis: ",new Date(m.expiryDate).toLocaleDateString("de-DE")]}),s.jsx("div",{className:"mt-3 pt-3 border-t",children:m.documentPath?s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsxs("a",{href:`/api${m.documentPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${m.documentPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),n&&s.jsxs(s.Fragment,{children:[s.jsx(bt,{onUpload:f=>d(m.id,f),existingFile:m.documentPath,accept:".pdf",label:"Ersetzen",disabled:!m.isActive}),s.jsxs("button",{onClick:()=>h(m.id),className:"text-red-600 hover:underline text-sm flex items-center gap-1",title:"Dokument löschen",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]})]}):n&&m.isActive&&s.jsx(bt,{onUpload:f=>d(m.id,f),accept:".pdf",label:"PDF hochladen"})})]},m.id))}):s.jsx("p",{className:"text-gray-500",children:"Keine Bankkarten vorhanden."})]})}function DS({customerId:e,documents:t,canEdit:n,showInactive:r,onToggleInactive:a,onAdd:i,onEdit:l}){const o=pe(),c=W({mutationFn:({id:f,data:y})=>Io.update(f,y),onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),u=W({mutationFn:Io.delete,onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),d=async(f,y)=>{try{await et.uploadIdentityDocument(f,y),o.invalidateQueries({queryKey:["customer",e.toString()]})}catch(N){console.error("Upload fehlgeschlagen:",N),alert("Upload fehlgeschlagen")}},h=async f=>{if(confirm("Dokument wirklich löschen?"))try{await et.deleteIdentityDocument(f),o.invalidateQueries({queryKey:["customer",e.toString()]})}catch(y){console.error("Löschen fehlgeschlagen:",y),alert("Löschen fehlgeschlagen")}},p=r?t:t.filter(f=>f.isActive),m={ID_CARD:"Personalausweis",PASSPORT:"Reisepass",DRIVERS_LICENSE:"Führerschein",OTHER:"Sonstiges"};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[n&&s.jsxs(T,{size:"sm",onClick:i,children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Ausweis hinzufügen"]}),s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:r,onChange:a,className:"rounded"}),"Inaktive anzeigen"]})]}),p.length>0?s.jsx("div",{className:"space-y-4",children:p.map(f=>s.jsxs("div",{className:`border rounded-lg p-4 ${f.isActive?"":"opacity-50 bg-gray-50"}`,children:[s.jsxs("div",{className:"flex items-start justify-between",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(at,{className:"w-4 h-4 text-gray-400"}),s.jsx(ge,{children:m[f.type]}),!f.isActive&&s.jsx(ge,{variant:"danger",children:"Inaktiv"}),f.expiryDate&&new Date(f.expiryDate)l(f),title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),f.isActive?s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Ausweis deaktivieren?")&&c.mutate({id:f.id,data:{isActive:!1}})},title:"Deaktivieren",children:s.jsx(Et,{className:"w-4 h-4"})}):s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Ausweis wieder aktivieren?")&&c.mutate({id:f.id,data:{isActive:!0}})},title:"Aktivieren",children:s.jsx(De,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Ausweis wirklich löschen?")&&u.mutate(f.id)},title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]}),s.jsxs("p",{className:"font-mono flex items-center gap-1",children:[f.documentNumber,s.jsx(ce,{value:f.documentNumber})]}),f.issuingAuthority&&s.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:["Ausgestellt von: ",f.issuingAuthority,s.jsx(ce,{value:f.issuingAuthority})]}),f.expiryDate&&s.jsxs("p",{className:"text-sm text-gray-500",children:["Gültig bis: ",new Date(f.expiryDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})]}),f.type==="DRIVERS_LICENSE"&&f.licenseClasses&&s.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:["Klassen: ",f.licenseClasses,s.jsx(ce,{value:f.licenseClasses})]}),f.type==="DRIVERS_LICENSE"&&f.licenseIssueDate&&s.jsxs("p",{className:"text-sm text-gray-500",children:["Klasse B seit: ",new Date(f.licenseIssueDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})]}),s.jsx("div",{className:"mt-3 pt-3 border-t",children:f.documentPath?s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsxs("a",{href:`/api${f.documentPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${f.documentPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),n&&s.jsxs(s.Fragment,{children:[s.jsx(bt,{onUpload:y=>d(f.id,y),existingFile:f.documentPath,accept:".pdf",label:"Ersetzen",disabled:!f.isActive}),s.jsxs("button",{onClick:()=>h(f.id),className:"text-red-600 hover:underline text-sm flex items-center gap-1",title:"Dokument löschen",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]})]}):n&&f.isActive&&s.jsx(bt,{onUpload:y=>d(f.id,y),accept:".pdf",label:"PDF hochladen"})})]},f.id))}):s.jsx("p",{className:"text-gray-500",children:"Keine Ausweise vorhanden."})]})}function PS({customerId:e,meters:t,canEdit:n,showInactive:r,onToggleInactive:a,onAdd:i,onEdit:l}){const[o,c]=b.useState(null),[u,d]=b.useState(null),[h,p]=b.useState(null),m=pe(),f=W({mutationFn:({id:x,data:j})=>Hs.update(x,j),onSuccess:()=>m.invalidateQueries({queryKey:["customer",e.toString()]})}),y=W({mutationFn:Hs.delete,onSuccess:()=>m.invalidateQueries({queryKey:["customer",e.toString()]})}),N=W({mutationFn:({meterId:x,readingId:j})=>Hs.deleteReading(x,j),onSuccess:()=>m.invalidateQueries({queryKey:["customer",e.toString()]})}),v=r?t:t.filter(x=>x.isActive),g=x=>x?[...x].sort((j,k)=>new Date(k.readingDate).getTime()-new Date(j.readingDate).getTime()):[];return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[n&&s.jsxs(T,{size:"sm",onClick:i,children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Zähler hinzufügen"]}),s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:r,onChange:a,className:"rounded"}),"Inaktive anzeigen"]})]}),v.length>0?s.jsx("div",{className:"space-y-4",children:v.map(x=>{const j=g(x.readings),k=u===x.id;return s.jsxs("div",{className:`border rounded-lg p-4 ${x.isActive?"":"opacity-50 bg-gray-50"}`,children:[s.jsxs("div",{className:"flex items-start justify-between",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsx(R0,{className:"w-4 h-4 text-gray-400"}),s.jsx(ge,{variant:x.type==="ELECTRICITY"?"warning":"info",children:x.type==="ELECTRICITY"?"Strom":"Gas"}),!x.isActive&&s.jsx(ge,{variant:"danger",children:"Inaktiv"})]}),n&&s.jsxs("div",{className:"flex gap-1",children:[x.isActive&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>c(x.id),title:"Zählerstand hinzufügen",children:s.jsx(Re,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>l(x),title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),x.isActive?s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Zähler deaktivieren?")&&f.mutate({id:x.id,data:{isActive:!1}})},title:"Deaktivieren",children:s.jsx(Et,{className:"w-4 h-4"})}):s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Zähler wieder aktivieren?")&&f.mutate({id:x.id,data:{isActive:!0}})},title:"Aktivieren",children:s.jsx(De,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Zähler wirklich löschen? Alle Zählerstände werden ebenfalls gelöscht.")&&y.mutate(x.id)},title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]}),s.jsxs("p",{className:"font-mono text-lg flex items-center gap-1",children:[x.meterNumber,s.jsx(ce,{value:x.meterNumber})]}),x.location&&s.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:["Standort: ",x.location,s.jsx(ce,{value:x.location})]}),j.length>0&&s.jsxs("div",{className:"mt-3 pt-3 border-t",children:[s.jsxs("div",{className:"flex items-center justify-between mb-2",children:[s.jsx("p",{className:"text-sm font-medium",children:"Zählerstände:"}),j.length>3&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>d(k?null:x.id),children:k?"Weniger anzeigen":`Alle ${j.length} anzeigen`})]}),s.jsx("div",{className:"space-y-1",children:(k?j:j.slice(0,3)).map(F=>s.jsxs("div",{className:"flex justify-between items-center text-sm group",children:[s.jsxs("span",{className:"text-gray-500 flex items-center gap-1",children:[new Date(F.readingDate).toLocaleDateString("de-DE"),s.jsx(ce,{value:new Date(F.readingDate).toLocaleDateString("de-DE")})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsxs("span",{className:"font-mono flex items-center gap-1",children:[F.value.toLocaleString("de-DE")," ",F.unit,s.jsx(ce,{value:F.value.toString(),title:"Nur Wert kopieren"}),s.jsx(ce,{value:`${F.value.toLocaleString("de-DE")} ${F.unit}`,title:"Mit Einheit kopieren"})]}),n&&s.jsxs("div",{className:"opacity-0 group-hover:opacity-100 flex gap-1",children:[s.jsx("button",{onClick:()=>p({meterId:x.id,reading:F}),className:"text-gray-400 hover:text-blue-600",title:"Bearbeiten",children:s.jsx(Je,{className:"w-3 h-3"})}),s.jsx("button",{onClick:()=>{confirm("Zählerstand wirklich löschen?")&&N.mutate({meterId:x.id,readingId:F.id})},className:"text-gray-400 hover:text-red-600",title:"Löschen",children:s.jsx(ve,{className:"w-3 h-3"})})]})]})]},F.id))})]})]},x.id)})}):s.jsx("p",{className:"text-gray-500",children:"Keine Zähler vorhanden."}),o&&s.jsx(zp,{isOpen:!0,onClose:()=>c(null),meterId:o,customerId:e}),h&&s.jsx(zp,{isOpen:!0,onClose:()=>p(null),meterId:h.meterId,customerId:e,reading:h.reading})]})}function AS({customerId:e,contracts:t}){const{hasPermission:n}=Be(),r=Vt(),a=pe(),i=W({mutationFn:$e.delete,onSuccess:()=>{a.invalidateQueries({queryKey:["customer",e.toString()]}),a.invalidateQueries({queryKey:["customers"]}),a.invalidateQueries({queryKey:["contracts"]})},onError:c=>{alert((c==null?void 0:c.message)||"Fehler beim Löschen des Vertrags")}}),l={ELECTRICITY:"Strom",GAS:"Gas",DSL:"DSL",FIBER:"Glasfaser",MOBILE:"Mobilfunk",TV:"TV",CAR_INSURANCE:"KFZ-Versicherung"},o={ACTIVE:"success",PENDING:"warning",CANCELLED:"danger",EXPIRED:"danger",DRAFT:"default",DEACTIVATED:"default"};return s.jsxs("div",{children:[n("contracts:create")&&s.jsx("div",{className:"mb-4",children:s.jsx(Ne,{to:`/contracts/new?customerId=${e}`,children:s.jsxs(T,{size:"sm",children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Vertrag anlegen"]})})}),t.length>0?s.jsx("div",{className:"space-y-4",children:t.map(c=>s.jsxs("div",{className:"border rounded-lg p-4 hover:bg-gray-50 transition-colors",children:[s.jsxs("div",{className:"flex items-center justify-between mb-2",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsxs("span",{className:"font-mono flex items-center gap-1",children:[c.contractNumber,s.jsx(ce,{value:c.contractNumber})]}),s.jsx(ge,{children:l[c.type]}),s.jsx(ge,{variant:o[c.status],children:c.status})]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>r(`/contracts/${c.id}`,{state:{from:"customer",customerId:e.toString()}}),title:"Ansehen",children:s.jsx(De,{className:"w-4 h-4"})}),n("contracts:update")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>r(`/contracts/${c.id}/edit`),title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),n("contracts:delete")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Vertrag wirklich löschen?")&&i.mutate(c.id)},title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]}),c.providerName&&s.jsxs("p",{className:"flex items-center gap-1",children:[c.providerName,c.tariffName&&` - ${c.tariffName}`,s.jsx(ce,{value:c.providerName+(c.tariffName?` - ${c.tariffName}`:"")})]}),c.startDate&&s.jsxs("p",{className:"text-sm text-gray-500",children:["Beginn: ",new Date(c.startDate).toLocaleDateString("de-DE"),c.endDate&&` | Ende: ${new Date(c.endDate).toLocaleDateString("de-DE")}`]})]},c.id))}):s.jsx("p",{className:"text-gray-500",children:"Keine Verträge vorhanden."})]})}function MS({customerId:e}){const[t,n]=b.useState(!1),[r,a]=b.useState(null),[i,l]=b.useState(!1),o=async()=>{var c;if(t){n(!1);return}l(!0);try{const u=await Nt.getPortalPassword(e);a(((c=u.data)==null?void 0:c.password)||null),n(!0)}catch(u){console.error("Fehler beim Laden des Passworts:",u),alert("Fehler beim Laden des Passworts")}finally{l(!1)}};return s.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[s.jsx("p",{className:"text-xs text-green-600",children:"Passwort ist gesetzt"}),s.jsx("button",{type:"button",onClick:o,className:"text-xs text-blue-600 hover:underline flex items-center gap-1",disabled:i,children:i?"Laden...":t?s.jsxs(s.Fragment,{children:[s.jsx(Et,{className:"w-3 h-3"}),"Verbergen"]}):s.jsxs(s.Fragment,{children:[s.jsx(De,{className:"w-3 h-3"}),"Anzeigen"]})}),t&&r&&s.jsxs("span",{className:"text-xs font-mono bg-gray-100 px-2 py-1 rounded flex items-center gap-1",children:[r,s.jsx(ce,{value:r})]}),t&&!r&&s.jsx("span",{className:"text-xs text-gray-500",children:"(Passwort nicht verfügbar)"})]})}function TS({customerId:e,canEdit:t}){const n=pe(),[r,a]=b.useState(!1),[i,l]=b.useState(""),[o,c]=b.useState(""),[u,d]=b.useState([]),[h,p]=b.useState(!1),{data:m,isLoading:f}=he({queryKey:["customer-portal",e],queryFn:()=>Nt.getPortalSettings(e)}),{data:y,isLoading:N}=he({queryKey:["customer-representatives",e],queryFn:()=>Nt.getRepresentatives(e)}),v=W({mutationFn:S=>Nt.updatePortalSettings(e,S),onSuccess:()=>{n.invalidateQueries({queryKey:["customer-portal",e]})}}),g=W({mutationFn:S=>Nt.setPortalPassword(e,S),onSuccess:()=>{l(""),n.invalidateQueries({queryKey:["customer-portal",e]}),alert("Passwort wurde gesetzt")},onError:S=>{alert(S.message)}}),x=W({mutationFn:S=>Nt.addRepresentative(e,S),onSuccess:()=>{n.invalidateQueries({queryKey:["customer-representatives",e]}),c(""),d([])},onError:S=>{alert(S.message)}}),j=W({mutationFn:S=>Nt.removeRepresentative(e,S),onSuccess:()=>{n.invalidateQueries({queryKey:["customer-representatives",e]})}}),k=async()=>{if(!(o.length<2)){p(!0);try{const S=await Nt.searchForRepresentative(e,o);d(S.data||[])}catch(S){console.error("Suche fehlgeschlagen:",S)}finally{p(!1)}}};if(f||N)return s.jsx("div",{className:"text-center py-4 text-gray-500",children:"Laden..."});const F=m==null?void 0:m.data,E=(y==null?void 0:y.data)||[];return s.jsxs("div",{className:"space-y-6",children:[s.jsxs("div",{className:"border rounded-lg p-4",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[s.jsx(Rm,{className:"w-5 h-5 text-gray-400"}),s.jsx("h3",{className:"font-medium",children:"Portal-Zugang"})]}),s.jsxs("div",{className:"space-y-4",children:[s.jsxs("label",{className:"flex items-center gap-3",children:[s.jsx("input",{type:"checkbox",checked:(F==null?void 0:F.portalEnabled)||!1,onChange:S=>v.mutate({portalEnabled:S.target.checked}),className:"rounded w-5 h-5",disabled:!t}),s.jsx("span",{children:"Portal aktiviert"}),(F==null?void 0:F.portalEnabled)&&s.jsx(ge,{variant:"success",children:"Aktiv"})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Portal E-Mail"}),s.jsx("div",{className:"flex gap-2",children:s.jsx(K,{value:(F==null?void 0:F.portalEmail)||"",onChange:S=>v.mutate({portalEmail:S.target.value||null}),placeholder:"portal@example.com",disabled:!t||!(F!=null&&F.portalEnabled),className:"flex-1"})}),s.jsx("p",{className:"text-xs text-gray-500 mt-1",children:"Diese E-Mail wird für den Login ins Kundenportal verwendet."})]}),(F==null?void 0:F.portalEnabled)&&s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:F!=null&&F.hasPassword?"Neues Passwort setzen":"Passwort setzen"}),s.jsxs("div",{className:"flex gap-2",children:[s.jsxs("div",{className:"relative flex-1",children:[s.jsx(K,{type:r?"text":"password",value:i,onChange:S=>l(S.target.value),placeholder:"Mindestens 6 Zeichen",disabled:!t}),s.jsx("button",{type:"button",onClick:()=>a(!r),className:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400",children:r?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]}),s.jsx(T,{onClick:()=>g.mutate(i),disabled:!t||i.length<6||g.isPending,children:g.isPending?"Speichern...":"Setzen"})]}),(F==null?void 0:F.hasPassword)&&s.jsx(MS,{customerId:e})]}),(F==null?void 0:F.portalLastLogin)&&s.jsxs("p",{className:"text-sm text-gray-500",children:["Letzte Anmeldung: ",new Date(F.portalLastLogin).toLocaleString("de-DE")]})]})]}),s.jsxs("div",{className:"border rounded-lg p-4",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[s.jsx(lS,{className:"w-5 h-5 text-gray-400"}),s.jsx("h3",{className:"font-medium",children:"Vertreter (können Verträge einsehen)"})]}),s.jsx("p",{className:"text-sm text-gray-500 mb-4",children:"Hier können Sie anderen Kunden erlauben, die Verträge dieses Kunden einzusehen. Beispiel: Der Sohn kann die Verträge seiner Mutter einsehen."}),t&&s.jsxs("div",{className:"mb-4",children:[s.jsxs("div",{className:"flex gap-2",children:[s.jsx(K,{value:o,onChange:S=>c(S.target.value),placeholder:"Kunden suchen (Name, Kundennummer)...",onKeyDown:S=>S.key==="Enter"&&k(),className:"flex-1"}),s.jsx(T,{variant:"secondary",onClick:k,disabled:o.length<2||h,children:s.jsx(cl,{className:"w-4 h-4"})})]}),s.jsx("p",{className:"text-xs text-gray-500 mt-1",children:"Nur Kunden mit aktiviertem Portal können als Vertreter hinzugefügt werden."}),u.length>0&&s.jsx("div",{className:"mt-2 border rounded-lg divide-y",children:u.map(S=>s.jsxs("div",{className:"flex items-center justify-between p-3 hover:bg-gray-50",children:[s.jsxs("div",{children:[s.jsx("p",{className:"font-medium",children:S.companyName||`${S.firstName} ${S.lastName}`}),s.jsx("p",{className:"text-sm text-gray-500",children:S.customerNumber})]}),s.jsxs(T,{size:"sm",onClick:()=>x.mutate(S.id),disabled:x.isPending,children:[s.jsx(Re,{className:"w-4 h-4 mr-1"}),"Hinzufügen"]})]},S.id))})]}),E.length>0?s.jsx("div",{className:"space-y-2",children:E.map(S=>{var P,A,_,L;return s.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 rounded-lg",children:[s.jsxs("div",{children:[s.jsx("p",{className:"font-medium",children:((P=S.representative)==null?void 0:P.companyName)||`${(A=S.representative)==null?void 0:A.firstName} ${(_=S.representative)==null?void 0:_.lastName}`}),s.jsx("p",{className:"text-sm text-gray-500",children:(L=S.representative)==null?void 0:L.customerNumber})]}),t&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Vertreter wirklich entfernen?")&&j.mutate(S.representativeId)},children:s.jsx(jn,{className:"w-4 h-4 text-red-500"})})]},S.id)})}):s.jsx("p",{className:"text-gray-500 text-sm",children:"Keine Vertreter konfiguriert."})]})]})}function Ip({isOpen:e,onClose:t,customerId:n,address:r}){const a=pe(),i=!!r,l=()=>({type:(r==null?void 0:r.type)||"DELIVERY_RESIDENCE",street:(r==null?void 0:r.street)||"",houseNumber:(r==null?void 0:r.houseNumber)||"",postalCode:(r==null?void 0:r.postalCode)||"",city:(r==null?void 0:r.city)||"",country:(r==null?void 0:r.country)||"Deutschland",isDefault:(r==null?void 0:r.isDefault)||!1}),[o,c]=b.useState(l),u=W({mutationFn:m=>bd.create(n,m),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",n.toString()]}),t(),c({type:"DELIVERY_RESIDENCE",street:"",houseNumber:"",postalCode:"",city:"",country:"Deutschland",isDefault:!1})}}),d=W({mutationFn:m=>bd.update(r.id,m),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",n.toString()]}),t()}}),h=m=>{m.preventDefault(),i?d.mutate(o):u.mutate(o)},p=u.isPending||d.isPending;return i&&o.street!==r.street&&c(l()),s.jsx(ot,{isOpen:e,onClose:t,title:i?"Adresse bearbeiten":"Adresse hinzufügen",children:s.jsxs("form",{onSubmit:h,className:"space-y-4",children:[s.jsx(Le,{label:"Adresstyp",value:o.type,onChange:m=>c({...o,type:m.target.value}),options:[{value:"DELIVERY_RESIDENCE",label:"Liefer-/Meldeadresse"},{value:"BILLING",label:"Rechnungsadresse"}]}),s.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[s.jsx("div",{className:"col-span-2",children:s.jsx(K,{label:"Straße",value:o.street,onChange:m=>c({...o,street:m.target.value}),required:!0})}),s.jsx(K,{label:"Hausnr.",value:o.houseNumber,onChange:m=>c({...o,houseNumber:m.target.value}),required:!0})]}),s.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[s.jsx(K,{label:"PLZ",value:o.postalCode,onChange:m=>c({...o,postalCode:m.target.value}),required:!0}),s.jsx("div",{className:"col-span-2",children:s.jsx(K,{label:"Ort",value:o.city,onChange:m=>c({...o,city:m.target.value}),required:!0})})]}),s.jsx(K,{label:"Land",value:o.country,onChange:m=>c({...o,country:m.target.value})}),s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:o.isDefault,onChange:m=>c({...o,isDefault:m.target.checked}),className:"rounded"}),"Als Standard setzen"]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:p,children:p?"Speichern...":"Speichern"})]})]})})}function Lp({isOpen:e,onClose:t,customerId:n,bankCard:r}){const a=pe(),i=!!r,l=()=>({accountHolder:(r==null?void 0:r.accountHolder)||"",iban:(r==null?void 0:r.iban)||"",bic:(r==null?void 0:r.bic)||"",bankName:(r==null?void 0:r.bankName)||"",expiryDate:r!=null&&r.expiryDate?new Date(r.expiryDate).toISOString().split("T")[0]:"",isActive:(r==null?void 0:r.isActive)??!0}),[o,c]=b.useState(l);b.useState(()=>{c(l())});const u=W({mutationFn:m=>Fo.create(n,m),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",n.toString()]}),t(),c({accountHolder:"",iban:"",bic:"",bankName:"",expiryDate:"",isActive:!0})}}),d=W({mutationFn:m=>Fo.update(r.id,m),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",n.toString()]}),t()}}),h=m=>{m.preventDefault();const f={...o,expiryDate:o.expiryDate?new Date(o.expiryDate):void 0};i?d.mutate(f):u.mutate(f)},p=u.isPending||d.isPending;return i&&o.iban!==r.iban&&c(l()),s.jsx(ot,{isOpen:e,onClose:t,title:i?"Bankkarte bearbeiten":"Bankkarte hinzufügen",children:s.jsxs("form",{onSubmit:h,className:"space-y-4",children:[s.jsx(K,{label:"Kontoinhaber",value:o.accountHolder,onChange:m=>c({...o,accountHolder:m.target.value}),required:!0}),s.jsx(K,{label:"IBAN",value:o.iban,onChange:m=>c({...o,iban:m.target.value}),required:!0}),s.jsx(K,{label:"BIC",value:o.bic,onChange:m=>c({...o,bic:m.target.value})}),s.jsx(K,{label:"Bank",value:o.bankName,onChange:m=>c({...o,bankName:m.target.value})}),s.jsx(K,{label:"Ablaufdatum",type:"date",value:o.expiryDate,onChange:m=>c({...o,expiryDate:m.target.value}),onClear:()=>c({...o,expiryDate:""})}),i&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:o.isActive,onChange:m=>c({...o,isActive:m.target.checked}),className:"rounded"}),"Aktiv"]}),!i&&s.jsx("p",{className:"text-sm text-gray-500 bg-gray-50 p-3 rounded",children:"Dokument-Upload ist nach dem Speichern in der Übersicht möglich."}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:p,children:p?"Speichern...":"Speichern"})]})]})})}function Rp({isOpen:e,onClose:t,customerId:n,document:r}){const a=pe(),i=!!r,l=()=>({type:(r==null?void 0:r.type)||"ID_CARD",documentNumber:(r==null?void 0:r.documentNumber)||"",issuingAuthority:(r==null?void 0:r.issuingAuthority)||"",issueDate:r!=null&&r.issueDate?new Date(r.issueDate).toISOString().split("T")[0]:"",expiryDate:r!=null&&r.expiryDate?new Date(r.expiryDate).toISOString().split("T")[0]:"",isActive:(r==null?void 0:r.isActive)??!0,licenseClasses:(r==null?void 0:r.licenseClasses)||"",licenseIssueDate:r!=null&&r.licenseIssueDate?new Date(r.licenseIssueDate).toISOString().split("T")[0]:""}),[o,c]=b.useState(l),u=W({mutationFn:m=>Io.create(n,m),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",n.toString()]}),t(),c({type:"ID_CARD",documentNumber:"",issuingAuthority:"",issueDate:"",expiryDate:"",isActive:!0,licenseClasses:"",licenseIssueDate:""})}}),d=W({mutationFn:m=>Io.update(r.id,m),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",n.toString()]}),t()}}),h=m=>{m.preventDefault();const f={...o,issueDate:o.issueDate?new Date(o.issueDate):void 0,expiryDate:o.expiryDate?new Date(o.expiryDate):void 0};o.type==="DRIVERS_LICENSE"?(f.licenseClasses=o.licenseClasses||void 0,f.licenseIssueDate=o.licenseIssueDate?new Date(o.licenseIssueDate):void 0):(delete f.licenseClasses,delete f.licenseIssueDate),i?d.mutate(f):u.mutate(f)},p=u.isPending||d.isPending;return i&&o.documentNumber!==r.documentNumber&&c(l()),s.jsx(ot,{isOpen:e,onClose:t,title:i?"Ausweis bearbeiten":"Ausweis hinzufügen",children:s.jsxs("form",{onSubmit:h,className:"space-y-4",children:[s.jsx(Le,{label:"Ausweistyp",value:o.type,onChange:m=>c({...o,type:m.target.value}),options:[{value:"ID_CARD",label:"Personalausweis"},{value:"PASSPORT",label:"Reisepass"},{value:"DRIVERS_LICENSE",label:"Führerschein"},{value:"OTHER",label:"Sonstiges"}]}),s.jsx(K,{label:"Ausweisnummer",value:o.documentNumber,onChange:m=>c({...o,documentNumber:m.target.value}),required:!0}),s.jsx(K,{label:"Ausstellende Behörde",value:o.issuingAuthority,onChange:m=>c({...o,issuingAuthority:m.target.value})}),s.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[s.jsx(K,{label:"Ausstellungsdatum",type:"date",value:o.issueDate,onChange:m=>c({...o,issueDate:m.target.value}),onClear:()=>c({...o,issueDate:""})}),s.jsx(K,{label:"Ablaufdatum",type:"date",value:o.expiryDate,onChange:m=>c({...o,expiryDate:m.target.value}),onClear:()=>c({...o,expiryDate:""})})]}),o.type==="DRIVERS_LICENSE"&&s.jsxs(s.Fragment,{children:[s.jsx(K,{label:"Führerscheinklassen",value:o.licenseClasses,onChange:m=>c({...o,licenseClasses:m.target.value}),placeholder:"z.B. B, BE, AM, L"}),s.jsx(K,{label:"Erwerb Klasse B (Pkw)",type:"date",value:o.licenseIssueDate,onChange:m=>c({...o,licenseIssueDate:m.target.value}),onClear:()=>c({...o,licenseIssueDate:""})})]}),i&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:o.isActive,onChange:m=>c({...o,isActive:m.target.checked}),className:"rounded"}),"Aktiv"]}),!i&&s.jsx("p",{className:"text-sm text-gray-500 bg-gray-50 p-3 rounded",children:"Dokument-Upload ist nach dem Speichern in der Übersicht möglich."}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:p,children:p?"Speichern...":"Speichern"})]})]})})}function Op({isOpen:e,onClose:t,customerId:n,meter:r}){const a=pe(),i=!!r,l=()=>({meterNumber:(r==null?void 0:r.meterNumber)||"",type:(r==null?void 0:r.type)||"ELECTRICITY",location:(r==null?void 0:r.location)||"",isActive:(r==null?void 0:r.isActive)??!0}),[o,c]=b.useState(l),u=W({mutationFn:m=>Hs.create(n,m),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",n.toString()]}),t(),c({meterNumber:"",type:"ELECTRICITY",location:"",isActive:!0})}}),d=W({mutationFn:m=>Hs.update(r.id,m),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",n.toString()]}),t()}}),h=m=>{m.preventDefault(),i?d.mutate(o):u.mutate(o)},p=u.isPending||d.isPending;return i&&o.meterNumber!==r.meterNumber&&c(l()),s.jsx(ot,{isOpen:e,onClose:t,title:i?"Zähler bearbeiten":"Zähler hinzufügen",children:s.jsxs("form",{onSubmit:h,className:"space-y-4",children:[s.jsx(K,{label:"Zählernummer",value:o.meterNumber,onChange:m=>c({...o,meterNumber:m.target.value}),required:!0}),s.jsx(Le,{label:"Zählertyp",value:o.type,onChange:m=>c({...o,type:m.target.value}),options:[{value:"ELECTRICITY",label:"Strom"},{value:"GAS",label:"Gas"}]}),s.jsx(K,{label:"Standort",value:o.location,onChange:m=>c({...o,location:m.target.value}),placeholder:"z.B. Keller, Wohnung"}),i&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:o.isActive,onChange:m=>c({...o,isActive:m.target.checked}),className:"rounded"}),"Aktiv"]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:p,children:p?"Speichern...":"Speichern"})]})]})})}function zp({isOpen:e,onClose:t,meterId:n,customerId:r,reading:a}){const i=pe(),l=!!a,o=()=>{var f;return{readingDate:a!=null&&a.readingDate?new Date(a.readingDate).toISOString().split("T")[0]:new Date().toISOString().split("T")[0],value:((f=a==null?void 0:a.value)==null?void 0:f.toString())||"",unit:(a==null?void 0:a.unit)||"kWh",notes:(a==null?void 0:a.notes)||""}},[c,u]=b.useState(o),d=W({mutationFn:f=>Hs.addReading(n,f),onSuccess:()=>{i.invalidateQueries({queryKey:["customer",r.toString()]}),t()}}),h=W({mutationFn:f=>Hs.updateReading(n,a.id,f),onSuccess:()=>{i.invalidateQueries({queryKey:["customer",r.toString()]}),t()}}),p=f=>{f.preventDefault();const y={readingDate:new Date(c.readingDate),value:parseFloat(c.value),unit:c.unit,notes:c.notes||void 0};l?h.mutate(y):d.mutate(y)},m=d.isPending||h.isPending;return l&&c.value!==a.value.toString()&&u(o()),s.jsx(ot,{isOpen:e,onClose:t,title:l?"Zählerstand bearbeiten":"Zählerstand erfassen",children:s.jsxs("form",{onSubmit:p,className:"space-y-4",children:[s.jsx(K,{label:"Ablesedatum",type:"date",value:c.readingDate,onChange:f=>u({...c,readingDate:f.target.value}),required:!0}),s.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[s.jsx("div",{className:"col-span-2",children:s.jsx(K,{label:"Zählerstand",type:"number",step:"0.01",value:c.value,onChange:f=>u({...c,value:f.target.value}),required:!0})}),s.jsx(Le,{label:"Einheit",value:c.unit,onChange:f=>u({...c,unit:f.target.value}),options:[{value:"kWh",label:"kWh"},{value:"m³",label:"m³"}]})]}),s.jsx(K,{label:"Notizen",value:c.notes,onChange:f=>u({...c,notes:f.target.value}),placeholder:"Optionale Notizen..."}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:m,children:m?"Speichern...":"Speichern"})]})]})})}const Xc="@stressfrei-wechseln.de";function FS({customerId:e,emails:t,canEdit:n,showInactive:r,onToggleInactive:a,onAdd:i,onEdit:l}){const o=pe(),c=W({mutationFn:({id:h,data:p})=>Ds.update(h,p),onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),u=W({mutationFn:Ds.delete,onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),d=r?t:t.filter(h=>h.isActive);return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[n&&s.jsxs(T,{size:"sm",onClick:i,children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Adresse hinzufügen"]}),s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:r,onChange:a,className:"rounded"}),"Inaktive anzeigen"]})]}),s.jsxs("p",{className:"text-sm text-gray-500 mb-4 bg-blue-50 border border-blue-200 rounded-lg p-3",children:[s.jsx("strong",{children:"Hinweis:"})," Hier werden E-Mail-Weiterleitungsadressen verwaltet, die für die Registrierung bei Anbietern verwendet werden. E-Mails an diese Adressen werden sowohl an den Kunden als auch an Sie weitergeleitet."]}),d.length>0?s.jsx("div",{className:"space-y-3",children:d.map(h=>s.jsx("div",{className:`border rounded-lg p-4 ${h.isActive?"":"opacity-50 bg-gray-50"}`,children:s.jsxs("div",{className:"flex items-start justify-between",children:[s.jsxs("div",{className:"flex-1",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(mn,{className:"w-4 h-4 text-gray-400"}),s.jsx("span",{className:"font-mono text-sm",children:h.email}),s.jsx(ce,{value:h.email}),!h.isActive&&s.jsx(ge,{variant:"danger",children:"Inaktiv"})]}),h.notes&&s.jsxs("div",{className:"flex items-center gap-2 mt-1 text-sm text-gray-500",children:[s.jsx(at,{className:"w-4 h-4 flex-shrink-0"}),s.jsx("span",{children:h.notes})]})]}),n&&s.jsxs("div",{className:"flex gap-1",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>l(h),title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),h.isActive?s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Adresse deaktivieren?")&&c.mutate({id:h.id,data:{isActive:!1}})},title:"Deaktivieren",children:s.jsx(Et,{className:"w-4 h-4"})}):s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Adresse wieder aktivieren?")&&c.mutate({id:h.id,data:{isActive:!0}})},title:"Aktivieren",children:s.jsx(De,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Adresse wirklich löschen?")&&u.mutate(h.id)},title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]})},h.id))}):s.jsx("p",{className:"text-gray-500",children:"Keine Stressfrei-Wechseln Adressen vorhanden."})]})}function _p({isOpen:e,onClose:t,customerId:n,email:r,customerEmail:a}){const[i,l]=b.useState(""),[o,c]=b.useState(""),[u,d]=b.useState(!1),[h,p]=b.useState(!1),[m,f]=b.useState(null),[y,N]=b.useState("idle"),[v,g]=b.useState(!1),[x,j]=b.useState(!1),[k,F]=b.useState(!1),[E,S]=b.useState(!1),[P,A]=b.useState(null),[_,L]=b.useState(!1),[V,q]=b.useState(!1),O=pe(),C=!!r,{data:w}=he({queryKey:["email-provider-configs"],queryFn:()=>sn.getConfigs(),enabled:e}),R=((w==null?void 0:w.data)||[]).some(G=>G.isActive&&G.isDefault),Q=G=>{if(!G)return"";const ze=G.indexOf("@");return ze>0?G.substring(0,ze):G},ee=async G=>{var ze;if(!(!R||!G)){N("checking");try{const Rt=await sn.checkEmailExists(G);N((ze=Rt.data)!=null&&ze.exists?"exists":"not_exists")}catch{N("error")}}},fe=async()=>{var G,ze;if(!(!a||!i)){g(!0),f(null);try{const Rt=await sn.provisionEmail(i,a);(G=Rt.data)!=null&&G.success?N("exists"):f(((ze=Rt.data)==null?void 0:ze.error)||"Provisionierung fehlgeschlagen")}catch(Rt){f(Rt instanceof Error?Rt.message:"Fehler bei der Provisionierung")}finally{g(!1)}}},ue=async()=>{if(r){j(!0),f(null);try{const G=await Ds.enableMailbox(r.id);G.success?(F(!0),O.invalidateQueries({queryKey:["customer",n.toString()]}),O.invalidateQueries({queryKey:["mailbox-accounts",n]})):f(G.error||"Mailbox-Aktivierung fehlgeschlagen")}catch(G){f(G instanceof Error?G.message:"Fehler bei der Mailbox-Aktivierung")}finally{j(!1)}}},nt=async()=>{if(r)try{const G=await Ds.syncMailboxStatus(r.id);G.success&&G.data&&(F(G.data.hasMailbox),G.data.wasUpdated&&O.invalidateQueries({queryKey:["customer",n.toString()]}))}catch(G){console.error("Fehler beim Synchronisieren des Mailbox-Status:",G)}},H=async()=>{if(r){L(!0);try{const G=await Ds.getMailboxCredentials(r.id);G.success&&G.data&&(A(G.data),S(!0))}catch(G){console.error("Fehler beim Laden der Zugangsdaten:",G)}finally{L(!1)}}},ke=async()=>{if(r&&confirm("Neues Passwort generieren? Das alte Passwort wird ungültig.")){q(!0);try{const G=await Ds.resetPassword(r.id);G.success&&G.data?(P&&A({...P,password:G.data.password}),alert("Passwort wurde erfolgreich zurückgesetzt.")):alert(G.error||"Fehler beim Zurücksetzen des Passworts")}catch(G){console.error("Fehler beim Zurücksetzen des Passworts:",G),alert(G instanceof Error?G.message:"Fehler beim Zurücksetzen des Passworts")}finally{q(!1)}}};b.useEffect(()=>{if(e){if(r){const G=Q(r.email);l(G),c(r.notes||""),N("idle"),F(r.hasMailbox||!1),R&&(ee(G),nt())}else l(""),c(""),d(!1),p(!1),N("idle"),F(!1);f(null),S(!1),A(null)}},[e,r,R]);const Ae=W({mutationFn:async G=>Ds.create(n,{email:G.email,notes:G.notes,provisionAtProvider:G.provision,createMailbox:G.createMailbox}),onSuccess:()=>{O.invalidateQueries({queryKey:["customer",n.toString()]}),O.invalidateQueries({queryKey:["mailbox-accounts",n]}),l(""),c(""),d(!1),p(!1),t()},onError:G=>{f(G instanceof Error?G.message:"Fehler bei der Provisionierung")}}),rt=W({mutationFn:G=>Ds.update(r.id,G),onSuccess:()=>{O.invalidateQueries({queryKey:["customer",n.toString()]}),t()}}),St=G=>{G.preventDefault(),f(null);const ze=i+Xc;C?rt.mutate({email:ze,notes:o||void 0}):Ae.mutate({email:ze,notes:o||void 0,provision:u,createMailbox:u&&h})},At=Ae.isPending||rt.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:C?"Adresse bearbeiten":"Adresse hinzufügen",children:s.jsxs("form",{onSubmit:St,className:"space-y-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"E-Mail-Adresse"}),s.jsxs("div",{className:"flex",children:[s.jsx("input",{type:"text",value:i,onChange:G=>l(G.target.value.toLowerCase().replace(/[^a-z0-9._-]/g,"")),placeholder:"kunde-freenet",required:!0,className:"block w-full px-3 py-2 border border-gray-300 rounded-l-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),s.jsx("span",{className:"inline-flex items-center px-3 py-2 border border-l-0 border-gray-300 bg-gray-100 text-gray-600 rounded-r-lg text-sm",children:Xc})]}),s.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:["Vollständige Adresse: ",s.jsxs("span",{className:"font-mono",children:[i||"...",Xc]})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Notizen (optional)"}),s.jsx("textarea",{value:o,onChange:G=>c(G.target.value),rows:3,className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"z.B. für Freenet-Konten, für Klarmobil..."})]}),R&&a&&s.jsx("div",{className:"bg-blue-50 p-3 rounded-lg",children:C?s.jsxs("div",{className:"space-y-2",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:"text-sm font-medium text-gray-700",children:"E-Mail-Provider Status"}),y==="checking"&&s.jsx("span",{className:"text-xs text-gray-500",children:"Prüfe..."}),y==="exists"&&s.jsxs("span",{className:"text-xs text-green-600 flex items-center gap-1",children:[s.jsx("svg",{className:"w-4 h-4",fill:"currentColor",viewBox:"0 0 20 20",children:s.jsx("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",clipRule:"evenodd"})}),"Beim Provider vorhanden"]}),y==="not_exists"&&s.jsx("span",{className:"text-xs text-orange-600",children:"Nicht beim Provider angelegt"}),y==="error"&&s.jsx("span",{className:"text-xs text-red-600",children:"Status konnte nicht geprüft werden"})]}),y==="not_exists"&&s.jsxs("div",{className:"pt-2 border-t border-blue-100",children:[s.jsxs("p",{className:"text-xs text-gray-500 mb-2",children:["Die E-Mail-Weiterleitung ist noch nicht auf dem Server eingerichtet. Weiterleitungsziel: ",a]}),s.jsx(T,{type:"button",size:"sm",onClick:fe,disabled:v,children:v?"Wird angelegt...":"Jetzt beim Provider anlegen"})]}),y==="error"&&s.jsx(T,{type:"button",size:"sm",variant:"secondary",onClick:()=>ee(i),children:"Erneut prüfen"}),y==="exists"&&s.jsxs("div",{className:"pt-3 mt-3 border-t border-blue-100",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:"text-sm font-medium text-gray-700",children:"Mailbox (IMAP/SMTP)"}),k?s.jsxs("span",{className:"text-xs text-green-600 flex items-center gap-1",children:[s.jsx("svg",{className:"w-4 h-4",fill:"currentColor",viewBox:"0 0 20 20",children:s.jsx("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",clipRule:"evenodd"})}),"Mailbox aktiv"]}):s.jsx("span",{className:"text-xs text-orange-600",children:"Keine Mailbox"})]}),!k&&s.jsxs("div",{className:"mt-2",children:[s.jsx("p",{className:"text-xs text-gray-500 mb-2",children:"Aktiviere eine echte Mailbox um E-Mails direkt im CRM zu empfangen und zu versenden."}),s.jsx(T,{type:"button",size:"sm",onClick:ue,disabled:x,children:x?"Wird aktiviert...":"Mailbox aktivieren"})]}),k&&s.jsx("div",{className:"mt-3",children:E?P&&s.jsxs("div",{className:"bg-white border border-gray-200 rounded-lg p-3 space-y-2",children:[s.jsxs("div",{className:"flex justify-between items-center mb-2",children:[s.jsx("span",{className:"text-xs font-medium text-gray-500 uppercase",children:"Zugangsdaten"}),s.jsx("button",{type:"button",onClick:()=>S(!1),className:"text-gray-400 hover:text-gray-600",children:s.jsx(Et,{className:"w-4 h-4"})})]}),s.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs",children:[s.jsxs("div",{children:[s.jsx("span",{className:"text-gray-500",children:"E-Mail:"}),s.jsx("p",{className:"font-mono text-gray-900 break-all",children:P.email})]}),s.jsxs("div",{children:[s.jsx("span",{className:"text-gray-500",children:"Passwort:"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("p",{className:"font-mono text-gray-900 break-all select-all flex-1",children:P.password}),s.jsx("button",{type:"button",onClick:ke,disabled:V,className:"text-blue-600 hover:text-blue-800 text-xs whitespace-nowrap disabled:opacity-50",title:"Neues Kennwort generieren",children:V?"Generiere...":"Neu generieren"})]})]})]}),P.imap&&s.jsxs("div",{className:"pt-2 border-t border-gray-100",children:[s.jsx("span",{className:"text-xs font-medium text-gray-500",children:"IMAP (Empfang)"}),s.jsxs("p",{className:"font-mono text-xs text-gray-900",children:[P.imap.server,":",P.imap.port," (",P.imap.encryption,")"]})]}),P.smtp&&s.jsxs("div",{className:"pt-2 border-t border-gray-100",children:[s.jsx("span",{className:"text-xs font-medium text-gray-500",children:"SMTP (Versand)"}),s.jsxs("p",{className:"font-mono text-xs text-gray-900",children:[P.smtp.server,":",P.smtp.port," (",P.smtp.encryption,")"]})]})]}):s.jsx(T,{type:"button",size:"sm",variant:"secondary",onClick:H,disabled:_,children:_?"Laden...":s.jsxs(s.Fragment,{children:[s.jsx(De,{className:"w-4 h-4 mr-1"}),"Zugangsdaten anzeigen"]})})})]})]}):s.jsxs("div",{className:"space-y-3",children:[s.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:u,onChange:G=>{d(G.target.checked),G.target.checked||p(!1)},className:"mt-1 rounded border-gray-300"}),s.jsxs("div",{children:[s.jsx("span",{className:"text-sm font-medium text-gray-700",children:"Beim E-Mail-Provider anlegen"}),s.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:["Die E-Mail-Weiterleitung wird automatisch auf dem konfigurierten Server erstellt. Weiterleitungsziel: ",a]})]})]}),u&&s.jsxs("label",{className:"flex items-start gap-2 cursor-pointer ml-6",children:[s.jsx("input",{type:"checkbox",checked:h,onChange:G=>p(G.target.checked),className:"mt-1 rounded border-gray-300"}),s.jsxs("div",{children:[s.jsx("span",{className:"text-sm font-medium text-gray-700",children:"Echte Mailbox erstellen (IMAP/SMTP-Zugang)"}),s.jsx("p",{className:"text-xs text-gray-500 mt-1",children:"Ermöglicht E-Mails direkt im CRM zu empfangen und zu versenden."})]})]})]})}),m&&s.jsx("div",{className:"bg-red-50 p-3 rounded-lg text-red-700 text-sm",children:m}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:At||!i,children:At?"Speichern...":"Speichern"})]})]})})}var dl=e=>e.type==="checkbox",xr=e=>e instanceof Date,Gt=e=>e==null;const q0=e=>typeof e=="object";var dt=e=>!Gt(e)&&!Array.isArray(e)&&q0(e)&&!xr(e),IS=e=>dt(e)&&e.target?dl(e.target)?e.target.checked:e.target.value:e,LS=e=>e.substring(0,e.search(/\.\d+(\.|$)/))||e,RS=(e,t)=>e.has(LS(t)),OS=e=>{const t=e.constructor&&e.constructor.prototype;return dt(t)&&t.hasOwnProperty("isPrototypeOf")},Um=typeof window<"u"&&typeof window.HTMLElement<"u"&&typeof document<"u";function mt(e){if(e instanceof Date)return new Date(e);const t=typeof FileList<"u"&&e instanceof FileList;if(Um&&(e instanceof Blob||t))return e;const n=Array.isArray(e);if(!n&&!(dt(e)&&OS(e)))return e;const r=n?[]:Object.create(Object.getPrototypeOf(e));for(const a in e)Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=mt(e[a]));return r}var xc=e=>/^\w*$/.test(e),Qe=e=>e===void 0,Bm=e=>Array.isArray(e)?e.filter(Boolean):[],Km=e=>Bm(e.replace(/["|']|\]/g,"").split(/\.|\[/)),oe=(e,t,n)=>{if(!t||!dt(e))return n;const r=(xc(t)?[t]:Km(t)).reduce((a,i)=>Gt(a)?a:a[i],e);return Qe(r)||r===e?Qe(e[t])?n:e[t]:r},_s=e=>typeof e=="boolean",Ps=e=>typeof e=="function",Ke=(e,t,n)=>{let r=-1;const a=xc(t)?[t]:Km(t),i=a.length,l=i-1;for(;++r{const a={defaultValues:t._defaultValues};for(const i in e)Object.defineProperty(a,i,{get:()=>{const l=i;return t._proxyFormState[l]!==As.all&&(t._proxyFormState[l]=!r||As.all),e[l]}});return a};const $S=typeof window<"u"?Ct.useLayoutEffect:Ct.useEffect;var as=e=>typeof e=="string",US=(e,t,n,r,a)=>as(e)?(r&&t.watch.add(e),oe(n,e,a)):Array.isArray(e)?e.map(i=>(r&&t.watch.add(i),oe(n,i))):(r&&(t.watchAll=!0),n),Sd=e=>Gt(e)||!q0(e);function Tn(e,t,n=new WeakSet){if(Sd(e)||Sd(t))return Object.is(e,t);if(xr(e)&&xr(t))return Object.is(e.getTime(),t.getTime());const r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;if(n.has(e)||n.has(t))return!0;n.add(e),n.add(t);for(const i of r){const l=e[i];if(!a.includes(i))return!1;if(i!=="ref"){const o=t[i];if(xr(l)&&xr(o)||dt(l)&&dt(o)||Array.isArray(l)&&Array.isArray(o)?!Tn(l,o,n):!Object.is(l,o))return!1}}return!0}const BS=Ct.createContext(null);BS.displayName="HookFormContext";var KS=(e,t,n,r,a)=>t?{...n[e],types:{...n[e]&&n[e].types?n[e].types:{},[r]:a||!0}}:{},ji=e=>Array.isArray(e)?e:[e],Up=()=>{let e=[];return{get observers(){return e},next:a=>{for(const i of e)i.next&&i.next(a)},subscribe:a=>(e.push(a),{unsubscribe:()=>{e=e.filter(i=>i!==a)}}),unsubscribe:()=>{e=[]}}};function V0(e,t){const n={};for(const r in e)if(e.hasOwnProperty(r)){const a=e[r],i=t[r];if(a&&dt(a)&&i){const l=V0(a,i);dt(l)&&(n[r]=l)}else e[r]&&(n[r]=i)}return n}var _t=e=>dt(e)&&!Object.keys(e).length,qm=e=>e.type==="file",Ro=e=>{if(!Um)return!1;const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},Q0=e=>e.type==="select-multiple",Vm=e=>e.type==="radio",qS=e=>Vm(e)||dl(e),Yc=e=>Ro(e)&&e.isConnected;function VS(e,t){const n=t.slice(0,-1).length;let r=0;for(;r{for(const t in e)if(Ps(e[t]))return!0;return!1};function H0(e){return Array.isArray(e)||dt(e)&&!HS(e)}function kd(e,t={}){for(const n in e){const r=e[n];H0(r)?(t[n]=Array.isArray(r)?[]:{},kd(r,t[n])):Qe(r)||(t[n]=!0)}return t}function Hr(e,t,n){n||(n=kd(t));for(const r in e){const a=e[r];if(H0(a))Qe(t)||Sd(n[r])?n[r]=kd(a,Array.isArray(a)?[]:{}):Hr(a,Gt(t)?{}:t[r],n[r]);else{const i=t[r];n[r]=!Tn(a,i)}}return n}const Bp={value:!1,isValid:!1},Kp={value:!0,isValid:!0};var W0=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(n=>n&&n.checked&&!n.disabled).map(n=>n.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!Qe(e[0].attributes.value)?Qe(e[0].value)||e[0].value===""?Kp:{value:e[0].value,isValid:!0}:Kp:Bp}return Bp},G0=(e,{valueAsNumber:t,valueAsDate:n,setValueAs:r})=>Qe(e)?e:t?e===""?NaN:e&&+e:n&&as(e)?new Date(e):r?r(e):e;const qp={isValid:!1,value:null};var Z0=e=>Array.isArray(e)?e.reduce((t,n)=>n&&n.checked&&!n.disabled?{isValid:!0,value:n.value}:t,qp):qp;function Vp(e){const t=e.ref;return qm(t)?t.files:Vm(t)?Z0(e.refs).value:Q0(t)?[...t.selectedOptions].map(({value:n})=>n):dl(t)?W0(e.refs).value:G0(Qe(t.value)?e.ref.value:t.value,e)}var WS=(e,t,n,r)=>{const a={};for(const i of e){const l=oe(t,i);l&&Ke(a,i,l._f)}return{criteriaMode:n,names:[...e],fields:a,shouldUseNativeValidation:r}},Oo=e=>e instanceof RegExp,ni=e=>Qe(e)?e:Oo(e)?e.source:dt(e)?Oo(e.value)?e.value.source:e.value:e,Qp=e=>({isOnSubmit:!e||e===As.onSubmit,isOnBlur:e===As.onBlur,isOnChange:e===As.onChange,isOnAll:e===As.all,isOnTouch:e===As.onTouched});const Hp="AsyncFunction";var GS=e=>!!e&&!!e.validate&&!!(Ps(e.validate)&&e.validate.constructor.name===Hp||dt(e.validate)&&Object.values(e.validate).find(t=>t.constructor.name===Hp)),ZS=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate),Wp=(e,t,n)=>!n&&(t.watchAll||t.watch.has(e)||[...t.watch].some(r=>e.startsWith(r)&&/^\.\w+/.test(e.slice(r.length))));const bi=(e,t,n,r)=>{for(const a of n||Object.keys(e)){const i=oe(e,a);if(i){const{_f:l,...o}=i;if(l){if(l.refs&&l.refs[0]&&t(l.refs[0],a)&&!r)return!0;if(l.ref&&t(l.ref,l.name)&&!r)return!0;if(bi(o,t))break}else if(dt(o)&&bi(o,t))break}}};function Gp(e,t,n){const r=oe(e,n);if(r||xc(n))return{error:r,name:n};const a=n.split(".");for(;a.length;){const i=a.join("."),l=oe(t,i),o=oe(e,i);if(l&&!Array.isArray(l)&&n!==i)return{name:n};if(o&&o.type)return{name:i,error:o};if(o&&o.root&&o.root.type)return{name:`${i}.root`,error:o.root};a.pop()}return{name:n}}var JS=(e,t,n,r)=>{n(e);const{name:a,...i}=e;return _t(i)||Object.keys(i).length>=Object.keys(t).length||Object.keys(i).find(l=>t[l]===(!r||As.all))},XS=(e,t,n)=>!e||!t||e===t||ji(e).some(r=>r&&(n?r===t:r.startsWith(t)||t.startsWith(r))),YS=(e,t,n,r,a)=>a.isOnAll?!1:!n&&a.isOnTouch?!(t||e):(n?r.isOnBlur:a.isOnBlur)?!e:(n?r.isOnChange:a.isOnChange)?e:!0,ek=(e,t)=>!Bm(oe(e,t)).length&&ct(e,t),tk=(e,t,n)=>{const r=ji(oe(e,n));return Ke(r,"root",t[n]),Ke(e,n,r),e};function Zp(e,t,n="validate"){if(as(e)||Array.isArray(e)&&e.every(as)||_s(e)&&!e)return{type:n,message:as(e)?e:"",ref:t}}var Vr=e=>dt(e)&&!Oo(e)?e:{value:e,message:""},Jp=async(e,t,n,r,a,i)=>{const{ref:l,refs:o,required:c,maxLength:u,minLength:d,min:h,max:p,pattern:m,validate:f,name:y,valueAsNumber:N,mount:v}=e._f,g=oe(n,y);if(!v||t.has(y))return{};const x=o?o[0]:l,j=L=>{a&&x.reportValidity&&(x.setCustomValidity(_s(L)?"":L||""),x.reportValidity())},k={},F=Vm(l),E=dl(l),S=F||E,P=(N||qm(l))&&Qe(l.value)&&Qe(g)||Ro(l)&&l.value===""||g===""||Array.isArray(g)&&!g.length,A=KS.bind(null,y,r,k),_=(L,V,q,O=Xs.maxLength,C=Xs.minLength)=>{const w=L?V:q;k[y]={type:L?O:C,message:w,ref:l,...A(L?O:C,w)}};if(i?!Array.isArray(g)||!g.length:c&&(!S&&(P||Gt(g))||_s(g)&&!g||E&&!W0(o).isValid||F&&!Z0(o).isValid)){const{value:L,message:V}=as(c)?{value:!!c,message:c}:Vr(c);if(L&&(k[y]={type:Xs.required,message:V,ref:x,...A(Xs.required,V)},!r))return j(V),k}if(!P&&(!Gt(h)||!Gt(p))){let L,V;const q=Vr(p),O=Vr(h);if(!Gt(g)&&!isNaN(g)){const C=l.valueAsNumber||g&&+g;Gt(q.value)||(L=C>q.value),Gt(O.value)||(V=Cnew Date(new Date().toDateString()+" "+ee),R=l.type=="time",Q=l.type=="week";as(q.value)&&g&&(L=R?w(g)>w(q.value):Q?g>q.value:C>new Date(q.value)),as(O.value)&&g&&(V=R?w(g)+L.value,O=!Gt(V.value)&&g.length<+V.value;if((q||O)&&(_(q,L.message,V.message),!r))return j(k[y].message),k}if(m&&!P&&as(g)){const{value:L,message:V}=Vr(m);if(Oo(L)&&!g.match(L)&&(k[y]={type:Xs.pattern,message:V,ref:l,...A(Xs.pattern,V)},!r))return j(V),k}if(f){if(Ps(f)){const L=await f(g,n),V=Zp(L,x);if(V&&(k[y]={...V,...A(Xs.validate,V.message)},!r))return j(V.message),k}else if(dt(f)){let L={};for(const V in f){if(!_t(L)&&!r)break;const q=Zp(await f[V](g,n),x,V);q&&(L={...q,...A(V,q.message)},j(q.message),r&&(k[y]=L))}if(!_t(L)&&(k[y]={ref:x,...L},!r))return k}}return j(!0),k};const sk={mode:As.onSubmit,reValidateMode:As.onChange,shouldFocusError:!0};function nk(e={}){let t={...sk,...e},n={submitCount:0,isDirty:!1,isReady:!1,isLoading:Ps(t.defaultValues),isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},validatingFields:{},errors:t.errors||{},disabled:t.disabled||!1},r={},a=dt(t.defaultValues)||dt(t.values)?mt(t.defaultValues||t.values)||{}:{},i=t.shouldUnregister?{}:mt(a),l={action:!1,mount:!1,watch:!1,keepIsValid:!1},o={mount:new Set,disabled:new Set,unMount:new Set,array:new Set,watch:new Set},c,u=0;const d={isDirty:!1,dirtyFields:!1,validatingFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},h={...d};let p={...h};const m={array:Up(),state:Up()},f=t.criteriaMode===As.all,y=M=>$=>{clearTimeout(u),u=setTimeout(M,$)},N=async M=>{if(!l.keepIsValid&&!t.disabled&&(h.isValid||p.isValid||M)){let $;t.resolver?($=_t((await S()).errors),v()):$=await A(r,!0),$!==n.isValid&&m.state.next({isValid:$})}},v=(M,$)=>{!t.disabled&&(h.isValidating||h.validatingFields||p.isValidating||p.validatingFields)&&((M||Array.from(o.mount)).forEach(B=>{B&&($?Ke(n.validatingFields,B,$):ct(n.validatingFields,B))}),m.state.next({validatingFields:n.validatingFields,isValidating:!_t(n.validatingFields)}))},g=(M,$=[],B,ae,Y=!0,J=!0)=>{if(ae&&B&&!t.disabled){if(l.action=!0,J&&Array.isArray(oe(r,M))){const de=B(oe(r,M),ae.argA,ae.argB);Y&&Ke(r,M,de)}if(J&&Array.isArray(oe(n.errors,M))){const de=B(oe(n.errors,M),ae.argA,ae.argB);Y&&Ke(n.errors,M,de),ek(n.errors,M)}if((h.touchedFields||p.touchedFields)&&J&&Array.isArray(oe(n.touchedFields,M))){const de=B(oe(n.touchedFields,M),ae.argA,ae.argB);Y&&Ke(n.touchedFields,M,de)}(h.dirtyFields||p.dirtyFields)&&(n.dirtyFields=Hr(a,i)),m.state.next({name:M,isDirty:L(M,$),dirtyFields:n.dirtyFields,errors:n.errors,isValid:n.isValid})}else Ke(i,M,$)},x=(M,$)=>{Ke(n.errors,M,$),m.state.next({errors:n.errors})},j=M=>{n.errors=M,m.state.next({errors:n.errors,isValid:!1})},k=(M,$,B,ae)=>{const Y=oe(r,M);if(Y){const J=oe(i,M,Qe(B)?oe(a,M):B);Qe(J)||ae&&ae.defaultChecked||$?Ke(i,M,$?J:Vp(Y._f)):O(M,J),l.mount&&!l.action&&N()}},F=(M,$,B,ae,Y)=>{let J=!1,de=!1;const Ce={name:M};if(!t.disabled){if(!B||ae){(h.isDirty||p.isDirty)&&(de=n.isDirty,n.isDirty=Ce.isDirty=L(),J=de!==Ce.isDirty);const Me=Tn(oe(a,M),$);de=!!oe(n.dirtyFields,M),Me?ct(n.dirtyFields,M):Ke(n.dirtyFields,M,!0),Ce.dirtyFields=n.dirtyFields,J=J||(h.dirtyFields||p.dirtyFields)&&de!==!Me}if(B){const Me=oe(n.touchedFields,M);Me||(Ke(n.touchedFields,M,B),Ce.touchedFields=n.touchedFields,J=J||(h.touchedFields||p.touchedFields)&&Me!==B)}J&&Y&&m.state.next(Ce)}return J?Ce:{}},E=(M,$,B,ae)=>{const Y=oe(n.errors,M),J=(h.isValid||p.isValid)&&_s($)&&n.isValid!==$;if(t.delayError&&B?(c=y(()=>x(M,B)),c(t.delayError)):(clearTimeout(u),c=null,B?Ke(n.errors,M,B):ct(n.errors,M)),(B?!Tn(Y,B):Y)||!_t(ae)||J){const de={...ae,...J&&_s($)?{isValid:$}:{},errors:n.errors,name:M};n={...n,...de},m.state.next(de)}},S=async M=>(v(M,!0),await t.resolver(i,t.context,WS(M||o.mount,r,t.criteriaMode,t.shouldUseNativeValidation))),P=async M=>{const{errors:$}=await S(M);if(v(M),M)for(const B of M){const ae=oe($,B);ae?Ke(n.errors,B,ae):ct(n.errors,B)}else n.errors=$;return $},A=async(M,$,B={valid:!0})=>{for(const ae in M){const Y=M[ae];if(Y){const{_f:J,...de}=Y;if(J){const Ce=o.array.has(J.name),Me=Y._f&&GS(Y._f);Me&&h.validatingFields&&v([J.name],!0);const yt=await Jp(Y,o.disabled,i,f,t.shouldUseNativeValidation&&!$,Ce);if(Me&&h.validatingFields&&v([J.name]),yt[J.name]&&(B.valid=!1,$||e.shouldUseNativeValidation))break;!$&&(oe(yt,J.name)?Ce?tk(n.errors,yt,J.name):Ke(n.errors,J.name,yt[J.name]):ct(n.errors,J.name))}!_t(de)&&await A(de,$,B)}}return B.valid},_=()=>{for(const M of o.unMount){const $=oe(r,M);$&&($._f.refs?$._f.refs.every(B=>!Yc(B)):!Yc($._f.ref))&&St(M)}o.unMount=new Set},L=(M,$)=>!t.disabled&&(M&&$&&Ke(i,M,$),!Tn(fe(),a)),V=(M,$,B)=>US(M,o,{...l.mount?i:Qe($)?a:as(M)?{[M]:$}:$},B,$),q=M=>Bm(oe(l.mount?i:a,M,t.shouldUnregister?oe(a,M,[]):[])),O=(M,$,B={})=>{const ae=oe(r,M);let Y=$;if(ae){const J=ae._f;J&&(!J.disabled&&Ke(i,M,G0($,J)),Y=Ro(J.ref)&&Gt($)?"":$,Q0(J.ref)?[...J.ref.options].forEach(de=>de.selected=Y.includes(de.value)):J.refs?dl(J.ref)?J.refs.forEach(de=>{(!de.defaultChecked||!de.disabled)&&(Array.isArray(Y)?de.checked=!!Y.find(Ce=>Ce===de.value):de.checked=Y===de.value||!!Y)}):J.refs.forEach(de=>de.checked=de.value===Y):qm(J.ref)?J.ref.value="":(J.ref.value=Y,J.ref.type||m.state.next({name:M,values:mt(i)})))}(B.shouldDirty||B.shouldTouch)&&F(M,Y,B.shouldTouch,B.shouldDirty,!0),B.shouldValidate&&ee(M)},C=(M,$,B)=>{for(const ae in $){if(!$.hasOwnProperty(ae))return;const Y=$[ae],J=M+"."+ae,de=oe(r,J);(o.array.has(M)||dt(Y)||de&&!de._f)&&!xr(Y)?C(J,Y,B):O(J,Y,B)}},w=(M,$,B={})=>{const ae=oe(r,M),Y=o.array.has(M),J=mt($);Ke(i,M,J),Y?(m.array.next({name:M,values:mt(i)}),(h.isDirty||h.dirtyFields||p.isDirty||p.dirtyFields)&&B.shouldDirty&&m.state.next({name:M,dirtyFields:Hr(a,i),isDirty:L(M,J)})):ae&&!ae._f&&!Gt(J)?C(M,J,B):O(M,J,B),Wp(M,o)?m.state.next({...n,name:M,values:mt(i)}):m.state.next({name:l.mount?M:void 0,values:mt(i)})},R=async M=>{l.mount=!0;const $=M.target;let B=$.name,ae=!0;const Y=oe(r,B),J=Me=>{ae=Number.isNaN(Me)||xr(Me)&&isNaN(Me.getTime())||Tn(Me,oe(i,B,Me))},de=Qp(t.mode),Ce=Qp(t.reValidateMode);if(Y){let Me,yt;const Zs=$.type?Vp(Y._f):IS(M),bs=M.type===$p.BLUR||M.type===$p.FOCUS_OUT,hl=!ZS(Y._f)&&!t.resolver&&!oe(n.errors,B)&&!Y._f.deps||YS(bs,oe(n.touchedFields,B),n.isSubmitted,Ce,de),Br=Wp(B,o,bs);Ke(i,B,Zs),bs?(!$||!$.readOnly)&&(Y._f.onBlur&&Y._f.onBlur(M),c&&c(0)):Y._f.onChange&&Y._f.onChange(M);const Kr=F(B,Zs,bs),fl=!_t(Kr)||Br;if(!bs&&m.state.next({name:B,type:M.type,values:mt(i)}),hl)return(h.isValid||p.isValid)&&(t.mode==="onBlur"?bs&&N():bs||N()),fl&&m.state.next({name:B,...Br?{}:Kr});if(!bs&&Br&&m.state.next({...n}),t.resolver){const{errors:Va}=await S([B]);if(v([B]),J(Zs),ae){const pl=Gp(n.errors,r,B),Qa=Gp(Va,r,pl.name||B);Me=Qa.error,B=Qa.name,yt=_t(Va)}}else v([B],!0),Me=(await Jp(Y,o.disabled,i,f,t.shouldUseNativeValidation))[B],v([B]),J(Zs),ae&&(Me?yt=!1:(h.isValid||p.isValid)&&(yt=await A(r,!0)));ae&&(Y._f.deps&&(!Array.isArray(Y._f.deps)||Y._f.deps.length>0)&&ee(Y._f.deps),E(B,yt,Me,Kr))}},Q=(M,$)=>{if(oe(n.errors,$)&&M.focus)return M.focus(),1},ee=async(M,$={})=>{let B,ae;const Y=ji(M);if(t.resolver){const J=await P(Qe(M)?M:Y);B=_t(J),ae=M?!Y.some(de=>oe(J,de)):B}else M?(ae=(await Promise.all(Y.map(async J=>{const de=oe(r,J);return await A(de&&de._f?{[J]:de}:de)}))).every(Boolean),!(!ae&&!n.isValid)&&N()):ae=B=await A(r);return m.state.next({...!as(M)||(h.isValid||p.isValid)&&B!==n.isValid?{}:{name:M},...t.resolver||!M?{isValid:B}:{},errors:n.errors}),$.shouldFocus&&!ae&&bi(r,Q,M?Y:o.mount),ae},fe=(M,$)=>{let B={...l.mount?i:a};return $&&(B=V0($.dirtyFields?n.dirtyFields:n.touchedFields,B)),Qe(M)?B:as(M)?oe(B,M):M.map(ae=>oe(B,ae))},ue=(M,$)=>({invalid:!!oe(($||n).errors,M),isDirty:!!oe(($||n).dirtyFields,M),error:oe(($||n).errors,M),isValidating:!!oe(n.validatingFields,M),isTouched:!!oe(($||n).touchedFields,M)}),nt=M=>{M&&ji(M).forEach($=>ct(n.errors,$)),m.state.next({errors:M?n.errors:{}})},H=(M,$,B)=>{const ae=(oe(r,M,{_f:{}})._f||{}).ref,Y=oe(n.errors,M)||{},{ref:J,message:de,type:Ce,...Me}=Y;Ke(n.errors,M,{...Me,...$,ref:ae}),m.state.next({name:M,errors:n.errors,isValid:!1}),B&&B.shouldFocus&&ae&&ae.focus&&ae.focus()},ke=(M,$)=>Ps(M)?m.state.subscribe({next:B=>"values"in B&&M(V(void 0,$),B)}):V(M,$,!0),Ae=M=>m.state.subscribe({next:$=>{XS(M.name,$.name,M.exact)&&JS($,M.formState||h,yc,M.reRenderRoot)&&M.callback({values:{...i},...n,...$,defaultValues:a})}}).unsubscribe,rt=M=>(l.mount=!0,p={...p,...M.formState},Ae({...M,formState:{...d,...M.formState}})),St=(M,$={})=>{for(const B of M?ji(M):o.mount)o.mount.delete(B),o.array.delete(B),$.keepValue||(ct(r,B),ct(i,B)),!$.keepError&&ct(n.errors,B),!$.keepDirty&&ct(n.dirtyFields,B),!$.keepTouched&&ct(n.touchedFields,B),!$.keepIsValidating&&ct(n.validatingFields,B),!t.shouldUnregister&&!$.keepDefaultValue&&ct(a,B);m.state.next({values:mt(i)}),m.state.next({...n,...$.keepDirty?{isDirty:L()}:{}}),!$.keepIsValid&&N()},At=({disabled:M,name:$})=>{if(_s(M)&&l.mount||M||o.disabled.has($)){const Y=o.disabled.has($)!==!!M;M?o.disabled.add($):o.disabled.delete($),Y&&l.mount&&!l.action&&N()}},G=(M,$={})=>{let B=oe(r,M);const ae=_s($.disabled)||_s(t.disabled);return Ke(r,M,{...B||{},_f:{...B&&B._f?B._f:{ref:{name:M}},name:M,mount:!0,...$}}),o.mount.add(M),B?At({disabled:_s($.disabled)?$.disabled:t.disabled,name:M}):k(M,!0,$.value),{...ae?{disabled:$.disabled||t.disabled}:{},...t.progressive?{required:!!$.required,min:ni($.min),max:ni($.max),minLength:ni($.minLength),maxLength:ni($.maxLength),pattern:ni($.pattern)}:{},name:M,onChange:R,onBlur:R,ref:Y=>{if(Y){G(M,$),B=oe(r,M);const J=Qe(Y.value)&&Y.querySelectorAll&&Y.querySelectorAll("input,select,textarea")[0]||Y,de=qS(J),Ce=B._f.refs||[];if(de?Ce.find(Me=>Me===J):J===B._f.ref)return;Ke(r,M,{_f:{...B._f,...de?{refs:[...Ce.filter(Yc),J,...Array.isArray(oe(a,M))?[{}]:[]],ref:{type:J.type,name:M}}:{ref:J}}}),k(M,!1,void 0,J)}else B=oe(r,M,{}),B._f&&(B._f.mount=!1),(t.shouldUnregister||$.shouldUnregister)&&!(RS(o.array,M)&&l.action)&&o.unMount.add(M)}}},ze=()=>t.shouldFocusError&&bi(r,Q,o.mount),Rt=M=>{_s(M)&&(m.state.next({disabled:M}),bi(r,($,B)=>{const ae=oe(r,B);ae&&($.disabled=ae._f.disabled||M,Array.isArray(ae._f.refs)&&ae._f.refs.forEach(Y=>{Y.disabled=ae._f.disabled||M}))},0,!1))},$r=(M,$)=>async B=>{let ae;B&&(B.preventDefault&&B.preventDefault(),B.persist&&B.persist());let Y=mt(i);if(m.state.next({isSubmitting:!0}),t.resolver){const{errors:J,values:de}=await S();v(),n.errors=J,Y=mt(de)}else await A(r);if(o.disabled.size)for(const J of o.disabled)ct(Y,J);if(ct(n.errors,"root"),_t(n.errors)){m.state.next({errors:{}});try{await M(Y,B)}catch(J){ae=J}}else $&&await $({...n.errors},B),ze(),setTimeout(ze);if(m.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:_t(n.errors)&&!ae,submitCount:n.submitCount+1,errors:n.errors}),ae)throw ae},Sn=(M,$={})=>{oe(r,M)&&(Qe($.defaultValue)?w(M,mt(oe(a,M))):(w(M,$.defaultValue),Ke(a,M,mt($.defaultValue))),$.keepTouched||ct(n.touchedFields,M),$.keepDirty||(ct(n.dirtyFields,M),n.isDirty=$.defaultValue?L(M,mt(oe(a,M))):L()),$.keepError||(ct(n.errors,M),h.isValid&&N()),m.state.next({...n}))},Ur=(M,$={})=>{const B=M?mt(M):a,ae=mt(B),Y=_t(M),J=Y?a:ae;if($.keepDefaultValues||(a=B),!$.keepValues){if($.keepDirtyValues){const de=new Set([...o.mount,...Object.keys(Hr(a,i))]);for(const Ce of Array.from(de)){const Me=oe(n.dirtyFields,Ce),yt=oe(i,Ce),Zs=oe(J,Ce);Me&&!Qe(yt)?Ke(J,Ce,yt):!Me&&!Qe(Zs)&&w(Ce,Zs)}}else{if(Um&&Qe(M))for(const de of o.mount){const Ce=oe(r,de);if(Ce&&Ce._f){const Me=Array.isArray(Ce._f.refs)?Ce._f.refs[0]:Ce._f.ref;if(Ro(Me)){const yt=Me.closest("form");if(yt){yt.reset();break}}}}if($.keepFieldsRef)for(const de of o.mount)w(de,oe(J,de));else r={}}i=t.shouldUnregister?$.keepDefaultValues?mt(a):{}:mt(J),m.array.next({values:{...J}}),m.state.next({values:{...J}})}o={mount:$.keepDirtyValues?o.mount:new Set,unMount:new Set,array:new Set,disabled:new Set,watch:new Set,watchAll:!1,focus:""},l.mount=!h.isValid||!!$.keepIsValid||!!$.keepDirtyValues||!t.shouldUnregister&&!_t(J),l.watch=!!t.shouldUnregister,l.keepIsValid=!!$.keepIsValid,l.action=!1,$.keepErrors||(n.errors={}),m.state.next({submitCount:$.keepSubmitCount?n.submitCount:0,isDirty:Y?!1:$.keepDirty?n.isDirty:!!($.keepDefaultValues&&!Tn(M,a)),isSubmitted:$.keepIsSubmitted?n.isSubmitted:!1,dirtyFields:Y?{}:$.keepDirtyValues?$.keepDefaultValues&&i?Hr(a,i):n.dirtyFields:$.keepDefaultValues&&M?Hr(a,M):$.keepDirty?n.dirtyFields:{},touchedFields:$.keepTouched?n.touchedFields:{},errors:$.keepErrors?n.errors:{},isSubmitSuccessful:$.keepIsSubmitSuccessful?n.isSubmitSuccessful:!1,isSubmitting:!1,defaultValues:a})},gt=(M,$)=>Ur(Ps(M)?M(i):M,{...t.resetOptions,...$}),gc=(M,$={})=>{const B=oe(r,M),ae=B&&B._f;if(ae){const Y=ae.refs?ae.refs[0]:ae.ref;Y.focus&&setTimeout(()=>{Y.focus(),$.shouldSelect&&Ps(Y.select)&&Y.select()})}},yc=M=>{n={...n,...M}},ml={control:{register:G,unregister:St,getFieldState:ue,handleSubmit:$r,setError:H,_subscribe:Ae,_runSchema:S,_updateIsValidating:v,_focusError:ze,_getWatch:V,_getDirty:L,_setValid:N,_setFieldArray:g,_setDisabledField:At,_setErrors:j,_getFieldArray:q,_reset:Ur,_resetDefaultValues:()=>Ps(t.defaultValues)&&t.defaultValues().then(M=>{gt(M,t.resetOptions),m.state.next({isLoading:!1})}),_removeUnmounted:_,_disableForm:Rt,_subjects:m,_proxyFormState:h,get _fields(){return r},get _formValues(){return i},get _state(){return l},set _state(M){l=M},get _defaultValues(){return a},get _names(){return o},set _names(M){o=M},get _formState(){return n},get _options(){return t},set _options(M){t={...t,...M}}},subscribe:rt,trigger:ee,register:G,handleSubmit:$r,watch:ke,setValue:w,getValues:fe,reset:gt,resetField:Sn,clearErrors:nt,unregister:St,setError:H,setFocus:gc,getFieldState:ue};return{...ml,formControl:ml}}function J0(e={}){const t=Ct.useRef(void 0),n=Ct.useRef(void 0),[r,a]=Ct.useState({isDirty:!1,isValidating:!1,isLoading:Ps(e.defaultValues),isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},validatingFields:{},errors:e.errors||{},disabled:e.disabled||!1,isReady:!1,defaultValues:Ps(e.defaultValues)?void 0:e.defaultValues});if(!t.current)if(e.formControl)t.current={...e.formControl,formState:r},e.defaultValues&&!Ps(e.defaultValues)&&e.formControl.reset(e.defaultValues,e.resetOptions);else{const{formControl:l,...o}=nk(e);t.current={...o,formState:r}}const i=t.current.control;return i._options=e,$S(()=>{const l=i._subscribe({formState:i._proxyFormState,callback:()=>a({...i._formState}),reRenderRoot:!0});return a(o=>({...o,isReady:!0})),i._formState.isReady=!0,l},[i]),Ct.useEffect(()=>i._disableForm(e.disabled),[i,e.disabled]),Ct.useEffect(()=>{e.mode&&(i._options.mode=e.mode),e.reValidateMode&&(i._options.reValidateMode=e.reValidateMode)},[i,e.mode,e.reValidateMode]),Ct.useEffect(()=>{e.errors&&(i._setErrors(e.errors),i._focusError())},[i,e.errors]),Ct.useEffect(()=>{e.shouldUnregister&&i._subjects.state.next({values:i._getWatch()})},[i,e.shouldUnregister]),Ct.useEffect(()=>{if(i._proxyFormState.isDirty){const l=i._getDirty();l!==r.isDirty&&i._subjects.state.next({isDirty:l})}},[i,r.isDirty]),Ct.useEffect(()=>{var l;e.values&&!Tn(e.values,n.current)?(i._reset(e.values,{keepFieldsRef:!0,...i._options.resetOptions}),!((l=i._options.resetOptions)===null||l===void 0)&&l.keepIsValid||i._setValid(),n.current=e.values,a(o=>({...o}))):i._resetDefaultValues()},[i,e.values]),Ct.useEffect(()=>{i._state.mount||(i._setValid(),i._state.mount=!0),i._state.watch&&(i._state.watch=!1,i._subjects.state.next({...i._formState})),i._removeUnmounted()}),t.current.formState=Ct.useMemo(()=>_S(r,i),[i,r]),t.current}function Xp(){var v,g;const{id:e}=sc(),t=Vt(),n=pe(),r=!!e,{register:a,handleSubmit:i,reset:l,watch:o,setValue:c,formState:{errors:u}}=J0(),d=o("type"),{data:h}=he({queryKey:["customer",e],queryFn:()=>Nt.getById(parseInt(e)),enabled:r});b.useEffect(()=>{if(h!=null&&h.data){const x={...h.data};x.birthDate&&(x.birthDate=x.birthDate.split("T")[0]),x.foundingDate&&(x.foundingDate=x.foundingDate.split("T")[0]),l(x)}},[h,l]);const p=W({mutationFn:Nt.create,onSuccess:()=>{n.invalidateQueries({queryKey:["customers"]}),t("/customers")}}),m=W({mutationFn:x=>Nt.update(parseInt(e),x),onSuccess:()=>{n.invalidateQueries({queryKey:["customers"]}),n.invalidateQueries({queryKey:["customer",e]}),t(`/customers/${e}`)}}),f=x=>{const j={type:x.type,salutation:x.salutation||void 0,firstName:x.firstName,lastName:x.lastName,companyName:x.companyName||void 0,email:x.email||void 0,phone:x.phone||void 0,mobile:x.mobile||void 0,taxNumber:x.taxNumber||void 0,commercialRegisterNumber:x.commercialRegisterNumber||void 0,notes:x.notes||void 0,birthPlace:x.birthPlace||void 0};x.birthDate&&typeof x.birthDate=="string"&&x.birthDate.trim()!==""?j.birthDate=new Date(x.birthDate).toISOString():j.birthDate=null,x.foundingDate&&typeof x.foundingDate=="string"&&x.foundingDate.trim()!==""?j.foundingDate=new Date(x.foundingDate).toISOString():j.foundingDate=null,r?m.mutate(j):p.mutate(j)},y=p.isPending||m.isPending,N=p.error||m.error;return s.jsxs("div",{children:[s.jsx("h1",{className:"text-2xl font-bold mb-6",children:r?"Kunde bearbeiten":"Neuer Kunde"}),N&&s.jsx("div",{className:"mb-4 p-4 bg-red-50 border border-red-200 text-red-700 rounded-lg",children:N instanceof Error?N.message:"Ein Fehler ist aufgetreten"}),s.jsxs("form",{onSubmit:i(f),children:[s.jsx(X,{className:"mb-6",title:"Stammdaten",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(Le,{label:"Kundentyp",...a("type"),options:[{value:"PRIVATE",label:"Privatkunde"},{value:"BUSINESS",label:"Geschäftskunde"}]}),s.jsx(Le,{label:"Anrede",...a("salutation"),options:[{value:"Herr",label:"Herr"},{value:"Frau",label:"Frau"},{value:"Divers",label:"Divers"}]}),s.jsx(K,{label:"Vorname",...a("firstName",{required:"Vorname erforderlich"}),error:(v=u.firstName)==null?void 0:v.message}),s.jsx(K,{label:"Nachname",...a("lastName",{required:"Nachname erforderlich"}),error:(g=u.lastName)==null?void 0:g.message}),d==="BUSINESS"&&s.jsxs(s.Fragment,{children:[s.jsx(K,{label:"Firmenname",...a("companyName"),className:"md:col-span-2"}),s.jsx(K,{label:"Gründungsdatum",type:"date",...a("foundingDate"),value:o("foundingDate")||"",onClear:()=>c("foundingDate","")})]}),d!=="BUSINESS"&&s.jsxs(s.Fragment,{children:[s.jsx(K,{label:"Geburtsdatum",type:"date",...a("birthDate"),value:o("birthDate")||"",onClear:()=>c("birthDate","")}),s.jsx(K,{label:"Geburtsort",...a("birthPlace")})]})]})}),s.jsx(X,{className:"mb-6",title:"Kontaktdaten",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(K,{label:"E-Mail",type:"email",...a("email")}),s.jsx(K,{label:"Telefon",...a("phone")}),s.jsx(K,{label:"Mobil",...a("mobile")})]})}),d==="BUSINESS"&&s.jsxs(X,{className:"mb-6",title:"Geschäftsdaten",children:[s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(K,{label:"Steuernummer",...a("taxNumber")}),s.jsx(K,{label:"Handelsregisternummer",...a("commercialRegisterNumber"),placeholder:"z.B. HRB 12345"})]}),r&&s.jsx("p",{className:"mt-4 text-sm text-gray-500",children:"Dokumente (Gewerbeanmeldung, Handelsregisterauszug) können nach dem Speichern in der Kundendetailansicht hochgeladen werden."})]}),s.jsx(X,{className:"mb-6",title:"Notizen",children:s.jsx("textarea",{...a("notes"),rows:4,className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"Interne Notizen..."})}),s.jsxs("div",{className:"flex justify-end gap-4",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:()=>t(-1),children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:y,children:y?"Speichern...":"Speichern"})]})]})]})}const eu={ELECTRICITY:"Strom",GAS:"Gas",DSL:"DSL",CABLE:"Kabelinternet",FIBER:"Glasfaser",MOBILE:"Mobilfunk",TV:"TV",CAR_INSURANCE:"KFZ-Versicherung"},tu={DRAFT:"Entwurf",PENDING:"Ausstehend",ACTIVE:"Aktiv",CANCELLED:"Gekündigt",EXPIRED:"Abgelaufen",DEACTIVATED:"Deaktiviert"},Yp={ACTIVE:"success",PENDING:"warning",CANCELLED:"danger",EXPIRED:"danger",DRAFT:"default",DEACTIVATED:"default"};function rk(){const[e,t]=rc(),n=Vt(),[r,a]=b.useState(e.get("search")||""),[i,l]=b.useState(e.get("type")||""),[o,c]=b.useState(e.get("status")||""),[u,d]=b.useState(parseInt(e.get("page")||"1",10)),{hasPermission:h,isCustomer:p,isCustomerPortal:m,user:f}=Be(),y=pe();b.useEffect(()=>{const j=new URLSearchParams;r&&j.set("search",r),i&&j.set("type",i),o&&j.set("status",o),u>1&&j.set("page",u.toString()),t(j,{replace:!0})},[r,i,o,u,t]);const N=W({mutationFn:$e.delete,onSuccess:()=>{y.invalidateQueries({queryKey:["contracts"]})}}),{data:v,isLoading:g}=he({queryKey:["contracts",r,i,o,u,p?f==null?void 0:f.customerId:null],queryFn:()=>$e.getAll({search:r||void 0,type:i||void 0,status:o||void 0,page:u,limit:20,customerId:p?f==null?void 0:f.customerId:void 0})}),x=b.useMemo(()=>{if(!m||!(v!=null&&v.data))return null;const j={};for(const k of v.data){const F=k.customerId;if(!j[F]){const E=k.customer?k.customer.companyName||`${k.customer.firstName} ${k.customer.lastName}`:`Kunde ${F}`;j[F]={customerName:E,isOwn:F===(f==null?void 0:f.customerId),contracts:[]}}j[F].contracts.push(k)}return Object.values(j).sort((k,F)=>k.isOwn&&!F.isOwn?-1:!k.isOwn&&F.isOwn?1:k.customerName.localeCompare(F.customerName))},[v==null?void 0:v.data,m,f==null?void 0:f.customerId]);return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsx("h1",{className:"text-2xl font-bold",children:"Verträge"}),h("contracts:create")&&!p&&s.jsx(Ne,{to:"/contracts/new",children:s.jsxs(T,{children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neuer Vertrag"]})})]}),s.jsx(X,{className:"mb-6",children:s.jsxs("div",{className:"flex gap-4 flex-wrap",children:[s.jsx("div",{className:"flex-1 min-w-[200px]",children:s.jsx(K,{placeholder:"Suchen...",value:r,onChange:j=>a(j.target.value)})}),s.jsx(Le,{value:i,onChange:j=>l(j.target.value),options:Object.entries(eu).map(([j,k])=>({value:j,label:k})),className:"w-48"}),s.jsx(Le,{value:o,onChange:j=>c(j.target.value),options:Object.entries(tu).map(([j,k])=>({value:j,label:k})),className:"w-48"}),s.jsx(T,{variant:"secondary",children:s.jsx(cl,{className:"w-4 h-4"})})]})}),g?s.jsx(X,{children:s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."})}):v!=null&&v.data&&v.data.length>0?s.jsx(s.Fragment,{children:m&&x?s.jsx("div",{className:"space-y-6",children:x.map(j=>s.jsxs(X,{children:[s.jsx("div",{className:"flex items-center gap-3 mb-4 pb-3 border-b",children:j.isOwn?s.jsxs(s.Fragment,{children:[s.jsx(_m,{className:"w-5 h-5 text-blue-600"}),s.jsx("h2",{className:"text-lg font-semibold text-gray-900",children:"Meine Verträge"}),s.jsx(ge,{variant:"default",children:j.contracts.length})]}):s.jsxs(s.Fragment,{children:[s.jsx(ha,{className:"w-5 h-5 text-purple-600"}),s.jsxs("h2",{className:"text-lg font-semibold text-gray-900",children:["Verträge von ",j.customerName]}),s.jsx(ge,{variant:"default",children:j.contracts.length})]})}),s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"border-b",children:[s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Vertragsnr."}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Typ"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Anbieter / Tarif"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Beginn"}),s.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),s.jsx("tbody",{children:j.contracts.map(k=>s.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[s.jsx("td",{className:"py-3 px-4 font-mono text-sm",children:k.contractNumber}),s.jsx("td",{className:"py-3 px-4",children:s.jsx(ge,{children:eu[k.type]})}),s.jsxs("td",{className:"py-3 px-4",children:[k.providerName||"-",k.tariffName&&s.jsxs("span",{className:"text-gray-500",children:[" / ",k.tariffName]})]}),s.jsx("td",{className:"py-3 px-4",children:s.jsx(ge,{variant:Yp[k.status],children:tu[k.status]})}),s.jsx("td",{className:"py-3 px-4",children:k.startDate?new Date(k.startDate).toLocaleDateString("de-DE"):"-"}),s.jsx("td",{className:"py-3 px-4 text-right",children:s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>n(`/contracts/${k.id}`,{state:{from:"contracts"}}),children:s.jsx(De,{className:"w-4 h-4"})})})]},k.id))})]})})]},j.isOwn?"own":j.customerName))}):s.jsxs(X,{children:[s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"border-b",children:[s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Vertragsnr."}),!p&&s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Kunde"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Typ"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Anbieter / Tarif"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Beginn"}),s.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),s.jsx("tbody",{children:v.data.map(j=>s.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[s.jsx("td",{className:"py-3 px-4 font-mono text-sm",children:j.contractNumber}),!p&&s.jsx("td",{className:"py-3 px-4",children:j.customer&&s.jsx(Ne,{to:`/customers/${j.customer.id}`,className:"text-blue-600 hover:underline",children:j.customer.companyName||`${j.customer.firstName} ${j.customer.lastName}`})}),s.jsx("td",{className:"py-3 px-4",children:s.jsx(ge,{children:eu[j.type]})}),s.jsxs("td",{className:"py-3 px-4",children:[j.providerName||"-",j.tariffName&&s.jsxs("span",{className:"text-gray-500",children:[" / ",j.tariffName]})]}),s.jsx("td",{className:"py-3 px-4",children:s.jsx(ge,{variant:Yp[j.status],children:tu[j.status]})}),s.jsx("td",{className:"py-3 px-4",children:j.startDate?new Date(j.startDate).toLocaleDateString("de-DE"):"-"}),s.jsx("td",{className:"py-3 px-4 text-right",children:s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>n(`/contracts/${j.id}`,{state:{from:"contracts"}}),children:s.jsx(De,{className:"w-4 h-4"})}),h("contracts:update")&&!p&&s.jsx(Ne,{to:`/contracts/${j.id}/edit`,children:s.jsx(T,{variant:"ghost",size:"sm",children:s.jsx(Je,{className:"w-4 h-4"})})}),h("contracts:delete")&&!p&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Vertrag wirklich löschen?")&&N.mutate(j.id)},children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})})]},j.id))})]})}),v.pagination&&v.pagination.totalPages>1&&s.jsxs("div",{className:"mt-4 flex items-center justify-between",children:[s.jsxs("p",{className:"text-sm text-gray-500",children:["Seite ",v.pagination.page," von ",v.pagination.totalPages," (",v.pagination.total," Einträge)"]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>d(j=>Math.max(1,j-1)),disabled:u===1,children:"Zurück"}),s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>d(j=>j+1),disabled:u>=v.pagination.totalPages,children:"Weiter"})]})]})]})}):s.jsx(X,{children:s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Verträge gefunden."})})]})}const ak={ELECTRICITY:"Strom",GAS:"Gas",DSL:"DSL",CABLE:"Kabelinternet",FIBER:"Glasfaser",MOBILE:"Mobilfunk",TV:"TV",CAR_INSURANCE:"KFZ-Versicherung"},ik={DRAFT:"Entwurf",PENDING:"Ausstehend",ACTIVE:"Aktiv",CANCELLED:"Gekündigt",EXPIRED:"Abgelaufen",DEACTIVATED:"Deaktiviert"},lk={ACTIVE:"success",PENDING:"warning",CANCELLED:"danger",EXPIRED:"danger",DRAFT:"default",DEACTIVATED:"default"};function ok(e){const t=e.match(/^(\d+)([TMWJ])$/);if(!t)return!1;const n=parseInt(t[1]),r=t[2];let a=0;return r==="T"?a=n:r==="W"?a=n*7:r==="M"?a=n*30:r==="J"&&(a=n*365),a<=30}function ck({simCard:e}){const[t,n]=b.useState(!1),[r,a]=b.useState(null),[i,l]=b.useState(!1),o=async()=>{if(t)n(!1),a(null);else{l(!0);try{const c=await $e.getSimCardCredentials(e.id);c.data&&(a(c.data),n(!0))}catch{alert("PIN/PUK konnte nicht geladen werden")}finally{l(!1)}}};return s.jsxs("div",{className:"p-3 bg-gray-50 rounded-lg border",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.isMain&&s.jsx(ge,{variant:"success",children:"Hauptkarte"}),e.isMultisim&&s.jsx(ge,{variant:"warning",children:"Multisim"})]}),s.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-3 text-sm",children:[e.phoneNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"Rufnummer"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[e.phoneNumber,s.jsx(ce,{value:e.phoneNumber})]})]}),e.simCardNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"SIM-Nr."}),s.jsxs("dd",{className:"font-mono text-xs flex items-center gap-1",children:[e.simCardNumber,s.jsx(ce,{value:e.simCardNumber})]})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"PIN"}),s.jsx("dd",{className:"font-mono flex items-center gap-1",children:t&&(r!=null&&r.pin)?s.jsxs(s.Fragment,{children:[r.pin,s.jsx(ce,{value:r.pin})]}):"••••"})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"PUK"}),s.jsx("dd",{className:"font-mono flex items-center gap-1",children:t&&(r!=null&&r.puk)?s.jsxs(s.Fragment,{children:[r.puk,s.jsx(ce,{value:r.puk})]}):"••••••••"})]})]}),s.jsx("div",{className:"mt-2",children:s.jsx(T,{variant:"ghost",size:"sm",onClick:o,disabled:i,children:i?"Laden...":t?s.jsxs(s.Fragment,{children:[s.jsx(Et,{className:"w-4 h-4 mr-1"})," PIN/PUK verbergen"]}):s.jsxs(s.Fragment,{children:[s.jsx(De,{className:"w-4 h-4 mr-1"})," PIN/PUK anzeigen"]})})})]})}function uk({meterId:e,meterType:t,readings:n,contractId:r,canEdit:a}){const[i,l]=b.useState(!1),[o,c]=b.useState(!1),[u,d]=b.useState(null),h=pe(),p=W({mutationFn:y=>Hs.deleteReading(e,y),onSuccess:()=>{h.invalidateQueries({queryKey:["contract",r.toString()]})}}),m=[...n].sort((y,N)=>new Date(N.readingDate).getTime()-new Date(y.readingDate).getTime()),f=t==="ELECTRICITY"?"kWh":"m³";return s.jsxs("div",{className:"mt-4 pt-4 border-t",children:[s.jsxs("div",{className:"flex items-center justify-between mb-3",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(R0,{className:"w-4 h-4 text-gray-500"}),s.jsx("h4",{className:"text-sm font-medium text-gray-700",children:"Zählerstände"}),s.jsx(ge,{variant:"default",children:n.length})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[a&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>c(!0),title:"Zählerstand erfassen",children:s.jsx(Re,{className:"w-4 h-4"})}),n.length>0&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>l(!i),children:i?s.jsx(F0,{className:"w-4 h-4"}):s.jsx(mc,{className:"w-4 h-4"})})]})]}),i&&n.length>0&&s.jsx("div",{className:"space-y-2 bg-gray-50 rounded-lg p-3",children:m.map(y=>s.jsxs("div",{className:"flex justify-between items-center text-sm group py-1 border-b border-gray-200 last:border-0",children:[s.jsxs("span",{className:"text-gray-500 flex items-center gap-1",children:[new Date(y.readingDate).toLocaleDateString("de-DE"),s.jsx(ce,{value:new Date(y.readingDate).toLocaleDateString("de-DE")})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsxs("span",{className:"font-mono flex items-center gap-1",children:[y.value.toLocaleString("de-DE")," ",y.unit,s.jsx(ce,{value:y.value.toString(),title:"Nur Wert kopieren"})]}),a&&s.jsxs("div",{className:"opacity-0 group-hover:opacity-100 flex gap-1",children:[s.jsx("button",{onClick:()=>d(y),className:"text-gray-400 hover:text-blue-600",title:"Bearbeiten",children:s.jsx(Je,{className:"w-3 h-3"})}),s.jsx("button",{onClick:()=>{confirm("Zählerstand wirklich löschen?")&&p.mutate(y.id)},className:"text-gray-400 hover:text-red-600",title:"Löschen",children:s.jsx(ve,{className:"w-3 h-3"})})]})]})]},y.id))}),!i&&n.length>0&&s.jsxs("p",{className:"text-sm text-gray-500",children:["Letzter Stand: ",m[0].value.toLocaleString("de-DE")," ",m[0].unit," (",new Date(m[0].readingDate).toLocaleDateString("de-DE"),")"]}),n.length===0&&s.jsx("p",{className:"text-sm text-gray-500",children:"Keine Zählerstände vorhanden."}),(o||u)&&s.jsx(dk,{isOpen:!0,onClose:()=>{c(!1),d(null)},meterId:e,contractId:r,reading:u,defaultUnit:f})]})}function dk({isOpen:e,onClose:t,meterId:n,contractId:r,reading:a,defaultUnit:i}){var f;const l=pe(),o=!!a,[c,u]=b.useState({readingDate:a!=null&&a.readingDate?new Date(a.readingDate).toISOString().split("T")[0]:new Date().toISOString().split("T")[0],value:((f=a==null?void 0:a.value)==null?void 0:f.toString())||"",unit:(a==null?void 0:a.unit)||i,notes:(a==null?void 0:a.notes)||""}),d=W({mutationFn:y=>Hs.addReading(n,y),onSuccess:()=>{l.invalidateQueries({queryKey:["contract",r.toString()]}),t()}}),h=W({mutationFn:y=>Hs.updateReading(n,a.id,y),onSuccess:()=>{l.invalidateQueries({queryKey:["contract",r.toString()]}),t()}}),p=y=>{y.preventDefault();const N={readingDate:new Date(c.readingDate),value:parseFloat(c.value),unit:c.unit,notes:c.notes||void 0};o?h.mutate(N):d.mutate(N)},m=d.isPending||h.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:o?"Zählerstand bearbeiten":"Zählerstand erfassen",children:s.jsxs("form",{onSubmit:p,className:"space-y-4",children:[s.jsx(K,{label:"Ablesedatum",type:"date",value:c.readingDate,onChange:y=>u({...c,readingDate:y.target.value}),required:!0}),s.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[s.jsx("div",{className:"col-span-2",children:s.jsx(K,{label:"Zählerstand",type:"number",step:"0.01",value:c.value,onChange:y=>u({...c,value:y.target.value}),required:!0})}),s.jsx(Le,{label:"Einheit",value:c.unit,onChange:y=>u({...c,unit:y.target.value}),options:[{value:"kWh",label:"kWh"},{value:"m³",label:"m³"}]})]}),s.jsx(K,{label:"Notizen (optional)",value:c.notes,onChange:y=>u({...c,notes:y.target.value})}),s.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:m||!c.value,children:m?"Speichern...":o?"Speichern":"Erfassen"})]})]})})}function ex({task:e,contractId:t,canEdit:n,isCustomerPortal:r,isCompleted:a,onEdit:i}){const[l,o]=b.useState(""),[c,u]=b.useState(!1),[d,h]=b.useState(null),[p,m]=b.useState(""),f=pe(),y=W({mutationFn:w=>st.complete(w),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),N=W({mutationFn:w=>st.reopen(w),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),v=W({mutationFn:w=>st.delete(w),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),g=W({mutationFn:w=>st.createSubtask(e.id,w),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]}),o(""),u(!1)},onError:w=>{console.error("Fehler beim Erstellen der Unteraufgabe:",w),alert("Fehler beim Erstellen der Unteraufgabe. Bitte versuchen Sie es erneut.")}}),x=W({mutationFn:w=>st.createReply(e.id,w),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]}),o(""),u(!1)},onError:w=>{console.error("Fehler beim Erstellen der Antwort:",w),alert("Fehler beim Erstellen der Antwort. Bitte versuchen Sie es erneut.")}}),j=W({mutationFn:({id:w,title:R})=>st.updateSubtask(w,R),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]}),h(null),m("")}}),k=W({mutationFn:w=>st.completeSubtask(w),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),F=W({mutationFn:w=>st.reopenSubtask(w),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),E=W({mutationFn:w=>st.deleteSubtask(w),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),S=w=>{w.preventDefault(),l.trim()&&(r?x.mutate(l.trim()):g.mutate(l.trim()))},P=w=>{w.preventDefault(),p.trim()&&d&&j.mutate({id:d,title:p.trim()})},A=(w,R)=>{h(w),m(R)},_=()=>{h(null),m("")},L=e.subtasks||[],V=L.filter(w=>w.status==="OPEN"),q=L.filter(w=>w.status==="COMPLETED"),O=r?{singular:"Antwort",placeholder:"Antwort...",deleteConfirm:"Antwort löschen?"}:{singular:"Unteraufgabe",placeholder:"Unteraufgabe...",deleteConfirm:"Unteraufgabe löschen?"},C=(w,R)=>d===w.id?s.jsx("div",{className:"py-1",children:s.jsxs("form",{onSubmit:P,className:"flex items-center gap-2",children:[s.jsx(to,{className:"w-4 h-4 text-gray-300 flex-shrink-0"}),s.jsx("input",{type:"text",value:p,onChange:ee=>m(ee.target.value),className:"flex-1 text-sm px-2 py-1 border rounded focus:outline-none focus:ring-1 focus:ring-blue-500",autoFocus:!0}),s.jsx(T,{type:"submit",size:"sm",disabled:!p.trim()||j.isPending,children:"✓"}),s.jsx(T,{type:"button",variant:"ghost",size:"sm",onClick:_,children:"×"})]})},w.id):s.jsx("div",{className:`py-1 group/subtask ${R?"opacity-60":""}`,children:s.jsxs("div",{className:"flex items-start gap-2",children:[s.jsx("button",{onClick:()=>R?F.mutate(w.id):k.mutate(w.id),disabled:k.isPending||F.isPending||r,className:`flex-shrink-0 mt-0.5 ${r?"cursor-default":R?"hover:text-yellow-600":"hover:text-green-600"}`,children:R?s.jsx(gs,{className:"w-4 h-4 text-green-500"}):s.jsx(to,{className:"w-4 h-4 text-gray-400"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-1",children:[s.jsx("span",{className:`text-sm ${R?"line-through text-gray-500":""}`,children:w.title}),n&&!r&&!R&&s.jsxs("div",{className:"flex items-center gap-0.5 opacity-0 group-hover/subtask:opacity-100",children:[s.jsx("button",{onClick:()=>A(w.id,w.title),className:"text-gray-400 hover:text-blue-600 p-0.5",title:"Bearbeiten",children:s.jsx(Je,{className:"w-3 h-3"})}),s.jsx("button",{onClick:()=>{confirm(O.deleteConfirm)&&E.mutate(w.id)},className:"text-gray-400 hover:text-red-600 p-0.5",title:"Löschen",children:s.jsx(ve,{className:"w-3 h-3"})})]}),n&&!r&&R&&s.jsx("button",{onClick:()=>{confirm(O.deleteConfirm)&&E.mutate(w.id)},className:"text-gray-400 hover:text-red-600 p-0.5 opacity-0 group-hover/subtask:opacity-100",title:"Löschen",children:s.jsx(ve,{className:"w-3 h-3"})})]}),s.jsxs("p",{className:"text-xs text-gray-400",children:[w.createdBy&&`${w.createdBy} • `,R?`Erledigt am ${w.completedAt?new Date(w.completedAt).toLocaleDateString("de-DE"):new Date(w.updatedAt).toLocaleDateString("de-DE")}`:new Date(w.createdAt).toLocaleDateString("de-DE")]})]})]})},w.id);return s.jsx("div",{className:`p-3 bg-gray-50 rounded-lg group ${a?"bg-gray-50/50 opacity-70":""}`,children:s.jsxs("div",{className:"flex items-start gap-3",children:[s.jsx("button",{onClick:()=>a?N.mutate(e.id):y.mutate(e.id),disabled:y.isPending||N.isPending||r,className:`mt-0.5 flex-shrink-0 ${r?"cursor-default":a?"hover:text-yellow-600":"hover:text-green-600"}`,title:r?void 0:a?"Wieder öffnen":"Als erledigt markieren",children:a?s.jsx(gs,{className:"w-5 h-5 text-green-500"}):s.jsx(to,{className:"w-5 h-5 text-gray-400"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:`font-medium ${a?"line-through text-gray-500":""}`,children:e.title}),e.visibleInPortal&&s.jsx(ge,{variant:"default",className:"text-xs",children:"Portal"}),L.length>0&&s.jsxs("span",{className:"text-xs text-gray-400",children:["(",q.length,"/",L.length,")"]})]}),e.description&&s.jsx("p",{className:`text-sm mt-1 whitespace-pre-wrap ${a?"text-gray-500":"text-gray-600"}`,children:e.description}),s.jsxs("p",{className:"text-xs text-gray-400 mt-1",children:[e.createdBy&&`${e.createdBy} • `,a?`Erledigt am ${e.completedAt?new Date(e.completedAt).toLocaleDateString("de-DE"):"-"}`:new Date(e.createdAt).toLocaleDateString("de-DE")]}),L.length>0&&s.jsxs("div",{className:"mt-3 ml-2 space-y-0 border-l-2 border-gray-200 pl-3",children:[V.map(w=>C(w,!1)),q.map(w=>C(w,!0))]}),!a&&(n&&!r||r)&&s.jsx("div",{className:"mt-2 ml-2",children:c?s.jsxs("form",{onSubmit:S,className:"flex items-center gap-2",children:[s.jsx("input",{type:"text",value:l,onChange:w=>o(w.target.value),placeholder:O.placeholder,className:"flex-1 text-sm px-2 py-1 border rounded focus:outline-none focus:ring-1 focus:ring-blue-500",autoFocus:!0}),s.jsx(T,{type:"submit",size:"sm",disabled:!l.trim()||g.isPending||x.isPending,children:s.jsx(Re,{className:"w-3 h-3"})}),s.jsx(T,{type:"button",variant:"ghost",size:"sm",onClick:()=>{u(!1),o("")},children:"×"})]}):s.jsxs("button",{onClick:()=>u(!0),className:"text-xs text-gray-400 hover:text-blue-600 flex items-center gap-1",children:[s.jsx(Re,{className:"w-3 h-3"}),O.singular]})})]}),n&&!r&&s.jsxs("div",{className:"flex gap-1 opacity-0 group-hover:opacity-100",children:[!a&&s.jsx("button",{onClick:i,className:"text-gray-400 hover:text-blue-600 p-1",title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),s.jsx("button",{onClick:()=>{confirm("Aufgabe wirklich löschen?")&&v.mutate(e.id)},className:"text-gray-400 hover:text-red-600 p-1",title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4"})})]})]})})}function mk({contractId:e,canEdit:t,isCustomerPortal:n}){var x;const[r,a]=b.useState(!1),[i,l]=b.useState(null),{data:o,isLoading:c}=he({queryKey:["contract-tasks",e],queryFn:()=>st.getByContract(e),staleTime:0,gcTime:0,refetchOnMount:"always"}),{data:u,isLoading:d}=he({queryKey:["app-settings-public"],queryFn:()=>Or.getPublic(),enabled:n,staleTime:0}),h=!d&&((x=u==null?void 0:u.data)==null?void 0:x.customerSupportTicketsEnabled)==="true",p=(o==null?void 0:o.data)||[],m=p.filter(j=>j.status==="OPEN"),f=p.filter(j=>j.status==="COMPLETED"),y=n?{title:"Support-Anfragen",button:"Anfrage erstellen",empty:"Keine Support-Anfragen vorhanden."}:{title:"Aufgaben",button:"Aufgabe",empty:"Keine Aufgaben vorhanden."},N=n?Hi:Qi;if(c||n&&d)return s.jsx(X,{className:"mb-6",title:y.title,children:s.jsx("div",{className:"text-center py-4 text-gray-500",children:"Laden..."})});const g=t&&!n||n&&h;return s.jsxs(X,{className:"mb-6",title:y.title,children:[s.jsxs("div",{className:"flex items-center justify-between mb-4",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(N,{className:"w-5 h-5 text-gray-500"}),s.jsxs("span",{className:"text-sm text-gray-600",children:[m.length," offen, ",f.length," erledigt"]})]}),g&&s.jsxs(T,{size:"sm",onClick:()=>a(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-1"}),y.button]})]}),p.length===0?s.jsx("p",{className:"text-center py-4 text-gray-500",children:y.empty}):s.jsxs("div",{className:"space-y-2",children:[m.map(j=>s.jsx(ex,{task:j,contractId:e,canEdit:t,isCustomerPortal:n,isCompleted:!1,onEdit:()=>l(j)},j.id)),f.length>0&&m.length>0&&s.jsx("div",{className:"border-t my-3"}),f.map(j=>s.jsx(ex,{task:j,contractId:e,canEdit:t,isCustomerPortal:n,isCompleted:!0,onEdit:()=>{}},j.id))]}),(r||i)&&s.jsx(hk,{isOpen:!0,onClose:()=>{a(!1),l(null)},contractId:e,task:i,isCustomerPortal:n})]})}function hk({isOpen:e,onClose:t,contractId:n,task:r,isCustomerPortal:a=!1}){const i=pe(),l=!!r,[o,c]=b.useState({title:(r==null?void 0:r.title)||"",description:(r==null?void 0:r.description)||"",visibleInPortal:(r==null?void 0:r.visibleInPortal)||!1});b.useEffect(()=>{e&&c({title:(r==null?void 0:r.title)||"",description:(r==null?void 0:r.description)||"",visibleInPortal:(r==null?void 0:r.visibleInPortal)||!1})},[e,r]);const u=W({mutationFn:y=>st.create(n,y),onSuccess:async()=>{await i.refetchQueries({queryKey:["contract-tasks",n]}),t()}}),d=W({mutationFn:y=>st.createSupportTicket(n,y),onSuccess:async()=>{await i.refetchQueries({queryKey:["contract-tasks",n]}),t()}}),h=W({mutationFn:y=>st.update(r.id,y),onSuccess:async()=>{await i.refetchQueries({queryKey:["contract-tasks",n]}),t()}}),p=y=>{y.preventDefault(),l?h.mutate({title:o.title,description:o.description||void 0,visibleInPortal:o.visibleInPortal}):a?d.mutate({title:o.title,description:o.description||void 0}):u.mutate({title:o.title,description:o.description||void 0,visibleInPortal:o.visibleInPortal})},m=u.isPending||d.isPending||h.isPending,f=a?{modalTitle:l?"Anfrage bearbeiten":"Neue Support-Anfrage",titleLabel:"Betreff",titlePlaceholder:"Kurze Beschreibung Ihrer Anfrage",descLabel:"Ihre Nachricht",descPlaceholder:"Beschreiben Sie Ihr Anliegen...",submitBtn:l?"Speichern":"Anfrage senden"}:{modalTitle:l?"Aufgabe bearbeiten":"Neue Aufgabe",titleLabel:"Titel",titlePlaceholder:"Kurze Beschreibung der Aufgabe",descLabel:"Beschreibung (optional)",descPlaceholder:"Details zur Aufgabe...",submitBtn:l?"Speichern":"Erstellen"};return s.jsx(ot,{isOpen:e,onClose:t,title:f.modalTitle,children:s.jsxs("form",{onSubmit:p,className:"space-y-4",children:[s.jsx(K,{label:f.titleLabel,value:o.title,onChange:y=>c({...o,title:y.target.value}),required:!0,placeholder:f.titlePlaceholder}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:f.descLabel}),s.jsx("textarea",{value:o.description,onChange:y=>c({...o,description:y.target.value}),className:"w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500",rows:a?5:3,placeholder:f.descPlaceholder})]}),!a&&s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:o.visibleInPortal,onChange:y=>c({...o,visibleInPortal:y.target.checked}),className:"w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500"}),s.jsx("span",{className:"text-sm text-gray-700",children:"Im Kundenportal sichtbar"})]}),s.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:m||!o.title.trim(),children:m?"Speichern...":f.submitBtn})]})]})})}function fk(){var R,Q,ee,fe,ue,nt;const{id:e}=sc(),t=Vt(),r=wn().state,a=pe(),{hasPermission:i,isCustomer:l,isCustomerPortal:o}=Be(),c=parseInt(e),[u,d]=b.useState(!1),[h,p]=b.useState(null),[m,f]=b.useState(!1),[y,N]=b.useState(!1),[v,g]=b.useState(null),[x,j]=b.useState({}),[k,F]=b.useState({}),{data:E,isLoading:S}=he({queryKey:["contract",e],queryFn:()=>$e.getById(c)}),P=W({mutationFn:()=>$e.delete(c),onSuccess:()=>{t("/contracts")}}),A=W({mutationFn:()=>$e.createFollowUp(c),onSuccess:H=>{H.data?t(`/contracts/${H.data.id}/edit`):alert("Folgevertrag wurde erstellt, aber keine ID zurückgegeben")},onError:H=>{console.error("Folgevertrag Fehler:",H),alert(`Fehler beim Erstellen des Folgevertrags: ${H instanceof Error?H.message:"Unbekannter Fehler"}`)}}),_=W({mutationFn:H=>{const Ae={cancellationConfirmationDate:H?new Date(H).toISOString():null};return $e.update(c,Ae)},onSuccess:()=>{a.invalidateQueries({queryKey:["contract",e]}),a.invalidateQueries({queryKey:["contract-cockpit"]})},onError:H=>{console.error("Fehler beim Speichern des Datums:",H),alert("Fehler beim Speichern des Datums")}}),L=W({mutationFn:H=>{const Ae={cancellationConfirmationOptionsDate:H?new Date(H).toISOString():null};return $e.update(c,Ae)},onSuccess:()=>{a.invalidateQueries({queryKey:["contract",e]}),a.invalidateQueries({queryKey:["contract-cockpit"]})},onError:H=>{console.error("Fehler beim Speichern des Datums:",H),alert("Fehler beim Speichern des Datums")}}),V=async()=>{var H;if(u)d(!1),p(null);else try{const ke=await $e.getPassword(c);(H=ke.data)!=null&&H.password&&(p(ke.data.password),d(!0))}catch{alert("Passwort konnte nicht entschlüsselt werden")}},q=async()=>{var H;if(y)N(!1),g(null);else try{const ke=await $e.getInternetCredentials(c);(H=ke.data)!=null&&H.password&&(g(ke.data.password),N(!0))}catch{alert("Internet-Passwort konnte nicht entschlüsselt werden")}},O=async H=>{var ke;if(x[H])j(Ae=>({...Ae,[H]:!1})),F(Ae=>({...Ae,[H]:null}));else try{const rt=(ke=(await $e.getSipCredentials(H)).data)==null?void 0:ke.password;rt&&(F(St=>({...St,[H]:rt})),j(St=>({...St,[H]:!0})))}catch{alert("SIP-Passwort konnte nicht entschlüsselt werden")}},C=async()=>{var Ae,rt,St;const H=E==null?void 0:E.data,ke=((Ae=H==null?void 0:H.stressfreiEmail)==null?void 0:Ae.email)||(H==null?void 0:H.portalUsername);if(!((rt=H==null?void 0:H.provider)!=null&&rt.portalUrl)||!ke){alert("Portal-URL oder Benutzername fehlt");return}f(!0);try{const At=await $e.getPassword(c);if(!((St=At.data)!=null&&St.password)){alert("Passwort konnte nicht entschlüsselt werden");return}const G=H.provider,ze=G.portalUrl,Rt=G.usernameFieldName||"username",$r=G.passwordFieldName||"password",Sn=new URL(ze);Sn.searchParams.set(Rt,ke),Sn.searchParams.set($r,At.data.password),window.open(Sn.toString(),"_blank")}catch{alert("Fehler beim Auto-Login")}finally{f(!1)}};if(S)return s.jsx("div",{className:"text-center py-8",children:"Laden..."});if(!(E!=null&&E.data))return s.jsx("div",{className:"text-center py-8 text-red-600",children:"Vertrag nicht gefunden"});const w=E.data;return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-2",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{if((r==null?void 0:r.from)==="customer"&&(r!=null&&r.customerId))t(`/customers/${r.customerId}?tab=contracts`);else if((r==null?void 0:r.from)==="cockpit"){const H=r.filter?`?filter=${r.filter}`:"";t(`/contracts/cockpit${H}`)}else(r==null?void 0:r.from)==="contracts"?t("/contracts"):w.customer?t(`/customers/${w.customer.id}?tab=contracts`):t("/contracts")},children:s.jsx(Gs,{className:"w-4 h-4"})}),s.jsx("h1",{className:"text-2xl font-bold",children:w.contractNumber}),s.jsx(ge,{children:ak[w.type]}),s.jsx(ge,{variant:lk[w.status],children:ik[w.status]})]}),w.customer&&s.jsxs("p",{className:"text-gray-500 ml-10",children:["Kunde:"," ",s.jsx(Ne,{to:`/customers/${w.customer.id}`,className:"text-blue-600 hover:underline",children:w.customer.companyName||`${w.customer.firstName} ${w.customer.lastName}`})]})]}),!l&&s.jsxs("div",{className:"flex gap-2",children:[i("contracts:create")&&!w.followUpContract&&s.jsxs(T,{variant:"secondary",onClick:()=>A.mutate(),disabled:A.isPending,children:[s.jsx(I0,{className:"w-4 h-4 mr-2"}),A.isPending?"Erstelle...":"Folgevertrag anlegen"]}),w.followUpContract&&s.jsx(Ne,{to:`/contracts/${w.followUpContract.id}`,children:s.jsxs(T,{variant:"secondary",children:[s.jsx(A0,{className:"w-4 h-4 mr-2"}),"Folgevertrag anzeigen"]})}),i("contracts:update")&&s.jsx(Ne,{to:`/contracts/${e}/edit`,children:s.jsxs(T,{variant:"secondary",children:[s.jsx(Je,{className:"w-4 h-4 mr-2"}),"Bearbeiten"]})}),i("contracts:delete")&&s.jsxs(T,{variant:"danger",onClick:()=>{confirm("Vertrag wirklich löschen?")&&P.mutate()},children:[s.jsx(ve,{className:"w-4 h-4 mr-2"}),"Löschen"]})]})]}),w.previousContract&&s.jsx(X,{className:"mb-6 border-l-4 border-l-blue-500",title:"Vorgängervertrag",children:s.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vertragsnummer"}),s.jsx("dd",{children:s.jsx(Ne,{to:`/contracts/${w.previousContract.id}`,className:"text-blue-600 hover:underline",children:w.previousContract.contractNumber})})]}),w.previousContract.providerName&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Anbieter"}),s.jsx("dd",{children:w.previousContract.providerName})]}),w.previousContract.customerNumberAtProvider&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Kundennummer"}),s.jsx("dd",{className:"font-mono",children:w.previousContract.customerNumberAtProvider})]}),w.previousContract.portalUsername&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Zugangsdaten"}),s.jsx("dd",{children:w.previousContract.portalUsername})]})]})}),w.cancellationConfirmationDate&&s.jsxs("div",{className:"mb-6 p-4 bg-red-50 border-2 border-red-400 rounded-lg flex items-start gap-3",children:[s.jsx("span",{className:"text-red-600 text-xl font-bold",children:"!"}),s.jsxs("div",{children:[s.jsx("p",{className:"font-semibold text-red-800",children:"Kündigungsbestätigung vorhanden"}),s.jsxs("p",{className:"text-sm text-red-700 mt-1",children:["Dieser Vertrag hat eine Kündigungsbestätigung vom"," ",s.jsx("strong",{children:new Date(w.cancellationConfirmationDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})}),".",w.cancellationConfirmationOptionsDate&&s.jsxs(s.Fragment,{children:[" Optionen-Bestätigung: ",s.jsx("strong",{children:new Date(w.cancellationConfirmationOptionsDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})}),"."]})]})]})]}),w.type==="MOBILE"&&((R=w.mobileDetails)==null?void 0:R.requiresMultisim)&&s.jsxs("div",{className:"mb-6 p-4 bg-amber-50 border border-amber-300 rounded-lg flex items-start gap-3",children:[s.jsx("span",{className:"text-amber-600 text-xl font-bold",children:"!"}),s.jsxs("div",{children:[s.jsx("p",{className:"font-semibold text-amber-800",children:"Multisim erforderlich"}),s.jsx("p",{className:"text-sm text-amber-700 mt-1",children:"Dieser Kunde benötigt eine Multisim-Karte. Multisim ist bei Klarmobil, Congstar und Otelo nicht buchbar. Bitte einen Anbieter wie Freenet oder vergleichbar wählen."})]})]}),s.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6",children:[s.jsx(X,{title:"Anbieter & Tarif",children:s.jsxs("dl",{className:"space-y-3",children:[(w.provider||w.providerName)&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Anbieter"}),s.jsx("dd",{className:"font-medium",children:((Q=w.provider)==null?void 0:Q.name)||w.providerName})]}),(w.tariff||w.tariffName)&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Tarif"}),s.jsx("dd",{children:((ee=w.tariff)==null?void 0:ee.name)||w.tariffName})]}),w.customerNumberAtProvider&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Kundennummer"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.customerNumberAtProvider,s.jsx(ce,{value:w.customerNumberAtProvider})]})]}),w.salesPlatform&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vertriebsplattform"}),s.jsx("dd",{children:w.salesPlatform.name})]}),w.commission!==null&&w.commission!==void 0&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Provision"}),s.jsx("dd",{children:w.commission.toLocaleString("de-DE",{style:"currency",currency:"EUR"})})]}),w.priceFirst12Months&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Preis erste 12 Monate"}),s.jsx("dd",{children:w.priceFirst12Months})]}),w.priceFrom13Months&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Preis ab 13. Monat"}),s.jsx("dd",{children:w.priceFrom13Months})]}),w.priceAfter24Months&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Preis nach 24 Monaten"}),s.jsx("dd",{children:w.priceAfter24Months})]})]})}),s.jsxs(X,{title:"Laufzeit und Kündigung",className:w.cancellationConfirmationDate?"border-2 border-red-400":"",children:[w.contractDuration&&ok(w.contractDuration.code)&&s.jsxs("p",{className:"text-sm text-gray-500 mb-4 bg-blue-50 border border-blue-200 rounded-lg p-3",children:[s.jsx("strong",{children:"Hinweis:"})," Dieser Vertrag gilt als unbefristet mit der jeweiligen Kündigungsfrist."]}),s.jsxs("dl",{className:"space-y-3",children:[w.startDate&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vertragsbeginn"}),s.jsx("dd",{children:new Date(w.startDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]}),w.endDate&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vertragsende"}),s.jsx("dd",{children:new Date(w.endDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]}),w.contractDuration&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vertragslaufzeit"}),s.jsx("dd",{children:w.contractDuration.description})]}),w.cancellationPeriod&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Kündigungsfrist"}),s.jsx("dd",{children:w.cancellationPeriod.description})]}),w.cancellationConfirmationDate&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Kündigungsbestätigungsdatum"}),s.jsx("dd",{children:new Date(w.cancellationConfirmationDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]}),w.cancellationConfirmationOptionsDate&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Kündigungsbestätigungsoptionendatum"}),s.jsx("dd",{children:new Date(w.cancellationConfirmationOptionsDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]}),w.wasSpecialCancellation&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Sonderkündigung"}),s.jsx("dd",{children:s.jsx(ge,{variant:"warning",children:"Ja"})})]})]}),i("contracts:update")&&s.jsxs("div",{className:"mt-6 pt-6 border-t",children:[s.jsx("h4",{className:"font-medium mb-4",children:"Kündigungsdokumente"}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500 mb-1",children:"Kündigungsschreiben"}),w.cancellationLetterPath?s.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[s.jsxs("a",{href:`/api${w.cancellationLetterPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${w.cancellationLetterPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),s.jsx(bt,{onUpload:async H=>{await et.uploadCancellationLetter(c,H),a.invalidateQueries({queryKey:["contract",e]})},existingFile:w.cancellationLetterPath,accept:".pdf",label:"Ersetzen"}),s.jsxs("button",{onClick:async()=>{confirm("Dokument wirklich löschen?")&&(await et.deleteCancellationLetter(c),a.invalidateQueries({queryKey:["contract",e]}))},className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]}):s.jsx(bt,{onUpload:async H=>{await et.uploadCancellationLetter(c,H),a.invalidateQueries({queryKey:["contract",e]})},accept:".pdf",label:"PDF hochladen"})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500 mb-1",children:"Kündigungsbestätigung"}),w.cancellationConfirmationPath?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[s.jsxs("a",{href:`/api${w.cancellationConfirmationPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${w.cancellationConfirmationPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),s.jsx(bt,{onUpload:async H=>{await et.uploadCancellationConfirmation(c,H),a.invalidateQueries({queryKey:["contract",e]})},existingFile:w.cancellationConfirmationPath,accept:".pdf",label:"Ersetzen"}),s.jsxs("button",{onClick:async()=>{confirm("Dokument wirklich löschen?")&&(await et.deleteCancellationConfirmation(c),a.invalidateQueries({queryKey:["contract",e]}))},className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]}),s.jsxs("div",{className:"mt-2",children:[s.jsx("label",{className:"text-xs text-gray-500 block mb-1",children:"Bestätigung erhalten am"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"date",value:w.cancellationConfirmationDate?w.cancellationConfirmationDate.split("T")[0]:"",onChange:H=>{const ke=H.target.value||null;_.mutate(ke)},className:"block w-full max-w-[180px] px-2 py-1 text-sm border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500"}),w.cancellationConfirmationDate&&s.jsx("button",{onClick:()=>_.mutate(null),className:"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded",title:"Datum löschen",children:s.jsx(ve,{className:"w-4 h-4"})})]})]})]}):s.jsx(bt,{onUpload:async H=>{await et.uploadCancellationConfirmation(c,H),a.invalidateQueries({queryKey:["contract",e]})},accept:".pdf",label:"PDF hochladen"})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500 mb-1",children:"Kündigungsschreiben Optionen"}),w.cancellationLetterOptionsPath?s.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[s.jsxs("a",{href:`/api${w.cancellationLetterOptionsPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${w.cancellationLetterOptionsPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),s.jsx(bt,{onUpload:async H=>{await et.uploadCancellationLetterOptions(c,H),a.invalidateQueries({queryKey:["contract",e]})},existingFile:w.cancellationLetterOptionsPath,accept:".pdf",label:"Ersetzen"}),s.jsxs("button",{onClick:async()=>{confirm("Dokument wirklich löschen?")&&(await et.deleteCancellationLetterOptions(c),a.invalidateQueries({queryKey:["contract",e]}))},className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]}):s.jsx(bt,{onUpload:async H=>{await et.uploadCancellationLetterOptions(c,H),a.invalidateQueries({queryKey:["contract",e]})},accept:".pdf",label:"PDF hochladen"})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500 mb-1",children:"Kündigungsbestätigung Optionen"}),w.cancellationConfirmationOptionsPath?s.jsxs(s.Fragment,{children:[s.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[s.jsxs("a",{href:`/api${w.cancellationConfirmationOptionsPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(De,{className:"w-4 h-4"}),"Anzeigen"]}),s.jsxs("a",{href:`/api${w.cancellationConfirmationOptionsPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(Ms,{className:"w-4 h-4"}),"Download"]}),s.jsx(bt,{onUpload:async H=>{await et.uploadCancellationConfirmationOptions(c,H),a.invalidateQueries({queryKey:["contract",e]})},existingFile:w.cancellationConfirmationOptionsPath,accept:".pdf",label:"Ersetzen"}),s.jsxs("button",{onClick:async()=>{confirm("Dokument wirklich löschen?")&&(await et.deleteCancellationConfirmationOptions(c),a.invalidateQueries({queryKey:["contract",e]}))},className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[s.jsx(ve,{className:"w-4 h-4"}),"Löschen"]})]}),s.jsxs("div",{className:"mt-2",children:[s.jsx("label",{className:"text-xs text-gray-500 block mb-1",children:"Bestätigung erhalten am"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"date",value:w.cancellationConfirmationOptionsDate?w.cancellationConfirmationOptionsDate.split("T")[0]:"",onChange:H=>{const ke=H.target.value||null;L.mutate(ke)},className:"block w-full max-w-[180px] px-2 py-1 text-sm border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500"}),w.cancellationConfirmationOptionsDate&&s.jsx("button",{onClick:()=>L.mutate(null),className:"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded",title:"Datum löschen",children:s.jsx(ve,{className:"w-4 h-4"})})]})]})]}):s.jsx(bt,{onUpload:async H=>{await et.uploadCancellationConfirmationOptions(c,H),a.invalidateQueries({queryKey:["contract",e]})},accept:".pdf",label:"PDF hochladen"})]})]})]})]})]}),(w.portalUsername||w.stressfreiEmail||w.portalPasswordEncrypted)&&s.jsxs(X,{className:"mb-6",title:"Zugangsdaten",children:[s.jsxs("dl",{className:"grid grid-cols-2 gap-4",children:[(w.portalUsername||w.stressfreiEmail)&&s.jsxs("div",{children:[s.jsxs("dt",{className:"text-sm text-gray-500",children:["Benutzername",w.stressfreiEmail&&s.jsx("span",{className:"ml-2 text-xs text-blue-600",children:"(Stressfrei-Wechseln)"})]}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[((fe=w.stressfreiEmail)==null?void 0:fe.email)||w.portalUsername,s.jsx(ce,{value:((ue=w.stressfreiEmail)==null?void 0:ue.email)||w.portalUsername||""})]})]}),w.portalPasswordEncrypted&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Passwort"}),s.jsxs("dd",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"font-mono",children:u&&h?h:"••••••••"}),u&&h&&s.jsx(ce,{value:h}),s.jsx(T,{variant:"ghost",size:"sm",onClick:V,children:u?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]})]})]}),((nt=w.provider)==null?void 0:nt.portalUrl)&&(w.portalUsername||w.stressfreiEmail)&&w.portalPasswordEncrypted&&s.jsxs("div",{className:"mt-4 pt-4 border-t",children:[s.jsxs(T,{onClick:C,disabled:m,className:"w-full sm:w-auto",children:[s.jsx(Lm,{className:"w-4 h-4 mr-2"}),m?"Wird geöffnet...":"Zum Kundenportal (Auto-Login)"]}),s.jsx("p",{className:"text-xs text-gray-500 mt-2",children:"Öffnet das Portal mit vorausgefüllten Zugangsdaten"})]})]}),s.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6",children:[w.address&&s.jsx(X,{title:"Adresse",children:s.jsxs(K0,{values:[`${w.address.street} ${w.address.houseNumber}`,`${w.address.postalCode} ${w.address.city}`,w.address.country],children:[s.jsxs("p",{children:[w.address.street," ",w.address.houseNumber]}),s.jsxs("p",{children:[w.address.postalCode," ",w.address.city]}),s.jsx("p",{className:"text-gray-500",children:w.address.country})]})}),w.bankCard&&s.jsxs(X,{title:"Bankkarte",children:[s.jsx("p",{className:"font-medium",children:w.bankCard.accountHolder}),s.jsxs("p",{className:"font-mono flex items-center gap-1",children:[w.bankCard.iban,s.jsx(ce,{value:w.bankCard.iban})]}),w.bankCard.bankName&&s.jsx("p",{className:"text-gray-500",children:w.bankCard.bankName})]}),w.identityDocument&&s.jsxs(X,{title:"Ausweis",children:[s.jsxs("p",{className:"font-mono flex items-center gap-1",children:[w.identityDocument.documentNumber,s.jsx(ce,{value:w.identityDocument.documentNumber})]}),s.jsx("p",{className:"text-gray-500",children:w.identityDocument.type})]})]}),w.energyDetails&&s.jsxs(X,{className:"mb-6",title:w.type==="ELECTRICITY"?"Strom-Details":"Gas-Details",children:[s.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[w.energyDetails.meter&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Zählernummer"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.energyDetails.meter.meterNumber,s.jsx(ce,{value:w.energyDetails.meter.meterNumber})]})]}),w.energyDetails.annualConsumption&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Jahresverbrauch"}),s.jsxs("dd",{children:[w.energyDetails.annualConsumption.toLocaleString("de-DE")," ",w.type==="ELECTRICITY"?"kWh":"m³"]})]}),w.energyDetails.basePrice&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Grundpreis"}),s.jsxs("dd",{children:[w.energyDetails.basePrice.toLocaleString("de-DE")," €/Monat"]})]}),w.energyDetails.unitPrice&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Arbeitspreis"}),s.jsxs("dd",{children:[w.energyDetails.unitPrice.toLocaleString("de-DE")," ct/",w.type==="ELECTRICITY"?"kWh":"m³"]})]}),w.energyDetails.bonus&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Bonus"}),s.jsxs("dd",{children:[w.energyDetails.bonus.toLocaleString("de-DE")," €"]})]}),w.energyDetails.previousProviderName&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vorversorger"}),s.jsx("dd",{children:w.energyDetails.previousProviderName})]}),w.energyDetails.previousCustomerNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vorherige Kundennr."}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.energyDetails.previousCustomerNumber,s.jsx(ce,{value:w.energyDetails.previousCustomerNumber})]})]})]}),w.energyDetails.meter&&s.jsx(uk,{meterId:w.energyDetails.meter.id,meterType:w.energyDetails.meter.type,readings:w.energyDetails.meter.readings||[],contractId:c,canEdit:i("contracts:update")&&!l})]}),w.internetDetails&&s.jsxs(X,{className:"mb-6",title:w.type==="DSL"?"DSL-Details":w.type==="CABLE"?"Kabelinternet-Details":"Glasfaser-Details",children:[s.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[w.internetDetails.downloadSpeed&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Download"}),s.jsxs("dd",{children:[w.internetDetails.downloadSpeed," Mbit/s"]})]}),w.internetDetails.uploadSpeed&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Upload"}),s.jsxs("dd",{children:[w.internetDetails.uploadSpeed," Mbit/s"]})]}),w.internetDetails.routerModel&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Router"}),s.jsx("dd",{children:w.internetDetails.routerModel})]}),w.internetDetails.routerSerialNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Router S/N"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.internetDetails.routerSerialNumber,s.jsx(ce,{value:w.internetDetails.routerSerialNumber})]})]}),w.internetDetails.installationDate&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Installation"}),s.jsx("dd",{children:new Date(w.internetDetails.installationDate).toLocaleDateString("de-DE")})]}),w.internetDetails.homeId&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Home-ID"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.internetDetails.homeId,s.jsx(ce,{value:w.internetDetails.homeId})]})]}),w.internetDetails.activationCode&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Aktivierungscode"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.internetDetails.activationCode,s.jsx(ce,{value:w.internetDetails.activationCode})]})]})]}),(w.internetDetails.internetUsername||w.internetDetails.internetPasswordEncrypted)&&s.jsxs("div",{className:"mt-4 pt-4 border-t",children:[s.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-3",children:"Internet-Zugangsdaten"}),s.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[w.internetDetails.internetUsername&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Benutzername"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.internetDetails.internetUsername,s.jsx(ce,{value:w.internetDetails.internetUsername})]})]}),w.internetDetails.internetPasswordEncrypted&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Passwort"}),s.jsxs("dd",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"font-mono",children:y&&v?v:"••••••••"}),y&&v&&s.jsx(ce,{value:v}),s.jsx(T,{variant:"ghost",size:"sm",onClick:q,children:y?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]})]})]})]}),w.internetDetails.phoneNumbers&&w.internetDetails.phoneNumbers.length>0&&s.jsxs("div",{className:"mt-4 pt-4 border-t",children:[s.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-3",children:"Rufnummern & SIP-Zugangsdaten"}),s.jsx("div",{className:"space-y-3",children:w.internetDetails.phoneNumbers.map(H=>s.jsxs("div",{className:"p-3 bg-gray-50 rounded-lg",children:[s.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[s.jsxs("span",{className:"font-mono font-medium flex items-center gap-1",children:[H.phoneNumber,s.jsx(ce,{value:H.phoneNumber})]}),H.isMain&&s.jsx(ge,{variant:"success",children:"Hauptnummer"})]}),(H.sipUsername||H.sipPasswordEncrypted||H.sipServer)&&s.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-3 text-sm",children:[H.sipUsername&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"SIP-Benutzer"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[H.sipUsername,s.jsx(ce,{value:H.sipUsername})]})]}),H.sipPasswordEncrypted&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"SIP-Passwort"}),s.jsxs("dd",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"font-mono",children:x[H.id]&&k[H.id]?k[H.id]:"••••••••"}),x[H.id]&&k[H.id]&&s.jsx(ce,{value:k[H.id]}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>O(H.id),children:x[H.id]?s.jsx(Et,{className:"w-3 h-3"}):s.jsx(De,{className:"w-3 h-3"})})]})]}),H.sipServer&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"SIP-Server"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[H.sipServer,s.jsx(ce,{value:H.sipServer})]})]})]})]},H.id))})]})]}),w.mobileDetails&&s.jsxs(X,{className:"mb-6",title:"Mobilfunk-Details",children:[s.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[w.mobileDetails.dataVolume&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Datenvolumen"}),s.jsxs("dd",{children:[w.mobileDetails.dataVolume," GB"]})]}),w.mobileDetails.includedMinutes&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Inklusiv-Minuten"}),s.jsx("dd",{children:w.mobileDetails.includedMinutes})]}),w.mobileDetails.includedSMS&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Inklusiv-SMS"}),s.jsx("dd",{children:w.mobileDetails.includedSMS})]}),w.mobileDetails.deviceModel&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Gerät"}),s.jsx("dd",{children:w.mobileDetails.deviceModel})]}),w.mobileDetails.deviceImei&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"IMEI"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.mobileDetails.deviceImei,s.jsx(ce,{value:w.mobileDetails.deviceImei})]})]}),w.mobileDetails.requiresMultisim&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Multisim"}),s.jsx("dd",{children:s.jsx(ge,{variant:"warning",children:"Erforderlich"})})]})]}),w.mobileDetails.simCards&&w.mobileDetails.simCards.length>0&&s.jsxs("div",{className:"mt-6 pt-6 border-t",children:[s.jsx("h4",{className:"font-medium mb-4",children:"SIM-Karten"}),s.jsx("div",{className:"space-y-3",children:w.mobileDetails.simCards.map(H=>s.jsx(ck,{simCard:H},H.id))})]}),(!w.mobileDetails.simCards||w.mobileDetails.simCards.length===0)&&(w.mobileDetails.phoneNumber||w.mobileDetails.simCardNumber)&&s.jsxs("div",{className:"mt-6 pt-6 border-t",children:[s.jsx("h4",{className:"font-medium mb-4",children:"SIM-Karte (Legacy)"}),s.jsxs("dl",{className:"grid grid-cols-2 gap-4",children:[w.mobileDetails.phoneNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Rufnummer"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.mobileDetails.phoneNumber,s.jsx(ce,{value:w.mobileDetails.phoneNumber})]})]}),w.mobileDetails.simCardNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"SIM-Kartennummer"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.mobileDetails.simCardNumber,s.jsx(ce,{value:w.mobileDetails.simCardNumber})]})]})]})]})]}),w.tvDetails&&s.jsx(X,{className:"mb-6",title:"TV-Details",children:s.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-3 gap-4",children:[w.tvDetails.receiverModel&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Receiver"}),s.jsx("dd",{children:w.tvDetails.receiverModel})]}),w.tvDetails.smartcardNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Smartcard"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.tvDetails.smartcardNumber,s.jsx(ce,{value:w.tvDetails.smartcardNumber})]})]}),w.tvDetails.package&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Paket"}),s.jsx("dd",{children:w.tvDetails.package})]})]})}),w.carInsuranceDetails&&s.jsx(X,{className:"mb-6",title:"KFZ-Versicherung Details",children:s.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[w.carInsuranceDetails.licensePlate&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Kennzeichen"}),s.jsxs("dd",{className:"font-mono font-bold flex items-center gap-1",children:[w.carInsuranceDetails.licensePlate,s.jsx(ce,{value:w.carInsuranceDetails.licensePlate})]})]}),w.carInsuranceDetails.vehicleType&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Fahrzeug"}),s.jsx("dd",{children:w.carInsuranceDetails.vehicleType})]}),w.carInsuranceDetails.hsn&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"HSN/TSN"}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.carInsuranceDetails.hsn,"/",w.carInsuranceDetails.tsn,s.jsx(ce,{value:`${w.carInsuranceDetails.hsn}/${w.carInsuranceDetails.tsn}`})]})]}),w.carInsuranceDetails.vin&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"FIN"}),s.jsxs("dd",{className:"font-mono text-sm flex items-center gap-1",children:[w.carInsuranceDetails.vin,s.jsx(ce,{value:w.carInsuranceDetails.vin})]})]}),w.carInsuranceDetails.firstRegistration&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Erstzulassung"}),s.jsx("dd",{children:new Date(w.carInsuranceDetails.firstRegistration).toLocaleDateString("de-DE")})]}),w.carInsuranceDetails.noClaimsClass&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"SF-Klasse"}),s.jsx("dd",{children:w.carInsuranceDetails.noClaimsClass})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Versicherungsart"}),s.jsx("dd",{children:s.jsx(ge,{variant:w.carInsuranceDetails.insuranceType==="FULL"?"success":w.carInsuranceDetails.insuranceType==="PARTIAL"?"warning":"default",children:w.carInsuranceDetails.insuranceType==="FULL"?"Vollkasko":w.carInsuranceDetails.insuranceType==="PARTIAL"?"Teilkasko":"Haftpflicht"})})]}),w.carInsuranceDetails.deductiblePartial&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"SB Teilkasko"}),s.jsxs("dd",{children:[w.carInsuranceDetails.deductiblePartial," €"]})]}),w.carInsuranceDetails.deductibleFull&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"SB Vollkasko"}),s.jsxs("dd",{children:[w.carInsuranceDetails.deductibleFull," €"]})]}),w.carInsuranceDetails.policyNumber&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Versicherungsschein-Nr."}),s.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[w.carInsuranceDetails.policyNumber,s.jsx(ce,{value:w.carInsuranceDetails.policyNumber})]})]}),w.carInsuranceDetails.previousInsurer&&s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Vorversicherer"}),s.jsx("dd",{children:w.carInsuranceDetails.previousInsurer})]})]})}),s.jsx(mk,{contractId:c,canEdit:i("contracts:update"),isCustomerPortal:o}),!o&&i("contracts:read")&&w.customerId&&s.jsx(bS,{contractId:c,customerId:w.customerId}),w.notes&&s.jsx(X,{title:"Notizen",children:s.jsx("p",{className:"whitespace-pre-wrap",children:w.notes})})]})}const pk=[{value:"DRAFT",label:"Entwurf"},{value:"PENDING",label:"Ausstehend"},{value:"ACTIVE",label:"Aktiv"},{value:"CANCELLED",label:"Gekündigt"},{value:"EXPIRED",label:"Abgelaufen"},{value:"DEACTIVATED",label:"Deaktiviert"}];function tx(){var bs,hl,Br,Kr,fl,Va,pl,Qa,Hm;const{id:e}=sc(),[t]=rc(),n=Vt(),r=pe(),a=!!e,i=t.get("customerId"),{register:l,handleSubmit:o,reset:c,watch:u,setValue:d,formState:{errors:h}}=J0({defaultValues:{customerId:i||"",type:"ELECTRICITY",status:"DRAFT"}}),p=u("type"),m=u("customerId"),{data:f}=he({queryKey:["contract",e],queryFn:()=>$e.getById(parseInt(e)),enabled:a}),{data:y}=he({queryKey:["customers-all"],queryFn:()=>Nt.getAll({limit:1e3})}),{data:N}=he({queryKey:["customer",m],queryFn:()=>Nt.getById(parseInt(m)),enabled:!!m}),{data:v}=he({queryKey:["platforms"],queryFn:()=>Bi.getAll()}),{data:g}=he({queryKey:["cancellation-periods"],queryFn:()=>Ki.getAll()}),{data:x}=he({queryKey:["contract-durations"],queryFn:()=>qi.getAll()}),{data:j}=he({queryKey:["providers"],queryFn:()=>Ra.getAll()}),{data:k}=he({queryKey:["contract-categories"],queryFn:()=>Vi.getAll()}),F=u("providerId"),[E,S]=b.useState(null),[P,A]=b.useState([]),[_,L]=b.useState([]),[V,q]=b.useState(!1),[O,C]=b.useState("manual"),[w,R]=b.useState(""),[Q,ee]=b.useState(!1),[fe,ue]=b.useState(!1),[nt,H]=b.useState({}),[ke,Ae]=b.useState({}),[rt,St]=b.useState({});b.useEffect(()=>{a||q(!0)},[a]),b.useEffect(()=>{!a&&i&&(y!=null&&y.data)&&y.data.some(ne=>ne.id.toString()===i)&&d("customerId",i)},[a,i,y,d]),b.useEffect(()=>{V&&E!==null&&F!==E&&d("tariffId",""),S(F)},[F,E,d,V]),b.useEffect(()=>{if(!a&&(k!=null&&k.data)&&k.data.length>0){const I=u("type"),ne=k.data.filter(le=>le.isActive),ye=ne.some(le=>le.code===I);if(!I||!ye){const le=ne.sort((xe,Xe)=>xe.sortOrder-Xe.sortOrder)[0];le&&d("type",le.code)}}},[k,a,d,u]),b.useEffect(()=>{var I,ne,ye,le,xe,Xe,we,Ha,Wm,Gm,Zm,Jm,Xm,Ym,eh,th,sh,nh,rh,ah,ih,lh,oh,ch,uh,dh,mh,hh,fh,ph,xh,gh,yh,vh,jh,bh,Nh,wh,Sh,kh,Ch,Eh,Dh,Ph,Ah,Mh,Th,Fh,Ih;if(f!=null&&f.data&&(v!=null&&v.data)&&(k!=null&&k.data)){const te=f.data;c({customerId:te.customerId.toString(),type:te.type,status:te.status,addressId:((I=te.addressId)==null?void 0:I.toString())||"",bankCardId:((ne=te.bankCardId)==null?void 0:ne.toString())||"",identityDocumentId:((ye=te.identityDocumentId)==null?void 0:ye.toString())||"",salesPlatformId:((le=te.salesPlatformId)==null?void 0:le.toString())||"",providerId:((xe=te.providerId)==null?void 0:xe.toString())||"",tariffId:((Xe=te.tariffId)==null?void 0:Xe.toString())||"",providerName:te.providerName||"",tariffName:te.tariffName||"",customerNumberAtProvider:te.customerNumberAtProvider||"",priceFirst12Months:te.priceFirst12Months||"",priceFrom13Months:te.priceFrom13Months||"",priceAfter24Months:te.priceAfter24Months||"",startDate:te.startDate?te.startDate.split("T")[0]:"",endDate:te.endDate?te.endDate.split("T")[0]:"",cancellationPeriodId:((we=te.cancellationPeriodId)==null?void 0:we.toString())||"",contractDurationId:((Ha=te.contractDurationId)==null?void 0:Ha.toString())||"",commission:te.commission||"",portalUsername:te.portalUsername||"",notes:te.notes||"",meterId:((Gm=(Wm=te.energyDetails)==null?void 0:Wm.meterId)==null?void 0:Gm.toString())||"",annualConsumption:((Zm=te.energyDetails)==null?void 0:Zm.annualConsumption)||"",basePrice:((Jm=te.energyDetails)==null?void 0:Jm.basePrice)||"",unitPrice:((Xm=te.energyDetails)==null?void 0:Xm.unitPrice)||"",bonus:((Ym=te.energyDetails)==null?void 0:Ym.bonus)||"",previousProviderName:((eh=te.energyDetails)==null?void 0:eh.previousProviderName)||"",previousCustomerNumber:((th=te.energyDetails)==null?void 0:th.previousCustomerNumber)||"",downloadSpeed:((sh=te.internetDetails)==null?void 0:sh.downloadSpeed)||"",uploadSpeed:((nh=te.internetDetails)==null?void 0:nh.uploadSpeed)||"",routerModel:((rh=te.internetDetails)==null?void 0:rh.routerModel)||"",routerSerialNumber:((ah=te.internetDetails)==null?void 0:ah.routerSerialNumber)||"",installationDate:(ih=te.internetDetails)!=null&&ih.installationDate?te.internetDetails.installationDate.split("T")[0]:"",internetUsername:((lh=te.internetDetails)==null?void 0:lh.internetUsername)||"",homeId:((oh=te.internetDetails)==null?void 0:oh.homeId)||"",activationCode:((ch=te.internetDetails)==null?void 0:ch.activationCode)||"",requiresMultisim:((uh=te.mobileDetails)==null?void 0:uh.requiresMultisim)||!1,dataVolume:((dh=te.mobileDetails)==null?void 0:dh.dataVolume)||"",includedMinutes:((mh=te.mobileDetails)==null?void 0:mh.includedMinutes)||"",includedSMS:((hh=te.mobileDetails)==null?void 0:hh.includedSMS)||"",deviceModel:((fh=te.mobileDetails)==null?void 0:fh.deviceModel)||"",deviceImei:((ph=te.mobileDetails)==null?void 0:ph.deviceImei)||"",phoneNumber:((xh=te.mobileDetails)==null?void 0:xh.phoneNumber)||"",simCardNumber:((gh=te.mobileDetails)==null?void 0:gh.simCardNumber)||"",receiverModel:((yh=te.tvDetails)==null?void 0:yh.receiverModel)||"",smartcardNumber:((vh=te.tvDetails)==null?void 0:vh.smartcardNumber)||"",tvPackage:((jh=te.tvDetails)==null?void 0:jh.package)||"",licensePlate:((bh=te.carInsuranceDetails)==null?void 0:bh.licensePlate)||"",hsn:((Nh=te.carInsuranceDetails)==null?void 0:Nh.hsn)||"",tsn:((wh=te.carInsuranceDetails)==null?void 0:wh.tsn)||"",vin:((Sh=te.carInsuranceDetails)==null?void 0:Sh.vin)||"",vehicleType:((kh=te.carInsuranceDetails)==null?void 0:kh.vehicleType)||"",firstRegistration:(Ch=te.carInsuranceDetails)!=null&&Ch.firstRegistration?te.carInsuranceDetails.firstRegistration.split("T")[0]:"",noClaimsClass:((Eh=te.carInsuranceDetails)==null?void 0:Eh.noClaimsClass)||"",insuranceType:((Dh=te.carInsuranceDetails)==null?void 0:Dh.insuranceType)||"LIABILITY",deductiblePartial:((Ph=te.carInsuranceDetails)==null?void 0:Ph.deductiblePartial)||"",deductibleFull:((Ah=te.carInsuranceDetails)==null?void 0:Ah.deductibleFull)||"",policyNumber:((Mh=te.carInsuranceDetails)==null?void 0:Mh.policyNumber)||"",previousInsurer:((Th=te.carInsuranceDetails)==null?void 0:Th.previousInsurer)||"",cancellationConfirmationDate:te.cancellationConfirmationDate?te.cancellationConfirmationDate.split("T")[0]:"",cancellationConfirmationOptionsDate:te.cancellationConfirmationOptionsDate?te.cancellationConfirmationOptionsDate.split("T")[0]:"",wasSpecialCancellation:te.wasSpecialCancellation||!1}),(Fh=te.mobileDetails)!=null&&Fh.simCards&&te.mobileDetails.simCards.length>0?A(te.mobileDetails.simCards.map(Qt=>({id:Qt.id,phoneNumber:Qt.phoneNumber||"",simCardNumber:Qt.simCardNumber||"",pin:"",puk:"",hasExistingPin:!!Qt.pin,hasExistingPuk:!!Qt.puk,isMultisim:Qt.isMultisim,isMain:Qt.isMain}))):A([]),(Ih=te.internetDetails)!=null&&Ih.phoneNumbers&&te.internetDetails.phoneNumbers.length>0?L(te.internetDetails.phoneNumbers.map(Qt=>({id:Qt.id,phoneNumber:Qt.phoneNumber||"",sipUsername:Qt.sipUsername||"",sipPassword:"",hasExistingSipPassword:!!Qt.sipPasswordEncrypted,sipServer:Qt.sipServer||"",isMain:Qt.isMain}))):L([]),te.stressfreiEmailId?(C("stressfrei"),R(te.stressfreiEmailId.toString())):(C("manual"),R("")),q(!0)}},[f,c,v,k]);const At=u("startDate"),G=u("contractDurationId");b.useEffect(()=>{if(At&&G&&(x!=null&&x.data)){const I=x.data.find(ne=>ne.id===parseInt(G));if(I){const ne=new Date(At),le=I.code.match(/^(\d+)([MTJ])$/);if(le){const xe=parseInt(le[1]),Xe=le[2];let we=new Date(ne);Xe==="T"?we.setDate(we.getDate()+xe):Xe==="M"?we.setMonth(we.getMonth()+xe):Xe==="J"&&we.setFullYear(we.getFullYear()+xe),d("endDate",we.toISOString().split("T")[0])}}}},[At,G,x,d]);const ze=W({mutationFn:$e.create,onSuccess:(I,ne)=>{r.invalidateQueries({queryKey:["contracts"]}),ne.customerId&&r.invalidateQueries({queryKey:["customer",ne.customerId.toString()]}),r.invalidateQueries({queryKey:["customers"]}),n(i?`/customers/${i}?tab=contracts`:"/contracts")}}),Rt=W({mutationFn:I=>$e.update(parseInt(e),I),onSuccess:(I,ne)=>{r.invalidateQueries({queryKey:["contracts"]}),r.invalidateQueries({queryKey:["contract",e]}),ne.customerId&&r.invalidateQueries({queryKey:["customer",ne.customerId.toString()]}),r.invalidateQueries({queryKey:["customers"]}),n(`/contracts/${e}`)}}),$r=I=>{const ne=we=>{if(we==null||we==="")return;const Ha=parseInt(String(we));return isNaN(Ha)?void 0:Ha},ye=J.find(we=>we.code===I.type),le=ne(I.customerId);if(!le){alert("Bitte wählen Sie einen Kunden aus");return}if(!I.type||!ye){alert("Bitte wählen Sie einen Vertragstyp aus");return}const xe=we=>we==null||we===""?null:we,Xe={customerId:le,type:I.type,contractCategoryId:ye.id,status:I.status,addressId:ne(I.addressId)??null,bankCardId:ne(I.bankCardId)??null,identityDocumentId:ne(I.identityDocumentId)??null,salesPlatformId:ne(I.salesPlatformId)??null,providerId:ne(I.providerId)??null,tariffId:ne(I.tariffId)??null,providerName:xe(I.providerName),tariffName:xe(I.tariffName),customerNumberAtProvider:xe(I.customerNumberAtProvider),priceFirst12Months:xe(I.priceFirst12Months),priceFrom13Months:xe(I.priceFrom13Months),priceAfter24Months:xe(I.priceAfter24Months),startDate:I.startDate?new Date(I.startDate):null,endDate:I.endDate?new Date(I.endDate):null,cancellationPeriodId:ne(I.cancellationPeriodId)??null,contractDurationId:ne(I.contractDurationId)??null,commission:I.commission?parseFloat(I.commission):null,portalUsername:O==="manual"?xe(I.portalUsername):null,stressfreiEmailId:O==="stressfrei"&&w?parseInt(w):null,portalPassword:I.portalPassword||void 0,notes:xe(I.notes),cancellationConfirmationDate:I.cancellationConfirmationDate?new Date(I.cancellationConfirmationDate):null,cancellationConfirmationOptionsDate:I.cancellationConfirmationOptionsDate?new Date(I.cancellationConfirmationOptionsDate):null,wasSpecialCancellation:I.wasSpecialCancellation||!1};["ELECTRICITY","GAS"].includes(I.type)&&(Xe.energyDetails={meterId:ne(I.meterId)??null,annualConsumption:I.annualConsumption?parseFloat(I.annualConsumption):null,basePrice:I.basePrice?parseFloat(I.basePrice):null,unitPrice:I.unitPrice?parseFloat(I.unitPrice):null,bonus:I.bonus?parseFloat(I.bonus):null,previousProviderName:xe(I.previousProviderName),previousCustomerNumber:xe(I.previousCustomerNumber)}),["DSL","CABLE","FIBER"].includes(I.type)&&(Xe.internetDetails={downloadSpeed:ne(I.downloadSpeed)??null,uploadSpeed:ne(I.uploadSpeed)??null,routerModel:xe(I.routerModel),routerSerialNumber:xe(I.routerSerialNumber),installationDate:I.installationDate?new Date(I.installationDate):null,internetUsername:xe(I.internetUsername),internetPassword:I.internetPassword||void 0,homeId:xe(I.homeId),activationCode:xe(I.activationCode),phoneNumbers:_.length>0?_.map(we=>({id:we.id,phoneNumber:we.phoneNumber||"",isMain:we.isMain??!1,sipUsername:xe(we.sipUsername),sipPassword:we.sipPassword||void 0,sipServer:xe(we.sipServer)})):void 0}),I.type==="MOBILE"&&(Xe.mobileDetails={requiresMultisim:I.requiresMultisim||!1,dataVolume:I.dataVolume?parseFloat(I.dataVolume):null,includedMinutes:ne(I.includedMinutes)??null,includedSMS:ne(I.includedSMS)??null,deviceModel:xe(I.deviceModel),deviceImei:xe(I.deviceImei),phoneNumber:xe(I.phoneNumber),simCardNumber:xe(I.simCardNumber),simCards:P.length>0?P.map(we=>({id:we.id,phoneNumber:xe(we.phoneNumber),simCardNumber:xe(we.simCardNumber),pin:we.pin||void 0,puk:we.puk||void 0,isMultisim:we.isMultisim,isMain:we.isMain})):void 0}),I.type==="TV"&&(Xe.tvDetails={receiverModel:xe(I.receiverModel),smartcardNumber:xe(I.smartcardNumber),package:xe(I.tvPackage)}),I.type==="CAR_INSURANCE"&&(Xe.carInsuranceDetails={licensePlate:xe(I.licensePlate),hsn:xe(I.hsn),tsn:xe(I.tsn),vin:xe(I.vin),vehicleType:xe(I.vehicleType),firstRegistration:I.firstRegistration?new Date(I.firstRegistration):null,noClaimsClass:xe(I.noClaimsClass),insuranceType:I.insuranceType,deductiblePartial:I.deductiblePartial?parseFloat(I.deductiblePartial):null,deductibleFull:I.deductibleFull?parseFloat(I.deductibleFull):null,policyNumber:xe(I.policyNumber),previousInsurer:xe(I.previousInsurer)}),a?Rt.mutate(Xe):ze.mutate(Xe)},Sn=ze.isPending||Rt.isPending,Ur=ze.error||Rt.error,gt=N==null?void 0:N.data,gc=(gt==null?void 0:gt.addresses)||[],yc=((bs=gt==null?void 0:gt.bankCards)==null?void 0:bs.filter(I=>I.isActive))||[],Qm=((hl=gt==null?void 0:gt.identityDocuments)==null?void 0:hl.filter(I=>I.isActive))||[],ml=((Br=gt==null?void 0:gt.meters)==null?void 0:Br.filter(I=>I.isActive))||[],M=((Kr=gt==null?void 0:gt.stressfreiEmails)==null?void 0:Kr.filter(I=>I.isActive))||[],$=(v==null?void 0:v.data)||[],B=(g==null?void 0:g.data)||[],ae=(x==null?void 0:x.data)||[],Y=((fl=j==null?void 0:j.data)==null?void 0:fl.filter(I=>I.isActive))||[],J=((Va=k==null?void 0:k.data)==null?void 0:Va.filter(I=>I.isActive).sort((I,ne)=>I.sortOrder-ne.sortOrder))||[],de=J.map(I=>({value:I.code,label:I.name})),Ce=Y.find(I=>I.id===parseInt(F||"0")),Me=((pl=Ce==null?void 0:Ce.tariffs)==null?void 0:pl.filter(I=>I.isActive))||[],yt=I=>{const ne=I.companyName||`${I.firstName} ${I.lastName}`,ye=I.birthDate?` (geb. ${new Date(I.birthDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})`:"";return`${I.customerNumber} - ${ne}${ye}`},Zs=(()=>{var ye;const ne=((y==null?void 0:y.data)||[]).map(le=>({value:le.id.toString(),label:yt(le)}));if(a&&((ye=f==null?void 0:f.data)!=null&&ye.customer)){const le=f.data.customer;ne.some(Xe=>Xe.value===le.id.toString())||ne.unshift({value:le.id.toString(),label:yt(le)})}return ne})();return s.jsxs("div",{children:[s.jsx("h1",{className:"text-2xl font-bold mb-6",children:a?"Vertrag bearbeiten":"Neuer Vertrag"}),Ur&&s.jsx("div",{className:"mb-4 p-4 bg-red-50 border border-red-200 text-red-700 rounded-lg",children:Ur instanceof Error?Ur.message:"Ein Fehler ist aufgetreten"}),s.jsxs("form",{onSubmit:o($r),children:[s.jsx(X,{className:"mb-6",title:"Vertragsdaten",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(Le,{label:"Kunde *",...l("customerId",{required:"Kunde erforderlich"}),options:Zs,error:(Qa=h.customerId)==null?void 0:Qa.message}),s.jsx(Le,{label:"Vertragstyp *",...l("type",{required:"Typ erforderlich"}),options:de}),s.jsx(Le,{label:"Status",...l("status"),options:pk}),s.jsx(Le,{label:"Vertriebsplattform",...l("salesPlatformId"),options:$.map(I=>({value:I.id,label:I.name}))})]})}),m&&s.jsx(X,{className:"mb-6",title:"Kundendaten verknüpfen",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[s.jsx(Le,{label:"Adresse",...l("addressId"),options:gc.map(I=>({value:I.id,label:`${I.street} ${I.houseNumber}, ${I.postalCode} ${I.city} (${I.type==="BILLING"?"Rechnung":"Liefer"})`}))}),s.jsx(Le,{label:"Bankkarte",...l("bankCardId"),options:yc.map(I=>({value:I.id,label:`${I.iban} (${I.accountHolder})`}))}),s.jsx(Le,{label:"Ausweis",...l("identityDocumentId"),options:Qm.map(I=>({value:I.id,label:`${I.documentNumber} (${I.type})`}))})]})}),s.jsx(X,{className:"mb-6",title:"Anbieter & Tarif",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(Le,{label:"Anbieter",...l("providerId"),options:Y.map(I=>({value:I.id,label:I.name}))}),s.jsx(Le,{label:"Tarif",...l("tariffId"),options:Me.map(I=>({value:I.id,label:I.name})),disabled:!F}),s.jsx(K,{label:"Kundennummer beim Anbieter",...l("customerNumberAtProvider")}),s.jsx(K,{label:"Provision (€)",type:"number",step:"0.01",...l("commission")}),s.jsx(K,{label:"Preis erste 12 Monate",...l("priceFirst12Months"),placeholder:"z.B. 29,99 €/Monat"}),s.jsx(K,{label:"Preis ab 13. Monat",...l("priceFrom13Months"),placeholder:"z.B. 39,99 €/Monat"}),s.jsx(K,{label:"Preis nach 24 Monaten",...l("priceAfter24Months"),placeholder:"z.B. 49,99 €/Monat"})]})}),s.jsxs(X,{className:"mb-6",title:"Laufzeit und Kündigung",children:[s.jsxs("p",{className:"text-sm text-gray-500 mb-4 bg-blue-50 border border-blue-200 rounded-lg p-3",children:[s.jsx("strong",{children:"Hinweis:"})," Ist die Laufzeit ≤ 4 Wochen, 1 Monat oder 30 Tage, gilt der Vertrag als unbefristet mit der jeweiligen Kündigungsfrist."]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(K,{label:"Vertragsbeginn",type:"date",...l("startDate"),value:u("startDate")||"",onClear:()=>d("startDate","")}),s.jsx(K,{label:"Vertragsende (berechnet)",type:"date",...l("endDate"),disabled:!0,className:"bg-gray-50"}),s.jsx(Le,{label:"Vertragslaufzeit",...l("contractDurationId"),options:ae.map(I=>({value:I.id,label:I.description}))}),s.jsx(Le,{label:"Kündigungsfrist",...l("cancellationPeriodId"),options:B.map(I=>({value:I.id,label:I.description}))}),s.jsx(K,{label:"Kündigungsbestätigungsdatum",type:"date",...l("cancellationConfirmationDate"),value:u("cancellationConfirmationDate")||"",onClear:()=>d("cancellationConfirmationDate","")}),s.jsx(K,{label:"Kündigungsbestätigungsoptionendatum",type:"date",...l("cancellationConfirmationOptionsDate"),value:u("cancellationConfirmationOptionsDate")||"",onClear:()=>d("cancellationConfirmationOptionsDate","")}),s.jsx("div",{className:"col-span-2",children:s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"checkbox",...l("wasSpecialCancellation"),className:"rounded border-gray-300"}),s.jsx("span",{children:"Wurde sondergekündigt?"})]})})]})]}),s.jsx(X,{className:"mb-6",title:"Zugangsdaten (verschlüsselt gespeichert)",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Portal Benutzername"}),s.jsxs("div",{className:"space-y-2",children:[s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"radio",name:"usernameType",checked:O==="manual",onChange:()=>{C("manual"),R("")},className:"text-blue-600"}),s.jsx("span",{className:"text-sm",children:"Manuell eingeben"})]}),O==="manual"&&s.jsx(K,{...l("portalUsername"),placeholder:"Benutzername eingeben..."}),s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"radio",name:"usernameType",checked:O==="stressfrei",onChange:()=>{C("stressfrei"),d("portalUsername","")},className:"text-blue-600"}),s.jsx("span",{className:"text-sm",children:"Stressfrei-Wechseln Adresse"})]}),O==="stressfrei"&&s.jsx(Le,{value:w,onChange:I=>R(I.target.value),options:M.map(I=>({value:I.id,label:I.email+(I.notes?` (${I.notes})`:"")})),placeholder:M.length===0?"Keine Stressfrei-Adressen vorhanden":"Adresse auswählen..."}),O==="stressfrei"&&M.length===0&&s.jsx("p",{className:"text-xs text-amber-600",children:"Keine Stressfrei-Wechseln Adressen für diesen Kunden vorhanden. Bitte zuerst beim Kunden anlegen."})]})]}),s.jsxs("div",{className:"mt-8",children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:a?"Neues Passwort (leer lassen = unverändert)":"Portal Passwort"}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:Q?"text":"password",...l("portalPassword"),className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),s.jsx("button",{type:"button",onClick:()=>ee(!Q),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:Q?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]})]})]})}),["ELECTRICITY","GAS"].includes(p)&&s.jsx(X,{className:"mb-6",title:p==="ELECTRICITY"?"Strom-Details":"Gas-Details",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(Le,{label:"Zähler",...l("meterId"),options:ml.filter(I=>I.type===p).map(I=>({value:I.id,label:`${I.meterNumber}${I.location?` (${I.location})`:""}`}))}),s.jsx(K,{label:`Jahresverbrauch (${p==="ELECTRICITY"?"kWh":"m³"})`,type:"number",...l("annualConsumption")}),s.jsx(K,{label:"Grundpreis (€/Monat)",type:"number",step:"0.01",...l("basePrice")}),s.jsx(K,{label:`Arbeitspreis (ct/${p==="ELECTRICITY"?"kWh":"m³"})`,type:"number",step:"0.01",...l("unitPrice")}),s.jsx(K,{label:"Bonus (€)",type:"number",step:"0.01",...l("bonus")}),s.jsx(K,{label:"Vorversorger",...l("previousProviderName")}),s.jsx(K,{label:"Kundennr. beim Vorversorger",...l("previousCustomerNumber")})]})}),["DSL","CABLE","FIBER"].includes(p)&&s.jsxs(s.Fragment,{children:[s.jsx(X,{className:"mb-6",title:p==="DSL"?"DSL-Details":p==="CABLE"?"Kabelinternet-Details":"Glasfaser-Details",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(K,{label:"Download (Mbit/s)",type:"number",...l("downloadSpeed")}),s.jsx(K,{label:"Upload (Mbit/s)",type:"number",...l("uploadSpeed")}),s.jsx(K,{label:"Router Modell",...l("routerModel")}),s.jsx(K,{label:"Router Seriennummer",...l("routerSerialNumber")}),s.jsx(K,{label:"Installationsdatum",type:"date",...l("installationDate"),value:u("installationDate")||"",onClear:()=>d("installationDate","")}),p==="FIBER"&&s.jsx(K,{label:"Home-ID",...l("homeId")}),((Hm=Ce==null?void 0:Ce.name)==null?void 0:Hm.toLowerCase().includes("vodafone"))&&["DSL","CABLE"].includes(p)&&s.jsx(K,{label:"Aktivierungscode",...l("activationCode")})]})}),s.jsx(X,{className:"mb-6",title:"Internet-Zugangsdaten (verschlüsselt)",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(K,{label:"Benutzername",...l("internetUsername")}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:a?"Neues Passwort (leer = beibehalten)":"Passwort"}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:fe?"text":"password",...l("internetPassword"),className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),s.jsx("button",{type:"button",onClick:()=>ue(!fe),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:fe?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]})]})]})}),s.jsxs(X,{className:"mb-6",title:"Rufnummern & SIP-Zugangsdaten",children:[s.jsx("p",{className:"text-sm text-gray-500 mb-4",children:"Hier können Sie Festnetz-Rufnummern mit SIP-Zugangsdaten erfassen."}),_.length>0&&s.jsx("div",{className:"space-y-4 mb-4",children:_.map((I,ne)=>s.jsxs("div",{className:"p-4 border rounded-lg bg-gray-50",children:[s.jsxs("div",{className:"flex justify-between items-center mb-3",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsxs("span",{className:"font-medium",children:["Rufnummer ",ne+1]}),s.jsxs("label",{className:"flex items-center gap-1 text-sm",children:[s.jsx("input",{type:"checkbox",checked:I.isMain,onChange:ye=>{const le=[..._];ye.target.checked?le.forEach((xe,Xe)=>xe.isMain=Xe===ne):le[ne].isMain=!1,L(le)},className:"rounded border-gray-300"}),"Hauptnummer"]})]}),s.jsx(T,{type:"button",variant:"ghost",size:"sm",onClick:()=>{L(_.filter((ye,le)=>le!==ne))},children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3",children:[s.jsx(K,{label:"Rufnummer",value:I.phoneNumber,onChange:ye=>{const le=[..._];le[ne].phoneNumber=ye.target.value,L(le)},placeholder:"z.B. 030 123456"}),s.jsx(K,{label:"SIP-Benutzername",value:I.sipUsername,onChange:ye=>{const le=[..._];le[ne].sipUsername=ye.target.value,L(le)}}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:I.hasExistingSipPassword?"SIP-Passwort (bereits hinterlegt)":"SIP-Passwort"}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:nt[ne]?"text":"password",value:I.sipPassword,onChange:ye=>{const le=[..._];le[ne].sipPassword=ye.target.value,L(le)},placeholder:I.hasExistingSipPassword?"Leer = beibehalten":"",className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),s.jsx("button",{type:"button",onClick:()=>H(ye=>({...ye,[ne]:!ye[ne]})),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:nt[ne]?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]})]}),s.jsx(K,{label:"SIP-Server",value:I.sipServer,onChange:ye=>{const le=[..._];le[ne].sipServer=ye.target.value,L(le)},placeholder:"z.B. sip.provider.de"})]})]},ne))}),s.jsxs(T,{type:"button",variant:"secondary",onClick:()=>{L([..._,{phoneNumber:"",sipUsername:"",sipPassword:"",sipServer:"",isMain:_.length===0}])},children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Rufnummer hinzufügen"]})]})]}),p==="MOBILE"&&s.jsxs(s.Fragment,{children:[s.jsxs(X,{className:"mb-6",title:"Mobilfunk-Details",children:[s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(K,{label:"Datenvolumen (GB)",type:"number",...l("dataVolume")}),s.jsx(K,{label:"Inklusiv-Minuten",type:"number",...l("includedMinutes")}),s.jsx(K,{label:"Inklusiv-SMS",type:"number",...l("includedSMS")}),s.jsx(K,{label:"Gerät (Modell)",...l("deviceModel")}),s.jsx(K,{label:"Gerät (IMEI)",...l("deviceImei")})]}),s.jsx("div",{className:"mt-4 pt-4 border-t",children:s.jsxs("label",{className:"flex items-start gap-3 cursor-pointer",children:[s.jsx("input",{type:"checkbox",...l("requiresMultisim"),className:"mt-1 rounded border-gray-300"}),s.jsxs("div",{children:[s.jsx("span",{className:"font-medium",children:"Multisim erforderlich"}),s.jsx("p",{className:"text-sm text-amber-600 mt-1",children:"Hinweis: Multisim ist bei Klarmobil, Congstar und Otelo nicht buchbar. Muss Freenet oder vergleichbar sein."})]})]})})]}),s.jsxs(X,{className:"mb-6",title:"SIM-Karten",children:[s.jsx("p",{className:"text-sm text-gray-500 mb-4",children:"Hier können Sie alle SIM-Karten zum Vertrag erfassen (Hauptkarte und Multisim-Karten)."}),P.length>0&&s.jsx("div",{className:"space-y-4 mb-4",children:P.map((I,ne)=>s.jsxs("div",{className:"p-4 border rounded-lg bg-gray-50",children:[s.jsxs("div",{className:"flex justify-between items-center mb-3",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsxs("span",{className:"font-medium",children:["SIM-Karte ",ne+1]}),s.jsxs("label",{className:"flex items-center gap-1 text-sm",children:[s.jsx("input",{type:"checkbox",checked:I.isMain,onChange:ye=>{const le=[...P];ye.target.checked?le.forEach((xe,Xe)=>xe.isMain=Xe===ne):le[ne].isMain=!1,A(le)},className:"rounded border-gray-300"}),"Hauptkarte"]}),s.jsxs("label",{className:"flex items-center gap-1 text-sm",children:[s.jsx("input",{type:"checkbox",checked:I.isMultisim,onChange:ye=>{const le=[...P];le[ne].isMultisim=ye.target.checked,A(le)},className:"rounded border-gray-300"}),"Multisim"]})]}),s.jsx(T,{type:"button",variant:"ghost",size:"sm",onClick:()=>{A(P.filter((ye,le)=>le!==ne))},children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3",children:[s.jsx(K,{label:"Rufnummer",value:I.phoneNumber,onChange:ye=>{const le=[...P];le[ne].phoneNumber=ye.target.value,A(le)},placeholder:"z.B. 0171 1234567"}),s.jsx(K,{label:"SIM-Kartennummer",value:I.simCardNumber,onChange:ye=>{const le=[...P];le[ne].simCardNumber=ye.target.value,A(le)},placeholder:"ICCID"}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:I.hasExistingPin?"PIN (bereits hinterlegt)":"PIN"}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:ke[ne]?"text":"password",value:I.pin,onChange:ye=>{const le=[...P];le[ne].pin=ye.target.value,A(le)},placeholder:I.hasExistingPin?"Leer = beibehalten":"4-stellig",className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),s.jsx("button",{type:"button",onClick:()=>Ae(ye=>({...ye,[ne]:!ye[ne]})),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:ke[ne]?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:I.hasExistingPuk?"PUK (bereits hinterlegt)":"PUK"}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:rt[ne]?"text":"password",value:I.puk,onChange:ye=>{const le=[...P];le[ne].puk=ye.target.value,A(le)},placeholder:I.hasExistingPuk?"Leer = beibehalten":"8-stellig",className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),s.jsx("button",{type:"button",onClick:()=>St(ye=>({...ye,[ne]:!ye[ne]})),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:rt[ne]?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]})]})]})]},ne))}),s.jsxs(T,{type:"button",variant:"secondary",onClick:()=>{A([...P,{phoneNumber:"",simCardNumber:"",pin:"",puk:"",isMultisim:!1,isMain:P.length===0}])},children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"SIM-Karte hinzufügen"]})]})]}),p==="TV"&&s.jsx(X,{className:"mb-6",title:"TV-Details",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(K,{label:"Receiver Modell",...l("receiverModel")}),s.jsx(K,{label:"Smartcard-Nummer",...l("smartcardNumber")}),s.jsx(K,{label:"Paket",...l("tvPackage"),placeholder:"z.B. Basis, Premium, Sport"})]})}),p==="CAR_INSURANCE"&&s.jsx(X,{className:"mb-6",title:"KFZ-Versicherung Details",children:s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[s.jsx(K,{label:"Kennzeichen",...l("licensePlate")}),s.jsx(K,{label:"HSN",...l("hsn")}),s.jsx(K,{label:"TSN",...l("tsn")}),s.jsx(K,{label:"FIN (VIN)",...l("vin")}),s.jsx(K,{label:"Fahrzeugtyp",...l("vehicleType")}),s.jsx(K,{label:"Erstzulassung",type:"date",...l("firstRegistration"),value:u("firstRegistration")||"",onClear:()=>d("firstRegistration","")}),s.jsx(K,{label:"SF-Klasse",...l("noClaimsClass")}),s.jsx(Le,{label:"Versicherungsart",...l("insuranceType"),options:[{value:"LIABILITY",label:"Haftpflicht"},{value:"PARTIAL",label:"Teilkasko"},{value:"FULL",label:"Vollkasko"}]}),s.jsx(K,{label:"SB Teilkasko (€)",type:"number",...l("deductiblePartial")}),s.jsx(K,{label:"SB Vollkasko (€)",type:"number",...l("deductibleFull")}),s.jsx(K,{label:"Versicherungsscheinnummer",...l("policyNumber")}),s.jsx(K,{label:"Vorversicherer",...l("previousInsurer")})]})}),s.jsx(X,{className:"mb-6",title:"Notizen",children:s.jsx("textarea",{...l("notes"),rows:4,className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"Interne Notizen..."})}),s.jsxs("div",{className:"flex justify-end gap-4",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:()=>n(-1),children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:Sn,children:Sn?"Speichern...":"Speichern"})]})]})]})}const xk={ELECTRICITY:$m,GAS:L0,DSL:fa,CABLE:fa,FIBER:fa,MOBILE:Om,TV:_0,CAR_INSURANCE:T0},gk={ELECTRICITY:"Strom",GAS:"Gas",DSL:"DSL",CABLE:"Kabel",FIBER:"Glasfaser",MOBILE:"Mobilfunk",TV:"TV",CAR_INSURANCE:"KFZ"},yk={critical:"bg-red-100 border-red-300 text-red-800",warning:"bg-yellow-100 border-yellow-300 text-yellow-800",ok:"bg-green-100 border-green-300 text-green-800",none:"bg-gray-100 border-gray-300 text-gray-800"},vk={critical:"danger",warning:"warning",ok:"success",none:"default"},jk={cancellation_deadline:M0,contract_ending:vn,missing_cancellation_letter:at,missing_cancellation_confirmation:at,missing_portal_credentials:W2,missing_customer_number:at,missing_provider:at,missing_address:at,missing_bank:at,missing_meter:$m,missing_sim:Om,open_tasks:Qi,pending_status:vn,draft_status:at},bk={cancellationDeadlines:"Kündigungsfristen",contractEnding:"Vertragsenden",missingCredentials:"Fehlende Zugangsdaten",missingData:"Fehlende Daten",openTasks:"Offene Aufgaben",pendingContracts:"Wartende Verträge"};function Nk(){var y;const[e,t]=rc(),[n,r]=b.useState(new Set),a=e.get("filter"),[i,l]=b.useState(a||"all");b.useEffect(()=>{i==="all"?e.delete("filter"):e.set("filter",i),t(e,{replace:!0})},[i,e,t]);const{data:o,isLoading:c,error:u}=he({queryKey:["contract-cockpit"],queryFn:()=>$e.getCockpit(),staleTime:0}),d=N=>{r(v=>{const g=new Set(v);return g.has(N)?g.delete(N):g.add(N),g})},h=b.useMemo(()=>{var v;if(!((v=o==null?void 0:o.data)!=null&&v.contracts))return[];const N=o.data.contracts;switch(i){case"critical":return N.filter(g=>g.highestUrgency==="critical");case"warning":return N.filter(g=>g.highestUrgency==="warning");case"ok":return N.filter(g=>g.highestUrgency==="ok");case"deadlines":return N.filter(g=>g.issues.some(x=>["cancellation_deadline","contract_ending"].includes(x.type)));case"credentials":return N.filter(g=>g.issues.some(x=>x.type.includes("credentials")));case"data":return N.filter(g=>g.issues.some(x=>x.type.startsWith("missing_")&&!x.type.includes("credentials")));case"tasks":return N.filter(g=>g.issues.some(x=>["open_tasks","pending_status","draft_status"].includes(x.type)));default:return N}},[(y=o==null?void 0:o.data)==null?void 0:y.contracts,i]);if(c)return s.jsx("div",{className:"flex items-center justify-center py-12",children:s.jsx("div",{className:"text-gray-500",children:"Laden..."})});if(u||!(o!=null&&o.data))return s.jsx("div",{className:"text-center py-12",children:s.jsx("p",{className:"text-red-500",children:"Fehler beim Laden des Cockpits"})});const{summary:p,thresholds:m}=o.data,f=N=>{var x,j,k,F;const v=n.has(N.id),g=xk[N.type]||at;return s.jsxs("div",{className:`border rounded-lg mb-2 ${yk[N.highestUrgency]}`,children:[s.jsxs("div",{className:"flex items-center p-4 cursor-pointer hover:bg-opacity-50",onClick:()=>d(N.id),children:[s.jsx("div",{className:"w-6 mr-2",children:v?s.jsx(mc,{className:"w-5 h-5"}):s.jsx(rs,{className:"w-5 h-5"})}),s.jsx(g,{className:"w-5 h-5 mr-3"}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx(Ne,{to:`/contracts/${N.id}`,state:{from:"cockpit",filter:i!=="all"?i:void 0},className:"font-medium hover:underline",onClick:E=>E.stopPropagation(),children:N.contractNumber}),s.jsxs(ge,{variant:vk[N.highestUrgency],children:[N.issues.length," ",N.highestUrgency==="ok"?N.issues.length===1?"Hinweis":"Hinweise":N.issues.length===1?"Problem":"Probleme"]}),s.jsx("span",{className:"text-sm",children:gk[N.type]})]}),s.jsxs("div",{className:"text-sm mt-1",children:[s.jsxs(Ne,{to:`/customers/${N.customer.id}`,className:"hover:underline",onClick:E=>E.stopPropagation(),children:[N.customer.customerNumber," - ",N.customer.name]}),(((x=N.provider)==null?void 0:x.name)||N.providerName)&&s.jsxs("span",{className:"ml-2",children:["| ",((j=N.provider)==null?void 0:j.name)||N.providerName,(((k=N.tariff)==null?void 0:k.name)||N.tariffName)&&` - ${((F=N.tariff)==null?void 0:F.name)||N.tariffName}`]})]})]}),s.jsx(Ne,{to:`/contracts/${N.id}`,state:{from:"cockpit",filter:i!=="all"?i:void 0},className:"ml-4 p-2 hover:bg-white hover:bg-opacity-50 rounded",onClick:E=>E.stopPropagation(),title:"Zum Vertrag",children:s.jsx(De,{className:"w-4 h-4"})})]}),v&&s.jsx("div",{className:"border-t px-4 py-3 bg-white bg-opacity-50",children:s.jsx("div",{className:"space-y-2",children:N.issues.map((E,S)=>{const P=jk[E.type]||un,A=E.urgency==="critical"?un:E.urgency==="warning"?nr:E.urgency==="ok"?gs:vn;return s.jsxs("div",{className:"flex items-start gap-3 text-sm",children:[s.jsx(A,{className:`w-4 h-4 mt-0.5 flex-shrink-0 ${E.urgency==="critical"?"text-red-500":E.urgency==="warning"?"text-yellow-500":E.urgency==="ok"?"text-green-500":"text-gray-500"}`}),s.jsx(P,{className:"w-4 h-4 mt-0.5 flex-shrink-0 text-gray-500"}),s.jsxs("div",{children:[s.jsx("span",{className:"font-medium",children:E.label}),E.details&&s.jsx("span",{className:"text-gray-600 ml-2",children:E.details})]})]},S)})})})]},N.id)};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(un,{className:"w-6 h-6 text-red-500"}),s.jsx("h1",{className:"text-2xl font-bold",children:"Vertrags-Cockpit"})]}),s.jsx(Ne,{to:"/settings/deadlines",className:"text-sm text-blue-600 hover:underline",children:"Fristenschwellen anpassen"})]}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4 mb-6",children:[s.jsx(X,{className:"!p-4",children:s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"p-2 bg-red-100 rounded-lg",children:s.jsx(un,{className:"w-6 h-6 text-red-500"})}),s.jsxs("div",{children:[s.jsx("p",{className:"text-2xl font-bold text-red-600",children:p.criticalCount}),s.jsxs("p",{className:"text-sm text-gray-500",children:["Kritisch (<",m.criticalDays," Tage)"]})]})]})}),s.jsx(X,{className:"!p-4",children:s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"p-2 bg-yellow-100 rounded-lg",children:s.jsx(nr,{className:"w-6 h-6 text-yellow-500"})}),s.jsxs("div",{children:[s.jsx("p",{className:"text-2xl font-bold text-yellow-600",children:p.warningCount}),s.jsxs("p",{className:"text-sm text-gray-500",children:["Warnung (<",m.warningDays," Tage)"]})]})]})}),s.jsx(X,{className:"!p-4",children:s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"p-2 bg-green-100 rounded-lg",children:s.jsx(gs,{className:"w-6 h-6 text-green-500"})}),s.jsxs("div",{children:[s.jsx("p",{className:"text-2xl font-bold text-green-600",children:p.okCount}),s.jsxs("p",{className:"text-sm text-gray-500",children:["OK (<",m.okDays," Tage)"]})]})]})}),s.jsx(X,{className:"!p-4",children:s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("div",{className:"p-2 bg-gray-100 rounded-lg",children:s.jsx(at,{className:"w-6 h-6 text-gray-500"})}),s.jsxs("div",{children:[s.jsx("p",{className:"text-2xl font-bold text-gray-600",children:p.totalContracts}),s.jsx("p",{className:"text-sm text-gray-500",children:"Verträge mit Handlungsbedarf"})]})]})})]}),s.jsx(X,{className:"mb-6",children:s.jsx("div",{className:"flex flex-wrap gap-4",children:Object.entries(p.byCategory).map(([N,v])=>v>0&&s.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[s.jsxs("span",{className:"font-medium",children:[bk[N]||N,":"]}),s.jsx(ge,{variant:"default",children:v})]},N))})}),s.jsx(X,{className:"mb-6",children:s.jsxs("div",{className:"flex items-center gap-4",children:[s.jsx("span",{className:"text-sm text-gray-600",children:"Filter:"}),s.jsx(Le,{value:i,onChange:N=>l(N.target.value),options:[{value:"all",label:`Alle (${o.data.contracts.length})`},{value:"critical",label:`Kritisch (${p.criticalCount})`},{value:"warning",label:`Warnung (${p.warningCount})`},{value:"ok",label:`OK (${p.okCount})`},{value:"deadlines",label:`Fristen (${p.byCategory.cancellationDeadlines+p.byCategory.contractEnding})`},{value:"credentials",label:`Zugangsdaten (${p.byCategory.missingCredentials})`},{value:"data",label:`Fehlende Daten (${p.byCategory.missingData})`},{value:"tasks",label:`Aufgaben/Status (${p.byCategory.openTasks+p.byCategory.pendingContracts})`}],className:"w-64"}),s.jsxs("span",{className:"text-sm text-gray-500",children:[h.length," Verträge angezeigt"]})]})}),h.length===0?s.jsx(X,{children:s.jsx("div",{className:"text-center py-8 text-gray-500",children:i==="all"?s.jsxs(s.Fragment,{children:[s.jsx(gs,{className:"w-12 h-12 mx-auto mb-4 text-green-500"}),s.jsx("p",{className:"text-lg font-medium",children:"Alles in Ordnung!"}),s.jsx("p",{children:"Keine Verträge mit Handlungsbedarf gefunden."})]}):s.jsx("p",{children:"Keine Verträge für diesen Filter gefunden."})})}):s.jsx("div",{children:h.map(f)})]})}const sx={OPEN:"Offen",COMPLETED:"Erledigt"},wk={OPEN:"warning",COMPLETED:"success"};function Sk(){var q;const e=Vt(),t=pe(),{isCustomerPortal:n,user:r,hasPermission:a}=Be(),[i,l]=b.useState("OPEN"),[o,c]=b.useState(new Set),[u,d]=b.useState(!1),[h,p]=b.useState({}),m=n?"Support-Anfragen":"Aufgaben",f=n?"Anfrage":"Aufgabe",{data:y,isLoading:N}=he({queryKey:["app-settings-public"],queryFn:()=>Or.getPublic(),enabled:n,staleTime:0}),v=!N&&((q=y==null?void 0:y.data)==null?void 0:q.customerSupportTicketsEnabled)==="true",{data:g,isLoading:x}=he({queryKey:["all-tasks",i],queryFn:()=>st.getAll({status:i||void 0}),staleTime:0}),j=W({mutationFn:O=>st.completeSubtask(O),onSuccess:()=>{t.invalidateQueries({queryKey:["all-tasks"]}),t.invalidateQueries({queryKey:["task-stats"]})}}),k=W({mutationFn:O=>st.reopenSubtask(O),onSuccess:()=>{t.invalidateQueries({queryKey:["all-tasks"]}),t.invalidateQueries({queryKey:["task-stats"]})}}),F=W({mutationFn:({taskId:O,title:C})=>n?st.createReply(O,C):st.createSubtask(O,C),onSuccess:(O,{taskId:C})=>{t.invalidateQueries({queryKey:["all-tasks"]}),p(w=>({...w,[C]:""}))}}),E=b.useMemo(()=>{var R;if(!(g!=null&&g.data))return{ownTasks:[],representedTasks:[],allTasks:[]};const O=g.data;if(!n)return{allTasks:O,ownTasks:[],representedTasks:[]};const C=[],w=[];for(const Q of O)((R=Q.contract)==null?void 0:R.customerId)===(r==null?void 0:r.customerId)?C.push(Q):w.push(Q);return{ownTasks:C,representedTasks:w,allTasks:[]}},[g==null?void 0:g.data,n,r==null?void 0:r.customerId]),S=O=>{c(C=>{const w=new Set(C);return w.has(O)?w.delete(O):w.add(O),w})},P=O=>{j.isPending||k.isPending||(O.status==="COMPLETED"?k.mutate(O.id):j.mutate(O.id))},A=O=>{var w;const C=(w=h[O])==null?void 0:w.trim();C&&F.mutate({taskId:O,title:C})},_=!n&&a("contracts:update"),L=(O,C=!1)=>{var H,ke,Ae,rt,St,At;const w=o.has(O.id),R=O.subtasks&&O.subtasks.length>0,Q=((H=O.subtasks)==null?void 0:H.filter(G=>G.status==="COMPLETED").length)||0,ee=((ke=O.subtasks)==null?void 0:ke.length)||0,fe=O.status==="COMPLETED",ue=O.contract?`${O.contract.contractNumber} - ${((Ae=O.contract.provider)==null?void 0:Ae.name)||O.contract.providerName||"Kein Anbieter"}`:`Vertrag #${O.contractId}`,nt=(rt=O.contract)!=null&&rt.customer?O.contract.customer.companyName||`${O.contract.customer.firstName} ${O.contract.customer.lastName}`:"";return s.jsxs("div",{className:"border rounded-lg mb-2",children:[s.jsxs("div",{className:"flex items-center p-4 hover:bg-gray-50 cursor-pointer",onClick:()=>S(O.id),children:[s.jsx("div",{className:"w-6 mr-2",children:w?s.jsx(mc,{className:"w-5 h-5 text-gray-400"}):s.jsx(rs,{className:"w-5 h-5 text-gray-400"})}),s.jsx("div",{className:"mr-3",children:O.status==="COMPLETED"?s.jsx(gs,{className:"w-5 h-5 text-green-500"}):s.jsx(vn,{className:"w-5 h-5 text-yellow-500"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx("span",{className:"font-medium",children:O.title}),s.jsx(ge,{variant:wk[O.status],children:sx[O.status]}),R&&s.jsxs("span",{className:"text-xs text-gray-500",children:["(",Q,"/",ee," erledigt)"]})]}),s.jsxs("div",{className:"text-sm text-gray-500 mt-1 flex items-center gap-2",children:[s.jsx(at,{className:"w-4 h-4"}),s.jsx(Ne,{to:`/contracts/${O.contractId}`,className:"text-blue-600 hover:underline",onClick:G=>G.stopPropagation(),children:ue}),C&&nt&&s.jsxs(s.Fragment,{children:[s.jsx("span",{className:"text-gray-400",children:"|"}),s.jsx("span",{children:nt})]})]}),O.description&&s.jsx("p",{className:"text-sm text-gray-600 mt-1 line-clamp-2",children:O.description})]}),s.jsx("div",{className:"ml-4 flex gap-2",children:s.jsx(T,{variant:"ghost",size:"sm",onClick:G=>{G.stopPropagation(),e(`/contracts/${O.contractId}`)},title:"Zum Vertrag",children:s.jsx(De,{className:"w-4 h-4"})})})]}),w&&s.jsxs("div",{className:"border-t bg-gray-50 px-4 py-3",children:[R&&s.jsx("div",{className:"space-y-2 mb-4",children:(St=O.subtasks)==null?void 0:St.map(G=>{const ze=new Date(G.createdAt).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"});return s.jsxs("div",{className:`flex items-start gap-2 text-sm ml-6 ${_?"cursor-pointer hover:bg-gray-100 rounded px-2 py-1 -mx-2":""}`,onClick:_?()=>P(G):void 0,children:[s.jsx("span",{className:"flex-shrink-0 mt-0.5",children:G.status==="COMPLETED"?s.jsx(gs,{className:"w-4 h-4 text-green-500"}):s.jsx(to,{className:"w-4 h-4 text-gray-400"})}),s.jsxs("span",{className:G.status==="COMPLETED"?"text-gray-500 line-through":"",children:[G.title,s.jsxs("span",{className:"text-xs text-gray-400 ml-2",children:[G.createdBy," • ",ze]})]})]},G.id)})}),!fe&&(_||n)&&s.jsxs("div",{className:"flex gap-2 ml-6",children:[s.jsx(K,{placeholder:n?"Antwort schreiben...":"Neue Unteraufgabe...",value:h[O.id]||"",onChange:G=>p(ze=>({...ze,[O.id]:G.target.value})),onKeyDown:G=>{G.key==="Enter"&&!G.shiftKey&&(G.preventDefault(),A(O.id))},className:"flex-1"}),s.jsx(T,{size:"sm",onClick:()=>A(O.id),disabled:!((At=h[O.id])!=null&&At.trim())||F.isPending,children:s.jsx(ul,{className:"w-4 h-4"})})]}),!R&&fe&&s.jsx("p",{className:"text-gray-500 text-sm text-center py-2",children:"Keine Unteraufgaben vorhanden."})]})]},O.id)},V=n?v:a("contracts:update");return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsx("h1",{className:"text-2xl font-bold",children:m}),V&&s.jsxs(T,{onClick:()=>d(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neue ",f]})]}),s.jsx(X,{className:"mb-6",children:s.jsx("div",{className:"flex gap-4 flex-wrap items-center",children:s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-sm text-gray-600",children:"Status:"}),s.jsx(Le,{value:i,onChange:O=>l(O.target.value),options:[{value:"",label:"Alle"},...Object.entries(sx).map(([O,C])=>({value:O,label:C}))],className:"w-40"})]})})}),x?s.jsx(X,{children:s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."})}):s.jsx(s.Fragment,{children:n?s.jsxs("div",{className:"space-y-6",children:[s.jsxs(X,{children:[s.jsxs("div",{className:"flex items-center gap-3 mb-4 pb-3 border-b",children:[s.jsx(_m,{className:"w-5 h-5 text-blue-600"}),s.jsxs("h2",{className:"text-lg font-semibold text-gray-900",children:["Meine ",m]}),s.jsx(ge,{variant:"default",children:E.ownTasks.length})]}),E.ownTasks.length>0?s.jsx("div",{children:E.ownTasks.map(O=>L(O,!1))}):s.jsxs("p",{className:"text-gray-500 text-center py-4",children:["Keine eigenen ",m.toLowerCase()," vorhanden."]})]}),E.representedTasks.length>0&&s.jsxs(X,{children:[s.jsxs("div",{className:"flex items-center gap-3 mb-4 pb-3 border-b",children:[s.jsx(ha,{className:"w-5 h-5 text-purple-600"}),s.jsxs("h2",{className:"text-lg font-semibold text-gray-900",children:[m," freigegebener Kunden"]}),s.jsx(ge,{variant:"default",children:E.representedTasks.length})]}),s.jsx("div",{children:E.representedTasks.map(O=>L(O,!0))})]})]}):s.jsx(X,{children:E.allTasks&&E.allTasks.length>0?s.jsx("div",{children:E.allTasks.map(O=>L(O,!0))}):s.jsxs("div",{className:"text-center py-8 text-gray-500",children:["Keine ",m.toLowerCase()," gefunden."]})})}),n?s.jsx(kk,{isOpen:u,onClose:()=>d(!1)}):s.jsx(Ck,{isOpen:u,onClose:()=>d(!1)})]})}function kk({isOpen:e,onClose:t}){const{user:n}=Be(),r=Vt(),a=pe(),[i,l]=b.useState("own"),[o,c]=b.useState(null),[u,d]=b.useState(""),[h,p]=b.useState(""),[m,f]=b.useState(!1),[y,N]=b.useState(""),{data:v}=he({queryKey:["contracts",n==null?void 0:n.customerId],queryFn:()=>$e.getAll({customerId:n==null?void 0:n.customerId}),enabled:e}),g=b.useMemo(()=>{if(!(v!=null&&v.data))return{own:[],represented:{}};const S=[],P={};for(const A of v.data)if(A.customerId===(n==null?void 0:n.customerId))S.push(A);else{if(!P[A.customerId]){const _=A.customer?A.customer.companyName||`${A.customer.firstName} ${A.customer.lastName}`:`Kunde ${A.customerId}`;P[A.customerId]={name:_,contracts:[]}}P[A.customerId].contracts.push(A)}return{own:S,represented:P}},[v==null?void 0:v.data,n==null?void 0:n.customerId]),x=Object.keys(g.represented).length>0,j=b.useMemo(()=>{var S;return i==="own"?g.own:((S=g.represented[i])==null?void 0:S.contracts)||[]},[i,g]),k=b.useMemo(()=>{if(!y)return j;const S=y.toLowerCase();return j.filter(P=>P.contractNumber.toLowerCase().includes(S)||(P.providerName||"").toLowerCase().includes(S)||(P.tariffName||"").toLowerCase().includes(S))},[j,y]),F=async()=>{if(!(!o||!u.trim())){f(!0);try{await st.createSupportTicket(o,{title:u.trim(),description:h.trim()||void 0}),a.invalidateQueries({queryKey:["all-tasks"]}),a.invalidateQueries({queryKey:["task-stats"]}),t(),d(""),p(""),c(null),l("own"),r(`/contracts/${o}`)}catch(S){console.error("Fehler beim Erstellen der Support-Anfrage:",S),alert("Fehler beim Erstellen der Support-Anfrage. Bitte versuchen Sie es erneut.")}finally{f(!1)}}},E=()=>{d(""),p(""),c(null),l("own"),N(""),t()};return s.jsx(ot,{isOpen:e,onClose:E,title:"Neue Support-Anfrage",children:s.jsxs("div",{className:"space-y-4",children:[x&&s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Kunde"}),s.jsxs("select",{value:i,onChange:S=>{const P=S.target.value;l(P==="own"?"own":parseInt(P)),c(null),N("")},className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500",children:[s.jsx("option",{value:"own",children:"Eigene Verträge"}),Object.entries(g.represented).map(([S,{name:P}])=>s.jsx("option",{value:S,children:P},S))]})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Vertrag *"}),s.jsx(K,{placeholder:"Vertrag suchen...",value:y,onChange:S=>N(S.target.value),className:"mb-2"}),s.jsx("div",{className:"max-h-48 overflow-y-auto border rounded-lg",children:k.length>0?k.map(S=>s.jsxs("div",{onClick:()=>c(S.id),className:`p-3 cursor-pointer border-b last:border-b-0 hover:bg-gray-50 ${o===S.id?"bg-blue-50 border-blue-200":""}`,children:[s.jsx("div",{className:"font-medium",children:S.contractNumber}),s.jsxs("div",{className:"text-sm text-gray-500",children:[S.providerName||"Kein Anbieter",S.tariffName&&` - ${S.tariffName}`]})]},S.id)):s.jsx("div",{className:"p-3 text-gray-500 text-center",children:"Keine Verträge gefunden."})})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Titel *"}),s.jsx(K,{value:u,onChange:S=>d(S.target.value),placeholder:"Kurze Beschreibung Ihres Anliegens"})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Beschreibung"}),s.jsx("textarea",{value:h,onChange:S=>p(S.target.value),placeholder:"Detaillierte Beschreibung (optional)",rows:4,className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),s.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[s.jsx(T,{variant:"secondary",onClick:E,children:"Abbrechen"}),s.jsx(T,{onClick:F,disabled:!o||!u.trim()||m,children:m?"Wird erstellt...":"Anfrage erstellen"})]})]})})}function Ck({isOpen:e,onClose:t}){const n=Vt(),r=pe(),[a,i]=b.useState(null),[l,o]=b.useState(null),[c,u]=b.useState(""),[d,h]=b.useState(""),[p,m]=b.useState(!1),[f,y]=b.useState(!1),[N,v]=b.useState(""),[g,x]=b.useState(""),{data:j}=he({queryKey:["customers-for-task"],queryFn:()=>Nt.getAll({limit:100}),enabled:e}),{data:k}=he({queryKey:["contracts-for-task",a],queryFn:()=>$e.getAll({customerId:a}),enabled:e&&a!==null}),F=b.useMemo(()=>{if(!(j!=null&&j.data))return[];if(!N)return j.data;const _=N.toLowerCase();return j.data.filter(L=>L.customerNumber.toLowerCase().includes(_)||L.firstName.toLowerCase().includes(_)||L.lastName.toLowerCase().includes(_)||(L.companyName||"").toLowerCase().includes(_))},[j==null?void 0:j.data,N]),E=b.useMemo(()=>{if(!(k!=null&&k.data))return[];if(!g)return k.data;const _=g.toLowerCase();return k.data.filter(L=>L.contractNumber.toLowerCase().includes(_)||(L.providerName||"").toLowerCase().includes(_)||(L.tariffName||"").toLowerCase().includes(_))},[k==null?void 0:k.data,g]),S=async()=>{if(!(!l||!c.trim())){y(!0);try{await st.create(l,{title:c.trim(),description:d.trim()||void 0,visibleInPortal:p}),r.invalidateQueries({queryKey:["all-tasks"]}),r.invalidateQueries({queryKey:["task-stats"]}),t(),u(""),h(""),m(!1),o(null),i(null),n(`/contracts/${l}`)}catch(_){console.error("Fehler beim Erstellen der Aufgabe:",_),alert("Fehler beim Erstellen der Aufgabe. Bitte versuchen Sie es erneut.")}finally{y(!1)}}},P=()=>{u(""),h(""),m(!1),o(null),i(null),v(""),x(""),t()},A=_=>{const L=_.companyName||`${_.firstName} ${_.lastName}`;return`${_.customerNumber} - ${L}`};return s.jsx(ot,{isOpen:e,onClose:P,title:"Neue Aufgabe",children:s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Kunde *"}),s.jsx(K,{placeholder:"Kunde suchen...",value:N,onChange:_=>v(_.target.value),className:"mb-2"}),s.jsx("div",{className:"max-h-40 overflow-y-auto border rounded-lg",children:F.length>0?F.map(_=>s.jsx("div",{onClick:()=>{i(_.id),o(null),x("")},className:`p-3 cursor-pointer border-b last:border-b-0 hover:bg-gray-50 ${a===_.id?"bg-blue-50 border-blue-200":""}`,children:s.jsx("div",{className:"font-medium",children:A(_)})},_.id)):s.jsx("div",{className:"p-3 text-gray-500 text-center",children:"Keine Kunden gefunden."})})]}),a&&s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Vertrag *"}),s.jsx(K,{placeholder:"Vertrag suchen...",value:g,onChange:_=>x(_.target.value),className:"mb-2"}),s.jsx("div",{className:"max-h-40 overflow-y-auto border rounded-lg",children:E.length>0?E.map(_=>s.jsxs("div",{onClick:()=>o(_.id),className:`p-3 cursor-pointer border-b last:border-b-0 hover:bg-gray-50 ${l===_.id?"bg-blue-50 border-blue-200":""}`,children:[s.jsx("div",{className:"font-medium",children:_.contractNumber}),s.jsxs("div",{className:"text-sm text-gray-500",children:[_.providerName||"Kein Anbieter",_.tariffName&&` - ${_.tariffName}`]})]},_.id)):s.jsx("div",{className:"p-3 text-gray-500 text-center",children:k?"Keine Verträge gefunden.":"Laden..."})})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Titel *"}),s.jsx(K,{value:c,onChange:_=>u(_.target.value),placeholder:"Aufgabentitel"})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Beschreibung"}),s.jsx("textarea",{value:d,onChange:_=>h(_.target.value),placeholder:"Detaillierte Beschreibung (optional)",rows:3,className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),s.jsx("div",{children:s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:p,onChange:_=>m(_.target.checked),className:"rounded border-gray-300 text-blue-600 focus:ring-blue-500"}),s.jsx("span",{className:"text-sm text-gray-700",children:"Im Kundenportal sichtbar"})]})}),s.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[s.jsx(T,{variant:"secondary",onClick:P,children:"Abbrechen"}),s.jsx(T,{onClick:S,disabled:!l||!c.trim()||f,children:f?"Wird erstellt...":"Aufgabe erstellen"})]})]})})}function Ek(){const[e,t]=b.useState(!1),[n,r]=b.useState(null),[a,i]=b.useState(!1),{hasPermission:l}=Be(),o=pe(),{data:c,isLoading:u}=he({queryKey:["platforms",a],queryFn:()=>Bi.getAll(a)}),d=W({mutationFn:Bi.delete,onSuccess:()=>{o.invalidateQueries({queryKey:["platforms"]})}}),h=m=>{r(m),t(!0)},p=()=>{t(!1),r(null)};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsx("h1",{className:"text-2xl font-bold",children:"Vertriebsplattformen"}),l("platforms:create")&&s.jsxs(T,{onClick:()=>t(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neue Plattform"]})]}),s.jsxs(X,{children:[s.jsx("div",{className:"mb-4",children:s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:a,onChange:m=>i(m.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),u?s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):c!=null&&c.data&&c.data.length>0?s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"border-b",children:[s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Name"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Kontakt"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),s.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),s.jsx("tbody",{children:c.data.map(m=>s.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[s.jsx("td",{className:"py-3 px-4 font-medium",children:m.name}),s.jsx("td",{className:"py-3 px-4 text-gray-500",children:m.contactInfo||"-"}),s.jsx("td",{className:"py-3 px-4",children:s.jsx(ge,{variant:m.isActive?"success":"danger",children:m.isActive?"Aktiv":"Inaktiv"})}),s.jsx("td",{className:"py-3 px-4 text-right",children:s.jsxs("div",{className:"flex justify-end gap-2",children:[l("platforms:update")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>h(m),children:s.jsx(Je,{className:"w-4 h-4"})}),l("platforms:delete")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Plattform wirklich löschen?")&&d.mutate(m.id)},children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})})]},m.id))})]})}):s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Plattformen vorhanden."})]}),s.jsx(Dk,{isOpen:e,onClose:p,platform:n})]})}function Dk({isOpen:e,onClose:t,platform:n}){const r=pe(),[a,i]=b.useState({name:"",contactInfo:"",isActive:!0});b.useState(()=>{i(n?{name:n.name,contactInfo:n.contactInfo||"",isActive:n.isActive}:{name:"",contactInfo:"",isActive:!0})}),n&&a.name!==n.name?i({name:n.name,contactInfo:n.contactInfo||"",isActive:n.isActive}):!n&&a.name;const l=W({mutationFn:Bi.create,onSuccess:()=>{r.invalidateQueries({queryKey:["platforms"]}),t(),i({name:"",contactInfo:"",isActive:!0})}}),o=W({mutationFn:d=>Bi.update(n.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["platforms"]}),t()}}),c=d=>{d.preventDefault(),n?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:n?"Plattform bearbeiten":"Neue Plattform",children:s.jsxs("form",{onSubmit:c,className:"space-y-4",children:[s.jsx(K,{label:"Name *",value:a.name,onChange:d=>i({...a,name:d.target.value}),required:!0}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Kontaktinformationen"}),s.jsx("textarea",{value:a.contactInfo,onChange:d=>i({...a,contactInfo:d.target.value}),rows:3,className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"E-Mail, Telefon, Ansprechpartner..."})]}),n&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}function Pk(){const[e,t]=b.useState(!1),[n,r]=b.useState(null),[a,i]=b.useState(!1),{hasPermission:l}=Be(),o=pe(),{data:c,isLoading:u}=he({queryKey:["cancellation-periods",a],queryFn:()=>Ki.getAll(a)}),d=W({mutationFn:Ki.delete,onSuccess:()=>{o.invalidateQueries({queryKey:["cancellation-periods"]})}}),h=m=>{r(m),t(!0)},p=()=>{t(!1),r(null)};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsx(Ne,{to:"/settings",children:s.jsx(T,{variant:"ghost",size:"sm",children:s.jsx(Gs,{className:"w-4 h-4"})})}),s.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Kündigungsfristen"}),l("platforms:create")&&s.jsxs(T,{onClick:()=>t(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neue Frist"]})]}),s.jsxs(X,{children:[s.jsx("div",{className:"mb-4",children:s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:a,onChange:m=>i(m.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),s.jsxs("div",{className:"mb-4 p-4 bg-blue-50 border border-blue-200 rounded-lg text-sm",children:[s.jsx("strong",{children:"Code-Format:"})," Zahl + Buchstabe (T=Tage, M=Monate, J=Jahre)",s.jsx("br",{}),s.jsx("strong",{children:"Beispiele:"})," 14T = 14 Tage, 3M = 3 Monate, 1J = 1 Jahr"]}),u?s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):c!=null&&c.data&&c.data.length>0?s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"border-b",children:[s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Code"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Beschreibung"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),s.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),s.jsx("tbody",{children:c.data.map(m=>s.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[s.jsx("td",{className:"py-3 px-4 font-mono font-medium",children:m.code}),s.jsx("td",{className:"py-3 px-4",children:m.description}),s.jsx("td",{className:"py-3 px-4",children:s.jsx(ge,{variant:m.isActive?"success":"danger",children:m.isActive?"Aktiv":"Inaktiv"})}),s.jsx("td",{className:"py-3 px-4 text-right",children:s.jsxs("div",{className:"flex justify-end gap-2",children:[l("platforms:update")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>h(m),children:s.jsx(Je,{className:"w-4 h-4"})}),l("platforms:delete")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Kündigungsfrist wirklich löschen?")&&d.mutate(m.id)},children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})})]},m.id))})]})}):s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Kündigungsfristen vorhanden."})]}),s.jsx(Ak,{isOpen:e,onClose:p,period:n})]})}function Ak({isOpen:e,onClose:t,period:n}){const r=pe(),[a,i]=b.useState({code:"",description:"",isActive:!0});b.useEffect(()=>{e&&i(n?{code:n.code,description:n.description,isActive:n.isActive}:{code:"",description:"",isActive:!0})},[e,n]);const l=W({mutationFn:Ki.create,onSuccess:()=>{r.invalidateQueries({queryKey:["cancellation-periods"]}),t(),i({code:"",description:"",isActive:!0})}}),o=W({mutationFn:d=>Ki.update(n.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["cancellation-periods"]}),t()}}),c=d=>{d.preventDefault(),n?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:n?"Kündigungsfrist bearbeiten":"Neue Kündigungsfrist",children:s.jsxs("form",{onSubmit:c,className:"space-y-4",children:[s.jsx(K,{label:"Code *",value:a.code,onChange:d=>i({...a,code:d.target.value.toUpperCase()}),required:!0,placeholder:"z.B. 14T, 3M, 1J"}),s.jsx(K,{label:"Beschreibung *",value:a.description,onChange:d=>i({...a,description:d.target.value}),required:!0,placeholder:"z.B. 14 Tage, 3 Monate, 1 Jahr"}),n&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}function Mk(){const[e,t]=b.useState(!1),[n,r]=b.useState(null),[a,i]=b.useState(!1),{hasPermission:l}=Be(),o=pe(),{data:c,isLoading:u}=he({queryKey:["contract-durations",a],queryFn:()=>qi.getAll(a)}),d=W({mutationFn:qi.delete,onSuccess:()=>{o.invalidateQueries({queryKey:["contract-durations"]})}}),h=m=>{r(m),t(!0)},p=()=>{t(!1),r(null)};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsx(Ne,{to:"/settings",children:s.jsx(T,{variant:"ghost",size:"sm",children:s.jsx(Gs,{className:"w-4 h-4"})})}),s.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Vertragslaufzeiten"}),l("platforms:create")&&s.jsxs(T,{onClick:()=>t(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neue Laufzeit"]})]}),s.jsxs(X,{children:[s.jsx("div",{className:"mb-4",children:s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:a,onChange:m=>i(m.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),s.jsxs("div",{className:"mb-4 p-4 bg-blue-50 border border-blue-200 rounded-lg text-sm",children:[s.jsx("strong",{children:"Code-Format:"})," Zahl + Buchstabe (T=Tage, M=Monate, J=Jahre)",s.jsx("br",{}),s.jsx("strong",{children:"Beispiele:"})," 12M = 12 Monate, 24M = 24 Monate, 2J = 2 Jahre"]}),u?s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):c!=null&&c.data&&c.data.length>0?s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"border-b",children:[s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Code"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Beschreibung"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),s.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),s.jsx("tbody",{children:c.data.map(m=>s.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[s.jsx("td",{className:"py-3 px-4 font-mono font-medium",children:m.code}),s.jsx("td",{className:"py-3 px-4",children:m.description}),s.jsx("td",{className:"py-3 px-4",children:s.jsx(ge,{variant:m.isActive?"success":"danger",children:m.isActive?"Aktiv":"Inaktiv"})}),s.jsx("td",{className:"py-3 px-4 text-right",children:s.jsxs("div",{className:"flex justify-end gap-2",children:[l("platforms:update")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>h(m),children:s.jsx(Je,{className:"w-4 h-4"})}),l("platforms:delete")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Laufzeit wirklich löschen?")&&d.mutate(m.id)},children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})})]},m.id))})]})}):s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Laufzeiten vorhanden."})]}),s.jsx(Tk,{isOpen:e,onClose:p,duration:n})]})}function Tk({isOpen:e,onClose:t,duration:n}){const r=pe(),[a,i]=b.useState({code:"",description:"",isActive:!0});b.useEffect(()=>{e&&i(n?{code:n.code,description:n.description,isActive:n.isActive}:{code:"",description:"",isActive:!0})},[e,n]);const l=W({mutationFn:qi.create,onSuccess:()=>{r.invalidateQueries({queryKey:["contract-durations"]}),t(),i({code:"",description:"",isActive:!0})}}),o=W({mutationFn:d=>qi.update(n.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["contract-durations"]}),t()}}),c=d=>{d.preventDefault(),n?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:n?"Laufzeit bearbeiten":"Neue Laufzeit",children:s.jsxs("form",{onSubmit:c,className:"space-y-4",children:[s.jsx(K,{label:"Code *",value:a.code,onChange:d=>i({...a,code:d.target.value.toUpperCase()}),required:!0,placeholder:"z.B. 12M, 24M, 2J"}),s.jsx(K,{label:"Beschreibung *",value:a.description,onChange:d=>i({...a,description:d.target.value}),required:!0,placeholder:"z.B. 12 Monate, 24 Monate, 2 Jahre"}),n&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}function Fk(){const[e,t]=b.useState(!1),[n,r]=b.useState(null),[a,i]=b.useState(!1),[l,o]=b.useState(new Set),{hasPermission:c}=Be(),u=pe(),{data:d,isLoading:h}=he({queryKey:["providers",a],queryFn:()=>Ra.getAll(a)}),p=W({mutationFn:Ra.delete,onSuccess:()=>{u.invalidateQueries({queryKey:["providers"]})},onError:N=>{alert(N.message)}}),m=N=>{o(v=>{const g=new Set(v);return g.has(N)?g.delete(N):g.add(N),g})},f=N=>{r(N),t(!0)},y=()=>{t(!1),r(null)};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsx(Ne,{to:"/settings",children:s.jsx(T,{variant:"ghost",size:"sm",children:s.jsx(Gs,{className:"w-4 h-4"})})}),s.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Anbieter & Tarife"}),c("providers:create")&&s.jsxs(T,{onClick:()=>t(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neuer Anbieter"]})]}),s.jsxs(X,{children:[s.jsx("div",{className:"mb-4",children:s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:a,onChange:N=>i(N.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),h?s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):d!=null&&d.data&&d.data.length>0?s.jsx("div",{className:"space-y-2",children:d.data.map(N=>s.jsx(Ik,{provider:N,isExpanded:l.has(N.id),onToggle:()=>m(N.id),onEdit:()=>f(N),onDelete:()=>{confirm("Anbieter wirklich löschen?")&&p.mutate(N.id)},hasPermission:c,showInactive:a},N.id))}):s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Anbieter vorhanden."})]}),s.jsx(Lk,{isOpen:e,onClose:y,provider:n})]})}function Ik({provider:e,isExpanded:t,onToggle:n,onEdit:r,onDelete:a,hasPermission:i,showInactive:l}){var f,y;const[o,c]=b.useState(!1),[u,d]=b.useState(null),h=pe(),p=W({mutationFn:k0.delete,onSuccess:()=>{h.invalidateQueries({queryKey:["providers"]})},onError:N=>{alert(N.message)}}),m=((f=e.tariffs)==null?void 0:f.filter(N=>l||N.isActive))||[];return s.jsxs("div",{className:"border rounded-lg",children:[s.jsxs("div",{className:"flex items-center p-4 hover:bg-gray-50",children:[s.jsx("button",{onClick:n,className:"mr-3 p-1 hover:bg-gray-200 rounded",children:t?s.jsx(mc,{className:"w-5 h-5 text-gray-400"}):s.jsx(rs,{className:"w-5 h-5 text-gray-400"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx("span",{className:"font-medium",children:e.name}),s.jsx(ge,{variant:e.isActive?"success":"danger",children:e.isActive?"Aktiv":"Inaktiv"}),s.jsxs("span",{className:"text-sm text-gray-500",children:["(",m.length," Tarife, ",((y=e._count)==null?void 0:y.contracts)||0," Verträge)"]})]}),e.portalUrl&&s.jsxs("a",{href:e.portalUrl,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-blue-600 hover:underline flex items-center gap-1 mt-1",children:[s.jsx(Lm,{className:"w-3 h-3"}),e.portalUrl]})]}),s.jsxs("div",{className:"flex gap-2 ml-4",children:[i("providers:update")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:r,title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),i("providers:delete")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:a,title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]}),t&&s.jsxs("div",{className:"border-t bg-gray-50 p-4",children:[s.jsxs("div",{className:"flex justify-between items-center mb-3",children:[s.jsx("h4",{className:"font-medium text-gray-700",children:"Tarife"}),i("providers:create")&&s.jsxs(T,{size:"sm",onClick:()=>c(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-1"}),"Tarif hinzufügen"]})]}),m.length>0?s.jsx("div",{className:"space-y-2",children:m.map(N=>{var v;return s.jsxs("div",{className:"flex items-center justify-between bg-white p-3 rounded border",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{children:N.name}),s.jsx(ge,{variant:N.isActive?"success":"danger",className:"text-xs",children:N.isActive?"Aktiv":"Inaktiv"}),((v=N._count)==null?void 0:v.contracts)!==void 0&&s.jsxs("span",{className:"text-xs text-gray-500",children:["(",N._count.contracts," Verträge)"]})]}),s.jsxs("div",{className:"flex gap-1",children:[i("providers:update")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{d(N),c(!0)},title:"Bearbeiten",children:s.jsx(Je,{className:"w-3 h-3"})}),i("providers:delete")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Tarif wirklich löschen?")&&p.mutate(N.id)},title:"Löschen",children:s.jsx(ve,{className:"w-3 h-3 text-red-500"})})]})]},N.id)})}):s.jsx("p",{className:"text-sm text-gray-500",children:"Keine Tarife vorhanden."})]}),s.jsx(Rk,{isOpen:o,onClose:()=>{c(!1),d(null)},providerId:e.id,tariff:u})]})}function Lk({isOpen:e,onClose:t,provider:n}){const r=pe(),[a,i]=b.useState({name:"",portalUrl:"",usernameFieldName:"",passwordFieldName:"",isActive:!0});b.useEffect(()=>{e&&i(n?{name:n.name,portalUrl:n.portalUrl||"",usernameFieldName:n.usernameFieldName||"",passwordFieldName:n.passwordFieldName||"",isActive:n.isActive}:{name:"",portalUrl:"",usernameFieldName:"",passwordFieldName:"",isActive:!0})},[e,n]);const l=W({mutationFn:Ra.create,onSuccess:()=>{r.invalidateQueries({queryKey:["providers"]}),t()},onError:d=>{alert(d.message)}}),o=W({mutationFn:d=>Ra.update(n.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["providers"]}),t()},onError:d=>{alert(d.message)}}),c=d=>{d.preventDefault(),n?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:n?"Anbieter bearbeiten":"Neuer Anbieter",children:s.jsxs("form",{onSubmit:c,className:"space-y-4",children:[s.jsx(K,{label:"Anbietername *",value:a.name,onChange:d=>i({...a,name:d.target.value}),required:!0,placeholder:"z.B. Vodafone, E.ON, Allianz"}),s.jsx(K,{label:"Portal-URL (Login-Seite)",value:a.portalUrl,onChange:d=>i({...a,portalUrl:d.target.value}),placeholder:"https://kundenportal.anbieter.de/login"}),s.jsxs("div",{className:"p-3 bg-gray-50 rounded-lg space-y-3",children:[s.jsxs("p",{className:"text-sm text-gray-600",children:[s.jsx("strong",{children:"Auto-Login Felder"})," (optional)",s.jsx("br",{}),"Feldnamen für URL-Parameter beim Auto-Login:"]}),s.jsx(K,{label:"Benutzername-Feldname",value:a.usernameFieldName,onChange:d=>i({...a,usernameFieldName:d.target.value}),placeholder:"z.B. username, email, login"}),s.jsx(K,{label:"Passwort-Feldname",value:a.passwordFieldName,onChange:d=>i({...a,passwordFieldName:d.target.value}),placeholder:"z.B. password, pwd, kennwort"})]}),n&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}function Rk({isOpen:e,onClose:t,providerId:n,tariff:r}){const a=pe(),[i,l]=b.useState({name:"",isActive:!0});b.useEffect(()=>{e&&l(r?{name:r.name,isActive:r.isActive}:{name:"",isActive:!0})},[e,r]);const o=W({mutationFn:h=>Ra.createTariff(n,h),onSuccess:()=>{a.invalidateQueries({queryKey:["providers"]}),t()},onError:h=>{alert(h.message)}}),c=W({mutationFn:h=>k0.update(r.id,h),onSuccess:()=>{a.invalidateQueries({queryKey:["providers"]}),t()},onError:h=>{alert(h.message)}}),u=h=>{h.preventDefault(),r?c.mutate(i):o.mutate(i)},d=o.isPending||c.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:r?"Tarif bearbeiten":"Neuer Tarif",children:s.jsxs("form",{onSubmit:u,className:"space-y-4",children:[s.jsx(K,{label:"Tarifname *",value:i.name,onChange:h=>l({...i,name:h.target.value}),required:!0,placeholder:"z.B. Comfort Plus, Basic 100"}),r&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:i.isActive,onChange:h=>l({...i,isActive:h.target.checked}),className:"rounded"}),"Aktiv"]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:d,children:d?"Speichern...":"Speichern"})]})]})})}const Cd={Zap:s.jsx($m,{className:"w-5 h-5"}),Flame:s.jsx(L0,{className:"w-5 h-5"}),Wifi:s.jsx(fa,{className:"w-5 h-5"}),Cable:s.jsx(U2,{className:"w-5 h-5"}),Network:s.jsx(eS,{className:"w-5 h-5"}),Smartphone:s.jsx(Om,{className:"w-5 h-5"}),Tv:s.jsx(_0,{className:"w-5 h-5"}),Car:s.jsx(T0,{className:"w-5 h-5"}),FileText:s.jsx(at,{className:"w-5 h-5"})},Ok=[{value:"Zap",label:"Blitz (Strom)"},{value:"Flame",label:"Flamme (Gas)"},{value:"Wifi",label:"WLAN (DSL)"},{value:"Cable",label:"Kabel"},{value:"Network",label:"Netzwerk (Glasfaser)"},{value:"Smartphone",label:"Smartphone (Mobilfunk)"},{value:"Tv",label:"TV"},{value:"Car",label:"Auto (KFZ)"},{value:"FileText",label:"Dokument (Sonstige)"}],zk=[{value:"#FFC107",label:"Gelb"},{value:"#FF5722",label:"Orange"},{value:"#2196F3",label:"Blau"},{value:"#9C27B0",label:"Lila"},{value:"#4CAF50",label:"Grün"},{value:"#E91E63",label:"Pink"},{value:"#607D8B",label:"Grau"},{value:"#795548",label:"Braun"},{value:"#00BCD4",label:"Cyan"},{value:"#F44336",label:"Rot"}];function _k(){const[e,t]=b.useState(!1),[n,r]=b.useState(null),[a,i]=b.useState(!1),{hasPermission:l}=Be(),o=pe(),{data:c,isLoading:u}=he({queryKey:["contract-categories",a],queryFn:()=>Vi.getAll(a)}),d=W({mutationFn:Vi.delete,onSuccess:()=>{o.invalidateQueries({queryKey:["contract-categories"]})},onError:m=>{alert(m.message)}}),h=m=>{r(m),t(!0)},p=()=>{t(!1),r(null)};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsx(Ne,{to:"/settings",children:s.jsx(T,{variant:"ghost",size:"sm",children:s.jsx(Gs,{className:"w-4 h-4"})})}),s.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Vertragstypen"}),l("developer:access")&&s.jsxs(T,{onClick:()=>t(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neuer Vertragstyp"]})]}),s.jsxs(X,{children:[s.jsx("div",{className:"mb-4",children:s.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[s.jsx("input",{type:"checkbox",checked:a,onChange:m=>i(m.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),u?s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):c!=null&&c.data&&c.data.length>0?s.jsx("div",{className:"space-y-2",children:c.data.map(m=>{var f;return s.jsxs("div",{className:"flex items-center p-4 border rounded-lg hover:bg-gray-50",children:[s.jsx("div",{className:"mr-3 text-gray-400",children:s.jsx(Q2,{className:"w-5 h-5"})}),s.jsx("div",{className:"w-10 h-10 rounded-lg flex items-center justify-center mr-4",style:{backgroundColor:m.color||"#E5E7EB",color:"#fff"},children:m.icon&&Cd[m.icon]?Cd[m.icon]:s.jsx(at,{className:"w-5 h-5"})}),s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[s.jsx("span",{className:"font-medium",children:m.name}),s.jsx(ge,{variant:m.isActive?"success":"danger",children:m.isActive?"Aktiv":"Inaktiv"}),s.jsxs("span",{className:"text-sm text-gray-500",children:["(",((f=m._count)==null?void 0:f.contracts)||0," Verträge)"]})]}),s.jsxs("div",{className:"text-sm text-gray-500",children:["Code: ",s.jsx("span",{className:"font-mono",children:m.code})]})]}),s.jsxs("div",{className:"flex gap-2 ml-4",children:[l("developer:access")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>h(m),title:"Bearbeiten",children:s.jsx(Je,{className:"w-4 h-4"})}),l("developer:access")&&s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>{confirm("Vertragstyp wirklich löschen?")&&d.mutate(m.id)},title:"Löschen",children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]},m.id)})}):s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Vertragstypen vorhanden."})]}),s.jsx($k,{isOpen:e,onClose:p,category:n})]})}function $k({isOpen:e,onClose:t,category:n}){const r=pe(),[a,i]=b.useState({code:"",name:"",icon:"FileText",color:"#607D8B",sortOrder:0,isActive:!0});b.useEffect(()=>{e&&i(n?{code:n.code,name:n.name,icon:n.icon||"FileText",color:n.color||"#607D8B",sortOrder:n.sortOrder,isActive:n.isActive}:{code:"",name:"",icon:"FileText",color:"#607D8B",sortOrder:0,isActive:!0})},[e,n]);const l=W({mutationFn:Vi.create,onSuccess:()=>{r.invalidateQueries({queryKey:["contract-categories"]}),t()},onError:d=>{alert(d.message)}}),o=W({mutationFn:d=>Vi.update(n.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["contract-categories"]}),t()},onError:d=>{alert(d.message)}}),c=d=>{d.preventDefault(),n?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:n?"Vertragstyp bearbeiten":"Neuer Vertragstyp",children:s.jsxs("form",{onSubmit:c,className:"space-y-4",children:[s.jsx(K,{label:"Code (technisch) *",value:a.code,onChange:d=>i({...a,code:d.target.value.toUpperCase().replace(/[^A-Z0-9_]/g,"")}),required:!0,placeholder:"z.B. ELECTRICITY, MOBILE_BUSINESS",disabled:!!n}),s.jsx(K,{label:"Anzeigename *",value:a.name,onChange:d=>i({...a,name:d.target.value}),required:!0,placeholder:"z.B. Strom, Mobilfunk Business"}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Icon"}),s.jsx("div",{className:"grid grid-cols-4 gap-2",children:Ok.map(d=>s.jsxs("button",{type:"button",onClick:()=>i({...a,icon:d.value}),className:`p-3 border rounded-lg flex flex-col items-center gap-1 text-xs ${a.icon===d.value?"border-blue-500 bg-blue-50":"border-gray-200 hover:bg-gray-50"}`,children:[Cd[d.value],s.jsx("span",{className:"truncate w-full text-center",children:d.label.split(" ")[0]})]},d.value))})]}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Farbe"}),s.jsx("div",{className:"flex flex-wrap gap-2",children:zk.map(d=>s.jsx("button",{type:"button",onClick:()=>i({...a,color:d.value}),className:`w-8 h-8 rounded-full border-2 ${a.color===d.value?"border-gray-800 ring-2 ring-offset-2 ring-gray-400":"border-transparent"}`,style:{backgroundColor:d.value},title:d.label},d.value))})]}),s.jsx(K,{label:"Sortierung",type:"number",value:a.sortOrder,onChange:d=>i({...a,sortOrder:parseInt(d.target.value)||0}),placeholder:"0"}),n&&s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}const Uk=[{value:"0.1",label:"10%"},{value:"0.2",label:"20%"},{value:"0.3",label:"30%"},{value:"0.4",label:"40%"},{value:"0.5",label:"50%"},{value:"0.6",label:"60%"},{value:"0.7",label:"70% (Standard)"},{value:"0.8",label:"80%"},{value:"0.9",label:"90%"},{value:"999",label:"Deaktiviert"}];function Bk(){const{settings:e,updateSettings:t}=D0();return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsx(Ne,{to:"/settings",className:"p-2 hover:bg-gray-100 rounded-lg transition-colors",children:s.jsx(Gs,{className:"w-5 h-5"})}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(De,{className:"w-6 h-6"}),s.jsx("h1",{className:"text-2xl font-bold",children:"Ansicht"})]})]}),s.jsx(X,{title:"Scroll-Verhalten",children:s.jsx("div",{className:"space-y-6",children:s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{children:[s.jsx("p",{className:"font-medium",children:"Nach-oben-Button"}),s.jsx("p",{className:"text-sm text-gray-500",children:"Ab welcher Scroll-Position der Button unten rechts erscheinen soll"})]}),s.jsx("div",{className:"w-48",children:s.jsx(Le,{options:Uk,value:e.scrollToTopThreshold.toString(),onChange:n=>t({scrollToTopThreshold:parseFloat(n.target.value)})})})]})})})]})}function Kk(){const e=pe(),{data:t,isLoading:n}=he({queryKey:["app-settings"],queryFn:()=>Or.getAll()}),[r,a]=b.useState(!1);b.useEffect(()=>{t!=null&&t.data&&a(t.data.customerSupportTicketsEnabled==="true")},[t]);const i=W({mutationFn:o=>Or.update(o),onSuccess:()=>{e.invalidateQueries({queryKey:["app-settings"]}),e.invalidateQueries({queryKey:["app-settings-public"]})}}),l=o=>{a(o),i.mutate({customerSupportTicketsEnabled:o?"true":"false"})};return n?s.jsx("div",{className:"flex items-center justify-center py-12",children:s.jsx("div",{className:"text-gray-500",children:"Laden..."})}):s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsx(Ne,{to:"/settings",className:"text-gray-500 hover:text-gray-700",children:s.jsx(Gs,{className:"w-5 h-5"})}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(Rm,{className:"w-6 h-6"}),s.jsx("h1",{className:"text-2xl font-bold",children:"Kundenportal"})]})]}),s.jsxs(X,{title:"Support-Anfragen",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(Hi,{className:"w-5 h-5 text-gray-500"}),s.jsxs("div",{children:[s.jsx("p",{className:"font-medium",children:"Kunden können Support-Anfragen erstellen"}),s.jsx("p",{className:"text-sm text-gray-500",children:"Wenn aktiviert, können Kunden im Portal Support-Anfragen zu ihren Verträgen erstellen. Diese erscheinen als Aufgaben in der Vertragsdetailansicht."})]})]}),s.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:r,onChange:o=>l(o.target.checked),disabled:i.isPending,className:"sr-only peer"}),s.jsx("div",{className:"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"})]})]}),r&&s.jsx("div",{className:"mt-4 p-3 bg-blue-50 border border-blue-200 rounded-lg",children:s.jsxs("p",{className:"text-sm text-blue-800",children:[s.jsx("strong",{children:"Hinweis:"}),' Kunden sehen diese Anfragen als "Support-Anfragen" in ihrem Portal. Sie können die Anfrage mit einem Titel und einer Beschreibung erstellen. Ihre Mitarbeiter können dann mit Antworten (Unteraufgaben) reagieren.']})})]})]})}function qk(){const e=pe(),{data:t,isLoading:n}=he({queryKey:["app-settings"],queryFn:()=>Or.getAll()}),[r,a]=b.useState("14"),[i,l]=b.useState("42"),[o,c]=b.useState("90"),[u,d]=b.useState(!1);b.useEffect(()=>{t!=null&&t.data&&(a(t.data.deadlineCriticalDays||"14"),l(t.data.deadlineWarningDays||"42"),c(t.data.deadlineOkDays||"90"),d(!1))},[t]);const h=W({mutationFn:f=>Or.update(f),onSuccess:()=>{e.invalidateQueries({queryKey:["app-settings"]}),e.invalidateQueries({queryKey:["contract-cockpit"]}),d(!1)}}),p=()=>{const f=parseInt(r),y=parseInt(i),N=parseInt(o);if(isNaN(f)||isNaN(y)||isNaN(N)){alert("Bitte gültige Zahlen eingeben");return}if(f>=y||y>=N){alert("Die Werte müssen aufsteigend sein: Kritisch < Warnung < OK");return}h.mutate({deadlineCriticalDays:r,deadlineWarningDays:i,deadlineOkDays:o})},m=(f,y)=>{f(y),d(!0)};return n?s.jsx("div",{className:"flex items-center justify-center py-12",children:s.jsx("div",{className:"text-gray-500",children:"Laden..."})}):s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsx(Ne,{to:"/settings",className:"text-gray-500 hover:text-gray-700",children:s.jsx(Gs,{className:"w-5 h-5"})}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(vn,{className:"w-6 h-6"}),s.jsx("h1",{className:"text-2xl font-bold",children:"Fristenschwellen"})]})]}),s.jsxs(X,{title:"Farbkodierung für Fristen",children:[s.jsx("p",{className:"text-gray-600 mb-6",children:"Definiere, ab wann Vertragsfristen als kritisch (rot), Warnung (gelb) oder OK (grün) angezeigt werden sollen. Die Werte geben die Anzahl der Tage bis zur Frist an."}),s.jsxs("div",{className:"space-y-6",children:[s.jsxs("div",{className:"flex items-center gap-4 p-4 bg-red-50 border border-red-200 rounded-lg",children:[s.jsx(un,{className:"w-8 h-8 text-red-500 flex-shrink-0"}),s.jsxs("div",{className:"flex-1",children:[s.jsx("label",{className:"block font-medium text-red-800 mb-1",children:"Kritisch (Rot)"}),s.jsx("p",{className:"text-sm text-red-600 mb-2",children:"Fristen mit weniger als X Tagen werden rot markiert"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(K,{type:"number",min:"1",value:r,onChange:f=>m(a,f.target.value),className:"w-24"}),s.jsx("span",{className:"text-red-700",children:"Tage"})]})]})]}),s.jsxs("div",{className:"flex items-center gap-4 p-4 bg-yellow-50 border border-yellow-200 rounded-lg",children:[s.jsx(nr,{className:"w-8 h-8 text-yellow-500 flex-shrink-0"}),s.jsxs("div",{className:"flex-1",children:[s.jsx("label",{className:"block font-medium text-yellow-800 mb-1",children:"Warnung (Gelb)"}),s.jsx("p",{className:"text-sm text-yellow-600 mb-2",children:"Fristen mit weniger als X Tagen werden gelb markiert"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(K,{type:"number",min:"1",value:i,onChange:f=>m(l,f.target.value),className:"w-24"}),s.jsx("span",{className:"text-yellow-700",children:"Tage"})]})]})]}),s.jsxs("div",{className:"flex items-center gap-4 p-4 bg-green-50 border border-green-200 rounded-lg",children:[s.jsx(gs,{className:"w-8 h-8 text-green-500 flex-shrink-0"}),s.jsxs("div",{className:"flex-1",children:[s.jsx("label",{className:"block font-medium text-green-800 mb-1",children:"OK (Grün)"}),s.jsx("p",{className:"text-sm text-green-600 mb-2",children:"Fristen mit weniger als X Tagen werden grün markiert (darüber nicht angezeigt)"}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(K,{type:"number",min:"1",value:o,onChange:f=>m(c,f.target.value),className:"w-24"}),s.jsx("span",{className:"text-green-700",children:"Tage"})]})]})]})]}),s.jsxs("div",{className:"mt-6 pt-4 border-t flex justify-between items-center",children:[s.jsx("p",{className:"text-sm text-gray-500",children:"Beispiel: Bei 14/42/90 Tagen wird eine Frist die in 10 Tagen abläuft rot, eine in 30 Tagen gelb, und eine in 60 Tagen grün markiert."}),s.jsx(T,{onClick:p,disabled:!u||h.isPending,children:h.isPending?"Speichere...":"Speichern"})]})]})]})}const Vk=[{value:"PLESK",label:"Plesk"},{value:"CPANEL",label:"cPanel"},{value:"DIRECTADMIN",label:"DirectAdmin"}],nx=[{value:"SSL",label:"SSL/TLS",description:"Verschlüsselung von Anfang an"},{value:"STARTTLS",label:"STARTTLS",description:"Startet unverschlüsselt, dann Upgrade"},{value:"NONE",label:"Keine",description:"Keine Verschlüsselung"}],su={name:"",type:"PLESK",apiUrl:"",apiKey:"",username:"",password:"",domain:"stressfrei-wechseln.de",defaultForwardEmail:"",imapEncryption:"SSL",smtpEncryption:"SSL",allowSelfSignedCerts:!1,isActive:!0,isDefault:!1};function Qk(){const e=Vt(),t=pe(),[n,r]=b.useState(!1),[a,i]=b.useState(null),[l,o]=b.useState(su),[c,u]=b.useState(!1),[d,h]=b.useState(null),[p,m]=b.useState(!1),[f,y]=b.useState({}),[N,v]=b.useState(null),{data:g,isLoading:x}=he({queryKey:["email-provider-configs"],queryFn:()=>sn.getConfigs()}),j=W({mutationFn:C=>sn.createConfig(C),onSuccess:()=>{t.invalidateQueries({queryKey:["email-provider-configs"]}),A()}}),k=W({mutationFn:({id:C,data:w})=>sn.updateConfig(C,w),onSuccess:()=>{t.invalidateQueries({queryKey:["email-provider-configs"]}),A()}}),F=W({mutationFn:C=>sn.deleteConfig(C),onSuccess:()=>{t.invalidateQueries({queryKey:["email-provider-configs"]})}}),E=(g==null?void 0:g.data)||[],S=()=>{o(su),i(null),u(!1),h(null),r(!0)},P=C=>{o({name:C.name,type:C.type,apiUrl:C.apiUrl,apiKey:C.apiKey||"",username:C.username||"",password:"",domain:C.domain,defaultForwardEmail:C.defaultForwardEmail||"",imapEncryption:C.imapEncryption??"SSL",smtpEncryption:C.smtpEncryption??"SSL",allowSelfSignedCerts:C.allowSelfSignedCerts??!1,isActive:C.isActive,isDefault:C.isDefault}),i(C.id),u(!1),h(null),r(!0)},A=()=>{r(!1),i(null),o(su),u(!1),h(null)},_=async C=>{var w,R,Q;v(C.id),y(ee=>({...ee,[C.id]:null}));try{const ee=await sn.testConnection({id:C.id}),fe={success:((w=ee.data)==null?void 0:w.success)||!1,message:(R=ee.data)==null?void 0:R.message,error:(Q=ee.data)==null?void 0:Q.error};y(ue=>({...ue,[C.id]:fe}))}catch(ee){y(fe=>({...fe,[C.id]:{success:!1,error:ee instanceof Error?ee.message:"Unbekannter Fehler beim Testen"}}))}finally{v(null)}},L=async()=>{var C,w,R;if(!l.apiUrl||!l.domain){h({success:!1,error:"Bitte geben Sie API-URL und Domain ein."});return}m(!0),h(null);try{const Q=await sn.testConnection({testData:{type:l.type,apiUrl:l.apiUrl,apiKey:l.apiKey||void 0,username:l.username||void 0,password:l.password||void 0,domain:l.domain}});h({success:((C=Q.data)==null?void 0:C.success)||!1,message:(w=Q.data)==null?void 0:w.message,error:(R=Q.data)==null?void 0:R.error})}catch(Q){h({success:!1,error:Q instanceof Error?Q.message:"Unbekannter Fehler beim Verbindungstest"})}finally{m(!1)}},V=C=>{C.preventDefault();const w={name:l.name,type:l.type,apiUrl:l.apiUrl,apiKey:l.apiKey,username:l.username,domain:l.domain,defaultForwardEmail:l.defaultForwardEmail,imapEncryption:l.imapEncryption,smtpEncryption:l.smtpEncryption,allowSelfSignedCerts:l.allowSelfSignedCerts,isActive:l.isActive,isDefault:l.isDefault};l.password&&(w.password=l.password),a?k.mutate({id:a,data:w}):j.mutate(w)},q=(C,w)=>{confirm(`Möchten Sie den Provider "${w}" wirklich löschen?`)&&F.mutate(C)},O=C=>C.error?C.error:C.message?C.message:"Verbindung fehlgeschlagen";return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsxs(T,{variant:"ghost",onClick:()=>e("/settings"),children:[s.jsx(Gs,{className:"w-4 h-4 mr-2"}),"Zurück"]}),s.jsx("h1",{className:"text-2xl font-bold",children:"Email-Provisionierung"})]}),s.jsxs(X,{className:"mb-6",children:[s.jsx("p",{className:"text-gray-600 mb-4",children:'Hier konfigurieren Sie die automatische Erstellung von Stressfrei-Wechseln E-Mail-Adressen. Wenn beim Anlegen einer Stressfrei-Adresse die Option "Bei Provider anlegen" aktiviert ist, wird die E-Mail-Weiterleitung automatisch erstellt.'}),s.jsxs(T,{onClick:S,children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Provider hinzufügen"]})]}),x?s.jsx("div",{className:"text-center py-8",children:"Laden..."}):E.length===0?s.jsx(X,{children:s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Noch keine Email-Provider konfiguriert."})}):s.jsx("div",{className:"space-y-4",children:E.map(C=>{const w=f[C.id],R=N===C.id;return s.jsx(X,{children:s.jsxs("div",{className:"flex items-start justify-between",children:[s.jsxs("div",{className:"flex-1",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("h3",{className:"font-semibold text-lg",children:C.name}),s.jsx("span",{className:"px-2 py-1 text-xs rounded bg-blue-100 text-blue-800",children:C.type}),C.isDefault&&s.jsx("span",{className:"px-2 py-1 text-xs rounded bg-green-100 text-green-800",children:"Standard"}),!C.isActive&&s.jsx("span",{className:"px-2 py-1 text-xs rounded bg-gray-100 text-gray-600",children:"Inaktiv"})]}),s.jsxs("dl",{className:"mt-3 grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",children:[s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"API-URL"}),s.jsx("dd",{className:"font-mono text-xs truncate",children:C.apiUrl})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"Domain"}),s.jsx("dd",{children:C.domain})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"Benutzer"}),s.jsx("dd",{children:C.username||"-"})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-gray-500",children:"Standard-Weiterleitung"}),s.jsx("dd",{className:"truncate",children:C.defaultForwardEmail||"-"})]})]}),w&&s.jsx("div",{className:`mt-3 p-3 rounded-lg text-sm ${w.success?"bg-green-50 text-green-800":"bg-red-50 text-red-800"}`,children:w.success?s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Nd,{className:"w-4 h-4 flex-shrink-0"}),s.jsx("span",{children:"Verbindung erfolgreich!"})]}):s.jsxs("div",{className:"flex items-start gap-2",children:[s.jsx(Fp,{className:"w-4 h-4 flex-shrink-0 mt-0.5"}),s.jsx("span",{children:O(w)})]})})]}),s.jsxs("div",{className:"flex gap-2 ml-4",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>_(C),disabled:R,title:"Verbindung testen",children:R?s.jsx("span",{className:"w-4 h-4 border-2 border-gray-400 border-t-transparent rounded-full animate-spin"}):s.jsx(fa,{className:"w-4 h-4 text-blue-500"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>P(C),children:s.jsx(Je,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>q(C.id,C.name),children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})]})},C.id)})}),n&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsx("div",{className:"bg-white rounded-lg shadow-xl w-full max-w-lg mx-4 max-h-[90vh] overflow-y-auto",children:s.jsxs("div",{className:"p-6",children:[s.jsxs("div",{className:"flex items-center justify-between mb-4",children:[s.jsx("h2",{className:"text-xl font-semibold",children:a?"Provider bearbeiten":"Neuer Provider"}),s.jsx("button",{onClick:A,className:"text-gray-400 hover:text-gray-600",children:s.jsx(jn,{className:"w-5 h-5"})})]}),(j.error||k.error)&&s.jsx("div",{className:"mb-4 p-3 rounded-lg bg-red-50 text-red-800 text-sm",children:s.jsxs("div",{className:"flex items-start gap-2",children:[s.jsx(jn,{className:"w-4 h-4 flex-shrink-0 mt-0.5"}),s.jsx("span",{children:j.error instanceof Error?j.error.message:k.error instanceof Error?k.error.message:"Fehler beim Speichern"})]})}),s.jsxs("form",{onSubmit:V,className:"space-y-4",children:[s.jsx(K,{label:"Name *",value:l.name,onChange:C=>o({...l,name:C.target.value}),placeholder:"z.B. Plesk Hauptserver",required:!0}),s.jsx(Le,{label:"Provider-Typ *",value:l.type,onChange:C=>o({...l,type:C.target.value}),options:Vk}),s.jsx(K,{label:"API-URL *",value:l.apiUrl,onChange:C=>o({...l,apiUrl:C.target.value}),placeholder:"https://server.de:8443",required:!0}),s.jsx(K,{label:"API-Key",value:l.apiKey,onChange:C=>o({...l,apiKey:C.target.value}),placeholder:"Optional - alternativ zu Benutzername/Passwort"}),s.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[s.jsx(K,{label:"Benutzername",value:l.username,onChange:C=>o({...l,username:C.target.value}),placeholder:"admin"}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:a?"Neues Passwort (leer = beibehalten)":"Passwort"}),s.jsxs("div",{className:"relative",children:[s.jsx("input",{type:c?"text":"password",value:l.password,onChange:C=>o({...l,password:C.target.value}),className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),s.jsx("button",{type:"button",onClick:()=>u(!c),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:c?s.jsx(Et,{className:"w-4 h-4"}):s.jsx(De,{className:"w-4 h-4"})})]})]})]}),s.jsx(K,{label:"Domain *",value:l.domain,onChange:C=>o({...l,domain:C.target.value}),placeholder:"stressfrei-wechseln.de",required:!0}),s.jsx(K,{label:"Standard-Weiterleitungsadresse",value:l.defaultForwardEmail,onChange:C=>o({...l,defaultForwardEmail:C.target.value}),placeholder:"info@meinefirma.de",type:"email"}),s.jsx("p",{className:"text-xs text-gray-500 -mt-2",children:"Diese E-Mail-Adresse wird zusätzlich zur Kunden-E-Mail als Weiterleitungsziel hinzugefügt."}),s.jsxs("div",{className:"pt-4 border-t",children:[s.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-3",children:"E-Mail-Verbindungseinstellungen"}),s.jsxs("div",{className:"space-y-4",children:[s.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[s.jsxs("div",{children:[s.jsxs("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:["IMAP Verschlüsselung",s.jsxs("span",{className:"text-gray-400 font-normal ml-1",children:["(Port ",l.imapEncryption==="SSL"?"993":"143",")"]})]}),s.jsx("select",{value:l.imapEncryption,onChange:C=>o({...l,imapEncryption:C.target.value}),className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm",children:nx.map(C=>s.jsxs("option",{value:C.value,children:[C.label," - ",C.description]},C.value))})]}),s.jsxs("div",{children:[s.jsxs("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:["SMTP Verschlüsselung",s.jsxs("span",{className:"text-gray-400 font-normal ml-1",children:["(Port ",l.smtpEncryption==="SSL"?"465":l.smtpEncryption==="STARTTLS"?"587":"25",")"]})]}),s.jsx("select",{value:l.smtpEncryption,onChange:C=>o({...l,smtpEncryption:C.target.value}),className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm",children:nx.map(C=>s.jsxs("option",{value:C.value,children:[C.label," - ",C.description]},C.value))})]})]}),s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:l.allowSelfSignedCerts,onChange:C=>o({...l,allowSelfSignedCerts:C.target.checked}),className:"rounded border-gray-300"}),s.jsx("span",{className:"text-sm",children:"Selbstsignierte Zertifikate erlauben"})]}),s.jsx("p",{className:"text-xs text-gray-500",children:"Aktivieren Sie diese Option für Testumgebungen mit selbstsignierten SSL-Zertifikaten."})]})]}),s.jsxs("div",{className:"flex gap-4",children:[s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:l.isActive,onChange:C=>o({...l,isActive:C.target.checked}),className:"rounded border-gray-300"}),s.jsx("span",{className:"text-sm",children:"Aktiv"})]}),s.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:l.isDefault,onChange:C=>o({...l,isDefault:C.target.checked}),className:"rounded border-gray-300"}),s.jsx("span",{className:"text-sm",children:"Als Standard verwenden"})]})]}),s.jsxs("div",{className:"pt-4 border-t",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:L,disabled:p,className:"w-full",children:p?"Teste Verbindung...":s.jsxs(s.Fragment,{children:[s.jsx(fa,{className:"w-4 h-4 mr-2"}),"Verbindung testen"]})}),d&&s.jsx("div",{className:`mt-2 p-3 rounded-lg text-sm ${d.success?"bg-green-50 text-green-800":"bg-red-50 text-red-800"}`,children:d.success?s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(Nd,{className:"w-4 h-4 flex-shrink-0"}),s.jsx("span",{children:"Verbindung erfolgreich!"})]}):s.jsxs("div",{className:"flex items-start gap-2",children:[s.jsx(Fp,{className:"w-4 h-4 flex-shrink-0 mt-0.5"}),s.jsx("span",{children:O(d)})]})})]}),s.jsxs("div",{className:"flex justify-end gap-3 pt-4 border-t",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:A,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:j.isPending||k.isPending,children:j.isPending||k.isPending?"Speichern...":"Speichern"})]})]})]})})})]})}function Hk(){const[e,t]=b.useState(null),[n,r]=b.useState(null),[a,i]=b.useState(!1),[l,o]=b.useState(""),[c,u]=b.useState(null),d=b.useRef(null),h=pe(),{logout:p}=Be(),{data:m,isLoading:f}=he({queryKey:["backups"],queryFn:()=>or.list()}),y=(m==null?void 0:m.data)||[],N=W({mutationFn:()=>or.create(),onSuccess:()=>{h.invalidateQueries({queryKey:["backups"]})}}),v=W({mutationFn:P=>or.restore(P),onSuccess:()=>{h.invalidateQueries({queryKey:["backups"]}),t(null)}}),g=W({mutationFn:P=>or.delete(P),onSuccess:()=>{h.invalidateQueries({queryKey:["backups"]}),r(null)}}),x=W({mutationFn:P=>or.upload(P),onSuccess:()=>{h.invalidateQueries({queryKey:["backups"]}),u(null),d.current&&(d.current.value="")},onError:P=>{u(P.message||"Upload fehlgeschlagen")}}),j=W({mutationFn:()=>or.factoryReset(),onSuccess:()=>{i(!1),o(""),p()}}),k=P=>{var _;const A=(_=P.target.files)==null?void 0:_[0];if(A){if(!A.name.endsWith(".zip")){u("Nur ZIP-Dateien sind erlaubt");return}u(null),x.mutate(A)}},F=async P=>{const A=localStorage.getItem("token"),_=or.getDownloadUrl(P);try{const L=await fetch(_,{headers:{Authorization:`Bearer ${A}`}});if(!L.ok)throw new Error("Download fehlgeschlagen");const V=await L.blob(),q=window.URL.createObjectURL(V),O=document.createElement("a");O.href=q,O.download=`opencrm-backup-${P}.zip`,document.body.appendChild(O),O.click(),document.body.removeChild(O),window.URL.revokeObjectURL(q)}catch(L){console.error("Download error:",L)}},E=P=>new Date(P).toLocaleString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"}),S=P=>P<1024?`${P} B`:P<1024*1024?`${(P/1024).toFixed(1)} KB`:`${(P/(1024*1024)).toFixed(1)} MB`;return s.jsxs("div",{className:"space-y-6",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{children:[s.jsxs("h2",{className:"text-lg font-semibold text-gray-900 flex items-center gap-2",children:[s.jsx(fc,{className:"w-5 h-5"}),"Datenbank & Zurücksetzen"]}),s.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Backups erstellen, wiederherstellen oder auf Werkseinstellungen zurücksetzen."})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"file",ref:d,accept:".zip",onChange:k,className:"hidden"}),s.jsx(T,{variant:"secondary",onClick:()=>{var P;return(P=d.current)==null?void 0:P.click()},disabled:x.isPending,children:x.isPending?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{className:"w-4 h-4 mr-2 animate-spin"}),"Hochladen..."]}):s.jsxs(s.Fragment,{children:[s.jsx(wd,{className:"w-4 h-4 mr-2"}),"Backup hochladen"]})}),s.jsx(T,{onClick:()=>N.mutate(),disabled:N.isPending,children:N.isPending?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{className:"w-4 h-4 mr-2 animate-spin"}),"Wird erstellt..."]}):s.jsxs(s.Fragment,{children:[s.jsx(Ms,{className:"w-4 h-4 mr-2"}),"Neues Backup"]})})]})]}),c&&s.jsx("div",{className:"bg-red-50 border border-red-200 rounded-lg p-4 text-red-700",children:c}),s.jsxs("div",{className:"bg-blue-50 border border-blue-200 rounded-lg p-4",children:[s.jsx("h4",{className:"text-sm font-medium text-blue-800 mb-2",children:"Hinweise zur Datensicherung"}),s.jsxs("ul",{className:"text-sm text-blue-700 space-y-1 list-disc list-inside",children:[s.jsx("li",{children:"Backups enthalten alle Datenbankdaten und hochgeladene Dokumente"}),s.jsx("li",{children:"Erstellen Sie vor Datenbankmigrationen immer ein Backup"}),s.jsx("li",{children:"Backups können als ZIP heruntergeladen und auf einem anderen System wiederhergestellt werden"}),s.jsx("li",{children:"Bei der Wiederherstellung werden bestehende Daten mit dem Backup-Stand überschrieben"})]})]}),s.jsxs("div",{className:"bg-white rounded-lg border border-gray-200 overflow-hidden",children:[s.jsx("div",{className:"px-4 py-3 bg-gray-50 border-b border-gray-200",children:s.jsx("h3",{className:"text-sm font-medium text-gray-700",children:"Verfügbare Backups"})}),f?s.jsx("div",{className:"flex items-center justify-center py-12",children:s.jsx(Qr,{className:"w-6 h-6 animate-spin text-gray-400"})}):y.length===0?s.jsxs("div",{className:"flex flex-col items-center justify-center py-12 text-gray-500",children:[s.jsx(Mp,{className:"w-12 h-12 mb-2 opacity-30"}),s.jsx("p",{children:"Keine Backups vorhanden"}),s.jsx("p",{className:"text-sm mt-1",children:"Erstellen Sie Ihr erstes Backup"})]}):s.jsx("div",{className:"divide-y divide-gray-200",children:y.map(P=>s.jsx("div",{className:"p-4 hover:bg-gray-50",children:s.jsxs("div",{className:"flex items-start justify-between",children:[s.jsxs("div",{className:"flex-1 min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-3 mb-2",children:[s.jsx("span",{className:"font-mono text-sm bg-gray-100 px-2 py-1 rounded",children:P.name}),s.jsxs("span",{className:"text-sm text-gray-500 flex items-center gap-1",children:[s.jsx(vn,{className:"w-4 h-4"}),E(P.timestamp)]})]}),s.jsxs("div",{className:"flex items-center gap-4 text-sm text-gray-600",children:[s.jsxs("span",{className:"flex items-center gap-1",children:[s.jsx(at,{className:"w-4 h-4"}),P.totalRecords.toLocaleString("de-DE")," Datensätze"]}),s.jsxs("span",{className:"flex items-center gap-1",children:[s.jsx(Mp,{className:"w-4 h-4"}),S(P.sizeBytes)]}),P.hasUploads&&s.jsxs("span",{className:"flex items-center gap-1 text-green-600",children:[s.jsx(V2,{className:"w-4 h-4"}),"Dokumente (",S(P.uploadSizeBytes),")"]})]}),s.jsxs("details",{className:"mt-2",children:[s.jsxs("summary",{className:"text-xs text-gray-500 cursor-pointer hover:text-gray-700",children:["Tabellen anzeigen (",P.tables.filter(A=>A.count>0).length," mit Daten)"]}),s.jsx("div",{className:"mt-2 flex flex-wrap gap-1",children:P.tables.filter(A=>A.count>0).map(A=>s.jsxs("span",{className:"text-xs bg-gray-100 px-2 py-0.5 rounded",children:[A.table,": ",A.count]},A.table))})]})]}),s.jsxs("div",{className:"flex items-center gap-2 ml-4",children:[s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>F(P.name),title:"Als ZIP herunterladen",children:s.jsx(_2,{className:"w-4 h-4"})}),s.jsxs(T,{variant:"secondary",size:"sm",onClick:()=>t(P.name),disabled:v.isPending,children:[s.jsx(wd,{className:"w-4 h-4 mr-1"}),"Wiederherstellen"]}),s.jsx(T,{variant:"danger",size:"sm",onClick:()=>r(P.name),disabled:g.isPending,children:s.jsx(ve,{className:"w-4 h-4"})})]})]})},P.name))})]}),e&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsxs("div",{className:"bg-white rounded-lg shadow-xl p-6 max-w-md mx-4",children:[s.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"Backup wiederherstellen?"}),s.jsxs("p",{className:"text-gray-600 mb-4",children:["Möchten Sie das Backup ",s.jsx("strong",{children:e})," wirklich wiederherstellen?"]}),s.jsxs("p",{className:"text-amber-600 text-sm mb-4 bg-amber-50 p-3 rounded-lg",children:[s.jsx("strong",{children:"Achtung:"})," Bestehende Daten und Dokumente werden mit dem Backup-Stand überschrieben. Dies kann nicht rückgängig gemacht werden."]}),s.jsxs("div",{className:"flex justify-end gap-3",children:[s.jsx(T,{variant:"secondary",onClick:()=>t(null),disabled:v.isPending,children:"Abbrechen"}),s.jsx(T,{variant:"primary",onClick:()=>v.mutate(e),disabled:v.isPending,children:v.isPending?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{className:"w-4 h-4 mr-2 animate-spin"}),"Wird wiederhergestellt..."]}):"Ja, wiederherstellen"})]})]})}),n&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsxs("div",{className:"bg-white rounded-lg shadow-xl p-6 max-w-md mx-4",children:[s.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:"Backup löschen?"}),s.jsxs("p",{className:"text-gray-600 mb-4",children:["Möchten Sie das Backup ",s.jsx("strong",{children:n})," wirklich löschen? Dies kann nicht rückgängig gemacht werden."]}),s.jsxs("div",{className:"flex justify-end gap-3",children:[s.jsx(T,{variant:"secondary",onClick:()=>r(null),disabled:g.isPending,children:"Abbrechen"}),s.jsx(T,{variant:"danger",onClick:()=>g.mutate(n),disabled:g.isPending,children:g.isPending?"Wird gelöscht...":"Ja, löschen"})]})]})}),s.jsx("div",{className:"bg-red-50 border border-red-200 rounded-lg p-6 mt-8",children:s.jsxs("div",{className:"flex items-start gap-4",children:[s.jsx("div",{className:"p-2 bg-red-100 rounded-lg",children:s.jsx(nr,{className:"w-6 h-6 text-red-600"})}),s.jsxs("div",{className:"flex-1",children:[s.jsx("h3",{className:"text-lg font-semibold text-red-800 mb-2",children:"Werkseinstellungen"}),s.jsxs("p",{className:"text-sm text-red-700 mb-4",children:["Setzt das System auf den Ausgangszustand zurück. ",s.jsx("strong",{children:"Alle Daten werden unwiderruflich gelöscht"})," - Kunden, Verträge, Benutzer, Dokumente und Einstellungen. Nur die hier gespeicherten Backups bleiben erhalten."]}),s.jsxs("ul",{className:"text-sm text-red-700 mb-4 list-disc list-inside space-y-1",children:[s.jsx("li",{children:"Alle Kunden und Verträge werden gelöscht"}),s.jsx("li",{children:"Alle Benutzer werden gelöscht"}),s.jsx("li",{children:"Alle hochgeladenen Dokumente werden gelöscht"}),s.jsx("li",{children:"Ein neuer Admin-Benutzer wird erstellt (admin@admin.com / admin)"}),s.jsxs("li",{children:[s.jsx("strong",{children:"Backups bleiben erhalten"})," und können danach wiederhergestellt werden"]})]}),s.jsxs(T,{variant:"danger",onClick:()=>i(!0),children:[s.jsx(sS,{className:"w-4 h-4 mr-2"}),"Werkseinstellungen"]})]})]})}),a&&s.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:s.jsxs("div",{className:"bg-white rounded-lg shadow-xl p-6 max-w-lg mx-4",children:[s.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[s.jsx("div",{className:"p-2 bg-red-100 rounded-lg",children:s.jsx(nr,{className:"w-6 h-6 text-red-600"})}),s.jsx("h3",{className:"text-lg font-semibold text-gray-900",children:"Wirklich auf Werkseinstellungen zurücksetzen?"})]}),s.jsxs("p",{className:"text-gray-600 mb-4",children:["Diese Aktion löscht ",s.jsx("strong",{children:"alle Daten unwiderruflich"}),". Es gibt kein Zurück!"]}),s.jsxs("p",{className:"text-sm text-gray-600 mb-4",children:["Geben Sie zur Bestätigung ",s.jsx("strong",{className:"font-mono bg-gray-100 px-1",children:"LÖSCHEN"})," ein:"]}),s.jsx("input",{type:"text",value:l,onChange:P=>o(P.target.value),placeholder:"LÖSCHEN",className:"w-full px-3 py-2 border border-gray-300 rounded-lg mb-4 focus:ring-2 focus:ring-red-500 focus:border-red-500"}),s.jsxs("div",{className:"flex justify-end gap-3",children:[s.jsx(T,{variant:"secondary",onClick:()=>{i(!1),o("")},disabled:j.isPending,children:"Abbrechen"}),s.jsx(T,{variant:"danger",onClick:()=>j.mutate(),disabled:l!=="LÖSCHEN"||j.isPending,children:j.isPending?s.jsxs(s.Fragment,{children:[s.jsx(Qr,{className:"w-4 h-4 mr-2 animate-spin"}),"Wird zurückgesetzt..."]}):"Ja, alles löschen"})]})]})})]})}function Wk(){var g;const[e,t]=b.useState(""),[n,r]=b.useState(1),[a,i]=b.useState(!1),[l,o]=b.useState(null),c=pe(),{refreshUser:u}=Be(),{data:d,isLoading:h}=he({queryKey:["users",e,n],queryFn:()=>vi.getAll({search:e||void 0,page:n,limit:20})}),{data:p}=he({queryKey:["roles"],queryFn:()=>vi.getRoles()}),m=W({mutationFn:vi.delete,onSuccess:()=>{c.invalidateQueries({queryKey:["users"]})},onError:x=>{alert((x==null?void 0:x.message)||"Fehler beim Löschen des Benutzers")}}),f=x=>{var j;return(j=x.roles)==null?void 0:j.some(k=>k.name==="Admin")},y=((g=d==null?void 0:d.data)==null?void 0:g.filter(x=>x.isActive&&f(x)).length)||0,N=x=>{o(x),i(!0)},v=()=>{i(!1),o(null)};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[s.jsx(Ne,{to:"/settings",children:s.jsx(T,{variant:"ghost",size:"sm",children:s.jsx(Gs,{className:"w-4 h-4"})})}),s.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Benutzer"}),s.jsxs(T,{onClick:()=>i(!0),children:[s.jsx(Re,{className:"w-4 h-4 mr-2"}),"Neuer Benutzer"]})]}),s.jsx(X,{className:"mb-6",children:s.jsxs("div",{className:"flex gap-4",children:[s.jsx("div",{className:"flex-1",children:s.jsx(K,{placeholder:"Suchen...",value:e,onChange:x=>t(x.target.value)})}),s.jsx(T,{variant:"secondary",children:s.jsx(cl,{className:"w-4 h-4"})})]})}),s.jsxs("div",{className:"mb-6 bg-blue-50 border border-blue-200 rounded-lg p-4 flex items-start gap-3",children:[s.jsx(H2,{className:"w-5 h-5 text-blue-600 flex-shrink-0 mt-0.5"}),s.jsxs("div",{className:"text-sm text-blue-800",children:[s.jsx("strong",{children:"Hinweis:"})," Bei Änderungen an Rollen oder Berechtigungen wird der betroffene Benutzer automatisch ausgeloggt und muss sich erneut anmelden."]})]}),s.jsx(X,{children:h?s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):d!=null&&d.data&&d.data.length>0?s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"border-b",children:[s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Name"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"E-Mail"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Rollen"}),s.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),s.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),s.jsx("tbody",{children:d.data.map(x=>{var j;return s.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[s.jsxs("td",{className:"py-3 px-4",children:[x.firstName," ",x.lastName]}),s.jsx("td",{className:"py-3 px-4",children:x.email}),s.jsx("td",{className:"py-3 px-4",children:s.jsx("div",{className:"flex gap-1 flex-wrap",children:(j=x.roles)==null?void 0:j.filter(k=>k.name!=="Developer").map(k=>s.jsx(ge,{variant:"info",children:k.name},k.id||k.name))})}),s.jsx("td",{className:"py-3 px-4",children:s.jsxs("div",{className:"flex gap-2",children:[s.jsx(ge,{variant:x.isActive?"success":"danger",children:x.isActive?"Aktiv":"Inaktiv"}),x.hasDeveloperAccess&&s.jsxs(ge,{variant:"warning",className:"flex items-center gap-1",children:[s.jsx(hc,{className:"w-3 h-3"}),"Dev"]})]})}),s.jsx("td",{className:"py-3 px-4 text-right",children:s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>N(x),children:s.jsx(Je,{className:"w-4 h-4"})}),(()=>{const k=f(x)&&x.isActive&&y<=1;return s.jsx(T,{variant:"ghost",size:"sm",disabled:k,title:k?"Letzter Administrator kann nicht gelöscht werden":void 0,onClick:()=>{confirm("Benutzer wirklich löschen?")&&m.mutate(x.id)},children:s.jsx(ve,{className:`w-4 h-4 ${k?"text-gray-300":"text-red-500"}`})})})()]})})]},x.id)})})]})}),d.pagination&&d.pagination.totalPages>1&&s.jsxs("div",{className:"mt-4 flex items-center justify-between",children:[s.jsxs("p",{className:"text-sm text-gray-500",children:["Seite ",d.pagination.page," von ",d.pagination.totalPages]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>r(x=>Math.max(1,x-1)),disabled:n===1,children:"Zurück"}),s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>r(x=>x+1),disabled:n>=d.pagination.totalPages,children:"Weiter"})]})]})]}):s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Benutzer gefunden."})}),s.jsx(Gk,{isOpen:a,onClose:v,user:l,roles:(p==null?void 0:p.data)||[],onUserUpdated:u})]})}function Gk({isOpen:e,onClose:t,user:n,roles:r,onUserUpdated:a}){const i=pe(),[l,o]=b.useState(null),[c,u]=b.useState({email:"",password:"",firstName:"",lastName:"",roleIds:[],isActive:!0,hasDeveloperAccess:!1});b.useEffect(()=>{var y;e&&(o(null),u(n?{email:n.email,password:"",firstName:n.firstName,lastName:n.lastName,roleIds:((y=n.roles)==null?void 0:y.filter(N=>N.name!=="Developer").map(N=>N.id))||[],isActive:n.isActive??!0,hasDeveloperAccess:n.hasDeveloperAccess??!1}:{email:"",password:"",firstName:"",lastName:"",roleIds:[],isActive:!0,hasDeveloperAccess:!1}))},[e,n]);const d=W({mutationFn:vi.create,onSuccess:()=>{i.invalidateQueries({queryKey:["users"]}),t()},onError:y=>{o((y==null?void 0:y.message)||"Fehler beim Erstellen des Benutzers")}}),h=W({mutationFn:y=>vi.update(n.id,y),onSuccess:async()=>{i.invalidateQueries({queryKey:["users"]}),await a(),t()},onError:y=>{o((y==null?void 0:y.message)||"Fehler beim Aktualisieren des Benutzers")}}),p=y=>{if(y.preventDefault(),n){const N={email:c.email,firstName:c.firstName,lastName:c.lastName,roleIds:c.roleIds,isActive:c.isActive,hasDeveloperAccess:c.hasDeveloperAccess};c.password&&(N.password=c.password),h.mutate(N)}else d.mutate({email:c.email,password:c.password,firstName:c.firstName,lastName:c.lastName,roleIds:c.roleIds,hasDeveloperAccess:c.hasDeveloperAccess})},m=y=>{u(N=>({...N,roleIds:N.roleIds.includes(y)?N.roleIds.filter(v=>v!==y):[...N.roleIds,y]}))},f=d.isPending||h.isPending;return s.jsx(ot,{isOpen:e,onClose:t,title:n?"Benutzer bearbeiten":"Neuer Benutzer",children:s.jsxs("form",{onSubmit:p,className:"space-y-4",children:[l&&s.jsxs("div",{className:"bg-red-50 border border-red-200 rounded-lg p-3 flex items-start gap-2",children:[s.jsx(nr,{className:"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5"}),s.jsx("p",{className:"text-red-700 text-sm",children:l})]}),s.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[s.jsx(K,{label:"Vorname *",value:c.firstName,onChange:y=>u({...c,firstName:y.target.value}),required:!0}),s.jsx(K,{label:"Nachname *",value:c.lastName,onChange:y=>u({...c,lastName:y.target.value}),required:!0})]}),s.jsx(K,{label:"E-Mail *",type:"email",value:c.email,onChange:y=>u({...c,email:y.target.value}),required:!0}),s.jsx(K,{label:n?"Neues Passwort (leer = unverändert)":"Passwort *",type:"password",value:c.password,onChange:y=>u({...c,password:y.target.value}),required:!n}),s.jsxs("div",{children:[s.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Rollen"}),s.jsxs("div",{className:"space-y-2",children:[r.filter(y=>y.name!=="Developer").map(y=>s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:c.roleIds.includes(y.id),onChange:()=>m(y.id),className:"rounded"}),s.jsx("span",{children:y.name}),y.description&&s.jsxs("span",{className:"text-sm text-gray-500",children:["(",y.description,")"]})]},y.id)),s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:c.hasDeveloperAccess,onChange:y=>u({...c,hasDeveloperAccess:y.target.checked}),className:"rounded border-purple-300 text-purple-600 focus:ring-purple-500"}),s.jsxs("span",{className:"flex items-center gap-1",children:[s.jsx(hc,{className:"w-4 h-4 text-purple-600"}),"Entwicklerzugriff"]}),s.jsx("span",{className:"text-sm text-gray-500",children:"(Datenbanktools)"})]})]}),n&&s.jsxs("p",{className:"mt-2 text-xs text-amber-600 flex items-center gap-1",children:[s.jsx(nr,{className:"w-3 h-3"}),"Bei Rollenänderung wird der Benutzer automatisch ausgeloggt."]})]}),n&&s.jsx("div",{className:"space-y-3 pt-3 border-t",children:s.jsxs("label",{className:"flex items-center gap-2",children:[s.jsx("input",{type:"checkbox",checked:c.isActive,onChange:y=>u({...c,isActive:y.target.checked}),className:"rounded"}),"Aktiv"]})}),s.jsxs("div",{className:"flex justify-end gap-2",children:[s.jsx(T,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),s.jsx(T,{type:"submit",disabled:f,children:f?"Speichern...":"Speichern"})]})]})})}function Zk(){const{hasPermission:e,developerMode:t,setDeveloperMode:n}=Be(),r=[{to:"/settings/users",icon:iS,title:"Benutzer",description:"Verwalten Sie Benutzerkonten, Rollen und Berechtigungen.",show:e("users:read")},{to:"/settings/platforms",icon:rS,title:"Vertriebsplattformen",description:"Verwalten Sie die Plattformen, über die Verträge abgeschlossen werden.",show:e("platforms:read")},{to:"/settings/cancellation-periods",icon:vn,title:"Kündigungsfristen",description:"Konfigurieren Sie die verfügbaren Kündigungsfristen für Verträge.",show:e("platforms:read")},{to:"/settings/contract-durations",icon:M0,title:"Vertragslaufzeiten",description:"Konfigurieren Sie die verfügbaren Laufzeiten für Verträge.",show:e("platforms:read")},{to:"/settings/providers",icon:$2,title:"Anbieter & Tarife",description:"Verwalten Sie Anbieter und deren Tarife für Verträge.",show:e("providers:read")||e("platforms:read")},{to:"/settings/contract-categories",icon:q2,title:"Vertragstypen",description:"Konfigurieren Sie die verfügbaren Vertragstypen (Strom, Gas, Mobilfunk, etc.).",show:e("platforms:read")}];return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center gap-3 mb-6",children:[s.jsx(z0,{className:"w-6 h-6"}),s.jsx("h1",{className:"text-2xl font-bold",children:"Einstellungen"})]}),s.jsxs("div",{className:"mb-8",children:[s.jsx("h2",{className:"text-lg font-semibold mb-4 text-gray-700",children:"Stammdaten"}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:r.filter(a=>a.show).map(a=>s.jsx(Ne,{to:a.to,className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:s.jsxs("div",{className:"flex items-start gap-4",children:[s.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:s.jsx(a.icon,{className:"w-6 h-6 text-blue-600"})}),s.jsxs("div",{className:"flex-1",children:[s.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:[a.title,s.jsx(rs,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),s.jsx("p",{className:"text-sm text-gray-500 mt-1",children:a.description})]})]})},a.to))})]}),e("settings:update")&&s.jsxs("div",{className:"mb-8",children:[s.jsx("h2",{className:"text-lg font-semibold mb-4 text-gray-700",children:"System"}),s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsx(Ne,{to:"/settings/portal",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:s.jsxs("div",{className:"flex items-start gap-4",children:[s.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:s.jsx(Rm,{className:"w-6 h-6 text-blue-600"})}),s.jsxs("div",{className:"flex-1",children:[s.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Kundenportal",s.jsx(rs,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),s.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Konfigurieren Sie das Kundenportal und Support-Anfragen."})]})]})}),s.jsx(Ne,{to:"/settings/deadlines",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:s.jsxs("div",{className:"flex items-start gap-4",children:[s.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:s.jsx(vn,{className:"w-6 h-6 text-blue-600"})}),s.jsxs("div",{className:"flex-1",children:[s.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Fristenschwellen",s.jsx(rs,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),s.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Konfigurieren Sie die Farbkodierung für Vertragsfristen im Cockpit."})]})]})}),s.jsx(Ne,{to:"/settings/email-providers",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:s.jsxs("div",{className:"flex items-start gap-4",children:[s.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:s.jsx(mn,{className:"w-6 h-6 text-blue-600"})}),s.jsxs("div",{className:"flex-1",children:[s.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Email-Provisionierung",s.jsx(rs,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),s.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Konfigurieren Sie die automatische E-Mail-Erstellung für Stressfrei-Wechseln Adressen."})]})]})}),s.jsx(Ne,{to:"/settings/database-backup",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:s.jsxs("div",{className:"flex items-start gap-4",children:[s.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:s.jsx(fc,{className:"w-6 h-6 text-blue-600"})}),s.jsxs("div",{className:"flex-1",children:[s.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Datenbank & Zurücksetzen",s.jsx(rs,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),s.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Backups erstellen, wiederherstellen oder auf Werkseinstellungen zurücksetzen."})]})]})})]})]}),s.jsxs("div",{className:"mb-8",children:[s.jsx("h2",{className:"text-lg font-semibold mb-4 text-gray-700",children:"Persönlich"}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:s.jsx(Ne,{to:"/settings/view",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:s.jsxs("div",{className:"flex items-start gap-4",children:[s.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:s.jsx(De,{className:"w-6 h-6 text-blue-600"})}),s.jsxs("div",{className:"flex-1",children:[s.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Ansicht",s.jsx(rs,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),s.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Passen Sie die Darstellung der Anwendung an."})]})]})})})]}),e("developer:access")&&s.jsxs(X,{title:"Entwickleroptionen",className:"mb-6",children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(hc,{className:"w-5 h-5 text-gray-500"}),s.jsxs("div",{children:[s.jsx("p",{className:"font-medium",children:"Entwicklermodus"}),s.jsx("p",{className:"text-sm text-gray-500",children:"Aktiviert erweiterte Funktionen wie direkten Datenbankzugriff"})]})]}),s.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[s.jsx("input",{type:"checkbox",checked:t,onChange:a=>n(a.target.checked),className:"sr-only peer"}),s.jsx("div",{className:"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"})]})]}),t&&s.jsx("div",{className:"mt-4 p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:s.jsxs("p",{className:"text-sm text-yellow-800",children:[s.jsx("strong",{children:"Warnung:"})," Der Entwicklermodus ermöglicht direkten Zugriff auf die Datenbank. Unsachgemäße Änderungen können zu Datenverlust oder Inkonsistenzen führen."]})})]}),s.jsx(X,{title:"Über",children:s.jsxs("dl",{className:"space-y-3",children:[s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"Version"}),s.jsx("dd",{children:"1.0.0"})]}),s.jsxs("div",{children:[s.jsx("dt",{className:"text-sm text-gray-500",children:"System"}),s.jsx("dd",{children:"OpenCRM"})]})]})})]})}function Jk({onSelectTable:e}){const t=b.useRef(null),[n,r]=b.useState(1),[a,i]=b.useState({x:0,y:0}),[l,o]=b.useState(!1),[c,u]=b.useState({x:0,y:0}),[d,h]=b.useState({}),[p,m]=b.useState(null),{data:f,isLoading:y}=he({queryKey:["developer-schema"],queryFn:ci.getSchema}),N=(f==null?void 0:f.data)||[];b.useEffect(()=>{if(N.length>0&&Object.keys(d).length===0){const S=Math.ceil(Math.sqrt(N.length)),P={x:280,y:200},A={};N.forEach((_,L)=>{const V=L%S,q=Math.floor(L/S);A[_.name]={x:50+V*P.x,y:50+q*P.y}}),h(A)}},[N,d]);const v=b.useCallback(S=>{(S.target===S.currentTarget||S.target.tagName==="svg")&&(o(!0),u({x:S.clientX-a.x,y:S.clientY-a.y}))},[a]),g=b.useCallback(S=>{var P;if(l&&!p)i({x:S.clientX-c.x,y:S.clientY-c.y});else if(p){const A=(P=t.current)==null?void 0:P.getBoundingClientRect();A&&h(_=>({..._,[p]:{x:(S.clientX-A.left-a.x)/n-100,y:(S.clientY-A.top-a.y)/n-20}}))}},[l,p,c,a,n]),x=b.useCallback(()=>{o(!1),m(null)},[]),j=S=>{r(P=>Math.min(2,Math.max(.3,P+S)))},k=()=>{r(1),i({x:0,y:0})},F=b.useCallback(()=>{const S=[];return N.forEach(P=>{const A=d[P.name];A&&P.foreignKeys.forEach(_=>{const L=d[_.targetTable];if(!L)return;const V=N.find(O=>O.name===_.targetTable),q=V==null?void 0:V.relations.find(O=>O.targetTable===P.name);S.push({from:{table:P.name,x:A.x+100,y:A.y+60},to:{table:_.targetTable,x:L.x+100,y:L.y+60},type:(q==null?void 0:q.type)||"one",label:_.field})})}),S},[N,d]);if(y)return s.jsx("div",{className:"flex items-center justify-center h-full",children:"Laden..."});const E=F();return s.jsxs("div",{className:"relative h-full w-full bg-gray-50 overflow-hidden",ref:t,children:[s.jsxs("div",{className:"absolute top-4 right-4 z-10 flex gap-2 bg-white rounded-lg shadow-md p-2",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>j(.1),title:"Vergrößern",children:s.jsx(oS,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>j(-.1),title:"Verkleinern",children:s.jsx(cS,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:k,title:"Zurücksetzen",children:s.jsx(X2,{className:"w-4 h-4"})}),s.jsxs("div",{className:"text-xs text-gray-500 flex items-center px-2",children:[Math.round(n*100),"%"]})]}),s.jsxs("div",{className:"absolute top-4 left-4 z-10 bg-white rounded-lg shadow-md p-2 text-xs text-gray-500",children:[s.jsx(Y2,{className:"w-3 h-3 inline mr-1"}),"Tabellen ziehen zum Verschieben"]}),s.jsx("svg",{className:"w-full h-full cursor-grab",style:{cursor:l?"grabbing":"grab"},onMouseDown:v,onMouseMove:g,onMouseUp:x,onMouseLeave:x,children:s.jsxs("g",{transform:`translate(${a.x}, ${a.y}) scale(${n})`,children:[s.jsxs("defs",{children:[s.jsx("marker",{id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"9",refY:"3.5",orient:"auto",children:s.jsx("polygon",{points:"0 0, 10 3.5, 0 7",fill:"#6b7280"})}),s.jsx("marker",{id:"many-marker",markerWidth:"12",markerHeight:"12",refX:"6",refY:"6",orient:"auto",children:s.jsx("circle",{cx:"6",cy:"6",r:"3",fill:"#6b7280"})})]}),E.map((S,P)=>{const A=S.to.x-S.from.x,_=S.to.y-S.from.y,L=S.from.x+A/2,V=S.from.y+_/2,q=S.from.x+A*.25,O=S.from.y,C=S.from.x+A*.75,w=S.to.y;return s.jsxs("g",{children:[s.jsx("path",{d:`M ${S.from.x} ${S.from.y} C ${q} ${O}, ${C} ${w}, ${S.to.x} ${S.to.y}`,fill:"none",stroke:"#9ca3af",strokeWidth:"2",markerEnd:"url(#arrowhead)"}),s.jsx("text",{x:L,y:V-8,fontSize:"10",fill:"#6b7280",textAnchor:"middle",className:"select-none",children:S.type==="many"?"1:n":"1:1"})]},P)}),N.map(S=>{const P=d[S.name];if(!P)return null;const A=200,_=32,L=20,V=[...new Set([S.primaryKey,...S.foreignKeys.map(O=>O.field)])],q=_+Math.min(V.length,5)*L+8;return s.jsxs("g",{transform:`translate(${P.x}, ${P.y})`,style:{cursor:"move"},onMouseDown:O=>{O.stopPropagation(),m(S.name)},children:[s.jsx("rect",{x:"3",y:"3",width:A,height:q,rx:"6",fill:"rgba(0,0,0,0.1)"}),s.jsx("rect",{x:"0",y:"0",width:A,height:q,rx:"6",fill:"white",stroke:"#e5e7eb",strokeWidth:"1"}),s.jsx("rect",{x:"0",y:"0",width:A,height:_,rx:"6",fill:"#3b82f6",className:"cursor-pointer",onClick:()=>e==null?void 0:e(S.name)}),s.jsx("rect",{x:"0",y:_-6,width:A,height:"6",fill:"#3b82f6"}),s.jsx("text",{x:A/2,y:"21",fontSize:"13",fontWeight:"bold",fill:"white",textAnchor:"middle",className:"select-none pointer-events-none",children:S.name}),V.slice(0,5).map((O,C)=>{const w=O===S.primaryKey||S.primaryKey.includes(O),R=S.foreignKeys.some(Q=>Q.field===O);return s.jsx("g",{transform:`translate(8, ${_+4+C*L})`,children:s.jsxs("text",{x:"0",y:"14",fontSize:"11",fill:w?"#dc2626":R?"#2563eb":"#374151",fontFamily:"monospace",className:"select-none",children:[w&&"🔑 ",R&&!w&&"🔗 ",O]})},O)}),V.length>5&&s.jsxs("text",{x:A/2,y:q-4,fontSize:"10",fill:"#9ca3af",textAnchor:"middle",className:"select-none",children:["+",V.length-5," mehr..."]})]},S.name)})]})}),s.jsxs("div",{className:"absolute bottom-4 left-4 bg-white rounded-lg shadow-md p-3 text-xs",children:[s.jsx("div",{className:"font-medium mb-2",children:"Legende"}),s.jsxs("div",{className:"space-y-1",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-red-600",children:"🔑"}),s.jsx("span",{children:"Primary Key"})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"text-blue-600",children:"🔗"}),s.jsx("span",{children:"Foreign Key"})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("div",{className:"w-6 h-0.5 bg-gray-400"}),s.jsx("span",{children:"Beziehung"})]})]})]})]})}function Xk(){var E;const[e,t]=b.useState(null),[n,r]=b.useState(1),[a,i]=b.useState(null),[l,o]=b.useState(!1),c=pe(),{data:u,isLoading:d,error:h}=he({queryKey:["developer-schema"],queryFn:ci.getSchema});console.log("Schema data:",u),console.log("Schema error:",h);const{data:p,isLoading:m}=he({queryKey:["developer-table",e,n],queryFn:()=>ci.getTableData(e,n),enabled:!!e}),f=W({mutationFn:({tableName:S,id:P,data:A})=>ci.updateRow(S,P,A),onSuccess:()=>{c.invalidateQueries({queryKey:["developer-table",e]}),i(null)},onError:S=>{var P,A;alert(((A=(P=S.response)==null?void 0:P.data)==null?void 0:A.error)||"Fehler beim Speichern")}}),y=W({mutationFn:({tableName:S,id:P})=>ci.deleteRow(S,P),onSuccess:()=>{c.invalidateQueries({queryKey:["developer-table",e]})},onError:S=>{var P,A;alert(((A=(P=S.response)==null?void 0:P.data)==null?void 0:A.error)||"Fehler beim Löschen")}}),N=(u==null?void 0:u.data)||[],v=N.find(S=>S.name===e),g=(S,P)=>P.primaryKey.includes(",")?P.primaryKey.split(",").map(A=>S[A]).join("-"):String(S[P.primaryKey]),x=S=>S==null?"-":typeof S=="boolean"?S?"Ja":"Nein":typeof S=="object"?S instanceof Date||typeof S=="string"&&S.match(/^\d{4}-\d{2}-\d{2}/)?new Date(S).toLocaleString("de-DE"):JSON.stringify(S):String(S),j=()=>{!a||!e||f.mutate({tableName:e,id:a.id,data:a.data})},k=S=>{e&&confirm("Datensatz wirklich löschen?")&&y.mutate({tableName:e,id:S})};if(d)return s.jsx("div",{className:"text-center py-8",children:"Laden..."});const F=S=>{t(S),r(1),o(!1)};return s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between mb-6",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(fc,{className:"w-6 h-6"}),s.jsx("h1",{className:"text-2xl font-bold",children:"Datenbankstruktur"})]}),s.jsxs(T,{onClick:()=>o(!0),children:[s.jsx(Ap,{className:"w-4 h-4 mr-2"}),"ER-Diagramm"]})]}),s.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-4 gap-6",children:[s.jsx(X,{title:"Tabellen",className:"lg:col-span-1",children:s.jsx("div",{className:"space-y-1 max-h-[600px] overflow-y-auto",children:N.map(S=>s.jsxs("button",{onClick:()=>{t(S.name),r(1)},className:`w-full text-left px-3 py-2 rounded-lg flex items-center gap-2 transition-colors ${e===S.name?"bg-blue-100 text-blue-700":"hover:bg-gray-100"}`,children:[s.jsx(aS,{className:"w-4 h-4"}),s.jsx("span",{className:"text-sm font-mono",children:S.name})]},S.name))})}),s.jsx("div",{className:"lg:col-span-3 space-y-6",children:e&&v?s.jsxs(s.Fragment,{children:[s.jsxs(X,{title:`${e} - Beziehungen`,children:[s.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[s.jsxs("div",{children:[s.jsx("h4",{className:"text-sm font-medium text-gray-500 mb-2",children:"Fremdschlüssel (referenziert)"}),v.foreignKeys.length>0?s.jsx("div",{className:"space-y-1",children:v.foreignKeys.map(S=>s.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[s.jsx("span",{className:"font-mono text-gray-600",children:S.field}),s.jsx(A0,{className:"w-4 h-4 text-gray-400"}),s.jsx(ge,{variant:"info",className:"cursor-pointer",onClick:()=>{t(S.targetTable),r(1)},children:S.targetTable})]},S.field))}):s.jsx("p",{className:"text-sm text-gray-400",children:"Keine"})]}),s.jsxs("div",{children:[s.jsx("h4",{className:"text-sm font-medium text-gray-500 mb-2",children:"Relationen (wird referenziert von)"}),v.relations.length>0?s.jsx("div",{className:"space-y-1",children:v.relations.map(S=>s.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[s.jsx("span",{className:"font-mono text-gray-600",children:S.field}),s.jsx(ge,{variant:S.type==="many"?"warning":"default",children:S.type==="many"?"1:n":"1:1"}),s.jsx(ge,{variant:"info",className:"cursor-pointer",onClick:()=>{t(S.targetTable),r(1)},children:S.targetTable})]},S.field))}):s.jsx("p",{className:"text-sm text-gray-400",children:"Keine"})]})]}),s.jsx("div",{className:"mt-4 pt-4 border-t",children:s.jsxs("div",{className:"flex gap-4 text-sm",children:[s.jsxs("div",{children:[s.jsx("span",{className:"text-gray-500",children:"Primary Key:"})," ",s.jsx("span",{className:"font-mono",children:v.primaryKey})]}),s.jsxs("div",{children:[s.jsx("span",{className:"text-gray-500",children:"Readonly:"})," ",s.jsx("span",{className:"font-mono text-red-600",children:v.readonlyFields.join(", ")||"-"})]}),s.jsxs("div",{children:[s.jsx("span",{className:"text-gray-500",children:"Required:"})," ",s.jsx("span",{className:"font-mono text-green-600",children:v.requiredFields.join(", ")||"-"})]})]})})]}),s.jsx(X,{title:`${e} - Daten`,children:m?s.jsx("div",{className:"text-center py-4",children:"Laden..."}):s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"overflow-x-auto",children:s.jsxs("table",{className:"w-full text-sm",children:[s.jsx("thead",{children:s.jsxs("tr",{className:"border-b bg-gray-50",children:[(p==null?void 0:p.data)&&p.data.length>0&&Object.keys(p.data[0]).map(S=>s.jsxs("th",{className:"text-left py-2 px-3 font-medium text-gray-600 whitespace-nowrap",children:[S,v.readonlyFields.includes(S)&&s.jsx("span",{className:"ml-1 text-red-400 text-xs",children:"*"}),v.requiredFields.includes(S)&&s.jsx("span",{className:"ml-1 text-green-400 text-xs",children:"!"})]},S)),s.jsx("th",{className:"text-right py-2 px-3 font-medium text-gray-600",children:"Aktionen"})]})}),s.jsxs("tbody",{children:[(E=p==null?void 0:p.data)==null?void 0:E.map(S=>{const P=g(S,v);return s.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[Object.entries(S).map(([A,_])=>s.jsx("td",{className:"py-2 px-3 font-mono text-xs max-w-[200px] truncate",children:x(_)},A)),s.jsx("td",{className:"py-2 px-3 text-right whitespace-nowrap",children:s.jsxs("div",{className:"flex justify-end gap-1",children:[s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>i({id:P,data:{...S}}),children:s.jsx(Je,{className:"w-4 h-4"})}),s.jsx(T,{variant:"ghost",size:"sm",onClick:()=>k(P),children:s.jsx(ve,{className:"w-4 h-4 text-red-500"})})]})})]},P)}),(!(p!=null&&p.data)||p.data.length===0)&&s.jsx("tr",{children:s.jsx("td",{colSpan:100,className:"py-4 text-center text-gray-500",children:"Keine Daten vorhanden"})})]})]})}),(p==null?void 0:p.pagination)&&p.pagination.totalPages>1&&s.jsxs("div",{className:"mt-4 flex items-center justify-between",children:[s.jsxs("p",{className:"text-sm text-gray-500",children:["Seite ",p.pagination.page," von ",p.pagination.totalPages," (",p.pagination.total," Einträge)"]}),s.jsxs("div",{className:"flex gap-2",children:[s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>r(S=>Math.max(1,S-1)),disabled:n===1,children:s.jsx(B2,{className:"w-4 h-4"})}),s.jsx(T,{variant:"secondary",size:"sm",onClick:()=>r(S=>S+1),disabled:n>=p.pagination.totalPages,children:s.jsx(rs,{className:"w-4 h-4"})})]})]})]})})]}):s.jsx(X,{children:s.jsx("div",{className:"text-center py-8 text-gray-500",children:"Wähle eine Tabelle aus der Liste aus"})})})]}),s.jsx(ot,{isOpen:!!a,onClose:()=>i(null),title:`${e} bearbeiten`,children:a&&v&&s.jsxs("div",{className:"space-y-4 max-h-[60vh] overflow-y-auto",children:[Object.entries(a.data).map(([S,P])=>{const A=v.readonlyFields.includes(S),_=v.requiredFields.includes(S);return s.jsxs("div",{children:[s.jsxs("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:[S,A&&s.jsx("span",{className:"ml-1 text-red-400",children:"(readonly)"}),_&&s.jsx("span",{className:"ml-1 text-green-600",children:"*"})]}),A?s.jsx("div",{className:"px-3 py-2 bg-gray-100 rounded-lg font-mono text-sm",children:x(P)}):typeof P=="boolean"?s.jsxs("select",{value:String(a.data[S]),onChange:L=>i({...a,data:{...a.data,[S]:L.target.value==="true"}}),className:"w-full px-3 py-2 border rounded-lg",children:[s.jsx("option",{value:"true",children:"Ja"}),s.jsx("option",{value:"false",children:"Nein"})]}):s.jsx("input",{type:typeof P=="number"?"number":"text",value:a.data[S]??"",onChange:L=>i({...a,data:{...a.data,[S]:typeof P=="number"?L.target.value?Number(L.target.value):null:L.target.value||null}}),className:"w-full px-3 py-2 border rounded-lg font-mono text-sm",disabled:A})]},S)}),s.jsxs("div",{className:"flex justify-end gap-2 pt-4 border-t",children:[s.jsxs(T,{variant:"secondary",onClick:()=>i(null),children:[s.jsx(jn,{className:"w-4 h-4 mr-2"}),"Abbrechen"]}),s.jsxs(T,{onClick:j,disabled:f.isPending,children:[s.jsx(nS,{className:"w-4 h-4 mr-2"}),f.isPending?"Speichern...":"Speichern"]})]})]})}),l&&s.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[s.jsx("div",{className:"absolute inset-0 bg-black/50",onClick:()=>o(!1)}),s.jsxs("div",{className:"relative bg-white rounded-xl shadow-2xl w-[90vw] h-[85vh] flex flex-col",children:[s.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx(Ap,{className:"w-5 h-5 text-blue-600"}),s.jsx("h2",{className:"text-lg font-semibold",children:"ER-Diagramm - Datenbankbeziehungen"})]}),s.jsx("button",{onClick:()=>o(!1),className:"p-2 hover:bg-gray-100 rounded-lg transition-colors",children:s.jsx(jn,{className:"w-5 h-5"})})]}),s.jsx("div",{className:"flex-1 overflow-hidden",children:s.jsx(Jk,{onSelectTable:F})})]})]})]})}function Yk({children:e}){const{isAuthenticated:t,isLoading:n}=Be();return n?s.jsx("div",{className:"min-h-screen flex items-center justify-center",children:s.jsx("div",{className:"text-gray-500",children:"Laden..."})}):t?s.jsx(s.Fragment,{children:e}):s.jsx(ia,{to:"/login",replace:!0})}function eC({children:e}){const{hasPermission:t,developerMode:n}=Be();return!t("developer:access")||!n?s.jsx(ia,{to:"/",replace:!0}):s.jsx(s.Fragment,{children:e})}function tC(){const{isAuthenticated:e,isLoading:t}=Be();return t?s.jsx("div",{className:"min-h-screen flex items-center justify-center",children:s.jsx("div",{className:"text-gray-500",children:"Laden..."})}):s.jsxs(s.Fragment,{children:[s.jsx(L2,{}),s.jsxs(vN,{children:[s.jsx(Te,{path:"/login",element:e?s.jsx(ia,{to:"/",replace:!0}):s.jsx(hS,{})}),s.jsxs(Te,{path:"/",element:s.jsx(Yk,{children:s.jsx(mS,{})}),children:[s.jsx(Te,{index:!0,element:s.jsx(fS,{})}),s.jsx(Te,{path:"customers",element:s.jsx(xS,{})}),s.jsx(Te,{path:"customers/new",element:s.jsx(Xp,{})}),s.jsx(Te,{path:"customers/:id",element:s.jsx(wS,{})}),s.jsx(Te,{path:"customers/:id/edit",element:s.jsx(Xp,{})}),s.jsx(Te,{path:"contracts",element:s.jsx(rk,{})}),s.jsx(Te,{path:"contracts/cockpit",element:s.jsx(Nk,{})}),s.jsx(Te,{path:"contracts/new",element:s.jsx(tx,{})}),s.jsx(Te,{path:"contracts/:id",element:s.jsx(fk,{})}),s.jsx(Te,{path:"contracts/:id/edit",element:s.jsx(tx,{})}),s.jsx(Te,{path:"tasks",element:s.jsx(Sk,{})}),s.jsx(Te,{path:"settings",element:s.jsx(Zk,{})}),s.jsx(Te,{path:"settings/users",element:s.jsx(Wk,{})}),s.jsx(Te,{path:"settings/platforms",element:s.jsx(Ek,{})}),s.jsx(Te,{path:"settings/cancellation-periods",element:s.jsx(Pk,{})}),s.jsx(Te,{path:"settings/contract-durations",element:s.jsx(Mk,{})}),s.jsx(Te,{path:"settings/providers",element:s.jsx(Fk,{})}),s.jsx(Te,{path:"settings/contract-categories",element:s.jsx(_k,{})}),s.jsx(Te,{path:"settings/view",element:s.jsx(Bk,{})}),s.jsx(Te,{path:"settings/portal",element:s.jsx(Kk,{})}),s.jsx(Te,{path:"settings/deadlines",element:s.jsx(qk,{})}),s.jsx(Te,{path:"settings/email-providers",element:s.jsx(Qk,{})}),s.jsx(Te,{path:"settings/database-backup",element:s.jsx(Hk,{})}),s.jsx(Te,{path:"users",element:s.jsx(ia,{to:"/settings/users",replace:!0})}),s.jsx(Te,{path:"platforms",element:s.jsx(ia,{to:"/settings/platforms",replace:!0})}),s.jsx(Te,{path:"developer/database",element:s.jsx(eC,{children:s.jsx(Xk,{})})})]}),s.jsx(Te,{path:"*",element:s.jsx(ia,{to:"/",replace:!0})})]})]})}const sC=new nw({defaultOptions:{queries:{retry:1,staleTime:0,gcTime:0,refetchOnMount:"always"}}});nu.createRoot(document.getElementById("root")).render(s.jsx(Ct.StrictMode,{children:s.jsx(rw,{client:sC,children:s.jsx(DN,{children:s.jsx(I2,{children:s.jsxs(F2,{children:[s.jsx(tC,{}),s.jsx(n1,{position:"top-right",toastOptions:{duration:4e3,style:{background:"#363636",color:"#fff"},success:{iconTheme:{primary:"#10b981",secondary:"#fff"}},error:{iconTheme:{primary:"#ef4444",secondary:"#fff"}}}})]})})})})})); diff --git a/frontend/dist/assets/index-Cpkp9CHh.js b/frontend/dist/assets/index-Cpkp9CHh.js deleted file mode 100644 index d637292d..00000000 --- a/frontend/dist/assets/index-Cpkp9CHh.js +++ /dev/null @@ -1,408 +0,0 @@ -var om=e=>{throw TypeError(e)};var Jo=(e,t,s)=>t.has(e)||om("Cannot "+s);var C=(e,t,s)=>(Jo(e,t,"read from private field"),s?s.call(e):t.get(e)),ue=(e,t,s)=>t.has(e)?om("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,s),te=(e,t,s,r)=>(Jo(e,t,"write to private field"),r?r.call(e,s):t.set(e,s),s),ye=(e,t,s)=>(Jo(e,t,"access private method"),s);var tl=(e,t,s,r)=>({set _(a){te(e,t,a,s)},get _(){return C(e,t,r)}});function hv(e,t){for(var s=0;sr[a]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))r(a);new MutationObserver(a=>{for(const i of a)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function s(a){const i={};return a.integrity&&(i.integrity=a.integrity),a.referrerPolicy&&(i.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?i.credentials="include":a.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(a){if(a.ep)return;a.ep=!0;const i=s(a);fetch(a.href,i)}})();function mv(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var _p={exports:{}},jo={},zp={exports:{}},Ne={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var $i=Symbol.for("react.element"),fv=Symbol.for("react.portal"),pv=Symbol.for("react.fragment"),gv=Symbol.for("react.strict_mode"),xv=Symbol.for("react.profiler"),yv=Symbol.for("react.provider"),vv=Symbol.for("react.context"),jv=Symbol.for("react.forward_ref"),bv=Symbol.for("react.suspense"),Nv=Symbol.for("react.memo"),wv=Symbol.for("react.lazy"),cm=Symbol.iterator;function Sv(e){return e===null||typeof e!="object"?null:(e=cm&&e[cm]||e["@@iterator"],typeof e=="function"?e:null)}var Up={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},$p=Object.assign,Bp={};function Sa(e,t,s){this.props=e,this.context=t,this.refs=Bp,this.updater=s||Up}Sa.prototype.isReactComponent={};Sa.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Sa.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Kp(){}Kp.prototype=Sa.prototype;function rd(e,t,s){this.props=e,this.context=t,this.refs=Bp,this.updater=s||Up}var ad=rd.prototype=new Kp;ad.constructor=rd;$p(ad,Sa.prototype);ad.isPureReactComponent=!0;var um=Array.isArray,Vp=Object.prototype.hasOwnProperty,id={current:null},qp={key:!0,ref:!0,__self:!0,__source:!0};function Qp(e,t,s){var r,a={},i=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&(i=""+t.key),t)Vp.call(t,r)&&!qp.hasOwnProperty(r)&&(a[r]=t[r]);var o=arguments.length-2;if(o===1)a.children=s;else if(1>>1,ve=B[me];if(0>>1;mea(Ce,ee))Mea(ht,Ce)?(B[me]=ht,B[Me]=ee,me=Me):(B[me]=Ce,B[V]=ee,me=V);else if(Mea(ht,ee))B[me]=ht,B[Me]=ee,me=Me;else break e}}return J}function a(B,J){var ee=B.sortIndex-J.sortIndex;return ee!==0?ee:B.id-J.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var l=Date,o=l.now();e.unstable_now=function(){return l.now()-o}}var c=[],u=[],d=1,m=null,p=3,h=!1,f=!1,g=!1,b=typeof setTimeout=="function"?setTimeout:null,y=typeof clearTimeout=="function"?clearTimeout:null,v=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function x(B){for(var J=s(u);J!==null;){if(J.callback===null)r(u);else if(J.startTime<=B)r(u),J.sortIndex=J.expirationTime,t(c,J);else break;J=s(u)}}function N(B){if(g=!1,x(B),!f)if(s(c)!==null)f=!0,P(k);else{var J=s(u);J!==null&&j(N,J.startTime-B)}}function k(B,J){f=!1,g&&(g=!1,y(S),S=-1),h=!0;var ee=p;try{for(x(J),m=s(c);m!==null&&(!(m.expirationTime>J)||B&&!_());){var me=m.callback;if(typeof me=="function"){m.callback=null,p=m.priorityLevel;var ve=me(m.expirationTime<=J);J=e.unstable_now(),typeof ve=="function"?m.callback=ve:m===s(c)&&r(c),x(J)}else r(c);m=s(c)}if(m!==null)var it=!0;else{var V=s(u);V!==null&&j(N,V.startTime-J),it=!1}return it}finally{m=null,p=ee,h=!1}}var D=!1,F=null,S=-1,L=5,T=-1;function _(){return!(e.unstable_now()-TB||125me?(B.sortIndex=ee,t(u,B),s(c)===null&&B===s(u)&&(g?(y(S),S=-1):g=!0,j(N,ee-me))):(B.sortIndex=ve,t(c,B),f||h||(f=!0,P(k))),B},e.unstable_shouldYield=_,e.unstable_wrapCallback=function(B){var J=p;return function(){var ee=p;p=J;try{return B.apply(this,arguments)}finally{p=ee}}}})(Yp);Zp.exports=Yp;var Rv=Zp.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ov=w,rs=Rv;function q(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,s=1;s"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Oc=Object.prototype.hasOwnProperty,_v=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,hm={},mm={};function zv(e){return Oc.call(mm,e)?!0:Oc.call(hm,e)?!1:_v.test(e)?mm[e]=!0:(hm[e]=!0,!1)}function Uv(e,t,s,r){if(s!==null&&s.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:s!==null?!s.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function $v(e,t,s,r){if(t===null||typeof t>"u"||Uv(e,t,s,r))return!0;if(r)return!1;if(s!==null)switch(s.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function zt(e,t,s,r,a,i,l){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=s,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=l}var St={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){St[e]=new zt(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];St[t]=new zt(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){St[e]=new zt(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){St[e]=new zt(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){St[e]=new zt(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){St[e]=new zt(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){St[e]=new zt(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){St[e]=new zt(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){St[e]=new zt(e,5,!1,e.toLowerCase(),null,!1,!1)});var od=/[\-:]([a-z])/g;function cd(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(od,cd);St[t]=new zt(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(od,cd);St[t]=new zt(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(od,cd);St[t]=new zt(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){St[e]=new zt(e,1,!1,e.toLowerCase(),null,!1,!1)});St.xlinkHref=new zt("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){St[e]=new zt(e,1,!1,e.toLowerCase(),null,!0,!0)});function ud(e,t,s,r){var a=St.hasOwnProperty(t)?St[t]:null;(a!==null?a.type!==0:r||!(2o||a[l]!==i[o]){var c=` -`+a[l].replace(" at new "," at ");return e.displayName&&c.includes("")&&(c=c.replace("",e.displayName)),c}while(1<=l&&0<=o);break}}}finally{tc=!1,Error.prepareStackTrace=s}return(e=e?e.displayName||e.name:"")?qa(e):""}function Bv(e){switch(e.tag){case 5:return qa(e.type);case 16:return qa("Lazy");case 13:return qa("Suspense");case 19:return qa("SuspenseList");case 0:case 2:case 15:return e=sc(e.type,!1),e;case 11:return e=sc(e.type.render,!1),e;case 1:return e=sc(e.type,!0),e;default:return""}}function $c(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Lr:return"Fragment";case Mr:return"Portal";case _c:return"Profiler";case dd:return"StrictMode";case zc:return"Suspense";case Uc:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case eg:return(e.displayName||"Context")+".Consumer";case Xp:return(e._context.displayName||"Context")+".Provider";case hd:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case md:return t=e.displayName||null,t!==null?t:$c(e.type)||"Memo";case pn:t=e._payload,e=e._init;try{return $c(e(t))}catch{}}return null}function Kv(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return $c(t);case 8:return t===dd?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Kn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function sg(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Vv(e){var t=sg(e)?"checked":"value",s=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof s<"u"&&typeof s.get=="function"&&typeof s.set=="function"){var a=s.get,i=s.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return a.call(this)},set:function(l){r=""+l,i.call(this,l)}}),Object.defineProperty(e,t,{enumerable:s.enumerable}),{getValue:function(){return r},setValue:function(l){r=""+l},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function rl(e){e._valueTracker||(e._valueTracker=Vv(e))}function ng(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var s=t.getValue(),r="";return e&&(r=sg(e)?e.checked?"true":"false":e.value),e=r,e!==s?(t.setValue(e),!0):!1}function zl(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Bc(e,t){var s=t.checked;return He({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:s??e._wrapperState.initialChecked})}function pm(e,t){var s=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;s=Kn(t.value!=null?t.value:s),e._wrapperState={initialChecked:r,initialValue:s,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function rg(e,t){t=t.checked,t!=null&&ud(e,"checked",t,!1)}function Kc(e,t){rg(e,t);var s=Kn(t.value),r=t.type;if(s!=null)r==="number"?(s===0&&e.value===""||e.value!=s)&&(e.value=""+s):e.value!==""+s&&(e.value=""+s);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Vc(e,t.type,s):t.hasOwnProperty("defaultValue")&&Vc(e,t.type,Kn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function gm(e,t,s){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,s||t===e.value||(e.value=t),e.defaultValue=t}s=e.name,s!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,s!==""&&(e.name=s)}function Vc(e,t,s){(t!=="number"||zl(e.ownerDocument)!==e)&&(s==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+s&&(e.defaultValue=""+s))}var Qa=Array.isArray;function Hr(e,t,s,r){if(e=e.options,t){t={};for(var a=0;a"+t.valueOf().toString()+"",t=al.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function ui(e,t){if(t){var s=e.firstChild;if(s&&s===e.lastChild&&s.nodeType===3){s.nodeValue=t;return}}e.textContent=t}var Ya={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qv=["Webkit","ms","Moz","O"];Object.keys(Ya).forEach(function(e){qv.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ya[t]=Ya[e]})});function og(e,t,s){return t==null||typeof t=="boolean"||t===""?"":s||typeof t!="number"||t===0||Ya.hasOwnProperty(e)&&Ya[e]?(""+t).trim():t+"px"}function cg(e,t){e=e.style;for(var s in t)if(t.hasOwnProperty(s)){var r=s.indexOf("--")===0,a=og(s,t[s],r);s==="float"&&(s="cssFloat"),r?e.setProperty(s,a):e[s]=a}}var Qv=He({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Hc(e,t){if(t){if(Qv[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(q(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(q(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(q(61))}if(t.style!=null&&typeof t.style!="object")throw Error(q(62))}}function Wc(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Gc=null;function fd(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Zc=null,Wr=null,Gr=null;function vm(e){if(e=Vi(e)){if(typeof Zc!="function")throw Error(q(280));var t=e.stateNode;t&&(t=ko(t),Zc(e.stateNode,e.type,t))}}function ug(e){Wr?Gr?Gr.push(e):Gr=[e]:Wr=e}function dg(){if(Wr){var e=Wr,t=Gr;if(Gr=Wr=null,vm(e),t)for(e=0;e>>=0,e===0?32:31-(n0(e)/r0|0)|0}var il=64,ll=4194304;function Ha(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Kl(e,t){var s=e.pendingLanes;if(s===0)return 0;var r=0,a=e.suspendedLanes,i=e.pingedLanes,l=s&268435455;if(l!==0){var o=l&~a;o!==0?r=Ha(o):(i&=l,i!==0&&(r=Ha(i)))}else l=s&~a,l!==0?r=Ha(l):i!==0&&(r=Ha(i));if(r===0)return 0;if(t!==0&&t!==r&&!(t&a)&&(a=r&-r,i=t&-t,a>=i||a===16&&(i&4194240)!==0))return t;if(r&4&&(r|=s&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0s;s++)t.push(e);return t}function Bi(e,t,s){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ks(t),e[t]=s}function o0(e,t){var s=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Xa),Dm=" ",Pm=!1;function Tg(e,t){switch(e){case"keyup":return R0.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Fg(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Rr=!1;function _0(e,t){switch(e){case"compositionend":return Fg(t);case"keypress":return t.which!==32?null:(Pm=!0,Dm);case"textInput":return e=t.data,e===Dm&&Pm?null:e;default:return null}}function z0(e,t){if(Rr)return e==="compositionend"||!Nd&&Tg(e,t)?(e=Pg(),kl=vd=An=null,Rr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:s,offset:t-e};e=r}e:{for(;s;){if(s.nextSibling){s=s.nextSibling;break e}s=s.parentNode}s=void 0}s=Im(s)}}function Rg(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Rg(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Og(){for(var e=window,t=zl();t instanceof e.HTMLIFrameElement;){try{var s=typeof t.contentWindow.location.href=="string"}catch{s=!1}if(s)e=t.contentWindow;else break;t=zl(e.document)}return t}function wd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function W0(e){var t=Og(),s=e.focusedElem,r=e.selectionRange;if(t!==s&&s&&s.ownerDocument&&Rg(s.ownerDocument.documentElement,s)){if(r!==null&&wd(s)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in s)s.selectionStart=t,s.selectionEnd=Math.min(e,s.value.length);else if(e=(t=s.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var a=s.textContent.length,i=Math.min(r.start,a);r=r.end===void 0?i:Math.min(r.end,a),!e.extend&&i>r&&(a=r,r=i,i=a),a=Mm(s,i);var l=Mm(s,r);a&&l&&(e.rangeCount!==1||e.anchorNode!==a.node||e.anchorOffset!==a.offset||e.focusNode!==l.node||e.focusOffset!==l.offset)&&(t=t.createRange(),t.setStart(a.node,a.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(l.node,l.offset)):(t.setEnd(l.node,l.offset),e.addRange(t)))}}for(t=[],e=s;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof s.focus=="function"&&s.focus(),s=0;s=document.documentMode,Or=null,su=null,ti=null,nu=!1;function Lm(e,t,s){var r=s.window===s?s.document:s.nodeType===9?s:s.ownerDocument;nu||Or==null||Or!==zl(r)||(r=Or,"selectionStart"in r&&wd(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ti&&gi(ti,r)||(ti=r,r=Ql(su,"onSelect"),0Ur||(e.current=cu[Ur],cu[Ur]=null,Ur--)}function Re(e,t){Ur++,cu[Ur]=e.current,e.current=t}var Vn={},At=Hn(Vn),Ht=Hn(!1),gr=Vn;function fa(e,t){var s=e.type.contextTypes;if(!s)return Vn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var a={},i;for(i in s)a[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function Wt(e){return e=e.childContextTypes,e!=null}function Wl(){ze(Ht),ze(At)}function Bm(e,t,s){if(At.current!==Vn)throw Error(q(168));Re(At,t),Re(Ht,s)}function Qg(e,t,s){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return s;r=r.getChildContext();for(var a in r)if(!(a in t))throw Error(q(108,Kv(e)||"Unknown",a));return He({},s,r)}function Gl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Vn,gr=At.current,Re(At,e),Re(Ht,Ht.current),!0}function Km(e,t,s){var r=e.stateNode;if(!r)throw Error(q(169));s?(e=Qg(e,t,gr),r.__reactInternalMemoizedMergedChildContext=e,ze(Ht),ze(At),Re(At,e)):ze(Ht),Re(Ht,s)}var Qs=null,Co=!1,gc=!1;function Hg(e){Qs===null?Qs=[e]:Qs.push(e)}function ij(e){Co=!0,Hg(e)}function Wn(){if(!gc&&Qs!==null){gc=!0;var e=0,t=Ie;try{var s=Qs;for(Ie=1;e>=l,a-=l,Js=1<<32-ks(t)+a|s<S?(L=F,F=null):L=F.sibling;var T=p(y,F,x[S],N);if(T===null){F===null&&(F=L);break}e&&F&&T.alternate===null&&t(y,F),v=i(T,v,S),D===null?k=T:D.sibling=T,D=T,F=L}if(S===x.length)return s(y,F),Be&&Zn(y,S),k;if(F===null){for(;SS?(L=F,F=null):L=F.sibling;var _=p(y,F,T.value,N);if(_===null){F===null&&(F=L);break}e&&F&&_.alternate===null&&t(y,F),v=i(_,v,S),D===null?k=_:D.sibling=_,D=_,F=L}if(T.done)return s(y,F),Be&&Zn(y,S),k;if(F===null){for(;!T.done;S++,T=x.next())T=m(y,T.value,N),T!==null&&(v=i(T,v,S),D===null?k=T:D.sibling=T,D=T);return Be&&Zn(y,S),k}for(F=r(y,F);!T.done;S++,T=x.next())T=h(F,y,S,T.value,N),T!==null&&(e&&T.alternate!==null&&F.delete(T.key===null?S:T.key),v=i(T,v,S),D===null?k=T:D.sibling=T,D=T);return e&&F.forEach(function(K){return t(y,K)}),Be&&Zn(y,S),k}function b(y,v,x,N){if(typeof x=="object"&&x!==null&&x.type===Lr&&x.key===null&&(x=x.props.children),typeof x=="object"&&x!==null){switch(x.$$typeof){case nl:e:{for(var k=x.key,D=v;D!==null;){if(D.key===k){if(k=x.type,k===Lr){if(D.tag===7){s(y,D.sibling),v=a(D,x.props.children),v.return=y,y=v;break e}}else if(D.elementType===k||typeof k=="object"&&k!==null&&k.$$typeof===pn&&Qm(k)===D.type){s(y,D.sibling),v=a(D,x.props),v.ref=Ua(y,D,x),v.return=y,y=v;break e}s(y,D);break}else t(y,D);D=D.sibling}x.type===Lr?(v=fr(x.props.children,y.mode,N,x.key),v.return=y,y=v):(N=Il(x.type,x.key,x.props,null,y.mode,N),N.ref=Ua(y,v,x),N.return=y,y=N)}return l(y);case Mr:e:{for(D=x.key;v!==null;){if(v.key===D)if(v.tag===4&&v.stateNode.containerInfo===x.containerInfo&&v.stateNode.implementation===x.implementation){s(y,v.sibling),v=a(v,x.children||[]),v.return=y,y=v;break e}else{s(y,v);break}else t(y,v);v=v.sibling}v=Sc(x,y.mode,N),v.return=y,y=v}return l(y);case pn:return D=x._init,b(y,v,D(x._payload),N)}if(Qa(x))return f(y,v,x,N);if(La(x))return g(y,v,x,N);fl(y,x)}return typeof x=="string"&&x!==""||typeof x=="number"?(x=""+x,v!==null&&v.tag===6?(s(y,v.sibling),v=a(v,x),v.return=y,y=v):(s(y,v),v=wc(x,y.mode,N),v.return=y,y=v),l(y)):s(y,v)}return b}var ga=Yg(!0),Jg=Yg(!1),Jl=Hn(null),Xl=null,Kr=null,Ed=null;function Dd(){Ed=Kr=Xl=null}function Pd(e){var t=Jl.current;ze(Jl),e._currentValue=t}function hu(e,t,s){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===s)break;e=e.return}}function Yr(e,t){Xl=e,Ed=Kr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(Qt=!0),e.firstContext=null)}function fs(e){var t=e._currentValue;if(Ed!==e)if(e={context:e,memoizedValue:t,next:null},Kr===null){if(Xl===null)throw Error(q(308));Kr=e,Xl.dependencies={lanes:0,firstContext:e}}else Kr=Kr.next=e;return t}var Xn=null;function Ad(e){Xn===null?Xn=[e]:Xn.push(e)}function Xg(e,t,s,r){var a=t.interleaved;return a===null?(s.next=s,Ad(t)):(s.next=a.next,a.next=s),t.interleaved=s,ln(e,r)}function ln(e,t){e.lanes|=t;var s=e.alternate;for(s!==null&&(s.lanes|=t),s=e,e=e.return;e!==null;)e.childLanes|=t,s=e.alternate,s!==null&&(s.childLanes|=t),s=e,e=e.return;return s.tag===3?s.stateNode:null}var gn=!1;function Td(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function ex(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function sn(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function On(e,t,s){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,De&2){var a=r.pending;return a===null?t.next=t:(t.next=a.next,a.next=t),r.pending=t,ln(e,s)}return a=r.interleaved,a===null?(t.next=t,Ad(r)):(t.next=a.next,a.next=t),r.interleaved=t,ln(e,s)}function El(e,t,s){if(t=t.updateQueue,t!==null&&(t=t.shared,(s&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,s|=r,t.lanes=s,gd(e,s)}}function Hm(e,t){var s=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,s===r)){var a=null,i=null;if(s=s.firstBaseUpdate,s!==null){do{var l={eventTime:s.eventTime,lane:s.lane,tag:s.tag,payload:s.payload,callback:s.callback,next:null};i===null?a=i=l:i=i.next=l,s=s.next}while(s!==null);i===null?a=i=t:i=i.next=t}else a=i=t;s={baseState:r.baseState,firstBaseUpdate:a,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=s;return}e=s.lastBaseUpdate,e===null?s.firstBaseUpdate=t:e.next=t,s.lastBaseUpdate=t}function eo(e,t,s,r){var a=e.updateQueue;gn=!1;var i=a.firstBaseUpdate,l=a.lastBaseUpdate,o=a.shared.pending;if(o!==null){a.shared.pending=null;var c=o,u=c.next;c.next=null,l===null?i=u:l.next=u,l=c;var d=e.alternate;d!==null&&(d=d.updateQueue,o=d.lastBaseUpdate,o!==l&&(o===null?d.firstBaseUpdate=u:o.next=u,d.lastBaseUpdate=c))}if(i!==null){var m=a.baseState;l=0,d=u=c=null,o=i;do{var p=o.lane,h=o.eventTime;if((r&p)===p){d!==null&&(d=d.next={eventTime:h,lane:0,tag:o.tag,payload:o.payload,callback:o.callback,next:null});e:{var f=e,g=o;switch(p=t,h=s,g.tag){case 1:if(f=g.payload,typeof f=="function"){m=f.call(h,m,p);break e}m=f;break e;case 3:f.flags=f.flags&-65537|128;case 0:if(f=g.payload,p=typeof f=="function"?f.call(h,m,p):f,p==null)break e;m=He({},m,p);break e;case 2:gn=!0}}o.callback!==null&&o.lane!==0&&(e.flags|=64,p=a.effects,p===null?a.effects=[o]:p.push(o))}else h={eventTime:h,lane:p,tag:o.tag,payload:o.payload,callback:o.callback,next:null},d===null?(u=d=h,c=m):d=d.next=h,l|=p;if(o=o.next,o===null){if(o=a.shared.pending,o===null)break;p=o,o=p.next,p.next=null,a.lastBaseUpdate=p,a.shared.pending=null}}while(!0);if(d===null&&(c=m),a.baseState=c,a.firstBaseUpdate=u,a.lastBaseUpdate=d,t=a.shared.interleaved,t!==null){a=t;do l|=a.lane,a=a.next;while(a!==t)}else i===null&&(a.shared.lanes=0);vr|=l,e.lanes=l,e.memoizedState=m}}function Wm(e,t,s){if(e=t.effects,t.effects=null,e!==null)for(t=0;ts?s:4,e(!0);var r=yc.transition;yc.transition={};try{e(!1),t()}finally{Ie=s,yc.transition=r}}function xx(){return ps().memoizedState}function uj(e,t,s){var r=zn(e);if(s={lane:r,action:s,hasEagerState:!1,eagerState:null,next:null},yx(e))vx(t,s);else if(s=Xg(e,t,s,r),s!==null){var a=Ot();Cs(s,e,r,a),jx(s,t,r)}}function dj(e,t,s){var r=zn(e),a={lane:r,action:s,hasEagerState:!1,eagerState:null,next:null};if(yx(e))vx(t,a);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var l=t.lastRenderedState,o=i(l,s);if(a.hasEagerState=!0,a.eagerState=o,Es(o,l)){var c=t.interleaved;c===null?(a.next=a,Ad(t)):(a.next=c.next,c.next=a),t.interleaved=a;return}}catch{}finally{}s=Xg(e,t,a,r),s!==null&&(a=Ot(),Cs(s,e,r,a),jx(s,t,r))}}function yx(e){var t=e.alternate;return e===qe||t!==null&&t===qe}function vx(e,t){si=so=!0;var s=e.pending;s===null?t.next=t:(t.next=s.next,s.next=t),e.pending=t}function jx(e,t,s){if(s&4194240){var r=t.lanes;r&=e.pendingLanes,s|=r,t.lanes=s,gd(e,s)}}var no={readContext:fs,useCallback:kt,useContext:kt,useEffect:kt,useImperativeHandle:kt,useInsertionEffect:kt,useLayoutEffect:kt,useMemo:kt,useReducer:kt,useRef:kt,useState:kt,useDebugValue:kt,useDeferredValue:kt,useTransition:kt,useMutableSource:kt,useSyncExternalStore:kt,useId:kt,unstable_isNewReconciler:!1},hj={readContext:fs,useCallback:function(e,t){return Ts().memoizedState=[e,t===void 0?null:t],e},useContext:fs,useEffect:Zm,useImperativeHandle:function(e,t,s){return s=s!=null?s.concat([e]):null,Pl(4194308,4,hx.bind(null,t,e),s)},useLayoutEffect:function(e,t){return Pl(4194308,4,e,t)},useInsertionEffect:function(e,t){return Pl(4,2,e,t)},useMemo:function(e,t){var s=Ts();return t=t===void 0?null:t,e=e(),s.memoizedState=[e,t],e},useReducer:function(e,t,s){var r=Ts();return t=s!==void 0?s(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=uj.bind(null,qe,e),[r.memoizedState,e]},useRef:function(e){var t=Ts();return e={current:e},t.memoizedState=e},useState:Gm,useDebugValue:zd,useDeferredValue:function(e){return Ts().memoizedState=e},useTransition:function(){var e=Gm(!1),t=e[0];return e=cj.bind(null,e[1]),Ts().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,s){var r=qe,a=Ts();if(Be){if(s===void 0)throw Error(q(407));s=s()}else{if(s=t(),jt===null)throw Error(q(349));yr&30||rx(r,t,s)}a.memoizedState=s;var i={value:s,getSnapshot:t};return a.queue=i,Zm(ix.bind(null,r,i,e),[e]),r.flags|=2048,Si(9,ax.bind(null,r,i,s,t),void 0,null),s},useId:function(){var e=Ts(),t=jt.identifierPrefix;if(Be){var s=Xs,r=Js;s=(r&~(1<<32-ks(r)-1)).toString(32)+s,t=":"+t+"R"+s,s=Ni++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=l.createElement(s,{is:r.is}):(e=l.createElement(s),s==="select"&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,s),e[Rs]=t,e[vi]=r,Ax(e,t,!1,!1),t.stateNode=e;e:{switch(l=Wc(s,r),s){case"dialog":_e("cancel",e),_e("close",e),a=r;break;case"iframe":case"object":case"embed":_e("load",e),a=r;break;case"video":case"audio":for(a=0;ava&&(t.flags|=128,r=!0,$a(i,!1),t.lanes=4194304)}else{if(!r)if(e=to(l),e!==null){if(t.flags|=128,r=!0,s=e.updateQueue,s!==null&&(t.updateQueue=s,t.flags|=4),$a(i,!0),i.tail===null&&i.tailMode==="hidden"&&!l.alternate&&!Be)return Ct(t),null}else 2*et()-i.renderingStartTime>va&&s!==1073741824&&(t.flags|=128,r=!0,$a(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(s=i.last,s!==null?s.sibling=l:t.child=l,i.last=l)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=et(),t.sibling=null,s=Ve.current,Re(Ve,r?s&1|2:s&1),t):(Ct(t),null);case 22:case 23:return qd(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?es&1073741824&&(Ct(t),t.subtreeFlags&6&&(t.flags|=8192)):Ct(t),null;case 24:return null;case 25:return null}throw Error(q(156,t.tag))}function jj(e,t){switch(kd(t),t.tag){case 1:return Wt(t.type)&&Wl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return xa(),ze(Ht),ze(At),Md(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Id(t),null;case 13:if(ze(Ve),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(q(340));pa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ze(Ve),null;case 4:return xa(),null;case 10:return Pd(t.type._context),null;case 22:case 23:return qd(),null;case 24:return null;default:return null}}var gl=!1,Et=!1,bj=typeof WeakSet=="function"?WeakSet:Set,re=null;function Vr(e,t){var s=e.ref;if(s!==null)if(typeof s=="function")try{s(null)}catch(r){Je(e,t,r)}else s.current=null}function bu(e,t,s){try{s()}catch(r){Je(e,t,r)}}var of=!1;function Nj(e,t){if(ru=Vl,e=Og(),wd(e)){if("selectionStart"in e)var s={start:e.selectionStart,end:e.selectionEnd};else e:{s=(s=e.ownerDocument)&&s.defaultView||window;var r=s.getSelection&&s.getSelection();if(r&&r.rangeCount!==0){s=r.anchorNode;var a=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{s.nodeType,i.nodeType}catch{s=null;break e}var l=0,o=-1,c=-1,u=0,d=0,m=e,p=null;t:for(;;){for(var h;m!==s||a!==0&&m.nodeType!==3||(o=l+a),m!==i||r!==0&&m.nodeType!==3||(c=l+r),m.nodeType===3&&(l+=m.nodeValue.length),(h=m.firstChild)!==null;)p=m,m=h;for(;;){if(m===e)break t;if(p===s&&++u===a&&(o=l),p===i&&++d===r&&(c=l),(h=m.nextSibling)!==null)break;m=p,p=m.parentNode}m=h}s=o===-1||c===-1?null:{start:o,end:c}}else s=null}s=s||{start:0,end:0}}else s=null;for(au={focusedElem:e,selectionRange:s},Vl=!1,re=t;re!==null;)if(t=re,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,re=e;else for(;re!==null;){t=re;try{var f=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(f!==null){var g=f.memoizedProps,b=f.memoizedState,y=t.stateNode,v=y.getSnapshotBeforeUpdate(t.elementType===t.type?g:ys(t.type,g),b);y.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var x=t.stateNode.containerInfo;x.nodeType===1?x.textContent="":x.nodeType===9&&x.documentElement&&x.removeChild(x.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(q(163))}}catch(N){Je(t,t.return,N)}if(e=t.sibling,e!==null){e.return=t.return,re=e;break}re=t.return}return f=of,of=!1,f}function ni(e,t,s){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var a=r=r.next;do{if((a.tag&e)===e){var i=a.destroy;a.destroy=void 0,i!==void 0&&bu(t,s,i)}a=a.next}while(a!==r)}}function Po(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var s=t=t.next;do{if((s.tag&e)===e){var r=s.create;s.destroy=r()}s=s.next}while(s!==t)}}function Nu(e){var t=e.ref;if(t!==null){var s=e.stateNode;switch(e.tag){case 5:e=s;break;default:e=s}typeof t=="function"?t(e):t.current=e}}function Ix(e){var t=e.alternate;t!==null&&(e.alternate=null,Ix(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Rs],delete t[vi],delete t[ou],delete t[rj],delete t[aj])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Mx(e){return e.tag===5||e.tag===3||e.tag===4}function cf(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Mx(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function wu(e,t,s){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?s.nodeType===8?s.parentNode.insertBefore(e,t):s.insertBefore(e,t):(s.nodeType===8?(t=s.parentNode,t.insertBefore(e,s)):(t=s,t.appendChild(e)),s=s._reactRootContainer,s!=null||t.onclick!==null||(t.onclick=Hl));else if(r!==4&&(e=e.child,e!==null))for(wu(e,t,s),e=e.sibling;e!==null;)wu(e,t,s),e=e.sibling}function Su(e,t,s){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?s.insertBefore(e,t):s.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Su(e,t,s),e=e.sibling;e!==null;)Su(e,t,s),e=e.sibling}var bt=null,bs=!1;function mn(e,t,s){for(s=s.child;s!==null;)Lx(e,t,s),s=s.sibling}function Lx(e,t,s){if(Os&&typeof Os.onCommitFiberUnmount=="function")try{Os.onCommitFiberUnmount(bo,s)}catch{}switch(s.tag){case 5:Et||Vr(s,t);case 6:var r=bt,a=bs;bt=null,mn(e,t,s),bt=r,bs=a,bt!==null&&(bs?(e=bt,s=s.stateNode,e.nodeType===8?e.parentNode.removeChild(s):e.removeChild(s)):bt.removeChild(s.stateNode));break;case 18:bt!==null&&(bs?(e=bt,s=s.stateNode,e.nodeType===8?pc(e.parentNode,s):e.nodeType===1&&pc(e,s),fi(e)):pc(bt,s.stateNode));break;case 4:r=bt,a=bs,bt=s.stateNode.containerInfo,bs=!0,mn(e,t,s),bt=r,bs=a;break;case 0:case 11:case 14:case 15:if(!Et&&(r=s.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){a=r=r.next;do{var i=a,l=i.destroy;i=i.tag,l!==void 0&&(i&2||i&4)&&bu(s,t,l),a=a.next}while(a!==r)}mn(e,t,s);break;case 1:if(!Et&&(Vr(s,t),r=s.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=s.memoizedProps,r.state=s.memoizedState,r.componentWillUnmount()}catch(o){Je(s,t,o)}mn(e,t,s);break;case 21:mn(e,t,s);break;case 22:s.mode&1?(Et=(r=Et)||s.memoizedState!==null,mn(e,t,s),Et=r):mn(e,t,s);break;default:mn(e,t,s)}}function uf(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var s=e.stateNode;s===null&&(s=e.stateNode=new bj),t.forEach(function(r){var a=Tj.bind(null,e,r);s.has(r)||(s.add(r),r.then(a,a))})}}function xs(e,t){var s=t.deletions;if(s!==null)for(var r=0;ra&&(a=l),r&=~i}if(r=a,r=et()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Sj(r/1960))-r,10e?16:e,Tn===null)var r=!1;else{if(e=Tn,Tn=null,io=0,De&6)throw Error(q(331));var a=De;for(De|=4,re=e.current;re!==null;){var i=re,l=i.child;if(re.flags&16){var o=i.deletions;if(o!==null){for(var c=0;cet()-Kd?mr(e,0):Bd|=s),Gt(e,t)}function Kx(e,t){t===0&&(e.mode&1?(t=ll,ll<<=1,!(ll&130023424)&&(ll=4194304)):t=1);var s=Ot();e=ln(e,t),e!==null&&(Bi(e,t,s),Gt(e,s))}function Aj(e){var t=e.memoizedState,s=0;t!==null&&(s=t.retryLane),Kx(e,s)}function Tj(e,t){var s=0;switch(e.tag){case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(s=a.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(q(314))}r!==null&&r.delete(t),Kx(e,s)}var Vx;Vx=function(e,t,s){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ht.current)Qt=!0;else{if(!(e.lanes&s)&&!(t.flags&128))return Qt=!1,yj(e,t,s);Qt=!!(e.flags&131072)}else Qt=!1,Be&&t.flags&1048576&&Wg(t,Yl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Al(e,t),e=t.pendingProps;var a=fa(t,At.current);Yr(t,s),a=Rd(null,t,r,e,a,s);var i=Od();return t.flags|=1,typeof a=="object"&&a!==null&&typeof a.render=="function"&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Wt(r)?(i=!0,Gl(t)):i=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,Td(t),a.updater=Do,t.stateNode=a,a._reactInternals=t,fu(t,r,e,s),t=xu(null,t,r,!0,i,s)):(t.tag=0,Be&&i&&Sd(t),Lt(null,t,a,s),t=t.child),t;case 16:r=t.elementType;e:{switch(Al(e,t),e=t.pendingProps,a=r._init,r=a(r._payload),t.type=r,a=t.tag=Ij(r),e=ys(r,e),a){case 0:t=gu(null,t,r,e,s);break e;case 1:t=rf(null,t,r,e,s);break e;case 11:t=sf(null,t,r,e,s);break e;case 14:t=nf(null,t,r,ys(r.type,e),s);break e}throw Error(q(306,r,""))}return t;case 0:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ys(r,a),gu(e,t,r,a,s);case 1:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ys(r,a),rf(e,t,r,a,s);case 3:e:{if(Ex(t),e===null)throw Error(q(387));r=t.pendingProps,i=t.memoizedState,a=i.element,ex(e,t),eo(t,r,null,s);var l=t.memoizedState;if(r=l.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){a=ya(Error(q(423)),t),t=af(e,t,r,s,a);break e}else if(r!==a){a=ya(Error(q(424)),t),t=af(e,t,r,s,a);break e}else for(ss=Rn(t.stateNode.containerInfo.firstChild),ns=t,Be=!0,Ns=null,s=Jg(t,null,r,s),t.child=s;s;)s.flags=s.flags&-3|4096,s=s.sibling;else{if(pa(),r===a){t=on(e,t,s);break e}Lt(e,t,r,s)}t=t.child}return t;case 5:return tx(t),e===null&&du(t),r=t.type,a=t.pendingProps,i=e!==null?e.memoizedProps:null,l=a.children,iu(r,a)?l=null:i!==null&&iu(r,i)&&(t.flags|=32),Cx(e,t),Lt(e,t,l,s),t.child;case 6:return e===null&&du(t),null;case 13:return Dx(e,t,s);case 4:return Fd(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=ga(t,null,r,s):Lt(e,t,r,s),t.child;case 11:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ys(r,a),sf(e,t,r,a,s);case 7:return Lt(e,t,t.pendingProps,s),t.child;case 8:return Lt(e,t,t.pendingProps.children,s),t.child;case 12:return Lt(e,t,t.pendingProps.children,s),t.child;case 10:e:{if(r=t.type._context,a=t.pendingProps,i=t.memoizedProps,l=a.value,Re(Jl,r._currentValue),r._currentValue=l,i!==null)if(Es(i.value,l)){if(i.children===a.children&&!Ht.current){t=on(e,t,s);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var o=i.dependencies;if(o!==null){l=i.child;for(var c=o.firstContext;c!==null;){if(c.context===r){if(i.tag===1){c=sn(-1,s&-s),c.tag=2;var u=i.updateQueue;if(u!==null){u=u.shared;var d=u.pending;d===null?c.next=c:(c.next=d.next,d.next=c),u.pending=c}}i.lanes|=s,c=i.alternate,c!==null&&(c.lanes|=s),hu(i.return,s,t),o.lanes|=s;break}c=c.next}}else if(i.tag===10)l=i.type===t.type?null:i.child;else if(i.tag===18){if(l=i.return,l===null)throw Error(q(341));l.lanes|=s,o=l.alternate,o!==null&&(o.lanes|=s),hu(l,s,t),l=i.sibling}else l=i.child;if(l!==null)l.return=i;else for(l=i;l!==null;){if(l===t){l=null;break}if(i=l.sibling,i!==null){i.return=l.return,l=i;break}l=l.return}i=l}Lt(e,t,a.children,s),t=t.child}return t;case 9:return a=t.type,r=t.pendingProps.children,Yr(t,s),a=fs(a),r=r(a),t.flags|=1,Lt(e,t,r,s),t.child;case 14:return r=t.type,a=ys(r,t.pendingProps),a=ys(r.type,a),nf(e,t,r,a,s);case 15:return Sx(e,t,t.type,t.pendingProps,s);case 17:return r=t.type,a=t.pendingProps,a=t.elementType===r?a:ys(r,a),Al(e,t),t.tag=1,Wt(r)?(e=!0,Gl(t)):e=!1,Yr(t,s),bx(t,r,a),fu(t,r,a,s),xu(null,t,r,!0,e,s);case 19:return Px(e,t,s);case 22:return kx(e,t,s)}throw Error(q(156,t.tag))};function qx(e,t){return yg(e,t)}function Fj(e,t,s,r){this.tag=e,this.key=s,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ds(e,t,s,r){return new Fj(e,t,s,r)}function Hd(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Ij(e){if(typeof e=="function")return Hd(e)?1:0;if(e!=null){if(e=e.$$typeof,e===hd)return 11;if(e===md)return 14}return 2}function Un(e,t){var s=e.alternate;return s===null?(s=ds(e.tag,t,e.key,e.mode),s.elementType=e.elementType,s.type=e.type,s.stateNode=e.stateNode,s.alternate=e,e.alternate=s):(s.pendingProps=t,s.type=e.type,s.flags=0,s.subtreeFlags=0,s.deletions=null),s.flags=e.flags&14680064,s.childLanes=e.childLanes,s.lanes=e.lanes,s.child=e.child,s.memoizedProps=e.memoizedProps,s.memoizedState=e.memoizedState,s.updateQueue=e.updateQueue,t=e.dependencies,s.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},s.sibling=e.sibling,s.index=e.index,s.ref=e.ref,s}function Il(e,t,s,r,a,i){var l=2;if(r=e,typeof e=="function")Hd(e)&&(l=1);else if(typeof e=="string")l=5;else e:switch(e){case Lr:return fr(s.children,a,i,t);case dd:l=8,a|=8;break;case _c:return e=ds(12,s,t,a|2),e.elementType=_c,e.lanes=i,e;case zc:return e=ds(13,s,t,a),e.elementType=zc,e.lanes=i,e;case Uc:return e=ds(19,s,t,a),e.elementType=Uc,e.lanes=i,e;case tg:return To(s,a,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Xp:l=10;break e;case eg:l=9;break e;case hd:l=11;break e;case md:l=14;break e;case pn:l=16,r=null;break e}throw Error(q(130,e==null?e:typeof e,""))}return t=ds(l,s,t,a),t.elementType=e,t.type=r,t.lanes=i,t}function fr(e,t,s,r){return e=ds(7,e,r,t),e.lanes=s,e}function To(e,t,s,r){return e=ds(22,e,r,t),e.elementType=tg,e.lanes=s,e.stateNode={isHidden:!1},e}function wc(e,t,s){return e=ds(6,e,null,t),e.lanes=s,e}function Sc(e,t,s){return t=ds(4,e.children!==null?e.children:[],e.key,t),t.lanes=s,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Mj(e,t,s,r,a){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=rc(0),this.expirationTimes=rc(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=rc(0),this.identifierPrefix=r,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function Wd(e,t,s,r,a,i,l,o,c){return e=new Mj(e,t,s,o,c),t===1?(t=1,i===!0&&(t|=8)):t=0,i=ds(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:s,cache:null,transitions:null,pendingSuspenseBoundaries:null},Td(i),e}function Lj(e,t,s){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Gx)}catch(e){console.error(e)}}Gx(),Gp.exports=as;var Uj=Gp.exports,yf=Uj;Rc.createRoot=yf.createRoot,Rc.hydrateRoot=yf.hydrateRoot;/** - * @remix-run/router v1.23.2 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Ci(){return Ci=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function Jd(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function Bj(){return Math.random().toString(36).substr(2,8)}function jf(e,t){return{usr:e.state,key:e.key,idx:t}}function Pu(e,t,s,r){return s===void 0&&(s=null),Ci({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?Ea(t):t,{state:s,key:t&&t.key||r||Bj()})}function co(e){let{pathname:t="/",search:s="",hash:r=""}=e;return s&&s!=="?"&&(t+=s.charAt(0)==="?"?s:"?"+s),r&&r!=="#"&&(t+=r.charAt(0)==="#"?r:"#"+r),t}function Ea(e){let t={};if(e){let s=e.indexOf("#");s>=0&&(t.hash=e.substr(s),e=e.substr(0,s));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function Kj(e,t,s,r){r===void 0&&(r={});let{window:a=document.defaultView,v5Compat:i=!1}=r,l=a.history,o=Fn.Pop,c=null,u=d();u==null&&(u=0,l.replaceState(Ci({},l.state,{idx:u}),""));function d(){return(l.state||{idx:null}).idx}function m(){o=Fn.Pop;let b=d(),y=b==null?null:b-u;u=b,c&&c({action:o,location:g.location,delta:y})}function p(b,y){o=Fn.Push;let v=Pu(g.location,b,y);u=d()+1;let x=jf(v,u),N=g.createHref(v);try{l.pushState(x,"",N)}catch(k){if(k instanceof DOMException&&k.name==="DataCloneError")throw k;a.location.assign(N)}i&&c&&c({action:o,location:g.location,delta:1})}function h(b,y){o=Fn.Replace;let v=Pu(g.location,b,y);u=d();let x=jf(v,u),N=g.createHref(v);l.replaceState(x,"",N),i&&c&&c({action:o,location:g.location,delta:0})}function f(b){let y=a.location.origin!=="null"?a.location.origin:a.location.href,v=typeof b=="string"?b:co(b);return v=v.replace(/ $/,"%20"),Qe(y,"No window.location.(origin|href) available to create URL for href: "+v),new URL(v,y)}let g={get action(){return o},get location(){return e(a,l)},listen(b){if(c)throw new Error("A history only accepts one active listener");return a.addEventListener(vf,m),c=b,()=>{a.removeEventListener(vf,m),c=null}},createHref(b){return t(a,b)},createURL:f,encodeLocation(b){let y=f(b);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:p,replace:h,go(b){return l.go(b)}};return g}var bf;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(bf||(bf={}));function Vj(e,t,s){return s===void 0&&(s="/"),qj(e,t,s)}function qj(e,t,s,r){let a=typeof t=="string"?Ea(t):t,i=ja(a.pathname||"/",s);if(i==null)return null;let l=Zx(e);Qj(l);let o=null;for(let c=0;o==null&&c{let c={relativePath:o===void 0?i.path||"":o,caseSensitive:i.caseSensitive===!0,childrenIndex:l,route:i};c.relativePath.startsWith("/")&&(Qe(c.relativePath.startsWith(r),'Absolute route path "'+c.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),c.relativePath=c.relativePath.slice(r.length));let u=$n([r,c.relativePath]),d=s.concat(c);i.children&&i.children.length>0&&(Qe(i.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+u+'".')),Zx(i.children,t,d,u)),!(i.path==null&&!i.index)&&t.push({path:u,score:Xj(u,i.index),routesMeta:d})};return e.forEach((i,l)=>{var o;if(i.path===""||!((o=i.path)!=null&&o.includes("?")))a(i,l);else for(let c of Yx(i.path))a(i,l,c)}),t}function Yx(e){let t=e.split("/");if(t.length===0)return[];let[s,...r]=t,a=s.endsWith("?"),i=s.replace(/\?$/,"");if(r.length===0)return a?[i,""]:[i];let l=Yx(r.join("/")),o=[];return o.push(...l.map(c=>c===""?i:[i,c].join("/"))),a&&o.push(...l),o.map(c=>e.startsWith("/")&&c===""?"/":c)}function Qj(e){e.sort((t,s)=>t.score!==s.score?s.score-t.score:eb(t.routesMeta.map(r=>r.childrenIndex),s.routesMeta.map(r=>r.childrenIndex)))}const Hj=/^:[\w-]+$/,Wj=3,Gj=2,Zj=1,Yj=10,Jj=-2,Nf=e=>e==="*";function Xj(e,t){let s=e.split("/"),r=s.length;return s.some(Nf)&&(r+=Jj),t&&(r+=Gj),s.filter(a=>!Nf(a)).reduce((a,i)=>a+(Hj.test(i)?Wj:i===""?Zj:Yj),r)}function eb(e,t){return e.length===t.length&&e.slice(0,-1).every((r,a)=>r===t[a])?e[e.length-1]-t[t.length-1]:0}function tb(e,t,s){let{routesMeta:r}=e,a={},i="/",l=[];for(let o=0;o{let{paramName:p,isOptional:h}=d;if(p==="*"){let g=o[m]||"";l=i.slice(0,i.length-g.length).replace(/(.)\/+$/,"$1")}const f=o[m];return h&&!f?u[p]=void 0:u[p]=(f||"").replace(/%2F/g,"/"),u},{}),pathname:i,pathnameBase:l,pattern:e}}function sb(e,t,s){t===void 0&&(t=!1),s===void 0&&(s=!0),Jd(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(l,o,c)=>(r.push({paramName:o,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),a+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):s?a+="\\/*$":e!==""&&e!=="/"&&(a+="(?:(?=\\/|$))"),[new RegExp(a,t?void 0:"i"),r]}function nb(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return Jd(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function ja(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let s=t.endsWith("/")?t.length-1:t.length,r=e.charAt(s);return r&&r!=="/"?null:e.slice(s)||"/"}const rb=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,ab=e=>rb.test(e);function ib(e,t){t===void 0&&(t="/");let{pathname:s,search:r="",hash:a=""}=typeof e=="string"?Ea(e):e,i;if(s)if(ab(s))i=s;else{if(s.includes("//")){let l=s;s=s.replace(/\/\/+/g,"/"),Jd(!1,"Pathnames cannot have embedded double slashes - normalizing "+(l+" -> "+s))}s.startsWith("/")?i=wf(s.substring(1),"/"):i=wf(s,t)}else i=t;return{pathname:i,search:cb(r),hash:ub(a)}}function wf(e,t){let s=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(a=>{a===".."?s.length>1&&s.pop():a!=="."&&s.push(a)}),s.length>1?s.join("/"):"/"}function kc(e,t,s,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+s+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function lb(e){return e.filter((t,s)=>s===0||t.route.path&&t.route.path.length>0)}function Xd(e,t){let s=lb(e);return t?s.map((r,a)=>a===s.length-1?r.pathname:r.pathnameBase):s.map(r=>r.pathnameBase)}function eh(e,t,s,r){r===void 0&&(r=!1);let a;typeof e=="string"?a=Ea(e):(a=Ci({},e),Qe(!a.pathname||!a.pathname.includes("?"),kc("?","pathname","search",a)),Qe(!a.pathname||!a.pathname.includes("#"),kc("#","pathname","hash",a)),Qe(!a.search||!a.search.includes("#"),kc("#","search","hash",a)));let i=e===""||a.pathname==="",l=i?"/":a.pathname,o;if(l==null)o=s;else{let m=t.length-1;if(!r&&l.startsWith("..")){let p=l.split("/");for(;p[0]==="..";)p.shift(),m-=1;a.pathname=p.join("/")}o=m>=0?t[m]:"/"}let c=ib(a,o),u=l&&l!=="/"&&l.endsWith("/"),d=(i||l===".")&&s.endsWith("/");return!c.pathname.endsWith("/")&&(u||d)&&(c.pathname+="/"),c}const $n=e=>e.join("/").replace(/\/\/+/g,"/"),ob=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),cb=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,ub=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function db(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Jx=["post","put","patch","delete"];new Set(Jx);const hb=["get",...Jx];new Set(hb);/** - * React Router v6.30.3 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function Ei(){return Ei=Object.assign?Object.assign.bind():function(e){for(var t=1;t{o.current=!0}),w.useCallback(function(u,d){if(d===void 0&&(d={}),!o.current)return;if(typeof u=="number"){r.go(u);return}let m=eh(u,JSON.parse(l),i,d.relative==="path");e==null&&t!=="/"&&(m.pathname=m.pathname==="/"?t:$n([t,m.pathname])),(d.replace?r.replace:r.push)(m,d.state,d)},[t,r,l,i,e])}const pb=w.createContext(null);function gb(e){let t=w.useContext(Us).outlet;return t&&w.createElement(pb.Provider,{value:e},t)}function _o(){let{matches:e}=w.useContext(Us),t=e[e.length-1];return t?t.params:{}}function zo(e,t){let{relative:s}=t===void 0?{}:t,{future:r}=w.useContext(un),{matches:a}=w.useContext(Us),{pathname:i}=dn(),l=JSON.stringify(Xd(a,r.v7_relativeSplatPath));return w.useMemo(()=>eh(e,JSON.parse(l),i,s==="path"),[e,l,i,s])}function xb(e,t){return yb(e,t)}function yb(e,t,s,r){Da()||Qe(!1);let{navigator:a}=w.useContext(un),{matches:i}=w.useContext(Us),l=i[i.length-1],o=l?l.params:{};l&&l.pathname;let c=l?l.pathnameBase:"/";l&&l.route;let u=dn(),d;if(t){var m;let b=typeof t=="string"?Ea(t):t;c==="/"||(m=b.pathname)!=null&&m.startsWith(c)||Qe(!1),d=b}else d=u;let p=d.pathname||"/",h=p;if(c!=="/"){let b=c.replace(/^\//,"").split("/");h="/"+p.replace(/^\//,"").split("/").slice(b.length).join("/")}let f=Vj(e,{pathname:h}),g=wb(f&&f.map(b=>Object.assign({},b,{params:Object.assign({},o,b.params),pathname:$n([c,a.encodeLocation?a.encodeLocation(b.pathname).pathname:b.pathname]),pathnameBase:b.pathnameBase==="/"?c:$n([c,a.encodeLocation?a.encodeLocation(b.pathnameBase).pathname:b.pathnameBase])})),i,s,r);return t&&g?w.createElement(Oo.Provider,{value:{location:Ei({pathname:"/",search:"",hash:"",state:null,key:"default"},d),navigationType:Fn.Pop}},g):g}function vb(){let e=Eb(),t=db(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),s=e instanceof Error?e.stack:null,a={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return w.createElement(w.Fragment,null,w.createElement("h2",null,"Unexpected Application Error!"),w.createElement("h3",{style:{fontStyle:"italic"}},t),s?w.createElement("pre",{style:a},s):null,null)}const jb=w.createElement(vb,null);class bb extends w.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,s){return s.location!==t.location||s.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:s.error,location:s.location,revalidation:t.revalidation||s.revalidation}}componentDidCatch(t,s){console.error("React Router caught the following error during render",t,s)}render(){return this.state.error!==void 0?w.createElement(Us.Provider,{value:this.props.routeContext},w.createElement(ey.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Nb(e){let{routeContext:t,match:s,children:r}=e,a=w.useContext(Ro);return a&&a.static&&a.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(a.staticContext._deepestRenderedBoundaryId=s.route.id),w.createElement(Us.Provider,{value:t},r)}function wb(e,t,s,r){var a;if(t===void 0&&(t=[]),s===void 0&&(s=null),r===void 0&&(r=null),e==null){var i;if(!s)return null;if(s.errors)e=s.matches;else if((i=r)!=null&&i.v7_partialHydration&&t.length===0&&!s.initialized&&s.matches.length>0)e=s.matches;else return null}let l=e,o=(a=s)==null?void 0:a.errors;if(o!=null){let d=l.findIndex(m=>m.route.id&&(o==null?void 0:o[m.route.id])!==void 0);d>=0||Qe(!1),l=l.slice(0,Math.min(l.length,d+1))}let c=!1,u=-1;if(s&&r&&r.v7_partialHydration)for(let d=0;d=0?l=l.slice(0,u+1):l=[l[0]];break}}}return l.reduceRight((d,m,p)=>{let h,f=!1,g=null,b=null;s&&(h=o&&m.route.id?o[m.route.id]:void 0,g=m.route.errorElement||jb,c&&(u<0&&p===0?(Pb("route-fallback"),f=!0,b=null):u===p&&(f=!0,b=m.route.hydrateFallbackElement||null)));let y=t.concat(l.slice(0,p+1)),v=()=>{let x;return h?x=g:f?x=b:m.route.Component?x=w.createElement(m.route.Component,null):m.route.element?x=m.route.element:x=d,w.createElement(Nb,{match:m,routeContext:{outlet:d,matches:y,isDataRoute:s!=null},children:x})};return s&&(m.route.ErrorBoundary||m.route.errorElement||p===0)?w.createElement(bb,{location:s.location,revalidation:s.revalidation,component:g,error:h,children:v(),routeContext:{outlet:null,matches:y,isDataRoute:!0}}):v()},null)}var sy=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(sy||{}),ny=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(ny||{});function Sb(e){let t=w.useContext(Ro);return t||Qe(!1),t}function kb(e){let t=w.useContext(Xx);return t||Qe(!1),t}function Cb(e){let t=w.useContext(Us);return t||Qe(!1),t}function ry(e){let t=Cb(),s=t.matches[t.matches.length-1];return s.route.id||Qe(!1),s.route.id}function Eb(){var e;let t=w.useContext(ey),s=kb(),r=ry();return t!==void 0?t:(e=s.errors)==null?void 0:e[r]}function Db(){let{router:e}=Sb(sy.UseNavigateStable),t=ry(ny.UseNavigateStable),s=w.useRef(!1);return ty(()=>{s.current=!0}),w.useCallback(function(a,i){i===void 0&&(i={}),s.current&&(typeof a=="number"?e.navigate(a):e.navigate(a,Ei({fromRouteId:t},i)))},[e,t])}const Sf={};function Pb(e,t,s){Sf[e]||(Sf[e]=!0)}function Ab(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function Qr(e){let{to:t,replace:s,state:r,relative:a}=e;Da()||Qe(!1);let{future:i,static:l}=w.useContext(un),{matches:o}=w.useContext(Us),{pathname:c}=dn(),u=Ut(),d=eh(t,Xd(o,i.v7_relativeSplatPath),c,a==="path"),m=JSON.stringify(d);return w.useEffect(()=>u(JSON.parse(m),{replace:s,state:r,relative:a}),[u,m,a,s,r]),null}function Tb(e){return gb(e.context)}function Fe(e){Qe(!1)}function Fb(e){let{basename:t="/",children:s=null,location:r,navigationType:a=Fn.Pop,navigator:i,static:l=!1,future:o}=e;Da()&&Qe(!1);let c=t.replace(/^\/*/,"/"),u=w.useMemo(()=>({basename:c,navigator:i,static:l,future:Ei({v7_relativeSplatPath:!1},o)}),[c,o,i,l]);typeof r=="string"&&(r=Ea(r));let{pathname:d="/",search:m="",hash:p="",state:h=null,key:f="default"}=r,g=w.useMemo(()=>{let b=ja(d,c);return b==null?null:{location:{pathname:b,search:m,hash:p,state:h,key:f},navigationType:a}},[c,d,m,p,h,f,a]);return g==null?null:w.createElement(un.Provider,{value:u},w.createElement(Oo.Provider,{children:s,value:g}))}function Ib(e){let{children:t,location:s}=e;return xb(Tu(t),s)}new Promise(()=>{});function Tu(e,t){t===void 0&&(t=[]);let s=[];return w.Children.forEach(e,(r,a)=>{if(!w.isValidElement(r))return;let i=[...t,a];if(r.type===w.Fragment){s.push.apply(s,Tu(r.props.children,i));return}r.type!==Fe&&Qe(!1),!r.props.index||!r.props.children||Qe(!1);let l={id:r.props.id||i.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,loader:r.props.loader,action:r.props.action,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(l.children=Tu(r.props.children,i)),s.push(l)}),s}/** - * React Router DOM v6.30.3 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */function uo(){return uo=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(s[a]=e[a]);return s}function Mb(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Lb(e,t){return e.button===0&&(!t||t==="_self")&&!Mb(e)}function Fu(e){return e===void 0&&(e=""),new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,s)=>{let r=e[s];return t.concat(Array.isArray(r)?r.map(a=>[s,a]):[[s,r]])},[]))}function Rb(e,t){let s=Fu(e);return t&&t.forEach((r,a)=>{s.has(a)||t.getAll(a).forEach(i=>{s.append(a,i)})}),s}const Ob=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],_b=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],zb="6";try{window.__reactRouterVersion=zb}catch{}const Ub=w.createContext({isTransitioning:!1}),$b="startTransition",kf=Pv[$b];function Bb(e){let{basename:t,children:s,future:r,window:a}=e,i=w.useRef();i.current==null&&(i.current=$j({window:a,v5Compat:!0}));let l=i.current,[o,c]=w.useState({action:l.action,location:l.location}),{v7_startTransition:u}=r||{},d=w.useCallback(m=>{u&&kf?kf(()=>c(m)):c(m)},[c,u]);return w.useLayoutEffect(()=>l.listen(d),[l,d]),w.useEffect(()=>Ab(r),[r]),w.createElement(Fb,{basename:t,children:s,location:o.location,navigationType:o.action,navigator:l,future:r})}const Kb=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Vb=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Se=w.forwardRef(function(t,s){let{onClick:r,relative:a,reloadDocument:i,replace:l,state:o,target:c,to:u,preventScrollReset:d,viewTransition:m}=t,p=ay(t,Ob),{basename:h}=w.useContext(un),f,g=!1;if(typeof u=="string"&&Vb.test(u)&&(f=u,Kb))try{let x=new URL(window.location.href),N=u.startsWith("//")?new URL(x.protocol+u):new URL(u),k=ja(N.pathname,h);N.origin===x.origin&&k!=null?u=k+N.search+N.hash:g=!0}catch{}let b=mb(u,{relative:a}),y=Qb(u,{replace:l,state:o,target:c,preventScrollReset:d,relative:a,viewTransition:m});function v(x){r&&r(x),x.defaultPrevented||y(x)}return w.createElement("a",uo({},p,{href:f||b,onClick:g||i?r:v,ref:s,target:c}))}),Cc=w.forwardRef(function(t,s){let{"aria-current":r="page",caseSensitive:a=!1,className:i="",end:l=!1,style:o,to:c,viewTransition:u,children:d}=t,m=ay(t,_b),p=zo(c,{relative:m.relative}),h=dn(),f=w.useContext(Xx),{navigator:g,basename:b}=w.useContext(un),y=f!=null&&Hb(p)&&u===!0,v=g.encodeLocation?g.encodeLocation(p).pathname:p.pathname,x=h.pathname,N=f&&f.navigation&&f.navigation.location?f.navigation.location.pathname:null;a||(x=x.toLowerCase(),N=N?N.toLowerCase():null,v=v.toLowerCase()),N&&b&&(N=ja(N,b)||N);const k=v!=="/"&&v.endsWith("/")?v.length-1:v.length;let D=x===v||!l&&x.startsWith(v)&&x.charAt(k)==="/",F=N!=null&&(N===v||!l&&N.startsWith(v)&&N.charAt(v.length)==="/"),S={isActive:D,isPending:F,isTransitioning:y},L=D?r:void 0,T;typeof i=="function"?T=i(S):T=[i,D?"active":null,F?"pending":null,y?"transitioning":null].filter(Boolean).join(" ");let _=typeof o=="function"?o(S):o;return w.createElement(Se,uo({},m,{"aria-current":L,className:T,ref:s,style:_,to:c,viewTransition:u}),typeof d=="function"?d(S):d)});var Iu;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Iu||(Iu={}));var Cf;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Cf||(Cf={}));function qb(e){let t=w.useContext(Ro);return t||Qe(!1),t}function Qb(e,t){let{target:s,replace:r,state:a,preventScrollReset:i,relative:l,viewTransition:o}=t===void 0?{}:t,c=Ut(),u=dn(),d=zo(e,{relative:l});return w.useCallback(m=>{if(Lb(m,s)){m.preventDefault();let p=r!==void 0?r:co(u)===co(d);c(e,{replace:p,state:a,preventScrollReset:i,relative:l,viewTransition:o})}},[u,c,d,r,a,s,e,i,l,o])}function Uo(e){let t=w.useRef(Fu(e)),s=w.useRef(!1),r=dn(),a=w.useMemo(()=>Rb(r.search,s.current?null:t.current),[r.search]),i=Ut(),l=w.useCallback((o,c)=>{const u=Fu(typeof o=="function"?o(a):o);s.current=!0,i("?"+u,c)},[i,a]);return[a,l]}function Hb(e,t){t===void 0&&(t={});let s=w.useContext(Ub);s==null&&Qe(!1);let{basename:r}=qb(Iu.useViewTransitionState),a=zo(e,{relative:t.relative});if(!s.isTransitioning)return!1;let i=ja(s.currentLocation.pathname,r)||s.currentLocation.pathname,l=ja(s.nextLocation.pathname,r)||s.nextLocation.pathname;return Au(a.pathname,l)!=null||Au(a.pathname,i)!=null}var Pa=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Wb={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},bn,nd,Ep,Gb=(Ep=class{constructor(){ue(this,bn,Wb);ue(this,nd,!1)}setTimeoutProvider(e){te(this,bn,e)}setTimeout(e,t){return C(this,bn).setTimeout(e,t)}clearTimeout(e){C(this,bn).clearTimeout(e)}setInterval(e,t){return C(this,bn).setInterval(e,t)}clearInterval(e){C(this,bn).clearInterval(e)}},bn=new WeakMap,nd=new WeakMap,Ep),tr=new Gb;function Zb(e){setTimeout(e,0)}var br=typeof window>"u"||"Deno"in globalThis;function Rt(){}function Yb(e,t){return typeof e=="function"?e(t):e}function Mu(e){return typeof e=="number"&&e>=0&&e!==1/0}function iy(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Bn(e,t){return typeof e=="function"?e(t):e}function os(e,t){return typeof e=="function"?e(t):e}function Ef(e,t){const{type:s="all",exact:r,fetchStatus:a,predicate:i,queryKey:l,stale:o}=e;if(l){if(r){if(t.queryHash!==th(l,t.options))return!1}else if(!Di(t.queryKey,l))return!1}if(s!=="all"){const c=t.isActive();if(s==="active"&&!c||s==="inactive"&&c)return!1}return!(typeof o=="boolean"&&t.isStale()!==o||a&&a!==t.state.fetchStatus||i&&!i(t))}function Df(e,t){const{exact:s,status:r,predicate:a,mutationKey:i}=e;if(i){if(!t.options.mutationKey)return!1;if(s){if(Nr(t.options.mutationKey)!==Nr(i))return!1}else if(!Di(t.options.mutationKey,i))return!1}return!(r&&t.state.status!==r||a&&!a(t))}function th(e,t){return((t==null?void 0:t.queryKeyHashFn)||Nr)(e)}function Nr(e){return JSON.stringify(e,(t,s)=>Lu(s)?Object.keys(s).sort().reduce((r,a)=>(r[a]=s[a],r),{}):s)}function Di(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(s=>Di(e[s],t[s])):!1}var Jb=Object.prototype.hasOwnProperty;function ly(e,t,s=0){if(e===t)return e;if(s>500)return t;const r=Pf(e)&&Pf(t);if(!r&&!(Lu(e)&&Lu(t)))return t;const i=(r?e:Object.keys(e)).length,l=r?t:Object.keys(t),o=l.length,c=r?new Array(o):{};let u=0;for(let d=0;d{tr.setTimeout(t,e)})}function Ru(e,t,s){return typeof s.structuralSharing=="function"?s.structuralSharing(e,t):s.structuralSharing!==!1?ly(e,t):t}function eN(e,t,s=0){const r=[...e,t];return s&&r.length>s?r.slice(1):r}function tN(e,t,s=0){const r=[t,...e];return s&&r.length>s?r.slice(0,-1):r}var sh=Symbol();function oy(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===sh?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function nh(e,t){return typeof e=="function"?e(...t):!!e}function sN(e,t,s){let r=!1,a;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(a??(a=t()),r||(r=!0,a.aborted?s():a.addEventListener("abort",s,{once:!0})),a)}),e}var rr,Nn,ta,Dp,nN=(Dp=class extends Pa{constructor(){super();ue(this,rr);ue(this,Nn);ue(this,ta);te(this,ta,t=>{if(!br&&window.addEventListener){const s=()=>t();return window.addEventListener("visibilitychange",s,!1),()=>{window.removeEventListener("visibilitychange",s)}}})}onSubscribe(){C(this,Nn)||this.setEventListener(C(this,ta))}onUnsubscribe(){var t;this.hasListeners()||((t=C(this,Nn))==null||t.call(this),te(this,Nn,void 0))}setEventListener(t){var s;te(this,ta,t),(s=C(this,Nn))==null||s.call(this),te(this,Nn,t(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(t){C(this,rr)!==t&&(te(this,rr,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(s=>{s(t)})}isFocused(){var t;return typeof C(this,rr)=="boolean"?C(this,rr):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},rr=new WeakMap,Nn=new WeakMap,ta=new WeakMap,Dp),rh=new nN;function Ou(){let e,t;const s=new Promise((a,i)=>{e=a,t=i});s.status="pending",s.catch(()=>{});function r(a){Object.assign(s,a),delete s.resolve,delete s.reject}return s.resolve=a=>{r({status:"fulfilled",value:a}),e(a)},s.reject=a=>{r({status:"rejected",reason:a}),t(a)},s}var rN=Zb;function aN(){let e=[],t=0,s=o=>{o()},r=o=>{o()},a=rN;const i=o=>{t?e.push(o):a(()=>{s(o)})},l=()=>{const o=e;e=[],o.length&&a(()=>{r(()=>{o.forEach(c=>{s(c)})})})};return{batch:o=>{let c;t++;try{c=o()}finally{t--,t||l()}return c},batchCalls:o=>(...c)=>{i(()=>{o(...c)})},schedule:i,setNotifyFunction:o=>{s=o},setBatchNotifyFunction:o=>{r=o},setScheduler:o=>{a=o}}}var ct=aN(),sa,wn,na,Pp,iN=(Pp=class extends Pa{constructor(){super();ue(this,sa,!0);ue(this,wn);ue(this,na);te(this,na,t=>{if(!br&&window.addEventListener){const s=()=>t(!0),r=()=>t(!1);return window.addEventListener("online",s,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",s),window.removeEventListener("offline",r)}}})}onSubscribe(){C(this,wn)||this.setEventListener(C(this,na))}onUnsubscribe(){var t;this.hasListeners()||((t=C(this,wn))==null||t.call(this),te(this,wn,void 0))}setEventListener(t){var s;te(this,na,t),(s=C(this,wn))==null||s.call(this),te(this,wn,t(this.setOnline.bind(this)))}setOnline(t){C(this,sa)!==t&&(te(this,sa,t),this.listeners.forEach(r=>{r(t)}))}isOnline(){return C(this,sa)}},sa=new WeakMap,wn=new WeakMap,na=new WeakMap,Pp),mo=new iN;function lN(e){return Math.min(1e3*2**e,3e4)}function cy(e){return(e??"online")==="online"?mo.isOnline():!0}var _u=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function uy(e){let t=!1,s=0,r;const a=Ou(),i=()=>a.status!=="pending",l=g=>{var b;if(!i()){const y=new _u(g);p(y),(b=e.onCancel)==null||b.call(e,y)}},o=()=>{t=!0},c=()=>{t=!1},u=()=>rh.isFocused()&&(e.networkMode==="always"||mo.isOnline())&&e.canRun(),d=()=>cy(e.networkMode)&&e.canRun(),m=g=>{i()||(r==null||r(),a.resolve(g))},p=g=>{i()||(r==null||r(),a.reject(g))},h=()=>new Promise(g=>{var b;r=y=>{(i()||u())&&g(y)},(b=e.onPause)==null||b.call(e)}).then(()=>{var g;r=void 0,i()||(g=e.onContinue)==null||g.call(e)}),f=()=>{if(i())return;let g;const b=s===0?e.initialPromise:void 0;try{g=b??e.fn()}catch(y){g=Promise.reject(y)}Promise.resolve(g).then(m).catch(y=>{var D;if(i())return;const v=e.retry??(br?0:3),x=e.retryDelay??lN,N=typeof x=="function"?x(s,y):x,k=v===!0||typeof v=="number"&&su()?void 0:h()).then(()=>{t?p(y):f()})})};return{promise:a,status:()=>a.status,cancel:l,continue:()=>(r==null||r(),a),cancelRetry:o,continueRetry:c,canStart:d,start:()=>(d()?f():h().then(f),a)}}var ar,Ap,dy=(Ap=class{constructor(){ue(this,ar)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Mu(this.gcTime)&&te(this,ar,tr.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(br?1/0:5*60*1e3))}clearGcTimeout(){C(this,ar)&&(tr.clearTimeout(C(this,ar)),te(this,ar,void 0))}},ar=new WeakMap,Ap),ir,ra,ls,lr,pt,Ri,or,vs,Vs,Tp,oN=(Tp=class extends dy{constructor(t){super();ue(this,vs);ue(this,ir);ue(this,ra);ue(this,ls);ue(this,lr);ue(this,pt);ue(this,Ri);ue(this,or);te(this,or,!1),te(this,Ri,t.defaultOptions),this.setOptions(t.options),this.observers=[],te(this,lr,t.client),te(this,ls,C(this,lr).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,te(this,ir,Ff(this.options)),this.state=t.state??C(this,ir),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var t;return(t=C(this,pt))==null?void 0:t.promise}setOptions(t){if(this.options={...C(this,Ri),...t},this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const s=Ff(this.options);s.data!==void 0&&(this.setState(Tf(s.data,s.dataUpdatedAt)),te(this,ir,s))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&C(this,ls).remove(this)}setData(t,s){const r=Ru(this.state.data,t,this.options);return ye(this,vs,Vs).call(this,{data:r,type:"success",dataUpdatedAt:s==null?void 0:s.updatedAt,manual:s==null?void 0:s.manual}),r}setState(t,s){ye(this,vs,Vs).call(this,{type:"setState",state:t,setStateOptions:s})}cancel(t){var r,a;const s=(r=C(this,pt))==null?void 0:r.promise;return(a=C(this,pt))==null||a.cancel(t),s?s.then(Rt).catch(Rt):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(C(this,ir))}isActive(){return this.observers.some(t=>os(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===sh||this.state.dataUpdateCount+this.state.errorUpdateCount===0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Bn(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!iy(this.state.dataUpdatedAt,t)}onFocus(){var s;const t=this.observers.find(r=>r.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(s=C(this,pt))==null||s.continue()}onOnline(){var s;const t=this.observers.find(r=>r.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(s=C(this,pt))==null||s.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),C(this,ls).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(s=>s!==t),this.observers.length||(C(this,pt)&&(C(this,or)?C(this,pt).cancel({revert:!0}):C(this,pt).cancelRetry()),this.scheduleGc()),C(this,ls).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||ye(this,vs,Vs).call(this,{type:"invalidate"})}async fetch(t,s){var c,u,d,m,p,h,f,g,b,y,v,x;if(this.state.fetchStatus!=="idle"&&((c=C(this,pt))==null?void 0:c.status())!=="rejected"){if(this.state.data!==void 0&&(s!=null&&s.cancelRefetch))this.cancel({silent:!0});else if(C(this,pt))return C(this,pt).continueRetry(),C(this,pt).promise}if(t&&this.setOptions(t),!this.options.queryFn){const N=this.observers.find(k=>k.options.queryFn);N&&this.setOptions(N.options)}const r=new AbortController,a=N=>{Object.defineProperty(N,"signal",{enumerable:!0,get:()=>(te(this,or,!0),r.signal)})},i=()=>{const N=oy(this.options,s),D=(()=>{const F={client:C(this,lr),queryKey:this.queryKey,meta:this.meta};return a(F),F})();return te(this,or,!1),this.options.persister?this.options.persister(N,D,this):N(D)},o=(()=>{const N={fetchOptions:s,options:this.options,queryKey:this.queryKey,client:C(this,lr),state:this.state,fetchFn:i};return a(N),N})();(u=this.options.behavior)==null||u.onFetch(o,this),te(this,ra,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((d=o.fetchOptions)==null?void 0:d.meta))&&ye(this,vs,Vs).call(this,{type:"fetch",meta:(m=o.fetchOptions)==null?void 0:m.meta}),te(this,pt,uy({initialPromise:s==null?void 0:s.initialPromise,fn:o.fetchFn,onCancel:N=>{N instanceof _u&&N.revert&&this.setState({...C(this,ra),fetchStatus:"idle"}),r.abort()},onFail:(N,k)=>{ye(this,vs,Vs).call(this,{type:"failed",failureCount:N,error:k})},onPause:()=>{ye(this,vs,Vs).call(this,{type:"pause"})},onContinue:()=>{ye(this,vs,Vs).call(this,{type:"continue"})},retry:o.options.retry,retryDelay:o.options.retryDelay,networkMode:o.options.networkMode,canRun:()=>!0}));try{const N=await C(this,pt).start();if(N===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(N),(h=(p=C(this,ls).config).onSuccess)==null||h.call(p,N,this),(g=(f=C(this,ls).config).onSettled)==null||g.call(f,N,this.state.error,this),N}catch(N){if(N instanceof _u){if(N.silent)return C(this,pt).promise;if(N.revert){if(this.state.data===void 0)throw N;return this.state.data}}throw ye(this,vs,Vs).call(this,{type:"error",error:N}),(y=(b=C(this,ls).config).onError)==null||y.call(b,N,this),(x=(v=C(this,ls).config).onSettled)==null||x.call(v,this.state.data,N,this),N}finally{this.scheduleGc()}}},ir=new WeakMap,ra=new WeakMap,ls=new WeakMap,lr=new WeakMap,pt=new WeakMap,Ri=new WeakMap,or=new WeakMap,vs=new WeakSet,Vs=function(t){const s=r=>{switch(t.type){case"failed":return{...r,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,...hy(r.data,this.options),fetchMeta:t.meta??null};case"success":const a={...r,...Tf(t.data,t.dataUpdatedAt),dataUpdateCount:r.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return te(this,ra,t.manual?a:void 0),a;case"error":const i=t.error;return{...r,error:i,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:i,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...t.state}}};this.state=s(this.state),ct.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),C(this,ls).notify({query:this,type:"updated",action:t})})},Tp);function hy(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:cy(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function Tf(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Ff(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,s=t!==void 0,r=s?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:s?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:s?"success":"pending",fetchStatus:"idle"}}var Bt,ke,Oi,Ft,cr,aa,Hs,Sn,_i,ia,la,ur,dr,kn,oa,Te,Ga,zu,Uu,$u,Bu,Ku,Vu,qu,my,Fp,cN=(Fp=class extends Pa{constructor(t,s){super();ue(this,Te);ue(this,Bt);ue(this,ke);ue(this,Oi);ue(this,Ft);ue(this,cr);ue(this,aa);ue(this,Hs);ue(this,Sn);ue(this,_i);ue(this,ia);ue(this,la);ue(this,ur);ue(this,dr);ue(this,kn);ue(this,oa,new Set);this.options=s,te(this,Bt,t),te(this,Sn,null),te(this,Hs,Ou()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(C(this,ke).addObserver(this),If(C(this,ke),this.options)?ye(this,Te,Ga).call(this):this.updateResult(),ye(this,Te,Bu).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Qu(C(this,ke),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Qu(C(this,ke),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,ye(this,Te,Ku).call(this),ye(this,Te,Vu).call(this),C(this,ke).removeObserver(this)}setOptions(t){const s=this.options,r=C(this,ke);if(this.options=C(this,Bt).defaultQueryOptions(t),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof os(this.options.enabled,C(this,ke))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");ye(this,Te,qu).call(this),C(this,ke).setOptions(this.options),s._defaulted&&!ho(this.options,s)&&C(this,Bt).getQueryCache().notify({type:"observerOptionsUpdated",query:C(this,ke),observer:this});const a=this.hasListeners();a&&Mf(C(this,ke),r,this.options,s)&&ye(this,Te,Ga).call(this),this.updateResult(),a&&(C(this,ke)!==r||os(this.options.enabled,C(this,ke))!==os(s.enabled,C(this,ke))||Bn(this.options.staleTime,C(this,ke))!==Bn(s.staleTime,C(this,ke)))&&ye(this,Te,zu).call(this);const i=ye(this,Te,Uu).call(this);a&&(C(this,ke)!==r||os(this.options.enabled,C(this,ke))!==os(s.enabled,C(this,ke))||i!==C(this,kn))&&ye(this,Te,$u).call(this,i)}getOptimisticResult(t){const s=C(this,Bt).getQueryCache().build(C(this,Bt),t),r=this.createResult(s,t);return dN(this,r)&&(te(this,Ft,r),te(this,aa,this.options),te(this,cr,C(this,ke).state)),r}getCurrentResult(){return C(this,Ft)}trackResult(t,s){return new Proxy(t,{get:(r,a)=>(this.trackProp(a),s==null||s(a),a==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&C(this,Hs).status==="pending"&&C(this,Hs).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(r,a))})}trackProp(t){C(this,oa).add(t)}getCurrentQuery(){return C(this,ke)}refetch({...t}={}){return this.fetch({...t})}fetchOptimistic(t){const s=C(this,Bt).defaultQueryOptions(t),r=C(this,Bt).getQueryCache().build(C(this,Bt),s);return r.fetch().then(()=>this.createResult(r,s))}fetch(t){return ye(this,Te,Ga).call(this,{...t,cancelRefetch:t.cancelRefetch??!0}).then(()=>(this.updateResult(),C(this,Ft)))}createResult(t,s){var L;const r=C(this,ke),a=this.options,i=C(this,Ft),l=C(this,cr),o=C(this,aa),u=t!==r?t.state:C(this,Oi),{state:d}=t;let m={...d},p=!1,h;if(s._optimisticResults){const T=this.hasListeners(),_=!T&&If(t,s),K=T&&Mf(t,r,s,a);(_||K)&&(m={...m,...hy(d.data,t.options)}),s._optimisticResults==="isRestoring"&&(m.fetchStatus="idle")}let{error:f,errorUpdatedAt:g,status:b}=m;h=m.data;let y=!1;if(s.placeholderData!==void 0&&h===void 0&&b==="pending"){let T;i!=null&&i.isPlaceholderData&&s.placeholderData===(o==null?void 0:o.placeholderData)?(T=i.data,y=!0):T=typeof s.placeholderData=="function"?s.placeholderData((L=C(this,la))==null?void 0:L.state.data,C(this,la)):s.placeholderData,T!==void 0&&(b="success",h=Ru(i==null?void 0:i.data,T,s),p=!0)}if(s.select&&h!==void 0&&!y)if(i&&h===(l==null?void 0:l.data)&&s.select===C(this,_i))h=C(this,ia);else try{te(this,_i,s.select),h=s.select(h),h=Ru(i==null?void 0:i.data,h,s),te(this,ia,h),te(this,Sn,null)}catch(T){te(this,Sn,T)}C(this,Sn)&&(f=C(this,Sn),h=C(this,ia),g=Date.now(),b="error");const v=m.fetchStatus==="fetching",x=b==="pending",N=b==="error",k=x&&v,D=h!==void 0,S={status:b,fetchStatus:m.fetchStatus,isPending:x,isSuccess:b==="success",isError:N,isInitialLoading:k,isLoading:k,data:h,dataUpdatedAt:m.dataUpdatedAt,error:f,errorUpdatedAt:g,failureCount:m.fetchFailureCount,failureReason:m.fetchFailureReason,errorUpdateCount:m.errorUpdateCount,isFetched:m.dataUpdateCount>0||m.errorUpdateCount>0,isFetchedAfterMount:m.dataUpdateCount>u.dataUpdateCount||m.errorUpdateCount>u.errorUpdateCount,isFetching:v,isRefetching:v&&!x,isLoadingError:N&&!D,isPaused:m.fetchStatus==="paused",isPlaceholderData:p,isRefetchError:N&&D,isStale:ah(t,s),refetch:this.refetch,promise:C(this,Hs),isEnabled:os(s.enabled,t)!==!1};if(this.options.experimental_prefetchInRender){const T=S.data!==void 0,_=S.status==="error"&&!T,K=z=>{_?z.reject(S.error):T&&z.resolve(S.data)},W=()=>{const z=te(this,Hs,S.promise=Ou());K(z)},Q=C(this,Hs);switch(Q.status){case"pending":t.queryHash===r.queryHash&&K(Q);break;case"fulfilled":(_||S.data!==Q.value)&&W();break;case"rejected":(!_||S.error!==Q.reason)&&W();break}}return S}updateResult(){const t=C(this,Ft),s=this.createResult(C(this,ke),this.options);if(te(this,cr,C(this,ke).state),te(this,aa,this.options),C(this,cr).data!==void 0&&te(this,la,C(this,ke)),ho(s,t))return;te(this,Ft,s);const r=()=>{if(!t)return!0;const{notifyOnChangeProps:a}=this.options,i=typeof a=="function"?a():a;if(i==="all"||!i&&!C(this,oa).size)return!0;const l=new Set(i??C(this,oa));return this.options.throwOnError&&l.add("error"),Object.keys(C(this,Ft)).some(o=>{const c=o;return C(this,Ft)[c]!==t[c]&&l.has(c)})};ye(this,Te,my).call(this,{listeners:r()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&ye(this,Te,Bu).call(this)}},Bt=new WeakMap,ke=new WeakMap,Oi=new WeakMap,Ft=new WeakMap,cr=new WeakMap,aa=new WeakMap,Hs=new WeakMap,Sn=new WeakMap,_i=new WeakMap,ia=new WeakMap,la=new WeakMap,ur=new WeakMap,dr=new WeakMap,kn=new WeakMap,oa=new WeakMap,Te=new WeakSet,Ga=function(t){ye(this,Te,qu).call(this);let s=C(this,ke).fetch(this.options,t);return t!=null&&t.throwOnError||(s=s.catch(Rt)),s},zu=function(){ye(this,Te,Ku).call(this);const t=Bn(this.options.staleTime,C(this,ke));if(br||C(this,Ft).isStale||!Mu(t))return;const r=iy(C(this,Ft).dataUpdatedAt,t)+1;te(this,ur,tr.setTimeout(()=>{C(this,Ft).isStale||this.updateResult()},r))},Uu=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(C(this,ke)):this.options.refetchInterval)??!1},$u=function(t){ye(this,Te,Vu).call(this),te(this,kn,t),!(br||os(this.options.enabled,C(this,ke))===!1||!Mu(C(this,kn))||C(this,kn)===0)&&te(this,dr,tr.setInterval(()=>{(this.options.refetchIntervalInBackground||rh.isFocused())&&ye(this,Te,Ga).call(this)},C(this,kn)))},Bu=function(){ye(this,Te,zu).call(this),ye(this,Te,$u).call(this,ye(this,Te,Uu).call(this))},Ku=function(){C(this,ur)&&(tr.clearTimeout(C(this,ur)),te(this,ur,void 0))},Vu=function(){C(this,dr)&&(tr.clearInterval(C(this,dr)),te(this,dr,void 0))},qu=function(){const t=C(this,Bt).getQueryCache().build(C(this,Bt),this.options);if(t===C(this,ke))return;const s=C(this,ke);te(this,ke,t),te(this,Oi,t.state),this.hasListeners()&&(s==null||s.removeObserver(this),t.addObserver(this))},my=function(t){ct.batch(()=>{t.listeners&&this.listeners.forEach(s=>{s(C(this,Ft))}),C(this,Bt).getQueryCache().notify({query:C(this,ke),type:"observerResultsUpdated"})})},Fp);function uN(e,t){return os(t.enabled,e)!==!1&&e.state.data===void 0&&!(e.state.status==="error"&&t.retryOnMount===!1)}function If(e,t){return uN(e,t)||e.state.data!==void 0&&Qu(e,t,t.refetchOnMount)}function Qu(e,t,s){if(os(t.enabled,e)!==!1&&Bn(t.staleTime,e)!=="static"){const r=typeof s=="function"?s(e):s;return r==="always"||r!==!1&&ah(e,t)}return!1}function Mf(e,t,s,r){return(e!==t||os(r.enabled,e)===!1)&&(!s.suspense||e.state.status!=="error")&&ah(e,s)}function ah(e,t){return os(t.enabled,e)!==!1&&e.isStaleByTime(Bn(t.staleTime,e))}function dN(e,t){return!ho(e.getCurrentResult(),t)}function Lf(e){return{onFetch:(t,s)=>{var d,m,p,h,f;const r=t.options,a=(p=(m=(d=t.fetchOptions)==null?void 0:d.meta)==null?void 0:m.fetchMore)==null?void 0:p.direction,i=((h=t.state.data)==null?void 0:h.pages)||[],l=((f=t.state.data)==null?void 0:f.pageParams)||[];let o={pages:[],pageParams:[]},c=0;const u=async()=>{let g=!1;const b=x=>{sN(x,()=>t.signal,()=>g=!0)},y=oy(t.options,t.fetchOptions),v=async(x,N,k)=>{if(g)return Promise.reject();if(N==null&&x.pages.length)return Promise.resolve(x);const F=(()=>{const _={client:t.client,queryKey:t.queryKey,pageParam:N,direction:k?"backward":"forward",meta:t.options.meta};return b(_),_})(),S=await y(F),{maxPages:L}=t.options,T=k?tN:eN;return{pages:T(x.pages,S,L),pageParams:T(x.pageParams,N,L)}};if(a&&i.length){const x=a==="backward",N=x?hN:Rf,k={pages:i,pageParams:l},D=N(r,k);o=await v(k,D,x)}else{const x=e??i.length;do{const N=c===0?l[0]??r.initialPageParam:Rf(r,o);if(c>0&&N==null)break;o=await v(o,N),c++}while(c{var g,b;return(b=(g=t.options).persister)==null?void 0:b.call(g,u,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},s)}:t.fetchFn=u}}}function Rf(e,{pages:t,pageParams:s}){const r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,s[r],s):void 0}function hN(e,{pages:t,pageParams:s}){var r;return t.length>0?(r=e.getPreviousPageParam)==null?void 0:r.call(e,t[0],t,s[0],s):void 0}var zi,Is,It,hr,Ms,fn,Ip,mN=(Ip=class extends dy{constructor(t){super();ue(this,Ms);ue(this,zi);ue(this,Is);ue(this,It);ue(this,hr);te(this,zi,t.client),this.mutationId=t.mutationId,te(this,It,t.mutationCache),te(this,Is,[]),this.state=t.state||fy(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){C(this,Is).includes(t)||(C(this,Is).push(t),this.clearGcTimeout(),C(this,It).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){te(this,Is,C(this,Is).filter(s=>s!==t)),this.scheduleGc(),C(this,It).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){C(this,Is).length||(this.state.status==="pending"?this.scheduleGc():C(this,It).remove(this))}continue(){var t;return((t=C(this,hr))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var l,o,c,u,d,m,p,h,f,g,b,y,v,x,N,k,D,F,S,L;const s=()=>{ye(this,Ms,fn).call(this,{type:"continue"})},r={client:C(this,zi),meta:this.options.meta,mutationKey:this.options.mutationKey};te(this,hr,uy({fn:()=>this.options.mutationFn?this.options.mutationFn(t,r):Promise.reject(new Error("No mutationFn found")),onFail:(T,_)=>{ye(this,Ms,fn).call(this,{type:"failed",failureCount:T,error:_})},onPause:()=>{ye(this,Ms,fn).call(this,{type:"pause"})},onContinue:s,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>C(this,It).canRun(this)}));const a=this.state.status==="pending",i=!C(this,hr).canStart();try{if(a)s();else{ye(this,Ms,fn).call(this,{type:"pending",variables:t,isPaused:i}),await((o=(l=C(this,It).config).onMutate)==null?void 0:o.call(l,t,this,r));const _=await((u=(c=this.options).onMutate)==null?void 0:u.call(c,t,r));_!==this.state.context&&ye(this,Ms,fn).call(this,{type:"pending",context:_,variables:t,isPaused:i})}const T=await C(this,hr).start();return await((m=(d=C(this,It).config).onSuccess)==null?void 0:m.call(d,T,t,this.state.context,this,r)),await((h=(p=this.options).onSuccess)==null?void 0:h.call(p,T,t,this.state.context,r)),await((g=(f=C(this,It).config).onSettled)==null?void 0:g.call(f,T,null,this.state.variables,this.state.context,this,r)),await((y=(b=this.options).onSettled)==null?void 0:y.call(b,T,null,t,this.state.context,r)),ye(this,Ms,fn).call(this,{type:"success",data:T}),T}catch(T){try{await((x=(v=C(this,It).config).onError)==null?void 0:x.call(v,T,t,this.state.context,this,r))}catch(_){Promise.reject(_)}try{await((k=(N=this.options).onError)==null?void 0:k.call(N,T,t,this.state.context,r))}catch(_){Promise.reject(_)}try{await((F=(D=C(this,It).config).onSettled)==null?void 0:F.call(D,void 0,T,this.state.variables,this.state.context,this,r))}catch(_){Promise.reject(_)}try{await((L=(S=this.options).onSettled)==null?void 0:L.call(S,void 0,T,t,this.state.context,r))}catch(_){Promise.reject(_)}throw ye(this,Ms,fn).call(this,{type:"error",error:T}),T}finally{C(this,It).runNext(this)}}},zi=new WeakMap,Is=new WeakMap,It=new WeakMap,hr=new WeakMap,Ms=new WeakSet,fn=function(t){const s=r=>{switch(t.type){case"failed":return{...r,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...r,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:t.error,failureCount:r.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=s(this.state),ct.batch(()=>{C(this,Is).forEach(r=>{r.onMutationUpdate(t)}),C(this,It).notify({mutation:this,type:"updated",action:t})})},Ip);function fy(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Ws,js,Ui,Mp,fN=(Mp=class extends Pa{constructor(t={}){super();ue(this,Ws);ue(this,js);ue(this,Ui);this.config=t,te(this,Ws,new Set),te(this,js,new Map),te(this,Ui,0)}build(t,s,r){const a=new mN({client:t,mutationCache:this,mutationId:++tl(this,Ui)._,options:t.defaultMutationOptions(s),state:r});return this.add(a),a}add(t){C(this,Ws).add(t);const s=vl(t);if(typeof s=="string"){const r=C(this,js).get(s);r?r.push(t):C(this,js).set(s,[t])}this.notify({type:"added",mutation:t})}remove(t){if(C(this,Ws).delete(t)){const s=vl(t);if(typeof s=="string"){const r=C(this,js).get(s);if(r)if(r.length>1){const a=r.indexOf(t);a!==-1&&r.splice(a,1)}else r[0]===t&&C(this,js).delete(s)}}this.notify({type:"removed",mutation:t})}canRun(t){const s=vl(t);if(typeof s=="string"){const r=C(this,js).get(s),a=r==null?void 0:r.find(i=>i.state.status==="pending");return!a||a===t}else return!0}runNext(t){var r;const s=vl(t);if(typeof s=="string"){const a=(r=C(this,js).get(s))==null?void 0:r.find(i=>i!==t&&i.state.isPaused);return(a==null?void 0:a.continue())??Promise.resolve()}else return Promise.resolve()}clear(){ct.batch(()=>{C(this,Ws).forEach(t=>{this.notify({type:"removed",mutation:t})}),C(this,Ws).clear(),C(this,js).clear()})}getAll(){return Array.from(C(this,Ws))}find(t){const s={exact:!0,...t};return this.getAll().find(r=>Df(s,r))}findAll(t={}){return this.getAll().filter(s=>Df(t,s))}notify(t){ct.batch(()=>{this.listeners.forEach(s=>{s(t)})})}resumePausedMutations(){const t=this.getAll().filter(s=>s.state.isPaused);return ct.batch(()=>Promise.all(t.map(s=>s.continue().catch(Rt))))}},Ws=new WeakMap,js=new WeakMap,Ui=new WeakMap,Mp);function vl(e){var t;return(t=e.options.scope)==null?void 0:t.id}var Gs,Cn,Kt,Zs,nn,Ml,Hu,Lp,pN=(Lp=class extends Pa{constructor(s,r){super();ue(this,nn);ue(this,Gs);ue(this,Cn);ue(this,Kt);ue(this,Zs);te(this,Gs,s),this.setOptions(r),this.bindMethods(),ye(this,nn,Ml).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(s){var a;const r=this.options;this.options=C(this,Gs).defaultMutationOptions(s),ho(this.options,r)||C(this,Gs).getMutationCache().notify({type:"observerOptionsUpdated",mutation:C(this,Kt),observer:this}),r!=null&&r.mutationKey&&this.options.mutationKey&&Nr(r.mutationKey)!==Nr(this.options.mutationKey)?this.reset():((a=C(this,Kt))==null?void 0:a.state.status)==="pending"&&C(this,Kt).setOptions(this.options)}onUnsubscribe(){var s;this.hasListeners()||(s=C(this,Kt))==null||s.removeObserver(this)}onMutationUpdate(s){ye(this,nn,Ml).call(this),ye(this,nn,Hu).call(this,s)}getCurrentResult(){return C(this,Cn)}reset(){var s;(s=C(this,Kt))==null||s.removeObserver(this),te(this,Kt,void 0),ye(this,nn,Ml).call(this),ye(this,nn,Hu).call(this)}mutate(s,r){var a;return te(this,Zs,r),(a=C(this,Kt))==null||a.removeObserver(this),te(this,Kt,C(this,Gs).getMutationCache().build(C(this,Gs),this.options)),C(this,Kt).addObserver(this),C(this,Kt).execute(s)}},Gs=new WeakMap,Cn=new WeakMap,Kt=new WeakMap,Zs=new WeakMap,nn=new WeakSet,Ml=function(){var r;const s=((r=C(this,Kt))==null?void 0:r.state)??fy();te(this,Cn,{...s,isPending:s.status==="pending",isSuccess:s.status==="success",isError:s.status==="error",isIdle:s.status==="idle",mutate:this.mutate,reset:this.reset})},Hu=function(s){ct.batch(()=>{var r,a,i,l,o,c,u,d;if(C(this,Zs)&&this.hasListeners()){const m=C(this,Cn).variables,p=C(this,Cn).context,h={client:C(this,Gs),meta:this.options.meta,mutationKey:this.options.mutationKey};if((s==null?void 0:s.type)==="success"){try{(a=(r=C(this,Zs)).onSuccess)==null||a.call(r,s.data,m,p,h)}catch(f){Promise.reject(f)}try{(l=(i=C(this,Zs)).onSettled)==null||l.call(i,s.data,null,m,p,h)}catch(f){Promise.reject(f)}}else if((s==null?void 0:s.type)==="error"){try{(c=(o=C(this,Zs)).onError)==null||c.call(o,s.error,m,p,h)}catch(f){Promise.reject(f)}try{(d=(u=C(this,Zs)).onSettled)==null||d.call(u,void 0,s.error,m,p,h)}catch(f){Promise.reject(f)}}}this.listeners.forEach(m=>{m(C(this,Cn))})})},Lp),Ls,Rp,gN=(Rp=class extends Pa{constructor(t={}){super();ue(this,Ls);this.config=t,te(this,Ls,new Map)}build(t,s,r){const a=s.queryKey,i=s.queryHash??th(a,s);let l=this.get(i);return l||(l=new oN({client:t,queryKey:a,queryHash:i,options:t.defaultQueryOptions(s),state:r,defaultOptions:t.getQueryDefaults(a)}),this.add(l)),l}add(t){C(this,Ls).has(t.queryHash)||(C(this,Ls).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const s=C(this,Ls).get(t.queryHash);s&&(t.destroy(),s===t&&C(this,Ls).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){ct.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return C(this,Ls).get(t)}getAll(){return[...C(this,Ls).values()]}find(t){const s={exact:!0,...t};return this.getAll().find(r=>Ef(s,r))}findAll(t={}){const s=this.getAll();return Object.keys(t).length>0?s.filter(r=>Ef(t,r)):s}notify(t){ct.batch(()=>{this.listeners.forEach(s=>{s(t)})})}onFocus(){ct.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){ct.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},Ls=new WeakMap,Rp),Ze,En,Dn,ca,ua,Pn,da,ha,Op,xN=(Op=class{constructor(e={}){ue(this,Ze);ue(this,En);ue(this,Dn);ue(this,ca);ue(this,ua);ue(this,Pn);ue(this,da);ue(this,ha);te(this,Ze,e.queryCache||new gN),te(this,En,e.mutationCache||new fN),te(this,Dn,e.defaultOptions||{}),te(this,ca,new Map),te(this,ua,new Map),te(this,Pn,0)}mount(){tl(this,Pn)._++,C(this,Pn)===1&&(te(this,da,rh.subscribe(async e=>{e&&(await this.resumePausedMutations(),C(this,Ze).onFocus())})),te(this,ha,mo.subscribe(async e=>{e&&(await this.resumePausedMutations(),C(this,Ze).onOnline())})))}unmount(){var e,t;tl(this,Pn)._--,C(this,Pn)===0&&((e=C(this,da))==null||e.call(this),te(this,da,void 0),(t=C(this,ha))==null||t.call(this),te(this,ha,void 0))}isFetching(e){return C(this,Ze).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return C(this,En).findAll({...e,status:"pending"}).length}getQueryData(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=C(this,Ze).get(t.queryHash))==null?void 0:s.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),s=C(this,Ze).build(this,t),r=s.state.data;return r===void 0?this.fetchQuery(e):(e.revalidateIfStale&&s.isStaleByTime(Bn(t.staleTime,s))&&this.prefetchQuery(t),Promise.resolve(r))}getQueriesData(e){return C(this,Ze).findAll(e).map(({queryKey:t,state:s})=>{const r=s.data;return[t,r]})}setQueryData(e,t,s){const r=this.defaultQueryOptions({queryKey:e}),a=C(this,Ze).get(r.queryHash),i=a==null?void 0:a.state.data,l=Yb(t,i);if(l!==void 0)return C(this,Ze).build(this,r).setData(l,{...s,manual:!0})}setQueriesData(e,t,s){return ct.batch(()=>C(this,Ze).findAll(e).map(({queryKey:r})=>[r,this.setQueryData(r,t,s)]))}getQueryState(e){var s;const t=this.defaultQueryOptions({queryKey:e});return(s=C(this,Ze).get(t.queryHash))==null?void 0:s.state}removeQueries(e){const t=C(this,Ze);ct.batch(()=>{t.findAll(e).forEach(s=>{t.remove(s)})})}resetQueries(e,t){const s=C(this,Ze);return ct.batch(()=>(s.findAll(e).forEach(r=>{r.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const s={revert:!0,...t},r=ct.batch(()=>C(this,Ze).findAll(e).map(a=>a.cancel(s)));return Promise.all(r).then(Rt).catch(Rt)}invalidateQueries(e,t={}){return ct.batch(()=>(C(this,Ze).findAll(e).forEach(s=>{s.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const s={...t,cancelRefetch:t.cancelRefetch??!0},r=ct.batch(()=>C(this,Ze).findAll(e).filter(a=>!a.isDisabled()&&!a.isStatic()).map(a=>{let i=a.fetch(void 0,s);return s.throwOnError||(i=i.catch(Rt)),a.state.fetchStatus==="paused"?Promise.resolve():i}));return Promise.all(r).then(Rt)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const s=C(this,Ze).build(this,t);return s.isStaleByTime(Bn(t.staleTime,s))?s.fetch(t):Promise.resolve(s.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(Rt).catch(Rt)}fetchInfiniteQuery(e){return e.behavior=Lf(e.pages),this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(Rt).catch(Rt)}ensureInfiniteQueryData(e){return e.behavior=Lf(e.pages),this.ensureQueryData(e)}resumePausedMutations(){return mo.isOnline()?C(this,En).resumePausedMutations():Promise.resolve()}getQueryCache(){return C(this,Ze)}getMutationCache(){return C(this,En)}getDefaultOptions(){return C(this,Dn)}setDefaultOptions(e){te(this,Dn,e)}setQueryDefaults(e,t){C(this,ca).set(Nr(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...C(this,ca).values()],s={};return t.forEach(r=>{Di(e,r.queryKey)&&Object.assign(s,r.defaultOptions)}),s}setMutationDefaults(e,t){C(this,ua).set(Nr(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...C(this,ua).values()],s={};return t.forEach(r=>{Di(e,r.mutationKey)&&Object.assign(s,r.defaultOptions)}),s}defaultQueryOptions(e){if(e._defaulted)return e;const t={...C(this,Dn).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=th(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===sh&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...C(this,Dn).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){C(this,Ze).clear(),C(this,En).clear()}},Ze=new WeakMap,En=new WeakMap,Dn=new WeakMap,ca=new WeakMap,ua=new WeakMap,Pn=new WeakMap,da=new WeakMap,ha=new WeakMap,Op),py=w.createContext(void 0),pe=e=>{const t=w.useContext(py);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},yN=({client:e,children:t})=>(w.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),n.jsx(py.Provider,{value:e,children:t})),gy=w.createContext(!1),vN=()=>w.useContext(gy);gy.Provider;function jN(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var bN=w.createContext(jN()),NN=()=>w.useContext(bN),wN=(e,t,s)=>{const r=s!=null&&s.state.error&&typeof e.throwOnError=="function"?nh(e.throwOnError,[s.state.error,s]):e.throwOnError;(e.suspense||e.experimental_prefetchInRender||r)&&(t.isReset()||(e.retryOnMount=!1))},SN=e=>{w.useEffect(()=>{e.clearReset()},[e])},kN=({result:e,errorResetBoundary:t,throwOnError:s,query:r,suspense:a})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(a&&e.data===void 0||nh(s,[e.error,r])),CN=e=>{if(e.suspense){const s=a=>a==="static"?a:Math.max(a??1e3,1e3),r=e.staleTime;e.staleTime=typeof r=="function"?(...a)=>s(r(...a)):s(r),typeof e.gcTime=="number"&&(e.gcTime=Math.max(e.gcTime,1e3))}},EN=(e,t)=>e.isLoading&&e.isFetching&&!t,DN=(e,t)=>(e==null?void 0:e.suspense)&&t.isPending,Of=(e,t,s)=>t.fetchOptimistic(e).catch(()=>{s.clearReset()});function PN(e,t,s){var p,h,f,g;const r=vN(),a=NN(),i=pe(),l=i.defaultQueryOptions(e);(h=(p=i.getDefaultOptions().queries)==null?void 0:p._experimental_beforeQuery)==null||h.call(p,l);const o=i.getQueryCache().get(l.queryHash);l._optimisticResults=r?"isRestoring":"optimistic",CN(l),wN(l,a,o),SN(a);const c=!i.getQueryCache().get(l.queryHash),[u]=w.useState(()=>new t(i,l)),d=u.getOptimisticResult(l),m=!r&&e.subscribed!==!1;if(w.useSyncExternalStore(w.useCallback(b=>{const y=m?u.subscribe(ct.batchCalls(b)):Rt;return u.updateResult(),y},[u,m]),()=>u.getCurrentResult(),()=>u.getCurrentResult()),w.useEffect(()=>{u.setOptions(l)},[l,u]),DN(l,d))throw Of(l,u,a);if(kN({result:d,errorResetBoundary:a,throwOnError:l.throwOnError,query:o,suspense:l.suspense}))throw d.error;if((g=(f=i.getDefaultOptions().queries)==null?void 0:f._experimental_afterQuery)==null||g.call(f,l,d),l.experimental_prefetchInRender&&!br&&EN(d,r)){const b=c?Of(l,u,a):o==null?void 0:o.promise;b==null||b.catch(Rt).finally(()=>{u.updateResult()})}return l.notifyOnChangeProps?d:u.trackResult(d)}function ge(e,t){return PN(e,cN)}function Y(e,t){const s=pe(),[r]=w.useState(()=>new pN(s,e));w.useEffect(()=>{r.setOptions(e)},[r,e]);const a=w.useSyncExternalStore(w.useCallback(l=>r.subscribe(ct.batchCalls(l)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),i=w.useCallback((l,o)=>{r.mutate(l,o).catch(Rt)},[r]);if(a.error&&nh(r.options.throwOnError,[a.error]))throw a.error;return{...a,mutate:i,mutateAsync:a.mutate}}function xy(e,t){return function(){return e.apply(t,arguments)}}const{toString:AN}=Object.prototype,{getPrototypeOf:ih}=Object,{iterator:$o,toStringTag:yy}=Symbol,Bo=(e=>t=>{const s=AN.call(t);return e[s]||(e[s]=s.slice(8,-1).toLowerCase())})(Object.create(null)),Ds=e=>(e=e.toLowerCase(),t=>Bo(t)===e),Ko=e=>t=>typeof t===e,{isArray:Aa}=Array,ba=Ko("undefined");function Qi(e){return e!==null&&!ba(e)&&e.constructor!==null&&!ba(e.constructor)&&Zt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const vy=Ds("ArrayBuffer");function TN(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&vy(e.buffer),t}const FN=Ko("string"),Zt=Ko("function"),jy=Ko("number"),Hi=e=>e!==null&&typeof e=="object",IN=e=>e===!0||e===!1,Ll=e=>{if(Bo(e)!=="object")return!1;const t=ih(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(yy in e)&&!($o in e)},MN=e=>{if(!Hi(e)||Qi(e))return!1;try{return Object.keys(e).length===0&&Object.getPrototypeOf(e)===Object.prototype}catch{return!1}},LN=Ds("Date"),RN=Ds("File"),ON=Ds("Blob"),_N=Ds("FileList"),zN=e=>Hi(e)&&Zt(e.pipe),UN=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Zt(e.append)&&((t=Bo(e))==="formdata"||t==="object"&&Zt(e.toString)&&e.toString()==="[object FormData]"))},$N=Ds("URLSearchParams"),[BN,KN,VN,qN]=["ReadableStream","Request","Response","Headers"].map(Ds),QN=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Wi(e,t,{allOwnKeys:s=!1}={}){if(e===null||typeof e>"u")return;let r,a;if(typeof e!="object"&&(e=[e]),Aa(e))for(r=0,a=e.length;r0;)if(a=s[r],t===a.toLowerCase())return a;return null}const sr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Ny=e=>!ba(e)&&e!==sr;function Wu(){const{caseless:e,skipUndefined:t}=Ny(this)&&this||{},s={},r=(a,i)=>{const l=e&&by(s,i)||i;Ll(s[l])&&Ll(a)?s[l]=Wu(s[l],a):Ll(a)?s[l]=Wu({},a):Aa(a)?s[l]=a.slice():(!t||!ba(a))&&(s[l]=a)};for(let a=0,i=arguments.length;a(Wi(t,(a,i)=>{s&&Zt(a)?e[i]=xy(a,s):e[i]=a},{allOwnKeys:r}),e),WN=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),GN=(e,t,s,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),s&&Object.assign(e.prototype,s)},ZN=(e,t,s,r)=>{let a,i,l;const o={};if(t=t||{},e==null)return t;do{for(a=Object.getOwnPropertyNames(e),i=a.length;i-- >0;)l=a[i],(!r||r(l,e,t))&&!o[l]&&(t[l]=e[l],o[l]=!0);e=s!==!1&&ih(e)}while(e&&(!s||s(e,t))&&e!==Object.prototype);return t},YN=(e,t,s)=>{e=String(e),(s===void 0||s>e.length)&&(s=e.length),s-=t.length;const r=e.indexOf(t,s);return r!==-1&&r===s},JN=e=>{if(!e)return null;if(Aa(e))return e;let t=e.length;if(!jy(t))return null;const s=new Array(t);for(;t-- >0;)s[t]=e[t];return s},XN=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&ih(Uint8Array)),ew=(e,t)=>{const r=(e&&e[$o]).call(e);let a;for(;(a=r.next())&&!a.done;){const i=a.value;t.call(e,i[0],i[1])}},tw=(e,t)=>{let s;const r=[];for(;(s=e.exec(t))!==null;)r.push(s);return r},sw=Ds("HTMLFormElement"),nw=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(s,r,a){return r.toUpperCase()+a}),_f=(({hasOwnProperty:e})=>(t,s)=>e.call(t,s))(Object.prototype),rw=Ds("RegExp"),wy=(e,t)=>{const s=Object.getOwnPropertyDescriptors(e),r={};Wi(s,(a,i)=>{let l;(l=t(a,i,e))!==!1&&(r[i]=l||a)}),Object.defineProperties(e,r)},aw=e=>{wy(e,(t,s)=>{if(Zt(e)&&["arguments","caller","callee"].indexOf(s)!==-1)return!1;const r=e[s];if(Zt(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+s+"'")})}})},iw=(e,t)=>{const s={},r=a=>{a.forEach(i=>{s[i]=!0})};return Aa(e)?r(e):r(String(e).split(t)),s},lw=()=>{},ow=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function cw(e){return!!(e&&Zt(e.append)&&e[yy]==="FormData"&&e[$o])}const uw=e=>{const t=new Array(10),s=(r,a)=>{if(Hi(r)){if(t.indexOf(r)>=0)return;if(Qi(r))return r;if(!("toJSON"in r)){t[a]=r;const i=Aa(r)?[]:{};return Wi(r,(l,o)=>{const c=s(l,a+1);!ba(c)&&(i[o]=c)}),t[a]=void 0,i}}return r};return s(e,0)},dw=Ds("AsyncFunction"),hw=e=>e&&(Hi(e)||Zt(e))&&Zt(e.then)&&Zt(e.catch),Sy=((e,t)=>e?setImmediate:t?((s,r)=>(sr.addEventListener("message",({source:a,data:i})=>{a===sr&&i===s&&r.length&&r.shift()()},!1),a=>{r.push(a),sr.postMessage(s,"*")}))(`axios@${Math.random()}`,[]):s=>setTimeout(s))(typeof setImmediate=="function",Zt(sr.postMessage)),mw=typeof queueMicrotask<"u"?queueMicrotask.bind(sr):typeof process<"u"&&process.nextTick||Sy,fw=e=>e!=null&&Zt(e[$o]),R={isArray:Aa,isArrayBuffer:vy,isBuffer:Qi,isFormData:UN,isArrayBufferView:TN,isString:FN,isNumber:jy,isBoolean:IN,isObject:Hi,isPlainObject:Ll,isEmptyObject:MN,isReadableStream:BN,isRequest:KN,isResponse:VN,isHeaders:qN,isUndefined:ba,isDate:LN,isFile:RN,isBlob:ON,isRegExp:rw,isFunction:Zt,isStream:zN,isURLSearchParams:$N,isTypedArray:XN,isFileList:_N,forEach:Wi,merge:Wu,extend:HN,trim:QN,stripBOM:WN,inherits:GN,toFlatObject:ZN,kindOf:Bo,kindOfTest:Ds,endsWith:YN,toArray:JN,forEachEntry:ew,matchAll:tw,isHTMLForm:sw,hasOwnProperty:_f,hasOwnProp:_f,reduceDescriptors:wy,freezeMethods:aw,toObjectSet:iw,toCamelCase:nw,noop:lw,toFiniteNumber:ow,findKey:by,global:sr,isContextDefined:Ny,isSpecCompliantForm:cw,toJSONObject:uw,isAsyncFn:dw,isThenable:hw,setImmediate:Sy,asap:mw,isIterable:fw};function xe(e,t,s,r,a){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),s&&(this.config=s),r&&(this.request=r),a&&(this.response=a,this.status=a.status?a.status:null)}R.inherits(xe,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:R.toJSONObject(this.config),code:this.code,status:this.status}}});const ky=xe.prototype,Cy={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{Cy[e]={value:e}});Object.defineProperties(xe,Cy);Object.defineProperty(ky,"isAxiosError",{value:!0});xe.from=(e,t,s,r,a,i)=>{const l=Object.create(ky);R.toFlatObject(e,l,function(d){return d!==Error.prototype},u=>u!=="isAxiosError");const o=e&&e.message?e.message:"Error",c=t==null&&e?e.code:t;return xe.call(l,o,c,s,r,a),e&&l.cause==null&&Object.defineProperty(l,"cause",{value:e,configurable:!0}),l.name=e&&e.name||"Error",i&&Object.assign(l,i),l};const pw=null;function Gu(e){return R.isPlainObject(e)||R.isArray(e)}function Ey(e){return R.endsWith(e,"[]")?e.slice(0,-2):e}function zf(e,t,s){return e?e.concat(t).map(function(a,i){return a=Ey(a),!s&&i?"["+a+"]":a}).join(s?".":""):t}function gw(e){return R.isArray(e)&&!e.some(Gu)}const xw=R.toFlatObject(R,{},null,function(t){return/^is[A-Z]/.test(t)});function Vo(e,t,s){if(!R.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,s=R.toFlatObject(s,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,b){return!R.isUndefined(b[g])});const r=s.metaTokens,a=s.visitor||d,i=s.dots,l=s.indexes,c=(s.Blob||typeof Blob<"u"&&Blob)&&R.isSpecCompliantForm(t);if(!R.isFunction(a))throw new TypeError("visitor must be a function");function u(f){if(f===null)return"";if(R.isDate(f))return f.toISOString();if(R.isBoolean(f))return f.toString();if(!c&&R.isBlob(f))throw new xe("Blob is not supported. Use a Buffer instead.");return R.isArrayBuffer(f)||R.isTypedArray(f)?c&&typeof Blob=="function"?new Blob([f]):Buffer.from(f):f}function d(f,g,b){let y=f;if(f&&!b&&typeof f=="object"){if(R.endsWith(g,"{}"))g=r?g:g.slice(0,-2),f=JSON.stringify(f);else if(R.isArray(f)&&gw(f)||(R.isFileList(f)||R.endsWith(g,"[]"))&&(y=R.toArray(f)))return g=Ey(g),y.forEach(function(x,N){!(R.isUndefined(x)||x===null)&&t.append(l===!0?zf([g],N,i):l===null?g:g+"[]",u(x))}),!1}return Gu(f)?!0:(t.append(zf(b,g,i),u(f)),!1)}const m=[],p=Object.assign(xw,{defaultVisitor:d,convertValue:u,isVisitable:Gu});function h(f,g){if(!R.isUndefined(f)){if(m.indexOf(f)!==-1)throw Error("Circular reference detected in "+g.join("."));m.push(f),R.forEach(f,function(y,v){(!(R.isUndefined(y)||y===null)&&a.call(t,y,R.isString(v)?v.trim():v,g,p))===!0&&h(y,g?g.concat(v):[v])}),m.pop()}}if(!R.isObject(e))throw new TypeError("data must be an object");return h(e),t}function Uf(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function lh(e,t){this._pairs=[],e&&Vo(e,this,t)}const Dy=lh.prototype;Dy.append=function(t,s){this._pairs.push([t,s])};Dy.toString=function(t){const s=t?function(r){return t.call(this,r,Uf)}:Uf;return this._pairs.map(function(a){return s(a[0])+"="+s(a[1])},"").join("&")};function yw(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Py(e,t,s){if(!t)return e;const r=s&&s.encode||yw;R.isFunction(s)&&(s={serialize:s});const a=s&&s.serialize;let i;if(a?i=a(t,s):i=R.isURLSearchParams(t)?t.toString():new lh(t,s).toString(r),i){const l=e.indexOf("#");l!==-1&&(e=e.slice(0,l)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e}class $f{constructor(){this.handlers=[]}use(t,s,r){return this.handlers.push({fulfilled:t,rejected:s,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){R.forEach(this.handlers,function(r){r!==null&&t(r)})}}const Ay={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},vw=typeof URLSearchParams<"u"?URLSearchParams:lh,jw=typeof FormData<"u"?FormData:null,bw=typeof Blob<"u"?Blob:null,Nw={isBrowser:!0,classes:{URLSearchParams:vw,FormData:jw,Blob:bw},protocols:["http","https","file","blob","url","data"]},oh=typeof window<"u"&&typeof document<"u",Zu=typeof navigator=="object"&&navigator||void 0,ww=oh&&(!Zu||["ReactNative","NativeScript","NS"].indexOf(Zu.product)<0),Sw=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",kw=oh&&window.location.href||"http://localhost",Cw=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:oh,hasStandardBrowserEnv:ww,hasStandardBrowserWebWorkerEnv:Sw,navigator:Zu,origin:kw},Symbol.toStringTag,{value:"Module"})),Dt={...Cw,...Nw};function Ew(e,t){return Vo(e,new Dt.classes.URLSearchParams,{visitor:function(s,r,a,i){return Dt.isNode&&R.isBuffer(s)?(this.append(r,s.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)},...t})}function Dw(e){return R.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function Pw(e){const t={},s=Object.keys(e);let r;const a=s.length;let i;for(r=0;r=s.length;return l=!l&&R.isArray(a)?a.length:l,c?(R.hasOwnProp(a,l)?a[l]=[a[l],r]:a[l]=r,!o):((!a[l]||!R.isObject(a[l]))&&(a[l]=[]),t(s,r,a[l],i)&&R.isArray(a[l])&&(a[l]=Pw(a[l])),!o)}if(R.isFormData(e)&&R.isFunction(e.entries)){const s={};return R.forEachEntry(e,(r,a)=>{t(Dw(r),a,s,0)}),s}return null}function Aw(e,t,s){if(R.isString(e))try{return(t||JSON.parse)(e),R.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(s||JSON.stringify)(e)}const Gi={transitional:Ay,adapter:["xhr","http","fetch"],transformRequest:[function(t,s){const r=s.getContentType()||"",a=r.indexOf("application/json")>-1,i=R.isObject(t);if(i&&R.isHTMLForm(t)&&(t=new FormData(t)),R.isFormData(t))return a?JSON.stringify(Ty(t)):t;if(R.isArrayBuffer(t)||R.isBuffer(t)||R.isStream(t)||R.isFile(t)||R.isBlob(t)||R.isReadableStream(t))return t;if(R.isArrayBufferView(t))return t.buffer;if(R.isURLSearchParams(t))return s.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let o;if(i){if(r.indexOf("application/x-www-form-urlencoded")>-1)return Ew(t,this.formSerializer).toString();if((o=R.isFileList(t))||r.indexOf("multipart/form-data")>-1){const c=this.env&&this.env.FormData;return Vo(o?{"files[]":t}:t,c&&new c,this.formSerializer)}}return i||a?(s.setContentType("application/json",!1),Aw(t)):t}],transformResponse:[function(t){const s=this.transitional||Gi.transitional,r=s&&s.forcedJSONParsing,a=this.responseType==="json";if(R.isResponse(t)||R.isReadableStream(t))return t;if(t&&R.isString(t)&&(r&&!this.responseType||a)){const l=!(s&&s.silentJSONParsing)&&a;try{return JSON.parse(t,this.parseReviver)}catch(o){if(l)throw o.name==="SyntaxError"?xe.from(o,xe.ERR_BAD_RESPONSE,this,null,this.response):o}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Dt.classes.FormData,Blob:Dt.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};R.forEach(["delete","get","head","post","put","patch"],e=>{Gi.headers[e]={}});const Tw=R.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Fw=e=>{const t={};let s,r,a;return e&&e.split(` -`).forEach(function(l){a=l.indexOf(":"),s=l.substring(0,a).trim().toLowerCase(),r=l.substring(a+1).trim(),!(!s||t[s]&&Tw[s])&&(s==="set-cookie"?t[s]?t[s].push(r):t[s]=[r]:t[s]=t[s]?t[s]+", "+r:r)}),t},Bf=Symbol("internals");function Ka(e){return e&&String(e).trim().toLowerCase()}function Rl(e){return e===!1||e==null?e:R.isArray(e)?e.map(Rl):String(e)}function Iw(e){const t=Object.create(null),s=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=s.exec(e);)t[r[1]]=r[2];return t}const Mw=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Ec(e,t,s,r,a){if(R.isFunction(r))return r.call(this,t,s);if(a&&(t=s),!!R.isString(t)){if(R.isString(r))return t.indexOf(r)!==-1;if(R.isRegExp(r))return r.test(t)}}function Lw(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,s,r)=>s.toUpperCase()+r)}function Rw(e,t){const s=R.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+s,{value:function(a,i,l){return this[r].call(this,t,a,i,l)},configurable:!0})})}let Yt=class{constructor(t){t&&this.set(t)}set(t,s,r){const a=this;function i(o,c,u){const d=Ka(c);if(!d)throw new Error("header name must be a non-empty string");const m=R.findKey(a,d);(!m||a[m]===void 0||u===!0||u===void 0&&a[m]!==!1)&&(a[m||c]=Rl(o))}const l=(o,c)=>R.forEach(o,(u,d)=>i(u,d,c));if(R.isPlainObject(t)||t instanceof this.constructor)l(t,s);else if(R.isString(t)&&(t=t.trim())&&!Mw(t))l(Fw(t),s);else if(R.isObject(t)&&R.isIterable(t)){let o={},c,u;for(const d of t){if(!R.isArray(d))throw TypeError("Object iterator must return a key-value pair");o[u=d[0]]=(c=o[u])?R.isArray(c)?[...c,d[1]]:[c,d[1]]:d[1]}l(o,s)}else t!=null&&i(s,t,r);return this}get(t,s){if(t=Ka(t),t){const r=R.findKey(this,t);if(r){const a=this[r];if(!s)return a;if(s===!0)return Iw(a);if(R.isFunction(s))return s.call(this,a,r);if(R.isRegExp(s))return s.exec(a);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,s){if(t=Ka(t),t){const r=R.findKey(this,t);return!!(r&&this[r]!==void 0&&(!s||Ec(this,this[r],r,s)))}return!1}delete(t,s){const r=this;let a=!1;function i(l){if(l=Ka(l),l){const o=R.findKey(r,l);o&&(!s||Ec(r,r[o],o,s))&&(delete r[o],a=!0)}}return R.isArray(t)?t.forEach(i):i(t),a}clear(t){const s=Object.keys(this);let r=s.length,a=!1;for(;r--;){const i=s[r];(!t||Ec(this,this[i],i,t,!0))&&(delete this[i],a=!0)}return a}normalize(t){const s=this,r={};return R.forEach(this,(a,i)=>{const l=R.findKey(r,i);if(l){s[l]=Rl(a),delete s[i];return}const o=t?Lw(i):String(i).trim();o!==i&&delete s[i],s[o]=Rl(a),r[o]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const s=Object.create(null);return R.forEach(this,(r,a)=>{r!=null&&r!==!1&&(s[a]=t&&R.isArray(r)?r.join(", "):r)}),s}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,s])=>t+": "+s).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...s){const r=new this(t);return s.forEach(a=>r.set(a)),r}static accessor(t){const r=(this[Bf]=this[Bf]={accessors:{}}).accessors,a=this.prototype;function i(l){const o=Ka(l);r[o]||(Rw(a,l),r[o]=!0)}return R.isArray(t)?t.forEach(i):i(t),this}};Yt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);R.reduceDescriptors(Yt.prototype,({value:e},t)=>{let s=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[s]=r}}});R.freezeMethods(Yt);function Dc(e,t){const s=this||Gi,r=t||s,a=Yt.from(r.headers);let i=r.data;return R.forEach(e,function(o){i=o.call(s,i,a.normalize(),t?t.status:void 0)}),a.normalize(),i}function Fy(e){return!!(e&&e.__CANCEL__)}function Ta(e,t,s){xe.call(this,e??"canceled",xe.ERR_CANCELED,t,s),this.name="CanceledError"}R.inherits(Ta,xe,{__CANCEL__:!0});function Iy(e,t,s){const r=s.config.validateStatus;!s.status||!r||r(s.status)?e(s):t(new xe("Request failed with status code "+s.status,[xe.ERR_BAD_REQUEST,xe.ERR_BAD_RESPONSE][Math.floor(s.status/100)-4],s.config,s.request,s))}function Ow(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function _w(e,t){e=e||10;const s=new Array(e),r=new Array(e);let a=0,i=0,l;return t=t!==void 0?t:1e3,function(c){const u=Date.now(),d=r[i];l||(l=u),s[a]=c,r[a]=u;let m=i,p=0;for(;m!==a;)p+=s[m++],m=m%e;if(a=(a+1)%e,a===i&&(i=(i+1)%e),u-l{s=d,a=null,i&&(clearTimeout(i),i=null),e(...u)};return[(...u)=>{const d=Date.now(),m=d-s;m>=r?l(u,d):(a=u,i||(i=setTimeout(()=>{i=null,l(a)},r-m)))},()=>a&&l(a)]}const fo=(e,t,s=3)=>{let r=0;const a=_w(50,250);return zw(i=>{const l=i.loaded,o=i.lengthComputable?i.total:void 0,c=l-r,u=a(c),d=l<=o;r=l;const m={loaded:l,total:o,progress:o?l/o:void 0,bytes:c,rate:u||void 0,estimated:u&&o&&d?(o-l)/u:void 0,event:i,lengthComputable:o!=null,[t?"download":"upload"]:!0};e(m)},s)},Kf=(e,t)=>{const s=e!=null;return[r=>t[0]({lengthComputable:s,total:e,loaded:r}),t[1]]},Vf=e=>(...t)=>R.asap(()=>e(...t)),Uw=Dt.hasStandardBrowserEnv?((e,t)=>s=>(s=new URL(s,Dt.origin),e.protocol===s.protocol&&e.host===s.host&&(t||e.port===s.port)))(new URL(Dt.origin),Dt.navigator&&/(msie|trident)/i.test(Dt.navigator.userAgent)):()=>!0,$w=Dt.hasStandardBrowserEnv?{write(e,t,s,r,a,i,l){if(typeof document>"u")return;const o=[`${e}=${encodeURIComponent(t)}`];R.isNumber(s)&&o.push(`expires=${new Date(s).toUTCString()}`),R.isString(r)&&o.push(`path=${r}`),R.isString(a)&&o.push(`domain=${a}`),i===!0&&o.push("secure"),R.isString(l)&&o.push(`SameSite=${l}`),document.cookie=o.join("; ")},read(e){if(typeof document>"u")return null;const t=document.cookie.match(new RegExp("(?:^|; )"+e+"=([^;]*)"));return t?decodeURIComponent(t[1]):null},remove(e){this.write(e,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function Bw(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function Kw(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function My(e,t,s){let r=!Bw(t);return e&&(r||s==!1)?Kw(e,t):t}const qf=e=>e instanceof Yt?{...e}:e;function wr(e,t){t=t||{};const s={};function r(u,d,m,p){return R.isPlainObject(u)&&R.isPlainObject(d)?R.merge.call({caseless:p},u,d):R.isPlainObject(d)?R.merge({},d):R.isArray(d)?d.slice():d}function a(u,d,m,p){if(R.isUndefined(d)){if(!R.isUndefined(u))return r(void 0,u,m,p)}else return r(u,d,m,p)}function i(u,d){if(!R.isUndefined(d))return r(void 0,d)}function l(u,d){if(R.isUndefined(d)){if(!R.isUndefined(u))return r(void 0,u)}else return r(void 0,d)}function o(u,d,m){if(m in t)return r(u,d);if(m in e)return r(void 0,u)}const c={url:i,method:i,data:i,baseURL:l,transformRequest:l,transformResponse:l,paramsSerializer:l,timeout:l,timeoutMessage:l,withCredentials:l,withXSRFToken:l,adapter:l,responseType:l,xsrfCookieName:l,xsrfHeaderName:l,onUploadProgress:l,onDownloadProgress:l,decompress:l,maxContentLength:l,maxBodyLength:l,beforeRedirect:l,transport:l,httpAgent:l,httpsAgent:l,cancelToken:l,socketPath:l,responseEncoding:l,validateStatus:o,headers:(u,d,m)=>a(qf(u),qf(d),m,!0)};return R.forEach(Object.keys({...e,...t}),function(d){const m=c[d]||a,p=m(e[d],t[d],d);R.isUndefined(p)&&m!==o||(s[d]=p)}),s}const Ly=e=>{const t=wr({},e);let{data:s,withXSRFToken:r,xsrfHeaderName:a,xsrfCookieName:i,headers:l,auth:o}=t;if(t.headers=l=Yt.from(l),t.url=Py(My(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),o&&l.set("Authorization","Basic "+btoa((o.username||"")+":"+(o.password?unescape(encodeURIComponent(o.password)):""))),R.isFormData(s)){if(Dt.hasStandardBrowserEnv||Dt.hasStandardBrowserWebWorkerEnv)l.setContentType(void 0);else if(R.isFunction(s.getHeaders)){const c=s.getHeaders(),u=["content-type","content-length"];Object.entries(c).forEach(([d,m])=>{u.includes(d.toLowerCase())&&l.set(d,m)})}}if(Dt.hasStandardBrowserEnv&&(r&&R.isFunction(r)&&(r=r(t)),r||r!==!1&&Uw(t.url))){const c=a&&i&&$w.read(i);c&&l.set(a,c)}return t},Vw=typeof XMLHttpRequest<"u",qw=Vw&&function(e){return new Promise(function(s,r){const a=Ly(e);let i=a.data;const l=Yt.from(a.headers).normalize();let{responseType:o,onUploadProgress:c,onDownloadProgress:u}=a,d,m,p,h,f;function g(){h&&h(),f&&f(),a.cancelToken&&a.cancelToken.unsubscribe(d),a.signal&&a.signal.removeEventListener("abort",d)}let b=new XMLHttpRequest;b.open(a.method.toUpperCase(),a.url,!0),b.timeout=a.timeout;function y(){if(!b)return;const x=Yt.from("getAllResponseHeaders"in b&&b.getAllResponseHeaders()),k={data:!o||o==="text"||o==="json"?b.responseText:b.response,status:b.status,statusText:b.statusText,headers:x,config:e,request:b};Iy(function(F){s(F),g()},function(F){r(F),g()},k),b=null}"onloadend"in b?b.onloadend=y:b.onreadystatechange=function(){!b||b.readyState!==4||b.status===0&&!(b.responseURL&&b.responseURL.indexOf("file:")===0)||setTimeout(y)},b.onabort=function(){b&&(r(new xe("Request aborted",xe.ECONNABORTED,e,b)),b=null)},b.onerror=function(N){const k=N&&N.message?N.message:"Network Error",D=new xe(k,xe.ERR_NETWORK,e,b);D.event=N||null,r(D),b=null},b.ontimeout=function(){let N=a.timeout?"timeout of "+a.timeout+"ms exceeded":"timeout exceeded";const k=a.transitional||Ay;a.timeoutErrorMessage&&(N=a.timeoutErrorMessage),r(new xe(N,k.clarifyTimeoutError?xe.ETIMEDOUT:xe.ECONNABORTED,e,b)),b=null},i===void 0&&l.setContentType(null),"setRequestHeader"in b&&R.forEach(l.toJSON(),function(N,k){b.setRequestHeader(k,N)}),R.isUndefined(a.withCredentials)||(b.withCredentials=!!a.withCredentials),o&&o!=="json"&&(b.responseType=a.responseType),u&&([p,f]=fo(u,!0),b.addEventListener("progress",p)),c&&b.upload&&([m,h]=fo(c),b.upload.addEventListener("progress",m),b.upload.addEventListener("loadend",h)),(a.cancelToken||a.signal)&&(d=x=>{b&&(r(!x||x.type?new Ta(null,e,b):x),b.abort(),b=null)},a.cancelToken&&a.cancelToken.subscribe(d),a.signal&&(a.signal.aborted?d():a.signal.addEventListener("abort",d)));const v=Ow(a.url);if(v&&Dt.protocols.indexOf(v)===-1){r(new xe("Unsupported protocol "+v+":",xe.ERR_BAD_REQUEST,e));return}b.send(i||null)})},Qw=(e,t)=>{const{length:s}=e=e?e.filter(Boolean):[];if(t||s){let r=new AbortController,a;const i=function(u){if(!a){a=!0,o();const d=u instanceof Error?u:this.reason;r.abort(d instanceof xe?d:new Ta(d instanceof Error?d.message:d))}};let l=t&&setTimeout(()=>{l=null,i(new xe(`timeout ${t} of ms exceeded`,xe.ETIMEDOUT))},t);const o=()=>{e&&(l&&clearTimeout(l),l=null,e.forEach(u=>{u.unsubscribe?u.unsubscribe(i):u.removeEventListener("abort",i)}),e=null)};e.forEach(u=>u.addEventListener("abort",i));const{signal:c}=r;return c.unsubscribe=()=>R.asap(o),c}},Hw=function*(e,t){let s=e.byteLength;if(s{const a=Ww(e,t);let i=0,l,o=c=>{l||(l=!0,r&&r(c))};return new ReadableStream({async pull(c){try{const{done:u,value:d}=await a.next();if(u){o(),c.close();return}let m=d.byteLength;if(s){let p=i+=m;s(p)}c.enqueue(new Uint8Array(d))}catch(u){throw o(u),u}},cancel(c){return o(c),a.return()}},{highWaterMark:2})},Hf=64*1024,{isFunction:jl}=R,Zw=(({Request:e,Response:t})=>({Request:e,Response:t}))(R.global),{ReadableStream:Wf,TextEncoder:Gf}=R.global,Zf=(e,...t)=>{try{return!!e(...t)}catch{return!1}},Yw=e=>{e=R.merge.call({skipUndefined:!0},Zw,e);const{fetch:t,Request:s,Response:r}=e,a=t?jl(t):typeof fetch=="function",i=jl(s),l=jl(r);if(!a)return!1;const o=a&&jl(Wf),c=a&&(typeof Gf=="function"?(f=>g=>f.encode(g))(new Gf):async f=>new Uint8Array(await new s(f).arrayBuffer())),u=i&&o&&Zf(()=>{let f=!1;const g=new s(Dt.origin,{body:new Wf,method:"POST",get duplex(){return f=!0,"half"}}).headers.has("Content-Type");return f&&!g}),d=l&&o&&Zf(()=>R.isReadableStream(new r("").body)),m={stream:d&&(f=>f.body)};a&&["text","arrayBuffer","blob","formData","stream"].forEach(f=>{!m[f]&&(m[f]=(g,b)=>{let y=g&&g[f];if(y)return y.call(g);throw new xe(`Response type '${f}' is not supported`,xe.ERR_NOT_SUPPORT,b)})});const p=async f=>{if(f==null)return 0;if(R.isBlob(f))return f.size;if(R.isSpecCompliantForm(f))return(await new s(Dt.origin,{method:"POST",body:f}).arrayBuffer()).byteLength;if(R.isArrayBufferView(f)||R.isArrayBuffer(f))return f.byteLength;if(R.isURLSearchParams(f)&&(f=f+""),R.isString(f))return(await c(f)).byteLength},h=async(f,g)=>{const b=R.toFiniteNumber(f.getContentLength());return b??p(g)};return async f=>{let{url:g,method:b,data:y,signal:v,cancelToken:x,timeout:N,onDownloadProgress:k,onUploadProgress:D,responseType:F,headers:S,withCredentials:L="same-origin",fetchOptions:T}=Ly(f),_=t||fetch;F=F?(F+"").toLowerCase():"text";let K=Qw([v,x&&x.toAbortSignal()],N),W=null;const Q=K&&K.unsubscribe&&(()=>{K.unsubscribe()});let z;try{if(D&&u&&b!=="get"&&b!=="head"&&(z=await h(S,y))!==0){let me=new s(g,{method:"POST",body:y,duplex:"half"}),ve;if(R.isFormData(y)&&(ve=me.headers.get("content-type"))&&S.setContentType(ve),me.body){const[it,V]=Kf(z,fo(Vf(D)));y=Qf(me.body,Hf,it,V)}}R.isString(L)||(L=L?"include":"omit");const P=i&&"credentials"in s.prototype,j={...T,signal:K,method:b.toUpperCase(),headers:S.normalize().toJSON(),body:y,duplex:"half",credentials:P?L:void 0};W=i&&new s(g,j);let B=await(i?_(W,T):_(g,j));const J=d&&(F==="stream"||F==="response");if(d&&(k||J&&Q)){const me={};["status","statusText","headers"].forEach(Ce=>{me[Ce]=B[Ce]});const ve=R.toFiniteNumber(B.headers.get("content-length")),[it,V]=k&&Kf(ve,fo(Vf(k),!0))||[];B=new r(Qf(B.body,Hf,it,()=>{V&&V(),Q&&Q()}),me)}F=F||"text";let ee=await m[R.findKey(m,F)||"text"](B,f);return!J&&Q&&Q(),await new Promise((me,ve)=>{Iy(me,ve,{data:ee,headers:Yt.from(B.headers),status:B.status,statusText:B.statusText,config:f,request:W})})}catch(P){throw Q&&Q(),P&&P.name==="TypeError"&&/Load failed|fetch/i.test(P.message)?Object.assign(new xe("Network Error",xe.ERR_NETWORK,f,W),{cause:P.cause||P}):xe.from(P,P&&P.code,f,W)}}},Jw=new Map,Ry=e=>{let t=e&&e.env||{};const{fetch:s,Request:r,Response:a}=t,i=[r,a,s];let l=i.length,o=l,c,u,d=Jw;for(;o--;)c=i[o],u=d.get(c),u===void 0&&d.set(c,u=o?new Map:Yw(t)),d=u;return u};Ry();const ch={http:pw,xhr:qw,fetch:{get:Ry}};R.forEach(ch,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Yf=e=>`- ${e}`,Xw=e=>R.isFunction(e)||e===null||e===!1;function e1(e,t){e=R.isArray(e)?e:[e];const{length:s}=e;let r,a;const i={};for(let l=0;l`adapter ${c} `+(u===!1?"is not supported by the environment":"is not available in the build"));let o=s?l.length>1?`since : -`+l.map(Yf).join(` -`):" "+Yf(l[0]):"as no adapter specified";throw new xe("There is no suitable adapter to dispatch the request "+o,"ERR_NOT_SUPPORT")}return a}const Oy={getAdapter:e1,adapters:ch};function Pc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ta(null,e)}function Jf(e){return Pc(e),e.headers=Yt.from(e.headers),e.data=Dc.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Oy.getAdapter(e.adapter||Gi.adapter,e)(e).then(function(r){return Pc(e),r.data=Dc.call(e,e.transformResponse,r),r.headers=Yt.from(r.headers),r},function(r){return Fy(r)||(Pc(e),r&&r.response&&(r.response.data=Dc.call(e,e.transformResponse,r.response),r.response.headers=Yt.from(r.response.headers))),Promise.reject(r)})}const _y="1.13.2",qo={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{qo[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const Xf={};qo.transitional=function(t,s,r){function a(i,l){return"[Axios v"+_y+"] Transitional option '"+i+"'"+l+(r?". "+r:"")}return(i,l,o)=>{if(t===!1)throw new xe(a(l," has been removed"+(s?" in "+s:"")),xe.ERR_DEPRECATED);return s&&!Xf[l]&&(Xf[l]=!0,console.warn(a(l," has been deprecated since v"+s+" and will be removed in the near future"))),t?t(i,l,o):!0}};qo.spelling=function(t){return(s,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function t1(e,t,s){if(typeof e!="object")throw new xe("options must be an object",xe.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let a=r.length;for(;a-- >0;){const i=r[a],l=t[i];if(l){const o=e[i],c=o===void 0||l(o,i,e);if(c!==!0)throw new xe("option "+i+" must be "+c,xe.ERR_BAD_OPTION_VALUE);continue}if(s!==!0)throw new xe("Unknown option "+i,xe.ERR_BAD_OPTION)}}const Ol={assertOptions:t1,validators:qo},As=Ol.validators;let pr=class{constructor(t){this.defaults=t||{},this.interceptors={request:new $f,response:new $f}}async request(t,s){try{return await this._request(t,s)}catch(r){if(r instanceof Error){let a={};Error.captureStackTrace?Error.captureStackTrace(a):a=new Error;const i=a.stack?a.stack.replace(/^.+\n/,""):"";try{r.stack?i&&!String(r.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(r.stack+=` -`+i):r.stack=i}catch{}}throw r}}_request(t,s){typeof t=="string"?(s=s||{},s.url=t):s=t||{},s=wr(this.defaults,s);const{transitional:r,paramsSerializer:a,headers:i}=s;r!==void 0&&Ol.assertOptions(r,{silentJSONParsing:As.transitional(As.boolean),forcedJSONParsing:As.transitional(As.boolean),clarifyTimeoutError:As.transitional(As.boolean)},!1),a!=null&&(R.isFunction(a)?s.paramsSerializer={serialize:a}:Ol.assertOptions(a,{encode:As.function,serialize:As.function},!0)),s.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?s.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:s.allowAbsoluteUrls=!0),Ol.assertOptions(s,{baseUrl:As.spelling("baseURL"),withXsrfToken:As.spelling("withXSRFToken")},!0),s.method=(s.method||this.defaults.method||"get").toLowerCase();let l=i&&R.merge(i.common,i[s.method]);i&&R.forEach(["delete","get","head","post","put","patch","common"],f=>{delete i[f]}),s.headers=Yt.concat(l,i);const o=[];let c=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen=="function"&&g.runWhen(s)===!1||(c=c&&g.synchronous,o.unshift(g.fulfilled,g.rejected))});const u=[];this.interceptors.response.forEach(function(g){u.push(g.fulfilled,g.rejected)});let d,m=0,p;if(!c){const f=[Jf.bind(this),void 0];for(f.unshift(...o),f.push(...u),p=f.length,d=Promise.resolve(s);m{if(!r._listeners)return;let i=r._listeners.length;for(;i-- >0;)r._listeners[i](a);r._listeners=null}),this.promise.then=a=>{let i;const l=new Promise(o=>{r.subscribe(o),i=o}).then(a);return l.cancel=function(){r.unsubscribe(i)},l},t(function(i,l,o){r.reason||(r.reason=new Ta(i,l,o),s(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const s=this._listeners.indexOf(t);s!==-1&&this._listeners.splice(s,1)}toAbortSignal(){const t=new AbortController,s=r=>{t.abort(r)};return this.subscribe(s),t.signal.unsubscribe=()=>this.unsubscribe(s),t.signal}static source(){let t;return{token:new zy(function(a){t=a}),cancel:t}}};function n1(e){return function(s){return e.apply(null,s)}}function r1(e){return R.isObject(e)&&e.isAxiosError===!0}const Yu={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Yu).forEach(([e,t])=>{Yu[t]=e});function Uy(e){const t=new pr(e),s=xy(pr.prototype.request,t);return R.extend(s,pr.prototype,t,{allOwnKeys:!0}),R.extend(s,t,null,{allOwnKeys:!0}),s.create=function(a){return Uy(wr(e,a))},s}const tt=Uy(Gi);tt.Axios=pr;tt.CanceledError=Ta;tt.CancelToken=s1;tt.isCancel=Fy;tt.VERSION=_y;tt.toFormData=Vo;tt.AxiosError=xe;tt.Cancel=tt.CanceledError;tt.all=function(t){return Promise.all(t)};tt.spread=n1;tt.isAxiosError=r1;tt.mergeConfig=wr;tt.AxiosHeaders=Yt;tt.formToJSON=e=>Ty(R.isHTMLForm(e)?new FormData(e):e);tt.getAdapter=Oy.getAdapter;tt.HttpStatusCode=Yu;tt.default=tt;const{Axios:S2,AxiosError:k2,CanceledError:C2,isCancel:E2,CancelToken:D2,VERSION:P2,all:A2,Cancel:T2,isAxiosError:F2,spread:I2,toFormData:M2,AxiosHeaders:L2,HttpStatusCode:R2,formToJSON:O2,getAdapter:_2,mergeConfig:z2}=tt,O=tt.create({baseURL:"/api",headers:{"Content-Type":"application/json"}});O.interceptors.request.use(e=>{const t=localStorage.getItem("token");return t&&(e.headers.Authorization=`Bearer ${t}`),e});O.interceptors.response.use(e=>e,e=>{var a,i,l,o,c,u,d;const t=((i=(a=e.config)==null?void 0:a.url)==null?void 0:i.includes("/auth/login"))||((o=(l=e.config)==null?void 0:l.url)==null?void 0:o.includes("/auth/customer-login"));((c=e.response)==null?void 0:c.status)===401&&!t&&(localStorage.removeItem("token"),localStorage.removeItem("user"),window.location.href="/login");const s=((d=(u=e.response)==null?void 0:u.data)==null?void 0:d.error)||e.message||"Ein Fehler ist aufgetreten",r=new Error(s);return Promise.reject(r)});const bl={login:async(e,t)=>(await O.post("/auth/login",{email:e,password:t})).data,customerLogin:async(e,t)=>(await O.post("/auth/customer-login",{email:e,password:t})).data,me:async()=>(await O.get("/auth/me")).data},yt={getAll:async e=>(await O.get("/customers",{params:e})).data,getById:async e=>(await O.get(`/customers/${e}`)).data,create:async e=>(await O.post("/customers",e)).data,update:async(e,t)=>(await O.put(`/customers/${e}`,t)).data,delete:async e=>(await O.delete(`/customers/${e}`)).data,getPortalSettings:async e=>(await O.get(`/customers/${e}/portal`)).data,updatePortalSettings:async(e,t)=>(await O.put(`/customers/${e}/portal`,t)).data,setPortalPassword:async(e,t)=>(await O.post(`/customers/${e}/portal/password`,{password:t})).data,getPortalPassword:async e=>(await O.get(`/customers/${e}/portal/password`)).data,getRepresentatives:async e=>(await O.get(`/customers/${e}/representatives`)).data,addRepresentative:async(e,t,s)=>(await O.post(`/customers/${e}/representatives`,{representativeId:t,notes:s})).data,removeRepresentative:async(e,t)=>(await O.delete(`/customers/${e}/representatives/${t}`)).data,searchForRepresentative:async(e,t)=>(await O.get(`/customers/${e}/representatives/search`,{params:{search:t}})).data},Ju={getByCustomer:async e=>(await O.get(`/customers/${e}/addresses`)).data,create:async(e,t)=>(await O.post(`/customers/${e}/addresses`,t)).data,update:async(e,t)=>(await O.put(`/addresses/${e}`,t)).data,delete:async e=>(await O.delete(`/addresses/${e}`)).data},po={getByCustomer:async(e,t=!1)=>(await O.get(`/customers/${e}/bank-cards`,{params:{showInactive:t}})).data,create:async(e,t)=>(await O.post(`/customers/${e}/bank-cards`,t)).data,update:async(e,t)=>(await O.put(`/bank-cards/${e}`,t)).data,delete:async e=>(await O.delete(`/bank-cards/${e}`)).data},go={getByCustomer:async(e,t=!1)=>(await O.get(`/customers/${e}/documents`,{params:{showInactive:t}})).data,create:async(e,t)=>(await O.post(`/customers/${e}/documents`,t)).data,update:async(e,t)=>(await O.put(`/documents/${e}`,t)).data,delete:async e=>(await O.delete(`/documents/${e}`)).data},zs={getByCustomer:async(e,t=!1)=>(await O.get(`/customers/${e}/meters`,{params:{showInactive:t}})).data,create:async(e,t)=>(await O.post(`/customers/${e}/meters`,t)).data,update:async(e,t)=>(await O.put(`/meters/${e}`,t)).data,delete:async e=>(await O.delete(`/meters/${e}`)).data,getReadings:async e=>(await O.get(`/meters/${e}/readings`)).data,addReading:async(e,t)=>(await O.post(`/meters/${e}/readings`,t)).data,updateReading:async(e,t,s)=>(await O.put(`/meters/${e}/readings/${t}`,s)).data,deleteReading:async(e,t)=>(await O.delete(`/meters/${e}/readings/${t}`)).data},xo={getByCustomer:async(e,t=!1)=>(await O.get(`/customers/${e}/stressfrei-emails`,{params:{includeInactive:t}})).data,create:async(e,t)=>(await O.post(`/customers/${e}/stressfrei-emails`,t)).data,update:async(e,t)=>(await O.put(`/stressfrei-emails/${e}`,t)).data,delete:async e=>(await O.delete(`/stressfrei-emails/${e}`)).data},$e={getAll:async e=>(await O.get("/contracts",{params:e})).data,getById:async e=>(await O.get(`/contracts/${e}`)).data,create:async e=>(await O.post("/contracts",e)).data,update:async(e,t)=>(await O.put(`/contracts/${e}`,t)).data,delete:async e=>(await O.delete(`/contracts/${e}`)).data,createFollowUp:async e=>(await O.post(`/contracts/${e}/follow-up`)).data,getPassword:async e=>(await O.get(`/contracts/${e}/password`)).data,getSimCardCredentials:async e=>(await O.get(`/contracts/simcard/${e}/credentials`)).data,getInternetCredentials:async e=>(await O.get(`/contracts/${e}/internet-credentials`)).data,getSipCredentials:async e=>(await O.get(`/contracts/phonenumber/${e}/sip-credentials`)).data,getCockpit:async()=>(await O.get("/contracts/cockpit")).data},Xe={getAll:async e=>(await O.get("/tasks",{params:e})).data,getStats:async()=>(await O.get("/tasks/stats")).data,getByContract:async(e,t)=>(await O.get(`/contracts/${e}/tasks`,{params:{status:t}})).data,create:async(e,t)=>(await O.post(`/contracts/${e}/tasks`,t)).data,update:async(e,t)=>(await O.put(`/tasks/${e}`,t)).data,complete:async e=>(await O.post(`/tasks/${e}/complete`)).data,reopen:async e=>(await O.post(`/tasks/${e}/reopen`)).data,delete:async e=>(await O.delete(`/tasks/${e}`)).data,createSubtask:async(e,t)=>(await O.post(`/tasks/${e}/subtasks`,{title:t})).data,createReply:async(e,t)=>(await O.post(`/tasks/${e}/reply`,{title:t})).data,updateSubtask:async(e,t)=>(await O.put(`/subtasks/${e}`,{title:t})).data,completeSubtask:async e=>(await O.post(`/subtasks/${e}/complete`)).data,reopenSubtask:async e=>(await O.post(`/subtasks/${e}/reopen`)).data,deleteSubtask:async e=>(await O.delete(`/subtasks/${e}`)).data,createSupportTicket:async(e,t)=>(await O.post(`/contracts/${e}/support-ticket`,t)).data},Sr={getPublic:async()=>(await O.get("/settings/public")).data,getAll:async()=>(await O.get("/settings")).data,update:async e=>(await O.put("/settings",e)).data,updateOne:async(e,t)=>(await O.put(`/settings/${e}`,{value:t})).data},Pi={getAll:async(e=!1)=>(await O.get("/platforms",{params:{includeInactive:e}})).data,getById:async e=>(await O.get(`/platforms/${e}`)).data,create:async e=>(await O.post("/platforms",e)).data,update:async(e,t)=>(await O.put(`/platforms/${e}`,t)).data,delete:async e=>(await O.delete(`/platforms/${e}`)).data},Ai={getAll:async(e=!1)=>(await O.get("/cancellation-periods",{params:{includeInactive:e}})).data,getById:async e=>(await O.get(`/cancellation-periods/${e}`)).data,create:async e=>(await O.post("/cancellation-periods",e)).data,update:async(e,t)=>(await O.put(`/cancellation-periods/${e}`,t)).data,delete:async e=>(await O.delete(`/cancellation-periods/${e}`)).data},Ti={getAll:async(e=!1)=>(await O.get("/contract-durations",{params:{includeInactive:e}})).data,getById:async e=>(await O.get(`/contract-durations/${e}`)).data,create:async e=>(await O.post("/contract-durations",e)).data,update:async(e,t)=>(await O.put(`/contract-durations/${e}`,t)).data,delete:async e=>(await O.delete(`/contract-durations/${e}`)).data},Fi={getAll:async(e=!1)=>(await O.get("/contract-categories",{params:{includeInactive:e}})).data,getById:async e=>(await O.get(`/contract-categories/${e}`)).data,create:async e=>(await O.post("/contract-categories",e)).data,update:async(e,t)=>(await O.put(`/contract-categories/${e}`,t)).data,delete:async e=>(await O.delete(`/contract-categories/${e}`)).data},Na={getAll:async(e=!1)=>(await O.get("/providers",{params:{includeInactive:e}})).data,getById:async e=>(await O.get(`/providers/${e}`)).data,create:async e=>(await O.post("/providers",e)).data,update:async(e,t)=>(await O.put(`/providers/${e}`,t)).data,delete:async e=>(await O.delete(`/providers/${e}`)).data,getTariffs:async(e,t=!1)=>(await O.get(`/providers/${e}/tariffs`,{params:{includeInactive:t}})).data,createTariff:async(e,t)=>(await O.post(`/providers/${e}/tariffs`,t)).data},$y={getById:async e=>(await O.get(`/tariffs/${e}`)).data,update:async(e,t)=>(await O.put(`/tariffs/${e}`,t)).data,delete:async e=>(await O.delete(`/tariffs/${e}`)).data},Ye={uploadBankCardDocument:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/bank-cards/${e}`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},uploadIdentityDocument:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/documents/${e}`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteBankCardDocument:async e=>(await O.delete(`/upload/bank-cards/${e}`)).data,deleteIdentityDocument:async e=>(await O.delete(`/upload/documents/${e}`)).data,uploadBusinessRegistration:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/customers/${e}/business-registration`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteBusinessRegistration:async e=>(await O.delete(`/upload/customers/${e}/business-registration`)).data,uploadCommercialRegister:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/customers/${e}/commercial-register`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCommercialRegister:async e=>(await O.delete(`/upload/customers/${e}/commercial-register`)).data,uploadPrivacyPolicy:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/customers/${e}/privacy-policy`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},deletePrivacyPolicy:async e=>(await O.delete(`/upload/customers/${e}/privacy-policy`)).data,uploadCancellationLetter:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/contracts/${e}/cancellation-letter`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCancellationLetter:async e=>(await O.delete(`/upload/contracts/${e}/cancellation-letter`)).data,uploadCancellationConfirmation:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/contracts/${e}/cancellation-confirmation`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCancellationConfirmation:async e=>(await O.delete(`/upload/contracts/${e}/cancellation-confirmation`)).data,uploadCancellationLetterOptions:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/contracts/${e}/cancellation-letter-options`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCancellationLetterOptions:async e=>(await O.delete(`/upload/contracts/${e}/cancellation-letter-options`)).data,uploadCancellationConfirmationOptions:async(e,t)=>{const s=new FormData;return s.append("document",t),(await O.post(`/upload/contracts/${e}/cancellation-confirmation-options`,s,{headers:{"Content-Type":"multipart/form-data"}})).data},deleteCancellationConfirmationOptions:async e=>(await O.delete(`/upload/contracts/${e}/cancellation-confirmation-options`)).data},ii={getAll:async e=>(await O.get("/users",{params:e})).data,getById:async e=>(await O.get(`/users/${e}`)).data,create:async e=>(await O.post("/users",e)).data,update:async(e,t)=>(await O.put(`/users/${e}`,t)).data,delete:async e=>(await O.delete(`/users/${e}`)).data,getRoles:async()=>(await O.get("/users/roles/list")).data},Za={getSchema:async()=>(await O.get("/developer/schema")).data,getTableData:async(e,t=1,s=50)=>(await O.get(`/developer/table/${e}`,{params:{page:t,limit:s}})).data,updateRow:async(e,t,s)=>(await O.put(`/developer/table/${e}/${t}`,s)).data,deleteRow:async(e,t)=>(await O.delete(`/developer/table/${e}/${t}`)).data,getReference:async e=>(await O.get(`/developer/reference/${e}`)).data},xn={getConfigs:async()=>(await O.get("/email-providers/configs")).data,getConfig:async e=>(await O.get(`/email-providers/configs/${e}`)).data,createConfig:async e=>(await O.post("/email-providers/configs",e)).data,updateConfig:async(e,t)=>(await O.put(`/email-providers/configs/${e}`,t)).data,deleteConfig:async e=>(await O.delete(`/email-providers/configs/${e}`)).data,testConnection:async e=>{const t=e!=null&&e.testData?{...e.testData}:e!=null&&e.id?{id:e.id}:{};return(await O.post("/email-providers/test-connection",t)).data},getDomain:async()=>(await O.get("/email-providers/domain")).data,checkEmailExists:async e=>(await O.get(`/email-providers/check/${e}`)).data,provisionEmail:async(e,t)=>(await O.post("/email-providers/provision",{localPart:e,customerEmail:t})).data,deprovisionEmail:async e=>(await O.delete(`/email-providers/deprovision/${e}`)).data},By=w.createContext(null);function a1({children:e}){const[t,s]=w.useState(null),[r,a]=w.useState(!0),[i,l]=w.useState(()=>localStorage.getItem("developerMode")==="true"),o=g=>{l(g),localStorage.setItem("developerMode",String(g))};w.useEffect(()=>{var g;console.log("useEffect check - user:",t==null?void 0:t.email,"developerMode:",i,"has developer:access:",(g=t==null?void 0:t.permissions)==null?void 0:g.includes("developer:access")),t&&i&&!t.permissions.includes("developer:access")&&(console.log("Disabling developer mode because user lacks developer:access permission"),o(!1))},[t,i]),w.useEffect(()=>{localStorage.getItem("token")?bl.me().then(b=>{b.success&&b.data?s(b.data):localStorage.removeItem("token")}).catch(()=>{localStorage.removeItem("token")}).finally(()=>{a(!1)}):a(!1)},[]);const c=async(g,b)=>{const y=await bl.login(g,b);if(y.success&&y.data)localStorage.setItem("token",y.data.token),s(y.data.user);else throw new Error(y.error||"Login fehlgeschlagen")},u=async(g,b)=>{const y=await bl.customerLogin(g,b);if(y.success&&y.data)localStorage.setItem("token",y.data.token),s(y.data.user);else throw new Error(y.error||"Login fehlgeschlagen")},d=()=>{localStorage.removeItem("token"),s(null)},m=async()=>{var b;if(localStorage.getItem("token"))try{const y=await bl.me();console.log("refreshUser response:",y),console.log("permissions:",(b=y.data)==null?void 0:b.permissions),y.success&&y.data&&s(y.data)}catch(y){console.error("refreshUser error:",y)}},p=g=>t?t.permissions.includes(g):!1,h=!!(t!=null&&t.customerId),f=!!(t!=null&&t.isCustomerPortal);return n.jsx(By.Provider,{value:{user:t,isLoading:r,isAuthenticated:!!t,login:c,customerLogin:u,logout:d,hasPermission:p,isCustomer:h,isCustomerPortal:f,developerMode:i,setDeveloperMode:o,refreshUser:m},children:e})}function st(){const e=w.useContext(By);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}const Ac={scrollToTopThreshold:.7},Ky=w.createContext(void 0),ep="opencrm_app_settings";function i1({children:e}){const[t,s]=w.useState(()=>{const a=localStorage.getItem(ep);if(a)try{return{...Ac,...JSON.parse(a)}}catch{return Ac}return Ac});w.useEffect(()=>{localStorage.setItem(ep,JSON.stringify(t))},[t]);const r=a=>{s(i=>({...i,...a}))};return n.jsx(Ky.Provider,{value:{settings:t,updateSettings:r},children:e})}function Vy(){const e=w.useContext(Ky);if(!e)throw new Error("useAppSettings must be used within AppSettingsProvider");return e}function l1(){const{pathname:e}=dn();return w.useEffect(()=>{window.scrollTo(0,0)},[e]),null}/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const o1=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),qy=(...e)=>e.filter((t,s,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===s).join(" ").trim();/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var c1={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const u1=w.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:s=2,absoluteStrokeWidth:r,className:a="",children:i,iconNode:l,...o},c)=>w.createElement("svg",{ref:c,...c1,width:t,height:t,stroke:e,strokeWidth:r?Number(s)*24/Number(t):s,className:qy("lucide",a),...o},[...l.map(([u,d])=>w.createElement(u,d)),...Array.isArray(i)?i:[i]]));/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ae=(e,t)=>{const s=w.forwardRef(({className:r,...a},i)=>w.createElement(u1,{ref:i,iconNode:t,className:qy(`lucide-${o1(e)}`,r),...a}));return s.displayName=`${e}`,s};/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const $s=ae("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const d1=ae("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const h1=ae("Building2",[["path",{d:"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z",key:"1b4qmf"}],["path",{d:"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",key:"i71pzd"}],["path",{d:"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2",key:"10jefs"}],["path",{d:"M10 6h4",key:"1itunk"}],["path",{d:"M10 10h4",key:"tcdvrf"}],["path",{d:"M10 14h4",key:"kelpxr"}],["path",{d:"M10 18h4",key:"1ulq68"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const m1=ae("Cable",[["path",{d:"M17 21v-2a1 1 0 0 1-1-1v-1a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1",key:"10bnsj"}],["path",{d:"M19 15V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V9",key:"1eqmu1"}],["path",{d:"M21 21v-2h-4",key:"14zm7j"}],["path",{d:"M3 5h4V3",key:"z442eg"}],["path",{d:"M7 5a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1V3",key:"ebdjd7"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Qy=ae("Calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Hy=ae("Car",[["path",{d:"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2",key:"5owen"}],["circle",{cx:"7",cy:"17",r:"2",key:"u2ysq9"}],["path",{d:"M9 17h6",key:"r8uit2"}],["circle",{cx:"17",cy:"17",r:"2",key:"axvx0g"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Xu=ae("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Qo=ae("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const f1=ae("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ys=ae("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Wy=ae("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const en=ae("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const hs=ae("CircleCheckBig",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const tp=ae("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const _l=ae("Circle",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ii=ae("ClipboardList",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}],["path",{d:"M12 11h4",key:"1jrz19"}],["path",{d:"M12 16h4",key:"n85exb"}],["path",{d:"M8 11h.01",key:"1dfujw"}],["path",{d:"M8 16h.01",key:"18s6g9"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const qn=ae("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ho=ae("Code",[["polyline",{points:"16 18 22 12 16 6",key:"z7tu5w"}],["polyline",{points:"8 6 2 12 8 18",key:"1eg1df"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Gy=ae("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const p1=ae("CreditCard",[["rect",{width:"20",height:"14",x:"2",y:"5",rx:"2",key:"ynyp8z"}],["line",{x1:"2",x2:"22",y1:"10",y2:"10",key:"1b3vmo"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Zy=ae("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const tn=ae("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Yy=ae("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Pt=ae("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ee=ae("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const vt=ae("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const g1=ae("FileType",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M9 13v-1h6v1",key:"1bb014"}],["path",{d:"M12 12v6",key:"3ahymv"}],["path",{d:"M11 18h2",key:"12mj7e"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Jy=ae("Flame",[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Xy=ae("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const sp=ae("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const uh=ae("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const x1=ae("GripVertical",[["circle",{cx:"9",cy:"12",r:"1",key:"1vctgf"}],["circle",{cx:"9",cy:"5",r:"1",key:"hp0tcf"}],["circle",{cx:"9",cy:"19",r:"1",key:"fkjjf6"}],["circle",{cx:"15",cy:"12",r:"1",key:"1tmaij"}],["circle",{cx:"15",cy:"5",r:"1",key:"19l28e"}],["circle",{cx:"15",cy:"19",r:"1",key:"f4zoj3"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const y1=ae("Key",[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const v1=ae("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const j1=ae("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ev=ae("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const b1=ae("MapPin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const N1=ae("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Mi=ae("MessageSquare",[["path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",key:"1lielz"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const w1=ae("Move",[["path",{d:"M12 2v20",key:"t6zp3m"}],["path",{d:"m15 19-3 3-3-3",key:"11eu04"}],["path",{d:"m19 9 3 3-3 3",key:"1mg7y2"}],["path",{d:"M2 12h20",key:"9i4pu4"}],["path",{d:"m5 9-3 3 3 3",key:"j64kie"}],["path",{d:"m9 5 3-3 3 3",key:"l8vdw6"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Oe=ae("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const S1=ae("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Wo=ae("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const k1=ae("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const tv=ae("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const dh=ae("Smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const We=ae("SquarePen",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z",key:"ohrbg2"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const C1=ae("Store",[["path",{d:"m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7",key:"ztvudi"}],["path",{d:"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8",key:"1b2hhj"}],["path",{d:"M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4",key:"2ebpfo"}],["path",{d:"M2 7h20",key:"1fcdvo"}],["path",{d:"M22 7v3a2 2 0 0 1-2 2a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 16 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 12 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 8 12a2.7 2.7 0 0 1-1.59-.63.7.7 0 0 0-.82 0A2.7 2.7 0 0 1 4 12a2 2 0 0 1-2-2V7",key:"6c3vgh"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const E1=ae("Table",[["path",{d:"M12 3v18",key:"108xh3"}],["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M3 15h18",key:"5xshup"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const be=ae("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Li=ae("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const sv=ae("Tv",[["rect",{width:"20",height:"15",x:"2",y:"7",rx:"2",ry:"2",key:"10ag99"}],["polyline",{points:"17 2 12 7 7 2",key:"11pgbg"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const D1=ae("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const P1=ae("UserCog",[["circle",{cx:"18",cy:"15",r:"3",key:"gjjjvw"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M10 15H6a4 4 0 0 0-4 4v2",key:"1nfge6"}],["path",{d:"m21.7 16.4-.9-.3",key:"12j9ji"}],["path",{d:"m15.2 13.9-.9-.3",key:"1fdjdi"}],["path",{d:"m16.6 18.7.3-.9",key:"heedtr"}],["path",{d:"m19.1 12.2.3-.9",key:"1af3ki"}],["path",{d:"m19.6 18.7-.4-1",key:"1x9vze"}],["path",{d:"m16.8 12.3-.4-1",key:"vqeiwj"}],["path",{d:"m14.3 16.6 1-.4",key:"1qlj63"}],["path",{d:"m20.7 13.8 1-.4",key:"1v5t8k"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const A1=ae("UserPlus",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const hh=ae("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Xr=ae("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const np=ae("WifiOff",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ea=ae("Wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const wa=ae("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const mh=ae("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const T1=ae("ZoomIn",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14",key:"1vmskp"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]]);/** - * @license lucide-react v0.454.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const F1=ae("ZoomOut",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65",key:"13gj7c"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11",key:"durymu"}]]);function I1(){const{user:e,logout:t,hasPermission:s,isCustomer:r,developerMode:a}=st(),i=[{to:"/",icon:v1,label:"Dashboard",show:!0,end:!0},{to:"/customers",icon:Xr,label:"Kunden",show:s("customers:read")&&!r},{to:"/contracts",icon:vt,label:"Verträge",show:s("contracts:read"),end:!0},{to:"/contracts/cockpit",icon:en,label:"Vertrags-Cockpit",show:s("contracts:read")&&!r},{to:"/tasks",icon:r?Mi:Ii,label:r?"Support-Anfragen":"Aufgaben",show:s("contracts:read")}],l=[{to:"/developer/database",icon:Zy,label:"Datenbankstruktur"}];return n.jsxs("aside",{className:"w-64 bg-gray-900 text-white min-h-screen flex flex-col",children:[n.jsx("div",{className:"p-4 border-b border-gray-800",children:n.jsx("h1",{className:"text-xl font-bold",children:"OpenCRM"})}),n.jsxs("nav",{className:"flex-1 p-4 overflow-y-auto",children:[n.jsx("ul",{className:"space-y-2",children:i.filter(o=>o.show).map(o=>n.jsx("li",{children:n.jsxs(Cc,{to:o.to,end:o.end,className:({isActive:c})=>`flex items-center gap-3 px-4 py-2 rounded-lg transition-colors ${c?"bg-blue-600 text-white":"text-gray-300 hover:bg-gray-800"}`,children:[n.jsx(o.icon,{className:"w-5 h-5"}),o.label]})},o.to))}),a&&s("developer:access")&&n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"mt-6 mb-2 px-4",children:n.jsxs("p",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider flex items-center gap-2",children:[n.jsx(Ho,{className:"w-3 h-3"}),"Entwickler"]})}),n.jsx("ul",{className:"space-y-2",children:l.map(o=>n.jsx("li",{children:n.jsxs(Cc,{to:o.to,className:({isActive:c})=>`flex items-center gap-3 px-4 py-2 rounded-lg transition-colors ${c?"bg-purple-600 text-white":"text-purple-300 hover:bg-gray-800"}`,children:[n.jsx(o.icon,{className:"w-5 h-5"}),o.label]})},o.to))})]}),n.jsx("div",{className:"mt-6 pt-6 border-t border-gray-800",children:n.jsxs(Cc,{to:"/settings",className:({isActive:o})=>`flex items-center gap-3 px-4 py-2 rounded-lg transition-colors ${o?"bg-blue-600 text-white":"text-gray-300 hover:bg-gray-800"}`,children:[n.jsx(tv,{className:"w-5 h-5"}),"Einstellungen"]})})]}),n.jsxs("div",{className:"p-4 border-t border-gray-800",children:[n.jsxs("div",{className:"mb-4 text-sm",children:[n.jsx("p",{className:"text-gray-400",children:"Angemeldet als"}),n.jsxs("p",{className:"font-medium",children:[e==null?void 0:e.firstName," ",e==null?void 0:e.lastName]})]}),n.jsxs("button",{onClick:t,className:"flex items-center gap-3 w-full px-4 py-2 text-gray-300 hover:bg-gray-800 rounded-lg transition-colors",children:[n.jsx(j1,{className:"w-5 h-5"}),"Abmelden"]})]})]})}function M1(){const{settings:e}=Vy(),[t,s]=w.useState(!1);w.useEffect(()=>{const a=()=>{window.scrollY>window.innerHeight*e.scrollToTopThreshold?s(!0):s(!1)};return window.addEventListener("scroll",a),()=>window.removeEventListener("scroll",a)},[e.scrollToTopThreshold]);const r=()=>{window.scrollTo({top:0,behavior:"smooth"})};return t?n.jsx("button",{onClick:r,className:"fixed bottom-6 right-6 p-3 bg-gray-200 hover:bg-gray-300 text-gray-600 rounded-full shadow-md transition-all duration-300 opacity-70 hover:opacity-100 z-50","aria-label":"Nach oben scrollen",title:"Nach oben",children:n.jsx(Wy,{className:"w-5 h-5"})}):null}function L1(){return n.jsxs("div",{className:"flex min-h-screen",children:[n.jsx(I1,{}),n.jsx("main",{className:"flex-1 p-8 overflow-auto",children:n.jsx(Tb,{})}),n.jsx(M1,{})]})}const I=w.forwardRef(({className:e="",variant:t="primary",size:s="md",children:r,disabled:a,...i},l)=>{const o="inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed",c={primary:"bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500",secondary:"bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-500",danger:"bg-red-600 text-white hover:bg-red-700 focus:ring-red-500",ghost:"bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-gray-500"},u={sm:"px-3 py-1.5 text-sm",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"};return n.jsx("button",{ref:l,className:`${o} ${c[t]} ${u[s]} ${e}`,disabled:a,...i,children:r})});I.displayName="Button";const $=w.forwardRef(({className:e="",label:t,error:s,id:r,onClear:a,...i},l)=>{const o=r||i.name,c=i.type==="date",u=i.value!==void 0&&i.value!==null&&i.value!=="",d=c&&a&&u;return n.jsxs("div",{className:"w-full",children:[t&&n.jsx("label",{htmlFor:o,className:"block text-sm font-medium text-gray-700 mb-1",children:t}),n.jsxs("div",{className:d?"flex gap-2":"",children:[n.jsx("input",{ref:l,id:o,className:`block w-full px-3 py-2 border rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${s?"border-red-500":"border-gray-300"} ${e}`,...i}),d&&n.jsx("button",{type:"button",onClick:a,className:"px-3 py-2 text-gray-400 hover:text-red-500 hover:bg-red-50 border border-gray-300 rounded-lg transition-colors",title:"Datum löschen",children:n.jsx(be,{className:"w-4 h-4"})})]}),s&&n.jsx("p",{className:"mt-1 text-sm text-red-600",children:s})]})});$.displayName="Input";function Z({children:e,className:t="",title:s,actions:r}){return n.jsxs("div",{className:`bg-white rounded-lg shadow ${t}`,children:[(s||r)&&n.jsxs("div",{className:"px-6 py-4 border-b border-gray-200 flex items-center justify-between",children:[s&&n.jsx("h3",{className:"text-lg font-medium text-gray-900",children:s}),r&&n.jsx("div",{className:"flex items-center gap-2",children:r})]}),n.jsx("div",{className:"p-6",children:e})]})}function R1(){const[e,t]=w.useState(""),[s,r]=w.useState(""),[a,i]=w.useState(""),[l,o]=w.useState(!1),{login:c,customerLogin:u}=st(),d=Ut(),m=async p=>{p.preventDefault(),i(""),o(!0);try{await c(e,s),d("/");return}catch{}try{await u(e,s),d("/")}catch{i("Ungültige Anmeldedaten"),o(!1)}};return n.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-100",children:n.jsxs(Z,{className:"w-full max-w-md",children:[n.jsxs("div",{className:"text-center mb-8",children:[n.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:"OpenCRM"}),n.jsx("p",{className:"text-gray-600 mt-2",children:"Melden Sie sich an"})]}),a&&n.jsx("div",{className:"mb-4 p-4 bg-red-50 border border-red-200 text-red-700 rounded-lg",children:a}),n.jsxs("form",{onSubmit:m,className:"space-y-4",children:[n.jsx($,{label:"E-Mail",type:"email",value:e,onChange:p=>t(p.target.value),required:!0,autoComplete:"email"}),n.jsx($,{label:"Passwort",type:"password",value:s,onChange:p=>r(p.target.value),required:!0,autoComplete:"current-password"}),n.jsx(I,{type:"submit",className:"w-full",disabled:l,children:l?"Anmeldung...":"Anmelden"})]})]})})}function dt({isOpen:e,onClose:t,title:s,children:r,size:a="md"}){if(w.useEffect(()=>(e?document.body.style.overflow="hidden":document.body.style.overflow="",()=>{document.body.style.overflow=""}),[e]),!e)return null;const i={sm:"max-w-md",md:"max-w-lg",lg:"max-w-2xl",xl:"max-w-4xl"};return n.jsx("div",{className:"fixed inset-0 z-50 overflow-y-auto",children:n.jsxs("div",{className:"flex min-h-full items-center justify-center p-4",children:[n.jsx("div",{className:"fixed inset-0 bg-black/50",onClick:t}),n.jsxs("div",{className:`relative bg-white rounded-lg shadow-xl w-full ${i[a]}`,children:[n.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b",children:[n.jsx("h2",{className:"text-lg font-semibold",children:s}),n.jsx(I,{variant:"ghost",size:"sm",onClick:t,children:n.jsx(wa,{className:"w-5 h-5"})})]}),n.jsx("div",{className:"p-6",children:r})]})]})})}function O1(){var S,L,T,_,K,W;const{user:e,isCustomer:t,isCustomerPortal:s}=st(),[r,a]=w.useState(!1),{data:i,isLoading:l}=ge({queryKey:["app-settings-public"],queryFn:()=>Sr.getPublic(),enabled:s,staleTime:0}),o=!l&&((S=i==null?void 0:i.data)==null?void 0:S.customerSupportTicketsEnabled)==="true",{data:c}=ge({queryKey:["customers-count"],queryFn:()=>yt.getAll({limit:1}),enabled:!t}),{data:u}=ge({queryKey:["contracts",t?e==null?void 0:e.customerId:void 0],queryFn:()=>$e.getAll(t?{customerId:e==null?void 0:e.customerId}:{limit:1})}),{data:d}=ge({queryKey:["contracts-active",t?e==null?void 0:e.customerId:void 0],queryFn:()=>$e.getAll({status:"ACTIVE",...t?{customerId:e==null?void 0:e.customerId}:{limit:1}})}),{data:m}=ge({queryKey:["contracts-pending",t?e==null?void 0:e.customerId:void 0],queryFn:()=>$e.getAll({status:"PENDING",...t?{customerId:e==null?void 0:e.customerId}:{limit:1}})}),{data:p}=ge({queryKey:["task-stats"],queryFn:()=>Xe.getStats()}),{data:h}=ge({queryKey:["contract-cockpit"],queryFn:()=>$e.getCockpit(),enabled:!t,staleTime:0}),{ownContracts:f,representedContracts:g}=w.useMemo(()=>{if(!s||!(u!=null&&u.data))return{ownContracts:[],representedContracts:[]};const Q=[],z={};for(const P of u.data)if(P.customerId===(e==null?void 0:e.customerId))Q.push(P);else{const j=P.customerId;if(!z[j]){const B=P.customer?P.customer.companyName||`${P.customer.firstName} ${P.customer.lastName}`:`Kunde ${j}`;z[j]={customerName:B,contracts:[]}}z[j].contracts.push(P)}return{ownContracts:Q,representedContracts:Object.values(z).sort((P,j)=>P.customerName.localeCompare(j.customerName))}},[u==null?void 0:u.data,s,e==null?void 0:e.customerId]),b=w.useMemo(()=>f.filter(Q=>Q.status==="ACTIVE").length,[f]),y=w.useMemo(()=>f.filter(Q=>Q.status==="PENDING").length,[f]),v=w.useMemo(()=>f.filter(Q=>Q.status==="EXPIRED").length,[f]),x=w.useMemo(()=>g.reduce((Q,z)=>Q+z.contracts.length,0),[g]),N=w.useMemo(()=>g.reduce((Q,z)=>Q+z.contracts.filter(P=>P.status==="ACTIVE").length,0),[g]),k=w.useMemo(()=>g.reduce((Q,z)=>Q+z.contracts.filter(P=>P.status==="EXPIRED").length,0),[g]),D=((L=p==null?void 0:p.data)==null?void 0:L.openCount)||0,F=Q=>n.jsx(Z,{className:Q.link?"cursor-pointer hover:shadow-md transition-shadow":"",children:Q.link?n.jsx(Se,{to:Q.link,className:"block",children:n.jsxs("div",{className:"flex items-center",children:[n.jsx("div",{className:`p-3 rounded-lg ${Q.color}`,children:n.jsx(Q.icon,{className:"w-6 h-6 text-white"})}),n.jsxs("div",{className:"ml-4",children:[n.jsx("p",{className:"text-sm text-gray-500",children:Q.label}),n.jsx("p",{className:"text-2xl font-bold",children:Q.value})]})]})}):n.jsxs("div",{className:"flex items-center",children:[n.jsx("div",{className:`p-3 rounded-lg ${Q.color}`,children:n.jsx(Q.icon,{className:"w-6 h-6 text-white"})}),n.jsxs("div",{className:"ml-4",children:[n.jsx("p",{className:"text-sm text-gray-500",children:Q.label}),n.jsx("p",{className:"text-2xl font-bold",children:Q.value})]})]})},Q.label);return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsxs("h1",{className:"text-2xl font-bold",children:["Willkommen, ",e==null?void 0:e.firstName,"!"]}),s&&o&&n.jsxs(I,{onClick:()=>a(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Support-Anfrage"]})]}),s?n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:"mb-6",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[n.jsx(hh,{className:"w-5 h-5 text-blue-600"}),n.jsx("h2",{className:"text-lg font-semibold",children:"Meine Verträge"})]}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[F({label:"Eigene Verträge",value:f.length,icon:vt,color:"bg-blue-500",link:"/contracts"}),F({label:"Davon aktiv",value:b,icon:hs,color:"bg-green-500"}),F({label:"Davon ausstehend",value:y,icon:qn,color:"bg-yellow-500"}),F({label:"Davon abgelaufen",value:v,icon:tp,color:"bg-red-500"})]})]}),x>0&&n.jsxs("div",{className:"mb-6",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[n.jsx(Xr,{className:"w-5 h-5 text-purple-600"}),n.jsx("h2",{className:"text-lg font-semibold",children:"Fremdverträge"})]}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[F({label:"Fremdverträge",value:x,icon:Xr,color:"bg-purple-500",link:"/contracts"}),F({label:"Davon aktiv",value:N,icon:hs,color:"bg-green-500"}),n.jsx("div",{className:"hidden lg:block"}),F({label:"Davon abgelaufen",value:k,icon:tp,color:"bg-red-500"})]})]}),n.jsxs("div",{className:"mb-6",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[n.jsx(Mi,{className:"w-5 h-5 text-orange-600"}),n.jsx("h2",{className:"text-lg font-semibold",children:"Support-Anfragen"})]}),n.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:F({label:"Offene Anfragen",value:D,icon:Mi,color:"bg-orange-500",link:"/tasks"})})]})]}):n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-6",children:[F({label:"Kunden",value:((T=c==null?void 0:c.pagination)==null?void 0:T.total)||0,icon:Xr,color:"bg-blue-500",link:"/customers"}),F({label:"Verträge gesamt",value:((_=u==null?void 0:u.pagination)==null?void 0:_.total)||0,icon:vt,color:"bg-purple-500",link:"/contracts"}),F({label:"Aktive Verträge",value:((K=d==null?void 0:d.pagination)==null?void 0:K.total)||0,icon:hs,color:"bg-green-500"}),F({label:"Ausstehende Verträge",value:((W=m==null?void 0:m.pagination)==null?void 0:W.total)||0,icon:en,color:"bg-yellow-500"})]}),(h==null?void 0:h.data)&&n.jsxs("div",{className:"mb-6",children:[n.jsxs("div",{className:"flex items-center justify-between mb-3",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(en,{className:"w-5 h-5 text-red-500"}),n.jsx("h2",{className:"text-lg font-semibold",children:"Vertrags-Cockpit"})]}),n.jsx(Se,{to:"/contracts/cockpit",className:"text-sm text-blue-600 hover:underline",children:"Alle anzeigen"})]}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:[n.jsx(Z,{className:"cursor-pointer hover:shadow-md transition-shadow",children:n.jsx(Se,{to:"/contracts/cockpit?filter=critical",className:"block",children:n.jsxs("div",{className:"flex items-center",children:[n.jsx("div",{className:"p-3 rounded-lg bg-red-100",children:n.jsx(en,{className:"w-6 h-6 text-red-500"})}),n.jsxs("div",{className:"ml-4",children:[n.jsxs("p",{className:"text-sm text-gray-500",children:["Kritisch (<",h.data.thresholds.criticalDays," Tage)"]}),n.jsx("p",{className:"text-2xl font-bold text-red-600",children:h.data.summary.criticalCount})]})]})})}),n.jsx(Z,{className:"cursor-pointer hover:shadow-md transition-shadow",children:n.jsx(Se,{to:"/contracts/cockpit?filter=warning",className:"block",children:n.jsxs("div",{className:"flex items-center",children:[n.jsx("div",{className:"p-3 rounded-lg bg-yellow-100",children:n.jsx(Li,{className:"w-6 h-6 text-yellow-500"})}),n.jsxs("div",{className:"ml-4",children:[n.jsxs("p",{className:"text-sm text-gray-500",children:["Warnung (<",h.data.thresholds.warningDays," Tage)"]}),n.jsx("p",{className:"text-2xl font-bold text-yellow-600",children:h.data.summary.warningCount})]})]})})}),n.jsx(Z,{className:"cursor-pointer hover:shadow-md transition-shadow",children:n.jsx(Se,{to:"/contracts/cockpit?filter=ok",className:"block",children:n.jsxs("div",{className:"flex items-center",children:[n.jsx("div",{className:"p-3 rounded-lg bg-green-100",children:n.jsx(hs,{className:"w-6 h-6 text-green-500"})}),n.jsxs("div",{className:"ml-4",children:[n.jsxs("p",{className:"text-sm text-gray-500",children:["OK (<",h.data.thresholds.okDays," Tage)"]}),n.jsx("p",{className:"text-2xl font-bold text-green-600",children:h.data.summary.okCount})]})]})})}),n.jsx(Z,{className:"cursor-pointer hover:shadow-md transition-shadow",children:n.jsx(Se,{to:"/contracts/cockpit",className:"block",children:n.jsxs("div",{className:"flex items-center",children:[n.jsx("div",{className:"p-3 rounded-lg bg-gray-100",children:n.jsx(vt,{className:"w-6 h-6 text-gray-500"})}),n.jsxs("div",{className:"ml-4",children:[n.jsx("p",{className:"text-sm text-gray-500",children:"Handlungsbedarf"}),n.jsx("p",{className:"text-2xl font-bold text-gray-600",children:h.data.summary.totalContracts})]})]})})})]})]}),n.jsxs("div",{className:"mb-6",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[n.jsx(Ii,{className:"w-5 h-5 text-orange-600"}),n.jsx("h2",{className:"text-lg font-semibold",children:"Aufgaben"})]}),n.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",children:F({label:"Offene Aufgaben",value:D,icon:Ii,color:"bg-orange-500",link:"/tasks"})})]})]}),s&&n.jsx(_1,{isOpen:r,onClose:()=>a(!1)})]})}function _1({isOpen:e,onClose:t}){const{user:s}=st(),r=Ut(),a=pe(),[i,l]=w.useState("own"),[o,c]=w.useState(null),[u,d]=w.useState(""),[m,p]=w.useState(""),[h,f]=w.useState(!1),[g,b]=w.useState(""),{data:y}=ge({queryKey:["contracts",s==null?void 0:s.customerId],queryFn:()=>$e.getAll({customerId:s==null?void 0:s.customerId}),enabled:e}),v=w.useMemo(()=>{if(!(y!=null&&y.data))return{own:[],represented:{}};const S=[],L={};for(const T of y.data)if(T.customerId===(s==null?void 0:s.customerId))S.push(T);else{if(!L[T.customerId]){const _=T.customer?T.customer.companyName||`${T.customer.firstName} ${T.customer.lastName}`:`Kunde ${T.customerId}`;L[T.customerId]={name:_,contracts:[]}}L[T.customerId].contracts.push(T)}return{own:S,represented:L}},[y==null?void 0:y.data,s==null?void 0:s.customerId]),x=Object.keys(v.represented).length>0,N=w.useMemo(()=>{var S;return i==="own"?v.own:((S=v.represented[i])==null?void 0:S.contracts)||[]},[i,v]),k=w.useMemo(()=>{if(!g)return N;const S=g.toLowerCase();return N.filter(L=>L.contractNumber.toLowerCase().includes(S)||(L.providerName||"").toLowerCase().includes(S)||(L.tariffName||"").toLowerCase().includes(S))},[N,g]),D=async()=>{if(!(!o||!u.trim())){f(!0);try{await Xe.createSupportTicket(o,{title:u.trim(),description:m.trim()||void 0}),a.invalidateQueries({queryKey:["task-stats"]}),a.invalidateQueries({queryKey:["all-tasks"]}),t(),d(""),p(""),c(null),l("own"),r(`/contracts/${o}`)}catch(S){console.error("Fehler beim Erstellen der Support-Anfrage:",S),alert("Fehler beim Erstellen der Support-Anfrage. Bitte versuchen Sie es erneut.")}finally{f(!1)}}},F=()=>{d(""),p(""),c(null),l("own"),b(""),t()};return n.jsx(dt,{isOpen:e,onClose:F,title:"Neue Support-Anfrage",children:n.jsxs("div",{className:"space-y-4",children:[x&&n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Kunde"}),n.jsxs("select",{value:i,onChange:S=>{const L=S.target.value;l(L==="own"?"own":parseInt(L)),c(null),b("")},className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500",children:[n.jsx("option",{value:"own",children:"Eigene Verträge"}),Object.entries(v.represented).map(([S,{name:L}])=>n.jsx("option",{value:S,children:L},S))]})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Vertrag *"}),n.jsx($,{placeholder:"Vertrag suchen...",value:g,onChange:S=>b(S.target.value),className:"mb-2"}),n.jsx("div",{className:"max-h-48 overflow-y-auto border rounded-lg",children:k.length>0?k.map(S=>n.jsxs("div",{onClick:()=>c(S.id),className:`p-3 cursor-pointer border-b last:border-b-0 hover:bg-gray-50 ${o===S.id?"bg-blue-50 border-blue-200":""}`,children:[n.jsx("div",{className:"font-medium",children:S.contractNumber}),n.jsxs("div",{className:"text-sm text-gray-500",children:[S.providerName||"Kein Anbieter",S.tariffName&&` - ${S.tariffName}`]})]},S.id)):n.jsx("div",{className:"p-3 text-gray-500 text-center",children:"Keine Verträge gefunden."})})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Titel *"}),n.jsx($,{value:u,onChange:S=>d(S.target.value),placeholder:"Kurze Beschreibung Ihres Anliegens"})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Beschreibung"}),n.jsx("textarea",{value:m,onChange:S=>p(S.target.value),placeholder:"Detaillierte Beschreibung (optional)",rows:4,className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),n.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[n.jsx(I,{variant:"secondary",onClick:F,children:"Abbrechen"}),n.jsx(I,{onClick:D,disabled:!o||!u.trim()||h,children:h?"Wird erstellt...":"Anfrage erstellen"})]})]})})}function he({children:e,variant:t="default",className:s="",onClick:r}){const a={default:"bg-gray-100 text-gray-800",success:"bg-green-100 text-green-800",warning:"bg-yellow-100 text-yellow-800",danger:"bg-red-100 text-red-800",info:"bg-blue-100 text-blue-800"};return n.jsx("span",{className:`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${a[t]} ${s}`,onClick:r,children:e})}function z1(){const[e,t]=w.useState(""),[s,r]=w.useState(""),[a,i]=w.useState(1),{hasPermission:l}=st(),{data:o,isLoading:c}=ge({queryKey:["customers",e,s,a],queryFn:()=>yt.getAll({search:e,type:s||void 0,page:a,limit:20})});return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsx("h1",{className:"text-2xl font-bold",children:"Kunden"}),l("customers:create")&&n.jsx(Se,{to:"/customers/new",children:n.jsxs(I,{children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neuer Kunde"]})})]}),n.jsx(Z,{className:"mb-6",children:n.jsxs("div",{className:"flex gap-2 items-center",children:[n.jsx($,{placeholder:"Suchen...",value:e,onChange:u=>t(u.target.value),className:"flex-1"}),n.jsxs("select",{value:s,onChange:u=>r(u.target.value),className:"px-3 py-2 border border-gray-300 rounded-lg w-28 flex-shrink-0",children:[n.jsx("option",{value:"",children:"Alle"}),n.jsx("option",{value:"PRIVATE",children:"Privat"}),n.jsx("option",{value:"BUSINESS",children:"Firma"})]}),n.jsx(I,{variant:"secondary",className:"flex-shrink-0",children:n.jsx(Wo,{className:"w-4 h-4"})})]})}),n.jsx(Z,{children:c?n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):o!=null&&o.data&&o.data.length>0?n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"overflow-x-auto",children:n.jsxs("table",{className:"w-full",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b",children:[n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Kundennr."}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Name"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Typ"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"E-Mail"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Verträge"}),n.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),n.jsx("tbody",{children:o.data.map(u=>{var d;return n.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[n.jsx("td",{className:"py-3 px-4 font-mono text-sm",children:u.customerNumber}),n.jsx("td",{className:"py-3 px-4",children:u.type==="BUSINESS"&&u.companyName?u.companyName:`${u.firstName} ${u.lastName}`}),n.jsx("td",{className:"py-3 px-4",children:n.jsx(he,{variant:u.type==="BUSINESS"?"info":"default",children:u.type==="BUSINESS"?"Firma":"Privat"})}),n.jsx("td",{className:"py-3 px-4",children:u.email||"-"}),n.jsx("td",{className:"py-3 px-4",children:((d=u._count)==null?void 0:d.contracts)||0}),n.jsx("td",{className:"py-3 px-4 text-right",children:n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(Se,{to:`/customers/${u.id}`,children:n.jsx(I,{variant:"ghost",size:"sm",children:n.jsx(Ee,{className:"w-4 h-4"})})}),l("customers:update")&&n.jsx(Se,{to:`/customers/${u.id}/edit`,children:n.jsx(I,{variant:"ghost",size:"sm",children:n.jsx(We,{className:"w-4 h-4"})})})]})})]},u.id)})})]})}),o.pagination&&o.pagination.totalPages>1&&n.jsxs("div",{className:"mt-4 flex items-center justify-between",children:[n.jsxs("p",{className:"text-sm text-gray-500",children:["Seite ",o.pagination.page," von ",o.pagination.totalPages," (",o.pagination.total," Einträge)"]}),n.jsxs("div",{className:"flex gap-2",children:[n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>i(u=>Math.max(1,u-1)),disabled:a===1,children:"Zurück"}),n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>i(u=>u+1),disabled:a>=o.pagination.totalPages,children:"Weiter"})]})]})]}):n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Kunden gefunden."})})]})}function U1({tabs:e,defaultTab:t}){var a,i;const[s,r]=w.useState(t||((a=e[0])==null?void 0:a.id));return n.jsxs("div",{children:[n.jsx("div",{className:"border-b border-gray-200",children:n.jsx("nav",{className:"flex -mb-px space-x-8",children:e.map(l=>n.jsx("button",{onClick:()=>r(l.id),className:`py-4 px-1 border-b-2 font-medium text-sm whitespace-nowrap ${s===l.id?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300"}`,children:l.label},l.id))})}),n.jsx("div",{className:"mt-4",children:(i=e.find(l=>l.id===s))==null?void 0:i.content})]})}const Le=w.forwardRef(({className:e="",label:t,error:s,options:r,id:a,placeholder:i="Bitte wählen...",...l},o)=>{const c=a||l.name,u=/\bw-\d+\b|\bw-\[|\bflex-/.test(e);return n.jsxs("div",{className:u?e:"w-full",children:[t&&n.jsx("label",{htmlFor:c,className:"block text-sm font-medium text-gray-700 mb-1",children:t}),n.jsxs("select",{ref:o,id:c,className:`block w-full px-3 py-2 border rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${s?"border-red-500":"border-gray-300"}`,...l,children:[n.jsx("option",{value:"",children:i}),r.map(d=>n.jsx("option",{value:d.value,children:d.label},d.value))]}),s&&n.jsx("p",{className:"mt-1 text-sm text-red-600",children:s})]})});Le.displayName="Select";function xt({onUpload:e,existingFile:t,accept:s=".pdf,.jpg,.jpeg,.png",label:r="Dokument hochladen",disabled:a=!1}){const i=w.useRef(null),[l,o]=w.useState(!1),[c,u]=w.useState(!1),d=async g=>{if(g){o(!0);try{await e(g)}catch(b){console.error("Upload failed:",b),alert("Upload fehlgeschlagen")}finally{o(!1)}}},m=g=>{var y;const b=(y=g.target.files)==null?void 0:y[0];b&&d(b)},p=g=>{var y;g.preventDefault(),u(!1);const b=(y=g.dataTransfer.files)==null?void 0:y[0];b&&d(b)},h=g=>{g.preventDefault(),u(!0)},f=()=>{u(!1)};return n.jsxs("div",{className:"space-y-2",children:[t?!a&&n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>{var g;return(g=i.current)==null?void 0:g.click()},disabled:l,children:l?"Wird hochgeladen...":"Ersetzen"}):n.jsx("div",{className:`border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors ${c?"border-blue-500 bg-blue-50":"border-gray-300 hover:border-gray-400"} ${a?"opacity-50 cursor-not-allowed":""}`,onClick:()=>{var g;return!a&&((g=i.current)==null?void 0:g.click())},onDrop:a?void 0:p,onDragOver:a?void 0:h,onDragLeave:a?void 0:f,children:l?n.jsxs("div",{className:"text-gray-500",children:[n.jsx("div",{className:"animate-spin w-6 h-6 border-2 border-blue-500 border-t-transparent rounded-full mx-auto mb-2"}),"Wird hochgeladen..."]}):n.jsxs(n.Fragment,{children:[n.jsx(D1,{className:"w-6 h-6 text-gray-400 mx-auto mb-2"}),n.jsx("p",{className:"text-sm text-gray-600",children:r}),n.jsx("p",{className:"text-xs text-gray-400 mt-1",children:"PDF, JPG oder PNG (max. 10MB)"})]})}),n.jsx("input",{ref:i,type:"file",accept:s,onChange:m,className:"hidden",disabled:a||l})]})}function oe({value:e,className:t="",size:s="sm",title:r="In Zwischenablage kopieren"}){const[a,i]=w.useState(!1),l=async c=>{c.preventDefault(),c.stopPropagation();try{await navigator.clipboard.writeText(e),i(!0),setTimeout(()=>i(!1),1500)}catch(u){console.error("Failed to copy:",u)}},o=s==="sm"?"w-3.5 h-3.5":"w-4 h-4";return n.jsx("button",{type:"button",onClick:l,className:`inline-flex items-center justify-center p-1 rounded transition-colors ${a?"text-green-600 bg-green-50":"text-gray-400 hover:text-blue-600 hover:bg-blue-50"} ${t}`,title:a?"Kopiert!":r,children:a?n.jsx(Xu,{className:o}):n.jsx(Gy,{className:o})})}function nv({values:e,separator:t=` -`,children:s,className:r=""}){const a=e.filter(i=>i!=null&&i!=="").map(String).join(t);return a?n.jsxs("div",{className:`relative group ${r}`,children:[s,n.jsx(oe,{value:a,className:"absolute top-0 right-0 opacity-60 group-hover:opacity-100",title:"Alles kopieren"})]}):n.jsx(n.Fragment,{children:s})}function $1(){var B,J;const{id:e}=_o(),t=Ut(),s=pe(),{hasPermission:r}=st(),[a]=Uo(),i=parseInt(e),l=a.get("tab")||"addresses",[o,c]=w.useState(!1),[u,d]=w.useState(!1),[m,p]=w.useState(!1),[h,f]=w.useState(!1),[g,b]=w.useState(!1),[y,v]=w.useState(!1),[x,N]=w.useState(null),[k,D]=w.useState(null),[F,S]=w.useState(null),[L,T]=w.useState(null),[_,K]=w.useState(null),{data:W,isLoading:Q}=ge({queryKey:["customer",e],queryFn:()=>yt.getById(i)}),z=Y({mutationFn:()=>yt.delete(i),onSuccess:()=>{t("/customers")}});if(Q)return n.jsx("div",{className:"text-center py-8",children:"Laden..."});if(!(W!=null&&W.data))return n.jsx("div",{className:"text-center py-8 text-red-600",children:"Kunde nicht gefunden"});const P=W.data,j=[{id:"addresses",label:"Adressen",content:n.jsx(V1,{customerId:i,addresses:P.addresses||[],canEdit:r("customers:update"),onAdd:()=>c(!0),onEdit:ee=>S(ee)})},{id:"bankcards",label:"Bankkarten",content:n.jsx(q1,{customerId:i,bankCards:P.bankCards||[],canEdit:r("customers:update"),showInactive:y,onToggleInactive:()=>v(!y),onAdd:()=>d(!0),onEdit:ee=>N(ee)})},{id:"documents",label:"Ausweise",content:n.jsx(Q1,{customerId:i,documents:P.identityDocuments||[],canEdit:r("customers:update"),showInactive:y,onToggleInactive:()=>v(!y),onAdd:()=>p(!0),onEdit:ee=>D(ee)})},{id:"meters",label:"Zähler",content:n.jsx(H1,{customerId:i,meters:P.meters||[],canEdit:r("customers:update"),showInactive:y,onToggleInactive:()=>v(!y),onAdd:()=>f(!0),onEdit:ee=>T(ee)})},{id:"stressfrei",label:"Stressfrei-Wechseln",content:n.jsx(Y1,{customerId:i,emails:P.stressfreiEmails||[],canEdit:r("customers:update"),showInactive:y,onToggleInactive:()=>v(!y),onAdd:()=>b(!0),onEdit:ee=>K(ee)})},{id:"contracts",label:"Verträge",content:n.jsx(W1,{customerId:i,contracts:P.contracts||[]})},...r("customers:update")?[{id:"portal",label:"Portal",content:n.jsx(Z1,{customerId:i,canEdit:r("customers:update")})}]:[]];return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsxs("div",{children:[n.jsx("h1",{className:"text-2xl font-bold",children:P.type==="BUSINESS"&&P.companyName?P.companyName:`${P.firstName} ${P.lastName}`}),n.jsxs("p",{className:"text-gray-500 font-mono flex items-center gap-1",children:[P.customerNumber,n.jsx(oe,{value:P.customerNumber})]})]}),n.jsxs("div",{className:"flex gap-2",children:[r("customers:update")&&n.jsx(Se,{to:`/customers/${e}/edit`,children:n.jsxs(I,{variant:"secondary",children:[n.jsx(We,{className:"w-4 h-4 mr-2"}),"Bearbeiten"]})}),r("customers:delete")&&n.jsxs(I,{variant:"danger",onClick:()=>{confirm("Kunde wirklich löschen?")&&z.mutate()},children:[n.jsx(be,{className:"w-4 h-4 mr-2"}),"Löschen"]})]})]}),n.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6",children:[n.jsx(Z,{title:"Stammdaten",className:"lg:col-span-2",children:n.jsxs("dl",{className:"grid grid-cols-2 gap-4",children:[n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Typ"}),n.jsx("dd",{children:n.jsx(he,{variant:P.type==="BUSINESS"?"info":"default",children:P.type==="BUSINESS"?"Geschäftskunde":"Privatkunde"})})]}),P.salutation&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Anrede"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[P.salutation,n.jsx(oe,{value:P.salutation})]})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vorname"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[P.firstName,n.jsx(oe,{value:P.firstName})]})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Nachname"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[P.lastName,n.jsx(oe,{value:P.lastName})]})]}),P.companyName&&n.jsxs("div",{className:"col-span-2",children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Firma"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[P.companyName,n.jsx(oe,{value:P.companyName})]})]}),P.foundingDate&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Gründungsdatum"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[new Date(P.foundingDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"}),n.jsx(oe,{value:new Date(P.foundingDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]})]}),P.birthDate&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Geburtsdatum"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[new Date(P.birthDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"}),n.jsx(oe,{value:new Date(P.birthDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]})]}),P.birthPlace&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Geburtsort"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[P.birthPlace,n.jsx(oe,{value:P.birthPlace})]})]})]})}),n.jsx(Z,{title:"Kontakt",children:n.jsxs("dl",{className:"space-y-3",children:[P.email&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"E-Mail"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[n.jsx("a",{href:`mailto:${P.email}`,className:"text-blue-600 hover:underline",children:P.email}),n.jsx(oe,{value:P.email})]})]}),P.phone&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Telefon"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[n.jsx("a",{href:`tel:${P.phone}`,className:"text-blue-600 hover:underline",children:P.phone}),n.jsx(oe,{value:P.phone})]})]}),P.mobile&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Mobil"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[n.jsx("a",{href:`tel:${P.mobile}`,className:"text-blue-600 hover:underline",children:P.mobile}),n.jsx(oe,{value:P.mobile})]})]})]})})]}),P.type==="BUSINESS"&&n.jsx(B1,{customer:P,canEdit:r("customers:update"),onUpdate:()=>s.invalidateQueries({queryKey:["customer",e]})}),n.jsx(K1,{customer:P,canEdit:r("customers:update"),onUpdate:()=>s.invalidateQueries({queryKey:["customer",e]})}),P.notes&&n.jsx(Z,{title:"Notizen",className:"mb-6",children:n.jsx("p",{className:"whitespace-pre-wrap",children:P.notes})}),n.jsx(Z,{children:n.jsx(U1,{tabs:j,defaultTab:l})}),n.jsx(rp,{isOpen:o,onClose:()=>c(!1),customerId:i}),n.jsx(rp,{isOpen:!!F,onClose:()=>S(null),customerId:i,address:F}),n.jsx(ap,{isOpen:u,onClose:()=>d(!1),customerId:i}),n.jsx(ap,{isOpen:!!x,onClose:()=>N(null),customerId:i,bankCard:x}),n.jsx(ip,{isOpen:m,onClose:()=>p(!1),customerId:i}),n.jsx(ip,{isOpen:!!k,onClose:()=>D(null),customerId:i,document:k}),n.jsx(lp,{isOpen:h,onClose:()=>f(!1),customerId:i}),n.jsx(lp,{isOpen:!!L,onClose:()=>T(null),customerId:i,meter:L}),n.jsx(cp,{isOpen:g,onClose:()=>b(!1),customerId:i,customerEmail:(B=W==null?void 0:W.data)==null?void 0:B.email}),n.jsx(cp,{isOpen:!!_,onClose:()=>K(null),customerId:i,email:_,customerEmail:(J=W==null?void 0:W.data)==null?void 0:J.email})]})}function B1({customer:e,canEdit:t,onUpdate:s}){const r=async c=>{try{await Ye.uploadBusinessRegistration(e.id,c),s()}catch(u){console.error("Upload fehlgeschlagen:",u),alert("Upload fehlgeschlagen")}},a=async()=>{if(confirm("Gewerbeanmeldung wirklich löschen?"))try{await Ye.deleteBusinessRegistration(e.id),s()}catch(c){console.error("Löschen fehlgeschlagen:",c),alert("Löschen fehlgeschlagen")}},i=async c=>{try{await Ye.uploadCommercialRegister(e.id,c),s()}catch(u){console.error("Upload fehlgeschlagen:",u),alert("Upload fehlgeschlagen")}},l=async()=>{if(confirm("Handelsregisterauszug wirklich löschen?"))try{await Ye.deleteCommercialRegister(e.id),s()}catch(c){console.error("Löschen fehlgeschlagen:",c),alert("Löschen fehlgeschlagen")}};return!(e.taxNumber||e.commercialRegisterNumber||e.businessRegistrationPath||e.commercialRegisterPath)&&!t?null:n.jsxs(Z,{title:"Geschäftsdaten",className:"mb-6",children:[n.jsxs("dl",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.taxNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Steuernummer"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[e.taxNumber,n.jsx(oe,{value:e.taxNumber})]})]}),e.commercialRegisterNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Handelsregisternummer"}),n.jsxs("dd",{className:"flex items-center gap-1",children:[e.commercialRegisterNumber,n.jsx(oe,{value:e.commercialRegisterNumber})]})]})]}),n.jsxs("div",{className:"mt-4 pt-4 border-t grid grid-cols-1 md:grid-cols-2 gap-6",children:[n.jsxs("div",{children:[n.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-2",children:"Gewerbeanmeldung"}),e.businessRegistrationPath?n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsxs("a",{href:`/api${e.businessRegistrationPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${e.businessRegistrationPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),t&&n.jsxs(n.Fragment,{children:[n.jsx(xt,{onUpload:r,existingFile:e.businessRegistrationPath,accept:".pdf",label:"Ersetzen"}),n.jsxs("button",{onClick:a,className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]})]}):t?n.jsx(xt,{onUpload:r,accept:".pdf",label:"PDF hochladen"}):n.jsx("p",{className:"text-sm text-gray-400",children:"Nicht vorhanden"})]}),n.jsxs("div",{children:[n.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-2",children:"Handelsregisterauszug"}),e.commercialRegisterPath?n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsxs("a",{href:`/api${e.commercialRegisterPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${e.commercialRegisterPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),t&&n.jsxs(n.Fragment,{children:[n.jsx(xt,{onUpload:i,existingFile:e.commercialRegisterPath,accept:".pdf",label:"Ersetzen"}),n.jsxs("button",{onClick:l,className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]})]}):t?n.jsx(xt,{onUpload:i,accept:".pdf",label:"PDF hochladen"}):n.jsx("p",{className:"text-sm text-gray-400",children:"Nicht vorhanden"})]})]})]})}function K1({customer:e,canEdit:t,onUpdate:s}){const r=async i=>{try{await Ye.uploadPrivacyPolicy(e.id,i),s()}catch(l){console.error("Upload fehlgeschlagen:",l),alert("Upload fehlgeschlagen")}},a=async()=>{if(confirm("Datenschutzerklärung wirklich löschen?"))try{await Ye.deletePrivacyPolicy(e.id),s()}catch(i){console.error("Löschen fehlgeschlagen:",i),alert("Löschen fehlgeschlagen")}};return!e.privacyPolicyPath&&!t?null:n.jsx(Z,{title:"Dokumente",className:"mb-6",children:n.jsxs("div",{children:[n.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-2",children:"Datenschutzerklärung"}),e.privacyPolicyPath?n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsxs("a",{href:`/api${e.privacyPolicyPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${e.privacyPolicyPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),t&&n.jsxs(n.Fragment,{children:[n.jsx(xt,{onUpload:r,existingFile:e.privacyPolicyPath,accept:".pdf",label:"Ersetzen"}),n.jsxs("button",{onClick:a,className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]})]}):t?n.jsx(xt,{onUpload:r,accept:".pdf",label:"PDF hochladen"}):n.jsx("p",{className:"text-sm text-gray-400",children:"Nicht vorhanden"})]})})}function V1({customerId:e,addresses:t,canEdit:s,onAdd:r,onEdit:a}){const i=pe(),l=Y({mutationFn:Ju.delete,onSuccess:()=>i.invalidateQueries({queryKey:["customer",e.toString()]})});return n.jsxs("div",{children:[s&&n.jsx("div",{className:"mb-4",children:n.jsxs(I,{size:"sm",onClick:r,children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Adresse hinzufügen"]})}),t.length>0?n.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:t.map(o=>n.jsxs("div",{className:"border rounded-lg p-4",children:[n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[n.jsx(b1,{className:"w-4 h-4 text-gray-400"}),n.jsx(he,{variant:o.type==="BILLING"?"info":"default",children:o.type==="BILLING"?"Rechnung":"Liefer-/Meldeadresse"}),o.isDefault&&n.jsx(he,{variant:"success",children:"Standard"})]}),s&&n.jsxs("div",{className:"flex gap-1",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>a(o),title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Adresse wirklich löschen?")&&l.mutate(o.id)},title:"Löschen",children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]}),n.jsxs(nv,{values:[`${o.street} ${o.houseNumber}`,`${o.postalCode} ${o.city}`,o.country],children:[n.jsxs("p",{children:[o.street," ",o.houseNumber]}),n.jsxs("p",{children:[o.postalCode," ",o.city]}),n.jsx("p",{className:"text-gray-500",children:o.country})]})]},o.id))}):n.jsx("p",{className:"text-gray-500",children:"Keine Adressen vorhanden."})]})}function q1({customerId:e,bankCards:t,canEdit:s,showInactive:r,onToggleInactive:a,onAdd:i,onEdit:l}){const o=pe(),c=Y({mutationFn:({id:h,data:f})=>po.update(h,f),onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),u=Y({mutationFn:po.delete,onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),d=async(h,f)=>{try{await Ye.uploadBankCardDocument(h,f),o.invalidateQueries({queryKey:["customer",e.toString()]})}catch(g){console.error("Upload fehlgeschlagen:",g),alert("Upload fehlgeschlagen")}},m=async h=>{if(confirm("Dokument wirklich löschen?"))try{await Ye.deleteBankCardDocument(h),o.invalidateQueries({queryKey:["customer",e.toString()]})}catch(f){console.error("Löschen fehlgeschlagen:",f),alert("Löschen fehlgeschlagen")}},p=r?t:t.filter(h=>h.isActive);return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[s&&n.jsxs(I,{size:"sm",onClick:i,children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Bankkarte hinzufügen"]}),n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:r,onChange:a,className:"rounded"}),"Inaktive anzeigen"]})]}),p.length>0?n.jsx("div",{className:"space-y-4",children:p.map(h=>n.jsxs("div",{className:`border rounded-lg p-4 ${h.isActive?"":"opacity-50 bg-gray-50"}`,children:[n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[n.jsx(p1,{className:"w-4 h-4 text-gray-400"}),!h.isActive&&n.jsx(he,{variant:"danger",children:"Inaktiv"}),h.expiryDate&&new Date(h.expiryDate)l(h),title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),h.isActive?n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Bankkarte deaktivieren?")&&c.mutate({id:h.id,data:{isActive:!1}})},title:"Deaktivieren",children:n.jsx(Pt,{className:"w-4 h-4"})}):n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Bankkarte wieder aktivieren?")&&c.mutate({id:h.id,data:{isActive:!0}})},title:"Aktivieren",children:n.jsx(Ee,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Bankkarte wirklich löschen?")&&u.mutate(h.id)},title:"Löschen",children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]}),n.jsxs("p",{className:"font-medium flex items-center gap-1",children:[h.accountHolder,n.jsx(oe,{value:h.accountHolder})]}),n.jsxs("p",{className:"font-mono flex items-center gap-1",children:[h.iban,n.jsx(oe,{value:h.iban})]}),h.bic&&n.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:["BIC: ",h.bic,n.jsx(oe,{value:h.bic})]}),h.bankName&&n.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:[h.bankName,n.jsx(oe,{value:h.bankName})]}),h.expiryDate&&n.jsxs("p",{className:"text-sm text-gray-500",children:["Gültig bis: ",new Date(h.expiryDate).toLocaleDateString("de-DE")]}),n.jsx("div",{className:"mt-3 pt-3 border-t",children:h.documentPath?n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsxs("a",{href:`/api${h.documentPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${h.documentPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),s&&n.jsxs(n.Fragment,{children:[n.jsx(xt,{onUpload:f=>d(h.id,f),existingFile:h.documentPath,accept:".pdf",label:"Ersetzen",disabled:!h.isActive}),n.jsxs("button",{onClick:()=>m(h.id),className:"text-red-600 hover:underline text-sm flex items-center gap-1",title:"Dokument löschen",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]})]}):s&&h.isActive&&n.jsx(xt,{onUpload:f=>d(h.id,f),accept:".pdf",label:"PDF hochladen"})})]},h.id))}):n.jsx("p",{className:"text-gray-500",children:"Keine Bankkarten vorhanden."})]})}function Q1({customerId:e,documents:t,canEdit:s,showInactive:r,onToggleInactive:a,onAdd:i,onEdit:l}){const o=pe(),c=Y({mutationFn:({id:f,data:g})=>go.update(f,g),onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),u=Y({mutationFn:go.delete,onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),d=async(f,g)=>{try{await Ye.uploadIdentityDocument(f,g),o.invalidateQueries({queryKey:["customer",e.toString()]})}catch(b){console.error("Upload fehlgeschlagen:",b),alert("Upload fehlgeschlagen")}},m=async f=>{if(confirm("Dokument wirklich löschen?"))try{await Ye.deleteIdentityDocument(f),o.invalidateQueries({queryKey:["customer",e.toString()]})}catch(g){console.error("Löschen fehlgeschlagen:",g),alert("Löschen fehlgeschlagen")}},p=r?t:t.filter(f=>f.isActive),h={ID_CARD:"Personalausweis",PASSPORT:"Reisepass",DRIVERS_LICENSE:"Führerschein",OTHER:"Sonstiges"};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[s&&n.jsxs(I,{size:"sm",onClick:i,children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Ausweis hinzufügen"]}),n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:r,onChange:a,className:"rounded"}),"Inaktive anzeigen"]})]}),p.length>0?n.jsx("div",{className:"space-y-4",children:p.map(f=>n.jsxs("div",{className:`border rounded-lg p-4 ${f.isActive?"":"opacity-50 bg-gray-50"}`,children:[n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[n.jsx(vt,{className:"w-4 h-4 text-gray-400"}),n.jsx(he,{children:h[f.type]}),!f.isActive&&n.jsx(he,{variant:"danger",children:"Inaktiv"}),f.expiryDate&&new Date(f.expiryDate)l(f),title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),f.isActive?n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Ausweis deaktivieren?")&&c.mutate({id:f.id,data:{isActive:!1}})},title:"Deaktivieren",children:n.jsx(Pt,{className:"w-4 h-4"})}):n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Ausweis wieder aktivieren?")&&c.mutate({id:f.id,data:{isActive:!0}})},title:"Aktivieren",children:n.jsx(Ee,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Ausweis wirklich löschen?")&&u.mutate(f.id)},title:"Löschen",children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]}),n.jsxs("p",{className:"font-mono flex items-center gap-1",children:[f.documentNumber,n.jsx(oe,{value:f.documentNumber})]}),f.issuingAuthority&&n.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:["Ausgestellt von: ",f.issuingAuthority,n.jsx(oe,{value:f.issuingAuthority})]}),f.expiryDate&&n.jsxs("p",{className:"text-sm text-gray-500",children:["Gültig bis: ",new Date(f.expiryDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})]}),f.type==="DRIVERS_LICENSE"&&f.licenseClasses&&n.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:["Klassen: ",f.licenseClasses,n.jsx(oe,{value:f.licenseClasses})]}),f.type==="DRIVERS_LICENSE"&&f.licenseIssueDate&&n.jsxs("p",{className:"text-sm text-gray-500",children:["Klasse B seit: ",new Date(f.licenseIssueDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})]}),n.jsx("div",{className:"mt-3 pt-3 border-t",children:f.documentPath?n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsxs("a",{href:`/api${f.documentPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${f.documentPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),s&&n.jsxs(n.Fragment,{children:[n.jsx(xt,{onUpload:g=>d(f.id,g),existingFile:f.documentPath,accept:".pdf",label:"Ersetzen",disabled:!f.isActive}),n.jsxs("button",{onClick:()=>m(f.id),className:"text-red-600 hover:underline text-sm flex items-center gap-1",title:"Dokument löschen",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]})]}):s&&f.isActive&&n.jsx(xt,{onUpload:g=>d(f.id,g),accept:".pdf",label:"PDF hochladen"})})]},f.id))}):n.jsx("p",{className:"text-gray-500",children:"Keine Ausweise vorhanden."})]})}function H1({customerId:e,meters:t,canEdit:s,showInactive:r,onToggleInactive:a,onAdd:i,onEdit:l}){const[o,c]=w.useState(null),[u,d]=w.useState(null),[m,p]=w.useState(null),h=pe(),f=Y({mutationFn:({id:x,data:N})=>zs.update(x,N),onSuccess:()=>h.invalidateQueries({queryKey:["customer",e.toString()]})}),g=Y({mutationFn:zs.delete,onSuccess:()=>h.invalidateQueries({queryKey:["customer",e.toString()]})}),b=Y({mutationFn:({meterId:x,readingId:N})=>zs.deleteReading(x,N),onSuccess:()=>h.invalidateQueries({queryKey:["customer",e.toString()]})}),y=r?t:t.filter(x=>x.isActive),v=x=>x?[...x].sort((N,k)=>new Date(k.readingDate).getTime()-new Date(N.readingDate).getTime()):[];return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[s&&n.jsxs(I,{size:"sm",onClick:i,children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Zähler hinzufügen"]}),n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:r,onChange:a,className:"rounded"}),"Inaktive anzeigen"]})]}),y.length>0?n.jsx("div",{className:"space-y-4",children:y.map(x=>{const N=v(x.readings),k=u===x.id;return n.jsxs("div",{className:`border rounded-lg p-4 ${x.isActive?"":"opacity-50 bg-gray-50"}`,children:[n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[n.jsx(Xy,{className:"w-4 h-4 text-gray-400"}),n.jsx(he,{variant:x.type==="ELECTRICITY"?"warning":"info",children:x.type==="ELECTRICITY"?"Strom":"Gas"}),!x.isActive&&n.jsx(he,{variant:"danger",children:"Inaktiv"})]}),s&&n.jsxs("div",{className:"flex gap-1",children:[x.isActive&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>c(x.id),title:"Zählerstand hinzufügen",children:n.jsx(Oe,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>l(x),title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),x.isActive?n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Zähler deaktivieren?")&&f.mutate({id:x.id,data:{isActive:!1}})},title:"Deaktivieren",children:n.jsx(Pt,{className:"w-4 h-4"})}):n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Zähler wieder aktivieren?")&&f.mutate({id:x.id,data:{isActive:!0}})},title:"Aktivieren",children:n.jsx(Ee,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Zähler wirklich löschen? Alle Zählerstände werden ebenfalls gelöscht.")&&g.mutate(x.id)},title:"Löschen",children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]}),n.jsxs("p",{className:"font-mono text-lg flex items-center gap-1",children:[x.meterNumber,n.jsx(oe,{value:x.meterNumber})]}),x.location&&n.jsxs("p",{className:"text-sm text-gray-500 flex items-center gap-1",children:["Standort: ",x.location,n.jsx(oe,{value:x.location})]}),N.length>0&&n.jsxs("div",{className:"mt-3 pt-3 border-t",children:[n.jsxs("div",{className:"flex items-center justify-between mb-2",children:[n.jsx("p",{className:"text-sm font-medium",children:"Zählerstände:"}),N.length>3&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>d(k?null:x.id),children:k?"Weniger anzeigen":`Alle ${N.length} anzeigen`})]}),n.jsx("div",{className:"space-y-1",children:(k?N:N.slice(0,3)).map(D=>n.jsxs("div",{className:"flex justify-between items-center text-sm group",children:[n.jsxs("span",{className:"text-gray-500 flex items-center gap-1",children:[new Date(D.readingDate).toLocaleDateString("de-DE"),n.jsx(oe,{value:new Date(D.readingDate).toLocaleDateString("de-DE")})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsxs("span",{className:"font-mono flex items-center gap-1",children:[D.value.toLocaleString("de-DE")," ",D.unit,n.jsx(oe,{value:D.value.toString(),title:"Nur Wert kopieren"}),n.jsx(oe,{value:`${D.value.toLocaleString("de-DE")} ${D.unit}`,title:"Mit Einheit kopieren"})]}),s&&n.jsxs("div",{className:"opacity-0 group-hover:opacity-100 flex gap-1",children:[n.jsx("button",{onClick:()=>p({meterId:x.id,reading:D}),className:"text-gray-400 hover:text-blue-600",title:"Bearbeiten",children:n.jsx(We,{className:"w-3 h-3"})}),n.jsx("button",{onClick:()=>{confirm("Zählerstand wirklich löschen?")&&b.mutate({meterId:x.id,readingId:D.id})},className:"text-gray-400 hover:text-red-600",title:"Löschen",children:n.jsx(be,{className:"w-3 h-3"})})]})]})]},D.id))})]})]},x.id)})}):n.jsx("p",{className:"text-gray-500",children:"Keine Zähler vorhanden."}),o&&n.jsx(op,{isOpen:!0,onClose:()=>c(null),meterId:o,customerId:e}),m&&n.jsx(op,{isOpen:!0,onClose:()=>p(null),meterId:m.meterId,customerId:e,reading:m.reading})]})}function W1({customerId:e,contracts:t}){const{hasPermission:s}=st(),r=Ut(),a=pe(),i=Y({mutationFn:$e.delete,onSuccess:()=>{a.invalidateQueries({queryKey:["customer",e.toString()]}),a.invalidateQueries({queryKey:["customers"]}),a.invalidateQueries({queryKey:["contracts"]})},onError:c=>{alert((c==null?void 0:c.message)||"Fehler beim Löschen des Vertrags")}}),l={ELECTRICITY:"Strom",GAS:"Gas",DSL:"DSL",FIBER:"Glasfaser",MOBILE:"Mobilfunk",TV:"TV",CAR_INSURANCE:"KFZ-Versicherung"},o={ACTIVE:"success",PENDING:"warning",CANCELLED:"danger",EXPIRED:"danger",DRAFT:"default"};return n.jsxs("div",{children:[s("contracts:create")&&n.jsx("div",{className:"mb-4",children:n.jsx(Se,{to:`/contracts/new?customerId=${e}`,children:n.jsxs(I,{size:"sm",children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Vertrag anlegen"]})})}),t.length>0?n.jsx("div",{className:"space-y-4",children:t.map(c=>n.jsxs("div",{className:"border rounded-lg p-4 hover:bg-gray-50 transition-colors",children:[n.jsxs("div",{className:"flex items-center justify-between mb-2",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsxs("span",{className:"font-mono flex items-center gap-1",children:[c.contractNumber,n.jsx(oe,{value:c.contractNumber})]}),n.jsx(he,{children:l[c.type]}),n.jsx(he,{variant:o[c.status],children:c.status})]}),n.jsxs("div",{className:"flex gap-2",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>r(`/contracts/${c.id}`,{state:{from:"customer",customerId:e.toString()}}),title:"Ansehen",children:n.jsx(Ee,{className:"w-4 h-4"})}),s("contracts:update")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>r(`/contracts/${c.id}/edit`),title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),s("contracts:delete")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Vertrag wirklich löschen?")&&i.mutate(c.id)},title:"Löschen",children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]}),c.providerName&&n.jsxs("p",{className:"flex items-center gap-1",children:[c.providerName,c.tariffName&&` - ${c.tariffName}`,n.jsx(oe,{value:c.providerName+(c.tariffName?` - ${c.tariffName}`:"")})]}),c.startDate&&n.jsxs("p",{className:"text-sm text-gray-500",children:["Beginn: ",new Date(c.startDate).toLocaleDateString("de-DE"),c.endDate&&` | Ende: ${new Date(c.endDate).toLocaleDateString("de-DE")}`]})]},c.id))}):n.jsx("p",{className:"text-gray-500",children:"Keine Verträge vorhanden."})]})}function G1({customerId:e}){const[t,s]=w.useState(!1),[r,a]=w.useState(null),[i,l]=w.useState(!1),o=async()=>{var c;if(t){s(!1);return}l(!0);try{const u=await yt.getPortalPassword(e);a(((c=u.data)==null?void 0:c.password)||null),s(!0)}catch(u){console.error("Fehler beim Laden des Passworts:",u),alert("Fehler beim Laden des Passworts")}finally{l(!1)}};return n.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[n.jsx("p",{className:"text-xs text-green-600",children:"Passwort ist gesetzt"}),n.jsx("button",{type:"button",onClick:o,className:"text-xs text-blue-600 hover:underline flex items-center gap-1",disabled:i,children:i?"Laden...":t?n.jsxs(n.Fragment,{children:[n.jsx(Pt,{className:"w-3 h-3"}),"Verbergen"]}):n.jsxs(n.Fragment,{children:[n.jsx(Ee,{className:"w-3 h-3"}),"Anzeigen"]})}),t&&r&&n.jsxs("span",{className:"text-xs font-mono bg-gray-100 px-2 py-1 rounded flex items-center gap-1",children:[r,n.jsx(oe,{value:r})]}),t&&!r&&n.jsx("span",{className:"text-xs text-gray-500",children:"(Passwort nicht verfügbar)"})]})}function Z1({customerId:e,canEdit:t}){const s=pe(),[r,a]=w.useState(!1),[i,l]=w.useState(""),[o,c]=w.useState(""),[u,d]=w.useState([]),[m,p]=w.useState(!1),{data:h,isLoading:f}=ge({queryKey:["customer-portal",e],queryFn:()=>yt.getPortalSettings(e)}),{data:g,isLoading:b}=ge({queryKey:["customer-representatives",e],queryFn:()=>yt.getRepresentatives(e)}),y=Y({mutationFn:S=>yt.updatePortalSettings(e,S),onSuccess:()=>{s.invalidateQueries({queryKey:["customer-portal",e]})}}),v=Y({mutationFn:S=>yt.setPortalPassword(e,S),onSuccess:()=>{l(""),s.invalidateQueries({queryKey:["customer-portal",e]}),alert("Passwort wurde gesetzt")},onError:S=>{alert(S.message)}}),x=Y({mutationFn:S=>yt.addRepresentative(e,S),onSuccess:()=>{s.invalidateQueries({queryKey:["customer-representatives",e]}),c(""),d([])},onError:S=>{alert(S.message)}}),N=Y({mutationFn:S=>yt.removeRepresentative(e,S),onSuccess:()=>{s.invalidateQueries({queryKey:["customer-representatives",e]})}}),k=async()=>{if(!(o.length<2)){p(!0);try{const S=await yt.searchForRepresentative(e,o);d(S.data||[])}catch(S){console.error("Suche fehlgeschlagen:",S)}finally{p(!1)}}};if(f||b)return n.jsx("div",{className:"text-center py-4 text-gray-500",children:"Laden..."});const D=h==null?void 0:h.data,F=(g==null?void 0:g.data)||[];return n.jsxs("div",{className:"space-y-6",children:[n.jsxs("div",{className:"border rounded-lg p-4",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[n.jsx(uh,{className:"w-5 h-5 text-gray-400"}),n.jsx("h3",{className:"font-medium",children:"Portal-Zugang"})]}),n.jsxs("div",{className:"space-y-4",children:[n.jsxs("label",{className:"flex items-center gap-3",children:[n.jsx("input",{type:"checkbox",checked:(D==null?void 0:D.portalEnabled)||!1,onChange:S=>y.mutate({portalEnabled:S.target.checked}),className:"rounded w-5 h-5",disabled:!t}),n.jsx("span",{children:"Portal aktiviert"}),(D==null?void 0:D.portalEnabled)&&n.jsx(he,{variant:"success",children:"Aktiv"})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Portal E-Mail"}),n.jsx("div",{className:"flex gap-2",children:n.jsx($,{value:(D==null?void 0:D.portalEmail)||"",onChange:S=>y.mutate({portalEmail:S.target.value||null}),placeholder:"portal@example.com",disabled:!t||!(D!=null&&D.portalEnabled),className:"flex-1"})}),n.jsx("p",{className:"text-xs text-gray-500 mt-1",children:"Diese E-Mail wird für den Login ins Kundenportal verwendet."})]}),(D==null?void 0:D.portalEnabled)&&n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:D!=null&&D.hasPassword?"Neues Passwort setzen":"Passwort setzen"}),n.jsxs("div",{className:"flex gap-2",children:[n.jsxs("div",{className:"relative flex-1",children:[n.jsx($,{type:r?"text":"password",value:i,onChange:S=>l(S.target.value),placeholder:"Mindestens 6 Zeichen",disabled:!t}),n.jsx("button",{type:"button",onClick:()=>a(!r),className:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400",children:r?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]}),n.jsx(I,{onClick:()=>v.mutate(i),disabled:!t||i.length<6||v.isPending,children:v.isPending?"Speichern...":"Setzen"})]}),(D==null?void 0:D.hasPassword)&&n.jsx(G1,{customerId:e})]}),(D==null?void 0:D.portalLastLogin)&&n.jsxs("p",{className:"text-sm text-gray-500",children:["Letzte Anmeldung: ",new Date(D.portalLastLogin).toLocaleString("de-DE")]})]})]}),n.jsxs("div",{className:"border rounded-lg p-4",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[n.jsx(A1,{className:"w-5 h-5 text-gray-400"}),n.jsx("h3",{className:"font-medium",children:"Vertreter (können Verträge einsehen)"})]}),n.jsx("p",{className:"text-sm text-gray-500 mb-4",children:"Hier können Sie anderen Kunden erlauben, die Verträge dieses Kunden einzusehen. Beispiel: Der Sohn kann die Verträge seiner Mutter einsehen."}),t&&n.jsxs("div",{className:"mb-4",children:[n.jsxs("div",{className:"flex gap-2",children:[n.jsx($,{value:o,onChange:S=>c(S.target.value),placeholder:"Kunden suchen (Name, Kundennummer)...",onKeyDown:S=>S.key==="Enter"&&k(),className:"flex-1"}),n.jsx(I,{variant:"secondary",onClick:k,disabled:o.length<2||m,children:n.jsx(Wo,{className:"w-4 h-4"})})]}),n.jsx("p",{className:"text-xs text-gray-500 mt-1",children:"Nur Kunden mit aktiviertem Portal können als Vertreter hinzugefügt werden."}),u.length>0&&n.jsx("div",{className:"mt-2 border rounded-lg divide-y",children:u.map(S=>n.jsxs("div",{className:"flex items-center justify-between p-3 hover:bg-gray-50",children:[n.jsxs("div",{children:[n.jsx("p",{className:"font-medium",children:S.companyName||`${S.firstName} ${S.lastName}`}),n.jsx("p",{className:"text-sm text-gray-500",children:S.customerNumber})]}),n.jsxs(I,{size:"sm",onClick:()=>x.mutate(S.id),disabled:x.isPending,children:[n.jsx(Oe,{className:"w-4 h-4 mr-1"}),"Hinzufügen"]})]},S.id))})]}),F.length>0?n.jsx("div",{className:"space-y-2",children:F.map(S=>{var L,T,_,K;return n.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 rounded-lg",children:[n.jsxs("div",{children:[n.jsx("p",{className:"font-medium",children:((L=S.representative)==null?void 0:L.companyName)||`${(T=S.representative)==null?void 0:T.firstName} ${(_=S.representative)==null?void 0:_.lastName}`}),n.jsx("p",{className:"text-sm text-gray-500",children:(K=S.representative)==null?void 0:K.customerNumber})]}),t&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Vertreter wirklich entfernen?")&&N.mutate(S.representativeId)},children:n.jsx(wa,{className:"w-4 h-4 text-red-500"})})]},S.id)})}):n.jsx("p",{className:"text-gray-500 text-sm",children:"Keine Vertreter konfiguriert."})]})]})}function rp({isOpen:e,onClose:t,customerId:s,address:r}){const a=pe(),i=!!r,l=()=>({type:(r==null?void 0:r.type)||"DELIVERY_RESIDENCE",street:(r==null?void 0:r.street)||"",houseNumber:(r==null?void 0:r.houseNumber)||"",postalCode:(r==null?void 0:r.postalCode)||"",city:(r==null?void 0:r.city)||"",country:(r==null?void 0:r.country)||"Deutschland",isDefault:(r==null?void 0:r.isDefault)||!1}),[o,c]=w.useState(l),u=Y({mutationFn:h=>Ju.create(s,h),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",s.toString()]}),t(),c({type:"DELIVERY_RESIDENCE",street:"",houseNumber:"",postalCode:"",city:"",country:"Deutschland",isDefault:!1})}}),d=Y({mutationFn:h=>Ju.update(r.id,h),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",s.toString()]}),t()}}),m=h=>{h.preventDefault(),i?d.mutate(o):u.mutate(o)},p=u.isPending||d.isPending;return i&&o.street!==r.street&&c(l()),n.jsx(dt,{isOpen:e,onClose:t,title:i?"Adresse bearbeiten":"Adresse hinzufügen",children:n.jsxs("form",{onSubmit:m,className:"space-y-4",children:[n.jsx(Le,{label:"Adresstyp",value:o.type,onChange:h=>c({...o,type:h.target.value}),options:[{value:"DELIVERY_RESIDENCE",label:"Liefer-/Meldeadresse"},{value:"BILLING",label:"Rechnungsadresse"}]}),n.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[n.jsx("div",{className:"col-span-2",children:n.jsx($,{label:"Straße",value:o.street,onChange:h=>c({...o,street:h.target.value}),required:!0})}),n.jsx($,{label:"Hausnr.",value:o.houseNumber,onChange:h=>c({...o,houseNumber:h.target.value}),required:!0})]}),n.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[n.jsx($,{label:"PLZ",value:o.postalCode,onChange:h=>c({...o,postalCode:h.target.value}),required:!0}),n.jsx("div",{className:"col-span-2",children:n.jsx($,{label:"Ort",value:o.city,onChange:h=>c({...o,city:h.target.value}),required:!0})})]}),n.jsx($,{label:"Land",value:o.country,onChange:h=>c({...o,country:h.target.value})}),n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:o.isDefault,onChange:h=>c({...o,isDefault:h.target.checked}),className:"rounded"}),"Als Standard setzen"]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:p,children:p?"Speichern...":"Speichern"})]})]})})}function ap({isOpen:e,onClose:t,customerId:s,bankCard:r}){const a=pe(),i=!!r,l=()=>({accountHolder:(r==null?void 0:r.accountHolder)||"",iban:(r==null?void 0:r.iban)||"",bic:(r==null?void 0:r.bic)||"",bankName:(r==null?void 0:r.bankName)||"",expiryDate:r!=null&&r.expiryDate?new Date(r.expiryDate).toISOString().split("T")[0]:"",isActive:(r==null?void 0:r.isActive)??!0}),[o,c]=w.useState(l);w.useState(()=>{c(l())});const u=Y({mutationFn:h=>po.create(s,h),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",s.toString()]}),t(),c({accountHolder:"",iban:"",bic:"",bankName:"",expiryDate:"",isActive:!0})}}),d=Y({mutationFn:h=>po.update(r.id,h),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",s.toString()]}),t()}}),m=h=>{h.preventDefault();const f={...o,expiryDate:o.expiryDate?new Date(o.expiryDate):void 0};i?d.mutate(f):u.mutate(f)},p=u.isPending||d.isPending;return i&&o.iban!==r.iban&&c(l()),n.jsx(dt,{isOpen:e,onClose:t,title:i?"Bankkarte bearbeiten":"Bankkarte hinzufügen",children:n.jsxs("form",{onSubmit:m,className:"space-y-4",children:[n.jsx($,{label:"Kontoinhaber",value:o.accountHolder,onChange:h=>c({...o,accountHolder:h.target.value}),required:!0}),n.jsx($,{label:"IBAN",value:o.iban,onChange:h=>c({...o,iban:h.target.value}),required:!0}),n.jsx($,{label:"BIC",value:o.bic,onChange:h=>c({...o,bic:h.target.value})}),n.jsx($,{label:"Bank",value:o.bankName,onChange:h=>c({...o,bankName:h.target.value})}),n.jsx($,{label:"Ablaufdatum",type:"date",value:o.expiryDate,onChange:h=>c({...o,expiryDate:h.target.value}),onClear:()=>c({...o,expiryDate:""})}),i&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:o.isActive,onChange:h=>c({...o,isActive:h.target.checked}),className:"rounded"}),"Aktiv"]}),!i&&n.jsx("p",{className:"text-sm text-gray-500 bg-gray-50 p-3 rounded",children:"Dokument-Upload ist nach dem Speichern in der Übersicht möglich."}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:p,children:p?"Speichern...":"Speichern"})]})]})})}function ip({isOpen:e,onClose:t,customerId:s,document:r}){const a=pe(),i=!!r,l=()=>({type:(r==null?void 0:r.type)||"ID_CARD",documentNumber:(r==null?void 0:r.documentNumber)||"",issuingAuthority:(r==null?void 0:r.issuingAuthority)||"",issueDate:r!=null&&r.issueDate?new Date(r.issueDate).toISOString().split("T")[0]:"",expiryDate:r!=null&&r.expiryDate?new Date(r.expiryDate).toISOString().split("T")[0]:"",isActive:(r==null?void 0:r.isActive)??!0,licenseClasses:(r==null?void 0:r.licenseClasses)||"",licenseIssueDate:r!=null&&r.licenseIssueDate?new Date(r.licenseIssueDate).toISOString().split("T")[0]:""}),[o,c]=w.useState(l),u=Y({mutationFn:h=>go.create(s,h),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",s.toString()]}),t(),c({type:"ID_CARD",documentNumber:"",issuingAuthority:"",issueDate:"",expiryDate:"",isActive:!0,licenseClasses:"",licenseIssueDate:""})}}),d=Y({mutationFn:h=>go.update(r.id,h),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",s.toString()]}),t()}}),m=h=>{h.preventDefault();const f={...o,issueDate:o.issueDate?new Date(o.issueDate):void 0,expiryDate:o.expiryDate?new Date(o.expiryDate):void 0};o.type==="DRIVERS_LICENSE"?(f.licenseClasses=o.licenseClasses||void 0,f.licenseIssueDate=o.licenseIssueDate?new Date(o.licenseIssueDate):void 0):(delete f.licenseClasses,delete f.licenseIssueDate),i?d.mutate(f):u.mutate(f)},p=u.isPending||d.isPending;return i&&o.documentNumber!==r.documentNumber&&c(l()),n.jsx(dt,{isOpen:e,onClose:t,title:i?"Ausweis bearbeiten":"Ausweis hinzufügen",children:n.jsxs("form",{onSubmit:m,className:"space-y-4",children:[n.jsx(Le,{label:"Ausweistyp",value:o.type,onChange:h=>c({...o,type:h.target.value}),options:[{value:"ID_CARD",label:"Personalausweis"},{value:"PASSPORT",label:"Reisepass"},{value:"DRIVERS_LICENSE",label:"Führerschein"},{value:"OTHER",label:"Sonstiges"}]}),n.jsx($,{label:"Ausweisnummer",value:o.documentNumber,onChange:h=>c({...o,documentNumber:h.target.value}),required:!0}),n.jsx($,{label:"Ausstellende Behörde",value:o.issuingAuthority,onChange:h=>c({...o,issuingAuthority:h.target.value})}),n.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[n.jsx($,{label:"Ausstellungsdatum",type:"date",value:o.issueDate,onChange:h=>c({...o,issueDate:h.target.value}),onClear:()=>c({...o,issueDate:""})}),n.jsx($,{label:"Ablaufdatum",type:"date",value:o.expiryDate,onChange:h=>c({...o,expiryDate:h.target.value}),onClear:()=>c({...o,expiryDate:""})})]}),o.type==="DRIVERS_LICENSE"&&n.jsxs(n.Fragment,{children:[n.jsx($,{label:"Führerscheinklassen",value:o.licenseClasses,onChange:h=>c({...o,licenseClasses:h.target.value}),placeholder:"z.B. B, BE, AM, L"}),n.jsx($,{label:"Erwerb Klasse B (Pkw)",type:"date",value:o.licenseIssueDate,onChange:h=>c({...o,licenseIssueDate:h.target.value}),onClear:()=>c({...o,licenseIssueDate:""})})]}),i&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:o.isActive,onChange:h=>c({...o,isActive:h.target.checked}),className:"rounded"}),"Aktiv"]}),!i&&n.jsx("p",{className:"text-sm text-gray-500 bg-gray-50 p-3 rounded",children:"Dokument-Upload ist nach dem Speichern in der Übersicht möglich."}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:p,children:p?"Speichern...":"Speichern"})]})]})})}function lp({isOpen:e,onClose:t,customerId:s,meter:r}){const a=pe(),i=!!r,l=()=>({meterNumber:(r==null?void 0:r.meterNumber)||"",type:(r==null?void 0:r.type)||"ELECTRICITY",location:(r==null?void 0:r.location)||"",isActive:(r==null?void 0:r.isActive)??!0}),[o,c]=w.useState(l),u=Y({mutationFn:h=>zs.create(s,h),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",s.toString()]}),t(),c({meterNumber:"",type:"ELECTRICITY",location:"",isActive:!0})}}),d=Y({mutationFn:h=>zs.update(r.id,h),onSuccess:()=>{a.invalidateQueries({queryKey:["customer",s.toString()]}),t()}}),m=h=>{h.preventDefault(),i?d.mutate(o):u.mutate(o)},p=u.isPending||d.isPending;return i&&o.meterNumber!==r.meterNumber&&c(l()),n.jsx(dt,{isOpen:e,onClose:t,title:i?"Zähler bearbeiten":"Zähler hinzufügen",children:n.jsxs("form",{onSubmit:m,className:"space-y-4",children:[n.jsx($,{label:"Zählernummer",value:o.meterNumber,onChange:h=>c({...o,meterNumber:h.target.value}),required:!0}),n.jsx(Le,{label:"Zählertyp",value:o.type,onChange:h=>c({...o,type:h.target.value}),options:[{value:"ELECTRICITY",label:"Strom"},{value:"GAS",label:"Gas"}]}),n.jsx($,{label:"Standort",value:o.location,onChange:h=>c({...o,location:h.target.value}),placeholder:"z.B. Keller, Wohnung"}),i&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:o.isActive,onChange:h=>c({...o,isActive:h.target.checked}),className:"rounded"}),"Aktiv"]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:p,children:p?"Speichern...":"Speichern"})]})]})})}function op({isOpen:e,onClose:t,meterId:s,customerId:r,reading:a}){const i=pe(),l=!!a,o=()=>{var f;return{readingDate:a!=null&&a.readingDate?new Date(a.readingDate).toISOString().split("T")[0]:new Date().toISOString().split("T")[0],value:((f=a==null?void 0:a.value)==null?void 0:f.toString())||"",unit:(a==null?void 0:a.unit)||"kWh",notes:(a==null?void 0:a.notes)||""}},[c,u]=w.useState(o),d=Y({mutationFn:f=>zs.addReading(s,f),onSuccess:()=>{i.invalidateQueries({queryKey:["customer",r.toString()]}),t()}}),m=Y({mutationFn:f=>zs.updateReading(s,a.id,f),onSuccess:()=>{i.invalidateQueries({queryKey:["customer",r.toString()]}),t()}}),p=f=>{f.preventDefault();const g={readingDate:new Date(c.readingDate),value:parseFloat(c.value),unit:c.unit,notes:c.notes||void 0};l?m.mutate(g):d.mutate(g)},h=d.isPending||m.isPending;return l&&c.value!==a.value.toString()&&u(o()),n.jsx(dt,{isOpen:e,onClose:t,title:l?"Zählerstand bearbeiten":"Zählerstand erfassen",children:n.jsxs("form",{onSubmit:p,className:"space-y-4",children:[n.jsx($,{label:"Ablesedatum",type:"date",value:c.readingDate,onChange:f=>u({...c,readingDate:f.target.value}),required:!0}),n.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[n.jsx("div",{className:"col-span-2",children:n.jsx($,{label:"Zählerstand",type:"number",step:"0.01",value:c.value,onChange:f=>u({...c,value:f.target.value}),required:!0})}),n.jsx(Le,{label:"Einheit",value:c.unit,onChange:f=>u({...c,unit:f.target.value}),options:[{value:"kWh",label:"kWh"},{value:"m³",label:"m³"}]})]}),n.jsx($,{label:"Notizen",value:c.notes,onChange:f=>u({...c,notes:f.target.value}),placeholder:"Optionale Notizen..."}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:h,children:h?"Speichern...":"Speichern"})]})]})})}const Tc="@stressfrei-wechseln.de";function Y1({customerId:e,emails:t,canEdit:s,showInactive:r,onToggleInactive:a,onAdd:i,onEdit:l}){const o=pe(),c=Y({mutationFn:({id:m,data:p})=>xo.update(m,p),onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),u=Y({mutationFn:xo.delete,onSuccess:()=>o.invalidateQueries({queryKey:["customer",e.toString()]})}),d=r?t:t.filter(m=>m.isActive);return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[s&&n.jsxs(I,{size:"sm",onClick:i,children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Adresse hinzufügen"]}),n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:r,onChange:a,className:"rounded"}),"Inaktive anzeigen"]})]}),n.jsxs("p",{className:"text-sm text-gray-500 mb-4 bg-blue-50 border border-blue-200 rounded-lg p-3",children:[n.jsx("strong",{children:"Hinweis:"})," Hier werden E-Mail-Weiterleitungsadressen verwaltet, die für die Registrierung bei Anbietern verwendet werden. E-Mails an diese Adressen werden sowohl an den Kunden als auch an Sie weitergeleitet."]}),d.length>0?n.jsx("div",{className:"space-y-3",children:d.map(m=>n.jsx("div",{className:`border rounded-lg p-4 ${m.isActive?"":"opacity-50 bg-gray-50"}`,children:n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("div",{className:"flex-1",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(ev,{className:"w-4 h-4 text-gray-400"}),n.jsx("span",{className:"font-mono text-sm",children:m.email}),n.jsx(oe,{value:m.email}),!m.isActive&&n.jsx(he,{variant:"danger",children:"Inaktiv"})]}),m.notes&&n.jsxs("div",{className:"flex items-center gap-2 mt-1 text-sm text-gray-500",children:[n.jsx(vt,{className:"w-4 h-4 flex-shrink-0"}),n.jsx("span",{children:m.notes})]})]}),s&&n.jsxs("div",{className:"flex gap-1",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>l(m),title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),m.isActive?n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Adresse deaktivieren?")&&c.mutate({id:m.id,data:{isActive:!1}})},title:"Deaktivieren",children:n.jsx(Pt,{className:"w-4 h-4"})}):n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Adresse wieder aktivieren?")&&c.mutate({id:m.id,data:{isActive:!0}})},title:"Aktivieren",children:n.jsx(Ee,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Adresse wirklich löschen?")&&u.mutate(m.id)},title:"Löschen",children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]})},m.id))}):n.jsx("p",{className:"text-gray-500",children:"Keine Stressfrei-Wechseln Adressen vorhanden."})]})}function cp({isOpen:e,onClose:t,customerId:s,email:r,customerEmail:a}){const[i,l]=w.useState(""),[o,c]=w.useState(""),[u,d]=w.useState(!1),[m,p]=w.useState(null),h=pe(),f=!!r,{data:g}=ge({queryKey:["email-provider-configs"],queryFn:()=>xn.getConfigs(),enabled:e&&!f}),b=((g==null?void 0:g.data)||[]).some(D=>D.isActive&&D.isDefault),y=D=>{if(!D)return"";const F=D.indexOf("@");return F>0?D.substring(0,F):D};w.useEffect(()=>{e&&(r?(l(y(r.email)),c(r.notes||"")):(l(""),c(""),d(!1)),p(null))},[e,r]);const v=Y({mutationFn:async D=>{var F,S,L;if(D.provision&&a){const T=await xn.provisionEmail(i,a);if(!((F=T.data)!=null&&F.success))throw new Error(((S=T.data)==null?void 0:S.error)||((L=T.data)==null?void 0:L.message)||"Provisionierung fehlgeschlagen")}return xo.create(s,{email:D.email,notes:D.notes})},onSuccess:()=>{h.invalidateQueries({queryKey:["customer",s.toString()]}),l(""),c(""),d(!1),t()},onError:D=>{p(D instanceof Error?D.message:"Fehler bei der Provisionierung")}}),x=Y({mutationFn:D=>xo.update(r.id,D),onSuccess:()=>{h.invalidateQueries({queryKey:["customer",s.toString()]}),t()}}),N=D=>{D.preventDefault(),p(null);const F=i+Tc;f?x.mutate({email:F,notes:o||void 0}):v.mutate({email:F,notes:o||void 0,provision:u})},k=v.isPending||x.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:f?"Adresse bearbeiten":"Adresse hinzufügen",children:n.jsxs("form",{onSubmit:N,className:"space-y-4",children:[n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"E-Mail-Adresse"}),n.jsxs("div",{className:"flex",children:[n.jsx("input",{type:"text",value:i,onChange:D=>l(D.target.value.toLowerCase().replace(/[^a-z0-9._-]/g,"")),placeholder:"kunde-freenet",required:!0,className:"block w-full px-3 py-2 border border-gray-300 rounded-l-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),n.jsx("span",{className:"inline-flex items-center px-3 py-2 border border-l-0 border-gray-300 bg-gray-100 text-gray-600 rounded-r-lg text-sm",children:Tc})]}),n.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:["Vollständige Adresse: ",n.jsxs("span",{className:"font-mono",children:[i||"...",Tc]})]})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Notizen (optional)"}),n.jsx("textarea",{value:o,onChange:D=>c(D.target.value),rows:3,className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"z.B. für Freenet-Konten, für Klarmobil..."})]}),!f&&b&&a&&n.jsx("div",{className:"bg-blue-50 p-3 rounded-lg",children:n.jsxs("label",{className:"flex items-start gap-2 cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:u,onChange:D=>d(D.target.checked),className:"mt-1 rounded border-gray-300"}),n.jsxs("div",{children:[n.jsx("span",{className:"text-sm font-medium text-gray-700",children:"Beim E-Mail-Provider anlegen"}),n.jsxs("p",{className:"text-xs text-gray-500 mt-1",children:["Die E-Mail-Weiterleitung wird automatisch auf dem konfigurierten Server erstellt. Weiterleitungsziel: ",a]})]})]})}),m&&n.jsx("div",{className:"bg-red-50 p-3 rounded-lg text-red-700 text-sm",children:m}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:k||!i,children:k?"Speichern...":"Speichern"})]})]})})}var Zi=e=>e.type==="checkbox",nr=e=>e instanceof Date,Vt=e=>e==null;const rv=e=>typeof e=="object";var at=e=>!Vt(e)&&!Array.isArray(e)&&rv(e)&&!nr(e),J1=e=>at(e)&&e.target?Zi(e.target)?e.target.checked:e.target.value:e,X1=e=>e.substring(0,e.search(/\.\d+(\.|$)/))||e,eS=(e,t)=>e.has(X1(t)),tS=e=>{const t=e.constructor&&e.constructor.prototype;return at(t)&&t.hasOwnProperty("isPrototypeOf")},fh=typeof window<"u"&&typeof window.HTMLElement<"u"&&typeof document<"u";function lt(e){if(e instanceof Date)return new Date(e);const t=typeof FileList<"u"&&e instanceof FileList;if(fh&&(e instanceof Blob||t))return e;const s=Array.isArray(e);if(!s&&!(at(e)&&tS(e)))return e;const r=s?[]:Object.create(Object.getPrototypeOf(e));for(const a in e)Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=lt(e[a]));return r}var Go=e=>/^\w*$/.test(e),Ke=e=>e===void 0,ph=e=>Array.isArray(e)?e.filter(Boolean):[],gh=e=>ph(e.replace(/["|']|\]/g,"").split(/\.|\[/)),le=(e,t,s)=>{if(!t||!at(e))return s;const r=(Go(t)?[t]:gh(t)).reduce((a,i)=>Vt(a)?a:a[i],e);return Ke(r)||r===e?Ke(e[t])?s:e[t]:r},Fs=e=>typeof e=="boolean",ws=e=>typeof e=="function",Ue=(e,t,s)=>{let r=-1;const a=Go(t)?[t]:gh(t),i=a.length,l=i-1;for(;++r{const a={defaultValues:t._defaultValues};for(const i in e)Object.defineProperty(a,i,{get:()=>{const l=i;return t._proxyFormState[l]!==Ss.all&&(t._proxyFormState[l]=!r||Ss.all),e[l]}});return a};const rS=typeof window<"u"?Nt.useLayoutEffect:Nt.useEffect;var ts=e=>typeof e=="string",aS=(e,t,s,r,a)=>ts(e)?(r&&t.watch.add(e),le(s,e,a)):Array.isArray(e)?e.map(i=>(r&&t.watch.add(i),le(s,i))):(r&&(t.watchAll=!0),s),ed=e=>Vt(e)||!rv(e);function jn(e,t,s=new WeakSet){if(ed(e)||ed(t))return Object.is(e,t);if(nr(e)&&nr(t))return Object.is(e.getTime(),t.getTime());const r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;if(s.has(e)||s.has(t))return!0;s.add(e),s.add(t);for(const i of r){const l=e[i];if(!a.includes(i))return!1;if(i!=="ref"){const o=t[i];if(nr(l)&&nr(o)||at(l)&&at(o)||Array.isArray(l)&&Array.isArray(o)?!jn(l,o,s):!Object.is(l,o))return!1}}return!0}const iS=Nt.createContext(null);iS.displayName="HookFormContext";var lS=(e,t,s,r,a)=>t?{...s[e],types:{...s[e]&&s[e].types?s[e].types:{},[r]:a||!0}}:{},li=e=>Array.isArray(e)?e:[e],dp=()=>{let e=[];return{get observers(){return e},next:a=>{for(const i of e)i.next&&i.next(a)},subscribe:a=>(e.push(a),{unsubscribe:()=>{e=e.filter(i=>i!==a)}}),unsubscribe:()=>{e=[]}}};function av(e,t){const s={};for(const r in e)if(e.hasOwnProperty(r)){const a=e[r],i=t[r];if(a&&at(a)&&i){const l=av(a,i);at(l)&&(s[r]=l)}else e[r]&&(s[r]=i)}return s}var Mt=e=>at(e)&&!Object.keys(e).length,xh=e=>e.type==="file",yo=e=>{if(!fh)return!1;const t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},iv=e=>e.type==="select-multiple",yh=e=>e.type==="radio",oS=e=>yh(e)||Zi(e),Fc=e=>yo(e)&&e.isConnected;function cS(e,t){const s=t.slice(0,-1).length;let r=0;for(;r{for(const t in e)if(ws(e[t]))return!0;return!1};function lv(e){return Array.isArray(e)||at(e)&&!dS(e)}function td(e,t={}){for(const s in e){const r=e[s];lv(r)?(t[s]=Array.isArray(r)?[]:{},td(r,t[s])):Ke(r)||(t[s]=!0)}return t}function Ir(e,t,s){s||(s=td(t));for(const r in e){const a=e[r];if(lv(a))Ke(t)||ed(s[r])?s[r]=td(a,Array.isArray(a)?[]:{}):Ir(a,Vt(t)?{}:t[r],s[r]);else{const i=t[r];s[r]=!jn(a,i)}}return s}const hp={value:!1,isValid:!1},mp={value:!0,isValid:!0};var ov=e=>{if(Array.isArray(e)){if(e.length>1){const t=e.filter(s=>s&&s.checked&&!s.disabled).map(s=>s.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!Ke(e[0].attributes.value)?Ke(e[0].value)||e[0].value===""?mp:{value:e[0].value,isValid:!0}:mp:hp}return hp},cv=(e,{valueAsNumber:t,valueAsDate:s,setValueAs:r})=>Ke(e)?e:t?e===""?NaN:e&&+e:s&&ts(e)?new Date(e):r?r(e):e;const fp={isValid:!1,value:null};var uv=e=>Array.isArray(e)?e.reduce((t,s)=>s&&s.checked&&!s.disabled?{isValid:!0,value:s.value}:t,fp):fp;function pp(e){const t=e.ref;return xh(t)?t.files:yh(t)?uv(e.refs).value:iv(t)?[...t.selectedOptions].map(({value:s})=>s):Zi(t)?ov(e.refs).value:cv(Ke(t.value)?e.ref.value:t.value,e)}var hS=(e,t,s,r)=>{const a={};for(const i of e){const l=le(t,i);l&&Ue(a,i,l._f)}return{criteriaMode:s,names:[...e],fields:a,shouldUseNativeValidation:r}},vo=e=>e instanceof RegExp,Va=e=>Ke(e)?e:vo(e)?e.source:at(e)?vo(e.value)?e.value.source:e.value:e,gp=e=>({isOnSubmit:!e||e===Ss.onSubmit,isOnBlur:e===Ss.onBlur,isOnChange:e===Ss.onChange,isOnAll:e===Ss.all,isOnTouch:e===Ss.onTouched});const xp="AsyncFunction";var mS=e=>!!e&&!!e.validate&&!!(ws(e.validate)&&e.validate.constructor.name===xp||at(e.validate)&&Object.values(e.validate).find(t=>t.constructor.name===xp)),fS=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate),yp=(e,t,s)=>!s&&(t.watchAll||t.watch.has(e)||[...t.watch].some(r=>e.startsWith(r)&&/^\.\w+/.test(e.slice(r.length))));const oi=(e,t,s,r)=>{for(const a of s||Object.keys(e)){const i=le(e,a);if(i){const{_f:l,...o}=i;if(l){if(l.refs&&l.refs[0]&&t(l.refs[0],a)&&!r)return!0;if(l.ref&&t(l.ref,l.name)&&!r)return!0;if(oi(o,t))break}else if(at(o)&&oi(o,t))break}}};function vp(e,t,s){const r=le(e,s);if(r||Go(s))return{error:r,name:s};const a=s.split(".");for(;a.length;){const i=a.join("."),l=le(t,i),o=le(e,i);if(l&&!Array.isArray(l)&&s!==i)return{name:s};if(o&&o.type)return{name:i,error:o};if(o&&o.root&&o.root.type)return{name:`${i}.root`,error:o.root};a.pop()}return{name:s}}var pS=(e,t,s,r)=>{s(e);const{name:a,...i}=e;return Mt(i)||Object.keys(i).length>=Object.keys(t).length||Object.keys(i).find(l=>t[l]===(!r||Ss.all))},gS=(e,t,s)=>!e||!t||e===t||li(e).some(r=>r&&(s?r===t:r.startsWith(t)||t.startsWith(r))),xS=(e,t,s,r,a)=>a.isOnAll?!1:!s&&a.isOnTouch?!(t||e):(s?r.isOnBlur:a.isOnBlur)?!e:(s?r.isOnChange:a.isOnChange)?e:!0,yS=(e,t)=>!ph(le(e,t)).length&&nt(e,t),vS=(e,t,s)=>{const r=li(le(e,s));return Ue(r,"root",t[s]),Ue(e,s,r),e};function jp(e,t,s="validate"){if(ts(e)||Array.isArray(e)&&e.every(ts)||Fs(e)&&!e)return{type:s,message:ts(e)?e:"",ref:t}}var Fr=e=>at(e)&&!vo(e)?e:{value:e,message:""},bp=async(e,t,s,r,a,i)=>{const{ref:l,refs:o,required:c,maxLength:u,minLength:d,min:m,max:p,pattern:h,validate:f,name:g,valueAsNumber:b,mount:y}=e._f,v=le(s,g);if(!y||t.has(g))return{};const x=o?o[0]:l,N=K=>{a&&x.reportValidity&&(x.setCustomValidity(Fs(K)?"":K||""),x.reportValidity())},k={},D=yh(l),F=Zi(l),S=D||F,L=(b||xh(l))&&Ke(l.value)&&Ke(v)||yo(l)&&l.value===""||v===""||Array.isArray(v)&&!v.length,T=lS.bind(null,g,r,k),_=(K,W,Q,z=Ks.maxLength,P=Ks.minLength)=>{const j=K?W:Q;k[g]={type:K?z:P,message:j,ref:l,...T(K?z:P,j)}};if(i?!Array.isArray(v)||!v.length:c&&(!S&&(L||Vt(v))||Fs(v)&&!v||F&&!ov(o).isValid||D&&!uv(o).isValid)){const{value:K,message:W}=ts(c)?{value:!!c,message:c}:Fr(c);if(K&&(k[g]={type:Ks.required,message:W,ref:x,...T(Ks.required,W)},!r))return N(W),k}if(!L&&(!Vt(m)||!Vt(p))){let K,W;const Q=Fr(p),z=Fr(m);if(!Vt(v)&&!isNaN(v)){const P=l.valueAsNumber||v&&+v;Vt(Q.value)||(K=P>Q.value),Vt(z.value)||(W=Pnew Date(new Date().toDateString()+" "+ee),B=l.type=="time",J=l.type=="week";ts(Q.value)&&v&&(K=B?j(v)>j(Q.value):J?v>Q.value:P>new Date(Q.value)),ts(z.value)&&v&&(W=B?j(v)+K.value,z=!Vt(W.value)&&v.length<+W.value;if((Q||z)&&(_(Q,K.message,W.message),!r))return N(k[g].message),k}if(h&&!L&&ts(v)){const{value:K,message:W}=Fr(h);if(vo(K)&&!v.match(K)&&(k[g]={type:Ks.pattern,message:W,ref:l,...T(Ks.pattern,W)},!r))return N(W),k}if(f){if(ws(f)){const K=await f(v,s),W=jp(K,x);if(W&&(k[g]={...W,...T(Ks.validate,W.message)},!r))return N(W.message),k}else if(at(f)){let K={};for(const W in f){if(!Mt(K)&&!r)break;const Q=jp(await f[W](v,s),x,W);Q&&(K={...Q,...T(W,Q.message)},N(Q.message),r&&(k[g]=K))}if(!Mt(K)&&(k[g]={ref:x,...K},!r))return k}}return N(!0),k};const jS={mode:Ss.onSubmit,reValidateMode:Ss.onChange,shouldFocusError:!0};function bS(e={}){let t={...jS,...e},s={submitCount:0,isDirty:!1,isReady:!1,isLoading:ws(t.defaultValues),isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},validatingFields:{},errors:t.errors||{},disabled:t.disabled||!1},r={},a=at(t.defaultValues)||at(t.values)?lt(t.defaultValues||t.values)||{}:{},i=t.shouldUnregister?{}:lt(a),l={action:!1,mount:!1,watch:!1,keepIsValid:!1},o={mount:new Set,disabled:new Set,unMount:new Set,array:new Set,watch:new Set},c,u=0;const d={isDirty:!1,dirtyFields:!1,validatingFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},m={...d};let p={...m};const h={array:dp(),state:dp()},f=t.criteriaMode===Ss.all,g=E=>M=>{clearTimeout(u),u=setTimeout(E,M)},b=async E=>{if(!l.keepIsValid&&!t.disabled&&(m.isValid||p.isValid||E)){let M;t.resolver?(M=Mt((await S()).errors),y()):M=await T(r,!0),M!==s.isValid&&h.state.next({isValid:M})}},y=(E,M)=>{!t.disabled&&(m.isValidating||m.validatingFields||p.isValidating||p.validatingFields)&&((E||Array.from(o.mount)).forEach(U=>{U&&(M?Ue(s.validatingFields,U,M):nt(s.validatingFields,U))}),h.state.next({validatingFields:s.validatingFields,isValidating:!Mt(s.validatingFields)}))},v=(E,M=[],U,se,G=!0,H=!0)=>{if(se&&U&&!t.disabled){if(l.action=!0,H&&Array.isArray(le(r,E))){const ce=U(le(r,E),se.argA,se.argB);G&&Ue(r,E,ce)}if(H&&Array.isArray(le(s.errors,E))){const ce=U(le(s.errors,E),se.argA,se.argB);G&&Ue(s.errors,E,ce),yS(s.errors,E)}if((m.touchedFields||p.touchedFields)&&H&&Array.isArray(le(s.touchedFields,E))){const ce=U(le(s.touchedFields,E),se.argA,se.argB);G&&Ue(s.touchedFields,E,ce)}(m.dirtyFields||p.dirtyFields)&&(s.dirtyFields=Ir(a,i)),h.state.next({name:E,isDirty:K(E,M),dirtyFields:s.dirtyFields,errors:s.errors,isValid:s.isValid})}else Ue(i,E,M)},x=(E,M)=>{Ue(s.errors,E,M),h.state.next({errors:s.errors})},N=E=>{s.errors=E,h.state.next({errors:s.errors,isValid:!1})},k=(E,M,U,se)=>{const G=le(r,E);if(G){const H=le(i,E,Ke(U)?le(a,E):U);Ke(H)||se&&se.defaultChecked||M?Ue(i,E,M?H:pp(G._f)):z(E,H),l.mount&&!l.action&&b()}},D=(E,M,U,se,G)=>{let H=!1,ce=!1;const we={name:E};if(!t.disabled){if(!U||se){(m.isDirty||p.isDirty)&&(ce=s.isDirty,s.isDirty=we.isDirty=K(),H=ce!==we.isDirty);const Ae=jn(le(a,E),M);ce=!!le(s.dirtyFields,E),Ae?nt(s.dirtyFields,E):Ue(s.dirtyFields,E,!0),we.dirtyFields=s.dirtyFields,H=H||(m.dirtyFields||p.dirtyFields)&&ce!==!Ae}if(U){const Ae=le(s.touchedFields,E);Ae||(Ue(s.touchedFields,E,U),we.touchedFields=s.touchedFields,H=H||(m.touchedFields||p.touchedFields)&&Ae!==U)}H&&G&&h.state.next(we)}return H?we:{}},F=(E,M,U,se)=>{const G=le(s.errors,E),H=(m.isValid||p.isValid)&&Fs(M)&&s.isValid!==M;if(t.delayError&&U?(c=g(()=>x(E,U)),c(t.delayError)):(clearTimeout(u),c=null,U?Ue(s.errors,E,U):nt(s.errors,E)),(U?!jn(G,U):G)||!Mt(se)||H){const ce={...se,...H&&Fs(M)?{isValid:M}:{},errors:s.errors,name:E};s={...s,...ce},h.state.next(ce)}},S=async E=>(y(E,!0),await t.resolver(i,t.context,hS(E||o.mount,r,t.criteriaMode,t.shouldUseNativeValidation))),L=async E=>{const{errors:M}=await S(E);if(y(E),E)for(const U of E){const se=le(M,U);se?Ue(s.errors,U,se):nt(s.errors,U)}else s.errors=M;return M},T=async(E,M,U={valid:!0})=>{for(const se in E){const G=E[se];if(G){const{_f:H,...ce}=G;if(H){const we=o.array.has(H.name),Ae=G._f&&mS(G._f);Ae&&m.validatingFields&&y([H.name],!0);const ft=await bp(G,o.disabled,i,f,t.shouldUseNativeValidation&&!M,we);if(Ae&&m.validatingFields&&y([H.name]),ft[H.name]&&(U.valid=!1,M||e.shouldUseNativeValidation))break;!M&&(le(ft,H.name)?we?vS(s.errors,ft,H.name):Ue(s.errors,H.name,ft[H.name]):nt(s.errors,H.name))}!Mt(ce)&&await T(ce,M,U)}}return U.valid},_=()=>{for(const E of o.unMount){const M=le(r,E);M&&(M._f.refs?M._f.refs.every(U=>!Fc(U)):!Fc(M._f.ref))&&Tt(E)}o.unMount=new Set},K=(E,M)=>!t.disabled&&(E&&M&&Ue(i,E,M),!jn(me(),a)),W=(E,M,U)=>aS(E,o,{...l.mount?i:Ke(M)?a:ts(E)?{[E]:M}:M},U,M),Q=E=>ph(le(l.mount?i:a,E,t.shouldUnregister?le(a,E,[]):[])),z=(E,M,U={})=>{const se=le(r,E);let G=M;if(se){const H=se._f;H&&(!H.disabled&&Ue(i,E,cv(M,H)),G=yo(H.ref)&&Vt(M)?"":M,iv(H.ref)?[...H.ref.options].forEach(ce=>ce.selected=G.includes(ce.value)):H.refs?Zi(H.ref)?H.refs.forEach(ce=>{(!ce.defaultChecked||!ce.disabled)&&(Array.isArray(G)?ce.checked=!!G.find(we=>we===ce.value):ce.checked=G===ce.value||!!G)}):H.refs.forEach(ce=>ce.checked=ce.value===G):xh(H.ref)?H.ref.value="":(H.ref.value=G,H.ref.type||h.state.next({name:E,values:lt(i)})))}(U.shouldDirty||U.shouldTouch)&&D(E,G,U.shouldTouch,U.shouldDirty,!0),U.shouldValidate&&ee(E)},P=(E,M,U)=>{for(const se in M){if(!M.hasOwnProperty(se))return;const G=M[se],H=E+"."+se,ce=le(r,H);(o.array.has(E)||at(G)||ce&&!ce._f)&&!nr(G)?P(H,G,U):z(H,G,U)}},j=(E,M,U={})=>{const se=le(r,E),G=o.array.has(E),H=lt(M);Ue(i,E,H),G?(h.array.next({name:E,values:lt(i)}),(m.isDirty||m.dirtyFields||p.isDirty||p.dirtyFields)&&U.shouldDirty&&h.state.next({name:E,dirtyFields:Ir(a,i),isDirty:K(E,H)})):se&&!se._f&&!Vt(H)?P(E,H,U):z(E,H,U),yp(E,o)?h.state.next({...s,name:E,values:lt(i)}):h.state.next({name:l.mount?E:void 0,values:lt(i)})},B=async E=>{l.mount=!0;const M=E.target;let U=M.name,se=!0;const G=le(r,U),H=Ae=>{se=Number.isNaN(Ae)||nr(Ae)&&isNaN(Ae.getTime())||jn(Ae,le(i,U,Ae))},ce=gp(t.mode),we=gp(t.reValidateMode);if(G){let Ae,ft;const Bs=M.type?pp(G._f):J1(E),gs=E.type===up.BLUR||E.type===up.FOCUS_OUT,Ji=!fS(G._f)&&!t.resolver&&!le(s.errors,U)&&!G._f.deps||xS(gs,le(s.touchedFields,U),s.isSubmitted,we,ce),Pr=yp(U,o,gs);Ue(i,U,Bs),gs?(!M||!M.readOnly)&&(G._f.onBlur&&G._f.onBlur(E),c&&c(0)):G._f.onChange&&G._f.onChange(E);const Ar=D(U,Bs,gs),Xi=!Mt(Ar)||Pr;if(!gs&&h.state.next({name:U,type:E.type,values:lt(i)}),Ji)return(m.isValid||p.isValid)&&(t.mode==="onBlur"?gs&&b():gs||b()),Xi&&h.state.next({name:U,...Pr?{}:Ar});if(!gs&&Pr&&h.state.next({...s}),t.resolver){const{errors:Fa}=await S([U]);if(y([U]),H(Bs),se){const el=vp(s.errors,r,U),Ia=vp(Fa,r,el.name||U);Ae=Ia.error,U=Ia.name,ft=Mt(Fa)}}else y([U],!0),Ae=(await bp(G,o.disabled,i,f,t.shouldUseNativeValidation))[U],y([U]),H(Bs),se&&(Ae?ft=!1:(m.isValid||p.isValid)&&(ft=await T(r,!0)));se&&(G._f.deps&&(!Array.isArray(G._f.deps)||G._f.deps.length>0)&&ee(G._f.deps),F(U,ft,Ae,Ar))}},J=(E,M)=>{if(le(s.errors,M)&&E.focus)return E.focus(),1},ee=async(E,M={})=>{let U,se;const G=li(E);if(t.resolver){const H=await L(Ke(E)?E:G);U=Mt(H),se=E?!G.some(ce=>le(H,ce)):U}else E?(se=(await Promise.all(G.map(async H=>{const ce=le(r,H);return await T(ce&&ce._f?{[H]:ce}:ce)}))).every(Boolean),!(!se&&!s.isValid)&&b()):se=U=await T(r);return h.state.next({...!ts(E)||(m.isValid||p.isValid)&&U!==s.isValid?{}:{name:E},...t.resolver||!E?{isValid:U}:{},errors:s.errors}),M.shouldFocus&&!se&&oi(r,J,E?G:o.mount),se},me=(E,M)=>{let U={...l.mount?i:a};return M&&(U=av(M.dirtyFields?s.dirtyFields:s.touchedFields,U)),Ke(E)?U:ts(E)?le(U,E):E.map(se=>le(U,se))},ve=(E,M)=>({invalid:!!le((M||s).errors,E),isDirty:!!le((M||s).dirtyFields,E),error:le((M||s).errors,E),isValidating:!!le(s.validatingFields,E),isTouched:!!le((M||s).touchedFields,E)}),it=E=>{E&&li(E).forEach(M=>nt(s.errors,M)),h.state.next({errors:E?s.errors:{}})},V=(E,M,U)=>{const se=(le(r,E,{_f:{}})._f||{}).ref,G=le(s.errors,E)||{},{ref:H,message:ce,type:we,...Ae}=G;Ue(s.errors,E,{...Ae,...M,ref:se}),h.state.next({name:E,errors:s.errors,isValid:!1}),U&&U.shouldFocus&&se&&se.focus&&se.focus()},Ce=(E,M)=>ws(E)?h.state.subscribe({next:U=>"values"in U&&E(W(void 0,M),U)}):W(E,M,!0),Me=E=>h.state.subscribe({next:M=>{gS(E.name,M.name,E.exact)&&pS(M,E.formState||m,Yo,E.reRenderRoot)&&E.callback({values:{...i},...s,...M,defaultValues:a})}}).unsubscribe,ht=E=>(l.mount=!0,p={...p,...E.formState},Me({...E,formState:{...d,...E.formState}})),Tt=(E,M={})=>{for(const U of E?li(E):o.mount)o.mount.delete(U),o.array.delete(U),M.keepValue||(nt(r,U),nt(i,U)),!M.keepError&&nt(s.errors,U),!M.keepDirty&&nt(s.dirtyFields,U),!M.keepTouched&&nt(s.touchedFields,U),!M.keepIsValidating&&nt(s.validatingFields,U),!t.shouldUnregister&&!M.keepDefaultValue&&nt(a,U);h.state.next({values:lt(i)}),h.state.next({...s,...M.keepDirty?{isDirty:K()}:{}}),!M.keepIsValid&&b()},Jt=({disabled:E,name:M})=>{if(Fs(E)&&l.mount||E||o.disabled.has(M)){const G=o.disabled.has(M)!==!!E;E?o.disabled.add(M):o.disabled.delete(M),G&&l.mount&&!l.action&&b()}},Pe=(E,M={})=>{let U=le(r,E);const se=Fs(M.disabled)||Fs(t.disabled);return Ue(r,E,{...U||{},_f:{...U&&U._f?U._f:{ref:{name:E}},name:E,mount:!0,...M}}),o.mount.add(E),U?Jt({disabled:Fs(M.disabled)?M.disabled:t.disabled,name:E}):k(E,!0,M.value),{...se?{disabled:M.disabled||t.disabled}:{},...t.progressive?{required:!!M.required,min:Va(M.min),max:Va(M.max),minLength:Va(M.minLength),maxLength:Va(M.maxLength),pattern:Va(M.pattern)}:{},name:E,onChange:B,onBlur:B,ref:G=>{if(G){Pe(E,M),U=le(r,E);const H=Ke(G.value)&&G.querySelectorAll&&G.querySelectorAll("input,select,textarea")[0]||G,ce=oS(H),we=U._f.refs||[];if(ce?we.find(Ae=>Ae===H):H===U._f.ref)return;Ue(r,E,{_f:{...U._f,...ce?{refs:[...we.filter(Fc),H,...Array.isArray(le(a,E))?[{}]:[]],ref:{type:H.type,name:E}}:{ref:H}}}),k(E,!1,void 0,H)}else U=le(r,E,{}),U._f&&(U._f.mount=!1),(t.shouldUnregister||M.shouldUnregister)&&!(eS(o.array,E)&&l.action)&&o.unMount.add(E)}}},Xt=()=>t.shouldFocusError&&oi(r,J,o.mount),Gn=E=>{Fs(E)&&(h.state.next({disabled:E}),oi(r,(M,U)=>{const se=le(r,U);se&&(M.disabled=se._f.disabled||E,Array.isArray(se._f.refs)&&se._f.refs.forEach(G=>{G.disabled=se._f.disabled||E}))},0,!1))},Er=(E,M)=>async U=>{let se;U&&(U.preventDefault&&U.preventDefault(),U.persist&&U.persist());let G=lt(i);if(h.state.next({isSubmitting:!0}),t.resolver){const{errors:H,values:ce}=await S();y(),s.errors=H,G=lt(ce)}else await T(r);if(o.disabled.size)for(const H of o.disabled)nt(G,H);if(nt(s.errors,"root"),Mt(s.errors)){h.state.next({errors:{}});try{await E(G,U)}catch(H){se=H}}else M&&await M({...s.errors},U),Xt(),setTimeout(Xt);if(h.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:Mt(s.errors)&&!se,submitCount:s.submitCount+1,errors:s.errors}),se)throw se},hn=(E,M={})=>{le(r,E)&&(Ke(M.defaultValue)?j(E,lt(le(a,E))):(j(E,M.defaultValue),Ue(a,E,lt(M.defaultValue))),M.keepTouched||nt(s.touchedFields,E),M.keepDirty||(nt(s.dirtyFields,E),s.isDirty=M.defaultValue?K(E,lt(le(a,E))):K()),M.keepError||(nt(s.errors,E),m.isValid&&b()),h.state.next({...s}))},Dr=(E,M={})=>{const U=E?lt(E):a,se=lt(U),G=Mt(E),H=G?a:se;if(M.keepDefaultValues||(a=U),!M.keepValues){if(M.keepDirtyValues){const ce=new Set([...o.mount,...Object.keys(Ir(a,i))]);for(const we of Array.from(ce)){const Ae=le(s.dirtyFields,we),ft=le(i,we),Bs=le(H,we);Ae&&!Ke(ft)?Ue(H,we,ft):!Ae&&!Ke(Bs)&&j(we,Bs)}}else{if(fh&&Ke(E))for(const ce of o.mount){const we=le(r,ce);if(we&&we._f){const Ae=Array.isArray(we._f.refs)?we._f.refs[0]:we._f.ref;if(yo(Ae)){const ft=Ae.closest("form");if(ft){ft.reset();break}}}}if(M.keepFieldsRef)for(const ce of o.mount)j(ce,le(H,ce));else r={}}i=t.shouldUnregister?M.keepDefaultValues?lt(a):{}:lt(H),h.array.next({values:{...H}}),h.state.next({values:{...H}})}o={mount:M.keepDirtyValues?o.mount:new Set,unMount:new Set,array:new Set,disabled:new Set,watch:new Set,watchAll:!1,focus:""},l.mount=!m.isValid||!!M.keepIsValid||!!M.keepDirtyValues||!t.shouldUnregister&&!Mt(H),l.watch=!!t.shouldUnregister,l.keepIsValid=!!M.keepIsValid,l.action=!1,M.keepErrors||(s.errors={}),h.state.next({submitCount:M.keepSubmitCount?s.submitCount:0,isDirty:G?!1:M.keepDirty?s.isDirty:!!(M.keepDefaultValues&&!jn(E,a)),isSubmitted:M.keepIsSubmitted?s.isSubmitted:!1,dirtyFields:G?{}:M.keepDirtyValues?M.keepDefaultValues&&i?Ir(a,i):s.dirtyFields:M.keepDefaultValues&&E?Ir(a,E):M.keepDirty?s.dirtyFields:{},touchedFields:M.keepTouched?s.touchedFields:{},errors:M.keepErrors?s.errors:{},isSubmitSuccessful:M.keepIsSubmitSuccessful?s.isSubmitSuccessful:!1,isSubmitting:!1,defaultValues:a})},mt=(E,M)=>Dr(ws(E)?E(i):E,{...t.resetOptions,...M}),Zo=(E,M={})=>{const U=le(r,E),se=U&&U._f;if(se){const G=se.refs?se.refs[0]:se.ref;G.focus&&setTimeout(()=>{G.focus(),M.shouldSelect&&ws(G.select)&&G.select()})}},Yo=E=>{s={...s,...E}},Yi={control:{register:Pe,unregister:Tt,getFieldState:ve,handleSubmit:Er,setError:V,_subscribe:Me,_runSchema:S,_updateIsValidating:y,_focusError:Xt,_getWatch:W,_getDirty:K,_setValid:b,_setFieldArray:v,_setDisabledField:Jt,_setErrors:N,_getFieldArray:Q,_reset:Dr,_resetDefaultValues:()=>ws(t.defaultValues)&&t.defaultValues().then(E=>{mt(E,t.resetOptions),h.state.next({isLoading:!1})}),_removeUnmounted:_,_disableForm:Gn,_subjects:h,_proxyFormState:m,get _fields(){return r},get _formValues(){return i},get _state(){return l},set _state(E){l=E},get _defaultValues(){return a},get _names(){return o},set _names(E){o=E},get _formState(){return s},get _options(){return t},set _options(E){t={...t,...E}}},subscribe:ht,trigger:ee,register:Pe,handleSubmit:Er,watch:Ce,setValue:j,getValues:me,reset:mt,resetField:hn,clearErrors:it,unregister:Tt,setError:V,setFocus:Zo,getFieldState:ve};return{...Yi,formControl:Yi}}function dv(e={}){const t=Nt.useRef(void 0),s=Nt.useRef(void 0),[r,a]=Nt.useState({isDirty:!1,isValidating:!1,isLoading:ws(e.defaultValues),isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,submitCount:0,dirtyFields:{},touchedFields:{},validatingFields:{},errors:e.errors||{},disabled:e.disabled||!1,isReady:!1,defaultValues:ws(e.defaultValues)?void 0:e.defaultValues});if(!t.current)if(e.formControl)t.current={...e.formControl,formState:r},e.defaultValues&&!ws(e.defaultValues)&&e.formControl.reset(e.defaultValues,e.resetOptions);else{const{formControl:l,...o}=bS(e);t.current={...o,formState:r}}const i=t.current.control;return i._options=e,rS(()=>{const l=i._subscribe({formState:i._proxyFormState,callback:()=>a({...i._formState}),reRenderRoot:!0});return a(o=>({...o,isReady:!0})),i._formState.isReady=!0,l},[i]),Nt.useEffect(()=>i._disableForm(e.disabled),[i,e.disabled]),Nt.useEffect(()=>{e.mode&&(i._options.mode=e.mode),e.reValidateMode&&(i._options.reValidateMode=e.reValidateMode)},[i,e.mode,e.reValidateMode]),Nt.useEffect(()=>{e.errors&&(i._setErrors(e.errors),i._focusError())},[i,e.errors]),Nt.useEffect(()=>{e.shouldUnregister&&i._subjects.state.next({values:i._getWatch()})},[i,e.shouldUnregister]),Nt.useEffect(()=>{if(i._proxyFormState.isDirty){const l=i._getDirty();l!==r.isDirty&&i._subjects.state.next({isDirty:l})}},[i,r.isDirty]),Nt.useEffect(()=>{var l;e.values&&!jn(e.values,s.current)?(i._reset(e.values,{keepFieldsRef:!0,...i._options.resetOptions}),!((l=i._options.resetOptions)===null||l===void 0)&&l.keepIsValid||i._setValid(),s.current=e.values,a(o=>({...o}))):i._resetDefaultValues()},[i,e.values]),Nt.useEffect(()=>{i._state.mount||(i._setValid(),i._state.mount=!0),i._state.watch&&(i._state.watch=!1,i._subjects.state.next({...i._formState})),i._removeUnmounted()}),t.current.formState=Nt.useMemo(()=>nS(r,i),[i,r]),t.current}function Np(){var y,v;const{id:e}=_o(),t=Ut(),s=pe(),r=!!e,{register:a,handleSubmit:i,reset:l,watch:o,setValue:c,formState:{errors:u}}=dv(),d=o("type"),{data:m}=ge({queryKey:["customer",e],queryFn:()=>yt.getById(parseInt(e)),enabled:r});w.useEffect(()=>{if(m!=null&&m.data){const x={...m.data};x.birthDate&&(x.birthDate=x.birthDate.split("T")[0]),x.foundingDate&&(x.foundingDate=x.foundingDate.split("T")[0]),l(x)}},[m,l]);const p=Y({mutationFn:yt.create,onSuccess:()=>{s.invalidateQueries({queryKey:["customers"]}),t("/customers")}}),h=Y({mutationFn:x=>yt.update(parseInt(e),x),onSuccess:()=>{s.invalidateQueries({queryKey:["customers"]}),s.invalidateQueries({queryKey:["customer",e]}),t(`/customers/${e}`)}}),f=x=>{const N={type:x.type,salutation:x.salutation||void 0,firstName:x.firstName,lastName:x.lastName,companyName:x.companyName||void 0,email:x.email||void 0,phone:x.phone||void 0,mobile:x.mobile||void 0,taxNumber:x.taxNumber||void 0,commercialRegisterNumber:x.commercialRegisterNumber||void 0,notes:x.notes||void 0,birthPlace:x.birthPlace||void 0};x.birthDate&&typeof x.birthDate=="string"&&x.birthDate.trim()!==""?N.birthDate=new Date(x.birthDate).toISOString():N.birthDate=null,x.foundingDate&&typeof x.foundingDate=="string"&&x.foundingDate.trim()!==""?N.foundingDate=new Date(x.foundingDate).toISOString():N.foundingDate=null,r?h.mutate(N):p.mutate(N)},g=p.isPending||h.isPending,b=p.error||h.error;return n.jsxs("div",{children:[n.jsx("h1",{className:"text-2xl font-bold mb-6",children:r?"Kunde bearbeiten":"Neuer Kunde"}),b&&n.jsx("div",{className:"mb-4 p-4 bg-red-50 border border-red-200 text-red-700 rounded-lg",children:b instanceof Error?b.message:"Ein Fehler ist aufgetreten"}),n.jsxs("form",{onSubmit:i(f),children:[n.jsx(Z,{className:"mb-6",title:"Stammdaten",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx(Le,{label:"Kundentyp",...a("type"),options:[{value:"PRIVATE",label:"Privatkunde"},{value:"BUSINESS",label:"Geschäftskunde"}]}),n.jsx(Le,{label:"Anrede",...a("salutation"),options:[{value:"Herr",label:"Herr"},{value:"Frau",label:"Frau"},{value:"Divers",label:"Divers"}]}),n.jsx($,{label:"Vorname",...a("firstName",{required:"Vorname erforderlich"}),error:(y=u.firstName)==null?void 0:y.message}),n.jsx($,{label:"Nachname",...a("lastName",{required:"Nachname erforderlich"}),error:(v=u.lastName)==null?void 0:v.message}),d==="BUSINESS"&&n.jsxs(n.Fragment,{children:[n.jsx($,{label:"Firmenname",...a("companyName"),className:"md:col-span-2"}),n.jsx($,{label:"Gründungsdatum",type:"date",...a("foundingDate"),value:o("foundingDate")||"",onClear:()=>c("foundingDate","")})]}),d!=="BUSINESS"&&n.jsxs(n.Fragment,{children:[n.jsx($,{label:"Geburtsdatum",type:"date",...a("birthDate"),value:o("birthDate")||"",onClear:()=>c("birthDate","")}),n.jsx($,{label:"Geburtsort",...a("birthPlace")})]})]})}),n.jsx(Z,{className:"mb-6",title:"Kontaktdaten",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx($,{label:"E-Mail",type:"email",...a("email")}),n.jsx($,{label:"Telefon",...a("phone")}),n.jsx($,{label:"Mobil",...a("mobile")})]})}),d==="BUSINESS"&&n.jsxs(Z,{className:"mb-6",title:"Geschäftsdaten",children:[n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx($,{label:"Steuernummer",...a("taxNumber")}),n.jsx($,{label:"Handelsregisternummer",...a("commercialRegisterNumber"),placeholder:"z.B. HRB 12345"})]}),r&&n.jsx("p",{className:"mt-4 text-sm text-gray-500",children:"Dokumente (Gewerbeanmeldung, Handelsregisterauszug) können nach dem Speichern in der Kundendetailansicht hochgeladen werden."})]}),n.jsx(Z,{className:"mb-6",title:"Notizen",children:n.jsx("textarea",{...a("notes"),rows:4,className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"Interne Notizen..."})}),n.jsxs("div",{className:"flex justify-end gap-4",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:()=>t(-1),children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:g,children:g?"Speichern...":"Speichern"})]})]})]})}const Ic={ELECTRICITY:"Strom",GAS:"Gas",DSL:"DSL",CABLE:"Kabelinternet",FIBER:"Glasfaser",MOBILE:"Mobilfunk",TV:"TV",CAR_INSURANCE:"KFZ-Versicherung"},Mc={DRAFT:"Entwurf",PENDING:"Ausstehend",ACTIVE:"Aktiv",CANCELLED:"Gekündigt",EXPIRED:"Abgelaufen"},wp={ACTIVE:"success",PENDING:"warning",CANCELLED:"danger",EXPIRED:"danger",DRAFT:"default"};function NS(){const[e,t]=Uo(),s=Ut(),[r,a]=w.useState(e.get("search")||""),[i,l]=w.useState(e.get("type")||""),[o,c]=w.useState(e.get("status")||""),[u,d]=w.useState(parseInt(e.get("page")||"1",10)),{hasPermission:m,isCustomer:p,isCustomerPortal:h,user:f}=st(),g=pe();w.useEffect(()=>{const N=new URLSearchParams;r&&N.set("search",r),i&&N.set("type",i),o&&N.set("status",o),u>1&&N.set("page",u.toString()),t(N,{replace:!0})},[r,i,o,u,t]);const b=Y({mutationFn:$e.delete,onSuccess:()=>{g.invalidateQueries({queryKey:["contracts"]})}}),{data:y,isLoading:v}=ge({queryKey:["contracts",r,i,o,u,p?f==null?void 0:f.customerId:null],queryFn:()=>$e.getAll({search:r||void 0,type:i||void 0,status:o||void 0,page:u,limit:20,customerId:p?f==null?void 0:f.customerId:void 0})}),x=w.useMemo(()=>{if(!h||!(y!=null&&y.data))return null;const N={};for(const k of y.data){const D=k.customerId;if(!N[D]){const F=k.customer?k.customer.companyName||`${k.customer.firstName} ${k.customer.lastName}`:`Kunde ${D}`;N[D]={customerName:F,isOwn:D===(f==null?void 0:f.customerId),contracts:[]}}N[D].contracts.push(k)}return Object.values(N).sort((k,D)=>k.isOwn&&!D.isOwn?-1:!k.isOwn&&D.isOwn?1:k.customerName.localeCompare(D.customerName))},[y==null?void 0:y.data,h,f==null?void 0:f.customerId]);return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsx("h1",{className:"text-2xl font-bold",children:"Verträge"}),m("contracts:create")&&!p&&n.jsx(Se,{to:"/contracts/new",children:n.jsxs(I,{children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neuer Vertrag"]})})]}),n.jsx(Z,{className:"mb-6",children:n.jsxs("div",{className:"flex gap-4 flex-wrap",children:[n.jsx("div",{className:"flex-1 min-w-[200px]",children:n.jsx($,{placeholder:"Suchen...",value:r,onChange:N=>a(N.target.value)})}),n.jsx(Le,{value:i,onChange:N=>l(N.target.value),options:Object.entries(Ic).map(([N,k])=>({value:N,label:k})),className:"w-48"}),n.jsx(Le,{value:o,onChange:N=>c(N.target.value),options:Object.entries(Mc).map(([N,k])=>({value:N,label:k})),className:"w-48"}),n.jsx(I,{variant:"secondary",children:n.jsx(Wo,{className:"w-4 h-4"})})]})}),v?n.jsx(Z,{children:n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."})}):y!=null&&y.data&&y.data.length>0?n.jsx(n.Fragment,{children:h&&x?n.jsx("div",{className:"space-y-6",children:x.map(N=>n.jsxs(Z,{children:[n.jsx("div",{className:"flex items-center gap-3 mb-4 pb-3 border-b",children:N.isOwn?n.jsxs(n.Fragment,{children:[n.jsx(hh,{className:"w-5 h-5 text-blue-600"}),n.jsx("h2",{className:"text-lg font-semibold text-gray-900",children:"Meine Verträge"}),n.jsx(he,{variant:"default",children:N.contracts.length})]}):n.jsxs(n.Fragment,{children:[n.jsx(Xr,{className:"w-5 h-5 text-purple-600"}),n.jsxs("h2",{className:"text-lg font-semibold text-gray-900",children:["Verträge von ",N.customerName]}),n.jsx(he,{variant:"default",children:N.contracts.length})]})}),n.jsx("div",{className:"overflow-x-auto",children:n.jsxs("table",{className:"w-full",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b",children:[n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Vertragsnr."}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Typ"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Anbieter / Tarif"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Beginn"}),n.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),n.jsx("tbody",{children:N.contracts.map(k=>n.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[n.jsx("td",{className:"py-3 px-4 font-mono text-sm",children:k.contractNumber}),n.jsx("td",{className:"py-3 px-4",children:n.jsx(he,{children:Ic[k.type]})}),n.jsxs("td",{className:"py-3 px-4",children:[k.providerName||"-",k.tariffName&&n.jsxs("span",{className:"text-gray-500",children:[" / ",k.tariffName]})]}),n.jsx("td",{className:"py-3 px-4",children:n.jsx(he,{variant:wp[k.status],children:Mc[k.status]})}),n.jsx("td",{className:"py-3 px-4",children:k.startDate?new Date(k.startDate).toLocaleDateString("de-DE"):"-"}),n.jsx("td",{className:"py-3 px-4 text-right",children:n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>s(`/contracts/${k.id}`,{state:{from:"contracts"}}),children:n.jsx(Ee,{className:"w-4 h-4"})})})]},k.id))})]})})]},N.isOwn?"own":N.customerName))}):n.jsxs(Z,{children:[n.jsx("div",{className:"overflow-x-auto",children:n.jsxs("table",{className:"w-full",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b",children:[n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Vertragsnr."}),!p&&n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Kunde"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Typ"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Anbieter / Tarif"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Beginn"}),n.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),n.jsx("tbody",{children:y.data.map(N=>n.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[n.jsx("td",{className:"py-3 px-4 font-mono text-sm",children:N.contractNumber}),!p&&n.jsx("td",{className:"py-3 px-4",children:N.customer&&n.jsx(Se,{to:`/customers/${N.customer.id}`,className:"text-blue-600 hover:underline",children:N.customer.companyName||`${N.customer.firstName} ${N.customer.lastName}`})}),n.jsx("td",{className:"py-3 px-4",children:n.jsx(he,{children:Ic[N.type]})}),n.jsxs("td",{className:"py-3 px-4",children:[N.providerName||"-",N.tariffName&&n.jsxs("span",{className:"text-gray-500",children:[" / ",N.tariffName]})]}),n.jsx("td",{className:"py-3 px-4",children:n.jsx(he,{variant:wp[N.status],children:Mc[N.status]})}),n.jsx("td",{className:"py-3 px-4",children:N.startDate?new Date(N.startDate).toLocaleDateString("de-DE"):"-"}),n.jsx("td",{className:"py-3 px-4 text-right",children:n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>s(`/contracts/${N.id}`,{state:{from:"contracts"}}),children:n.jsx(Ee,{className:"w-4 h-4"})}),m("contracts:update")&&!p&&n.jsx(Se,{to:`/contracts/${N.id}/edit`,children:n.jsx(I,{variant:"ghost",size:"sm",children:n.jsx(We,{className:"w-4 h-4"})})}),m("contracts:delete")&&!p&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Vertrag wirklich löschen?")&&b.mutate(N.id)},children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})})]},N.id))})]})}),y.pagination&&y.pagination.totalPages>1&&n.jsxs("div",{className:"mt-4 flex items-center justify-between",children:[n.jsxs("p",{className:"text-sm text-gray-500",children:["Seite ",y.pagination.page," von ",y.pagination.totalPages," (",y.pagination.total," Einträge)"]}),n.jsxs("div",{className:"flex gap-2",children:[n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>d(N=>Math.max(1,N-1)),disabled:u===1,children:"Zurück"}),n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>d(N=>N+1),disabled:u>=y.pagination.totalPages,children:"Weiter"})]})]})]})}):n.jsx(Z,{children:n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Verträge gefunden."})})]})}const wS={ELECTRICITY:"Strom",GAS:"Gas",DSL:"DSL",CABLE:"Kabelinternet",FIBER:"Glasfaser",MOBILE:"Mobilfunk",TV:"TV",CAR_INSURANCE:"KFZ-Versicherung"},SS={DRAFT:"Entwurf",PENDING:"Ausstehend",ACTIVE:"Aktiv",CANCELLED:"Gekündigt",EXPIRED:"Abgelaufen"},kS={ACTIVE:"success",PENDING:"warning",CANCELLED:"danger",EXPIRED:"danger",DRAFT:"default"};function CS(e){const t=e.match(/^(\d+)([TMWJ])$/);if(!t)return!1;const s=parseInt(t[1]),r=t[2];let a=0;return r==="T"?a=s:r==="W"?a=s*7:r==="M"?a=s*30:r==="J"&&(a=s*365),a<=30}function ES({simCard:e}){const[t,s]=w.useState(!1),[r,a]=w.useState(null),[i,l]=w.useState(!1),o=async()=>{if(t)s(!1),a(null);else{l(!0);try{const c=await $e.getSimCardCredentials(e.id);c.data&&(a(c.data),s(!0))}catch{alert("PIN/PUK konnte nicht geladen werden")}finally{l(!1)}}};return n.jsxs("div",{className:"p-3 bg-gray-50 rounded-lg border",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.isMain&&n.jsx(he,{variant:"success",children:"Hauptkarte"}),e.isMultisim&&n.jsx(he,{variant:"warning",children:"Multisim"})]}),n.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-3 text-sm",children:[e.phoneNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"Rufnummer"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[e.phoneNumber,n.jsx(oe,{value:e.phoneNumber})]})]}),e.simCardNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"SIM-Nr."}),n.jsxs("dd",{className:"font-mono text-xs flex items-center gap-1",children:[e.simCardNumber,n.jsx(oe,{value:e.simCardNumber})]})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"PIN"}),n.jsx("dd",{className:"font-mono flex items-center gap-1",children:t&&(r!=null&&r.pin)?n.jsxs(n.Fragment,{children:[r.pin,n.jsx(oe,{value:r.pin})]}):"••••"})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"PUK"}),n.jsx("dd",{className:"font-mono flex items-center gap-1",children:t&&(r!=null&&r.puk)?n.jsxs(n.Fragment,{children:[r.puk,n.jsx(oe,{value:r.puk})]}):"••••••••"})]})]}),n.jsx("div",{className:"mt-2",children:n.jsx(I,{variant:"ghost",size:"sm",onClick:o,disabled:i,children:i?"Laden...":t?n.jsxs(n.Fragment,{children:[n.jsx(Pt,{className:"w-4 h-4 mr-1"})," PIN/PUK verbergen"]}):n.jsxs(n.Fragment,{children:[n.jsx(Ee,{className:"w-4 h-4 mr-1"})," PIN/PUK anzeigen"]})})})]})}function DS({meterId:e,meterType:t,readings:s,contractId:r,canEdit:a}){const[i,l]=w.useState(!1),[o,c]=w.useState(!1),[u,d]=w.useState(null),m=pe(),p=Y({mutationFn:g=>zs.deleteReading(e,g),onSuccess:()=>{m.invalidateQueries({queryKey:["contract",r.toString()]})}}),h=[...s].sort((g,b)=>new Date(b.readingDate).getTime()-new Date(g.readingDate).getTime()),f=t==="ELECTRICITY"?"kWh":"m³";return n.jsxs("div",{className:"mt-4 pt-4 border-t",children:[n.jsxs("div",{className:"flex items-center justify-between mb-3",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(Xy,{className:"w-4 h-4 text-gray-500"}),n.jsx("h4",{className:"text-sm font-medium text-gray-700",children:"Zählerstände"}),n.jsx(he,{variant:"default",children:s.length})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[a&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>c(!0),title:"Zählerstand erfassen",children:n.jsx(Oe,{className:"w-4 h-4"})}),s.length>0&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>l(!i),children:i?n.jsx(Wy,{className:"w-4 h-4"}):n.jsx(Qo,{className:"w-4 h-4"})})]})]}),i&&s.length>0&&n.jsx("div",{className:"space-y-2 bg-gray-50 rounded-lg p-3",children:h.map(g=>n.jsxs("div",{className:"flex justify-between items-center text-sm group py-1 border-b border-gray-200 last:border-0",children:[n.jsxs("span",{className:"text-gray-500 flex items-center gap-1",children:[new Date(g.readingDate).toLocaleDateString("de-DE"),n.jsx(oe,{value:new Date(g.readingDate).toLocaleDateString("de-DE")})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsxs("span",{className:"font-mono flex items-center gap-1",children:[g.value.toLocaleString("de-DE")," ",g.unit,n.jsx(oe,{value:g.value.toString(),title:"Nur Wert kopieren"})]}),a&&n.jsxs("div",{className:"opacity-0 group-hover:opacity-100 flex gap-1",children:[n.jsx("button",{onClick:()=>d(g),className:"text-gray-400 hover:text-blue-600",title:"Bearbeiten",children:n.jsx(We,{className:"w-3 h-3"})}),n.jsx("button",{onClick:()=>{confirm("Zählerstand wirklich löschen?")&&p.mutate(g.id)},className:"text-gray-400 hover:text-red-600",title:"Löschen",children:n.jsx(be,{className:"w-3 h-3"})})]})]})]},g.id))}),!i&&s.length>0&&n.jsxs("p",{className:"text-sm text-gray-500",children:["Letzter Stand: ",h[0].value.toLocaleString("de-DE")," ",h[0].unit," (",new Date(h[0].readingDate).toLocaleDateString("de-DE"),")"]}),s.length===0&&n.jsx("p",{className:"text-sm text-gray-500",children:"Keine Zählerstände vorhanden."}),(o||u)&&n.jsx(PS,{isOpen:!0,onClose:()=>{c(!1),d(null)},meterId:e,contractId:r,reading:u,defaultUnit:f})]})}function PS({isOpen:e,onClose:t,meterId:s,contractId:r,reading:a,defaultUnit:i}){var f;const l=pe(),o=!!a,[c,u]=w.useState({readingDate:a!=null&&a.readingDate?new Date(a.readingDate).toISOString().split("T")[0]:new Date().toISOString().split("T")[0],value:((f=a==null?void 0:a.value)==null?void 0:f.toString())||"",unit:(a==null?void 0:a.unit)||i,notes:(a==null?void 0:a.notes)||""}),d=Y({mutationFn:g=>zs.addReading(s,g),onSuccess:()=>{l.invalidateQueries({queryKey:["contract",r.toString()]}),t()}}),m=Y({mutationFn:g=>zs.updateReading(s,a.id,g),onSuccess:()=>{l.invalidateQueries({queryKey:["contract",r.toString()]}),t()}}),p=g=>{g.preventDefault();const b={readingDate:new Date(c.readingDate),value:parseFloat(c.value),unit:c.unit,notes:c.notes||void 0};o?m.mutate(b):d.mutate(b)},h=d.isPending||m.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:o?"Zählerstand bearbeiten":"Zählerstand erfassen",children:n.jsxs("form",{onSubmit:p,className:"space-y-4",children:[n.jsx($,{label:"Ablesedatum",type:"date",value:c.readingDate,onChange:g=>u({...c,readingDate:g.target.value}),required:!0}),n.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[n.jsx("div",{className:"col-span-2",children:n.jsx($,{label:"Zählerstand",type:"number",step:"0.01",value:c.value,onChange:g=>u({...c,value:g.target.value}),required:!0})}),n.jsx(Le,{label:"Einheit",value:c.unit,onChange:g=>u({...c,unit:g.target.value}),options:[{value:"kWh",label:"kWh"},{value:"m³",label:"m³"}]})]}),n.jsx($,{label:"Notizen (optional)",value:c.notes,onChange:g=>u({...c,notes:g.target.value})}),n.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:h||!c.value,children:h?"Speichern...":o?"Speichern":"Erfassen"})]})]})})}function Sp({task:e,contractId:t,canEdit:s,isCustomerPortal:r,isCompleted:a,onEdit:i}){const[l,o]=w.useState(""),[c,u]=w.useState(!1),[d,m]=w.useState(null),[p,h]=w.useState(""),f=pe(),g=Y({mutationFn:j=>Xe.complete(j),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),b=Y({mutationFn:j=>Xe.reopen(j),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),y=Y({mutationFn:j=>Xe.delete(j),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),v=Y({mutationFn:j=>Xe.createSubtask(e.id,j),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]}),o(""),u(!1)},onError:j=>{console.error("Fehler beim Erstellen der Unteraufgabe:",j),alert("Fehler beim Erstellen der Unteraufgabe. Bitte versuchen Sie es erneut.")}}),x=Y({mutationFn:j=>Xe.createReply(e.id,j),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]}),o(""),u(!1)},onError:j=>{console.error("Fehler beim Erstellen der Antwort:",j),alert("Fehler beim Erstellen der Antwort. Bitte versuchen Sie es erneut.")}}),N=Y({mutationFn:({id:j,title:B})=>Xe.updateSubtask(j,B),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]}),m(null),h("")}}),k=Y({mutationFn:j=>Xe.completeSubtask(j),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),D=Y({mutationFn:j=>Xe.reopenSubtask(j),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),F=Y({mutationFn:j=>Xe.deleteSubtask(j),onSuccess:async()=>{await f.refetchQueries({queryKey:["contract-tasks",t]})}}),S=j=>{j.preventDefault(),l.trim()&&(r?x.mutate(l.trim()):v.mutate(l.trim()))},L=j=>{j.preventDefault(),p.trim()&&d&&N.mutate({id:d,title:p.trim()})},T=(j,B)=>{m(j),h(B)},_=()=>{m(null),h("")},K=e.subtasks||[],W=K.filter(j=>j.status==="OPEN"),Q=K.filter(j=>j.status==="COMPLETED"),z=r?{singular:"Antwort",placeholder:"Antwort...",deleteConfirm:"Antwort löschen?"}:{singular:"Unteraufgabe",placeholder:"Unteraufgabe...",deleteConfirm:"Unteraufgabe löschen?"},P=(j,B)=>d===j.id?n.jsx("div",{className:"py-1",children:n.jsxs("form",{onSubmit:L,className:"flex items-center gap-2",children:[n.jsx(_l,{className:"w-4 h-4 text-gray-300 flex-shrink-0"}),n.jsx("input",{type:"text",value:p,onChange:ee=>h(ee.target.value),className:"flex-1 text-sm px-2 py-1 border rounded focus:outline-none focus:ring-1 focus:ring-blue-500",autoFocus:!0}),n.jsx(I,{type:"submit",size:"sm",disabled:!p.trim()||N.isPending,children:"✓"}),n.jsx(I,{type:"button",variant:"ghost",size:"sm",onClick:_,children:"×"})]})},j.id):n.jsx("div",{className:`py-1 group/subtask ${B?"opacity-60":""}`,children:n.jsxs("div",{className:"flex items-start gap-2",children:[n.jsx("button",{onClick:()=>B?D.mutate(j.id):k.mutate(j.id),disabled:k.isPending||D.isPending||r,className:`flex-shrink-0 mt-0.5 ${r?"cursor-default":B?"hover:text-yellow-600":"hover:text-green-600"}`,children:B?n.jsx(hs,{className:"w-4 h-4 text-green-500"}):n.jsx(_l,{className:"w-4 h-4 text-gray-400"})}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-1",children:[n.jsx("span",{className:`text-sm ${B?"line-through text-gray-500":""}`,children:j.title}),s&&!r&&!B&&n.jsxs("div",{className:"flex items-center gap-0.5 opacity-0 group-hover/subtask:opacity-100",children:[n.jsx("button",{onClick:()=>T(j.id,j.title),className:"text-gray-400 hover:text-blue-600 p-0.5",title:"Bearbeiten",children:n.jsx(We,{className:"w-3 h-3"})}),n.jsx("button",{onClick:()=>{confirm(z.deleteConfirm)&&F.mutate(j.id)},className:"text-gray-400 hover:text-red-600 p-0.5",title:"Löschen",children:n.jsx(be,{className:"w-3 h-3"})})]}),s&&!r&&B&&n.jsx("button",{onClick:()=>{confirm(z.deleteConfirm)&&F.mutate(j.id)},className:"text-gray-400 hover:text-red-600 p-0.5 opacity-0 group-hover/subtask:opacity-100",title:"Löschen",children:n.jsx(be,{className:"w-3 h-3"})})]}),n.jsxs("p",{className:"text-xs text-gray-400",children:[j.createdBy&&`${j.createdBy} • `,B?`Erledigt am ${j.completedAt?new Date(j.completedAt).toLocaleDateString("de-DE"):new Date(j.updatedAt).toLocaleDateString("de-DE")}`:new Date(j.createdAt).toLocaleDateString("de-DE")]})]})]})},j.id);return n.jsx("div",{className:`p-3 bg-gray-50 rounded-lg group ${a?"bg-gray-50/50 opacity-70":""}`,children:n.jsxs("div",{className:"flex items-start gap-3",children:[n.jsx("button",{onClick:()=>a?b.mutate(e.id):g.mutate(e.id),disabled:g.isPending||b.isPending||r,className:`mt-0.5 flex-shrink-0 ${r?"cursor-default":a?"hover:text-yellow-600":"hover:text-green-600"}`,title:r?void 0:a?"Wieder öffnen":"Als erledigt markieren",children:a?n.jsx(hs,{className:"w-5 h-5 text-green-500"}):n.jsx(_l,{className:"w-5 h-5 text-gray-400"})}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("span",{className:`font-medium ${a?"line-through text-gray-500":""}`,children:e.title}),e.visibleInPortal&&n.jsx(he,{variant:"default",className:"text-xs",children:"Portal"}),K.length>0&&n.jsxs("span",{className:"text-xs text-gray-400",children:["(",Q.length,"/",K.length,")"]})]}),e.description&&n.jsx("p",{className:`text-sm mt-1 whitespace-pre-wrap ${a?"text-gray-500":"text-gray-600"}`,children:e.description}),n.jsxs("p",{className:"text-xs text-gray-400 mt-1",children:[e.createdBy&&`${e.createdBy} • `,a?`Erledigt am ${e.completedAt?new Date(e.completedAt).toLocaleDateString("de-DE"):"-"}`:new Date(e.createdAt).toLocaleDateString("de-DE")]}),K.length>0&&n.jsxs("div",{className:"mt-3 ml-2 space-y-0 border-l-2 border-gray-200 pl-3",children:[W.map(j=>P(j,!1)),Q.map(j=>P(j,!0))]}),!a&&(s&&!r||r)&&n.jsx("div",{className:"mt-2 ml-2",children:c?n.jsxs("form",{onSubmit:S,className:"flex items-center gap-2",children:[n.jsx("input",{type:"text",value:l,onChange:j=>o(j.target.value),placeholder:z.placeholder,className:"flex-1 text-sm px-2 py-1 border rounded focus:outline-none focus:ring-1 focus:ring-blue-500",autoFocus:!0}),n.jsx(I,{type:"submit",size:"sm",disabled:!l.trim()||v.isPending||x.isPending,children:n.jsx(Oe,{className:"w-3 h-3"})}),n.jsx(I,{type:"button",variant:"ghost",size:"sm",onClick:()=>{u(!1),o("")},children:"×"})]}):n.jsxs("button",{onClick:()=>u(!0),className:"text-xs text-gray-400 hover:text-blue-600 flex items-center gap-1",children:[n.jsx(Oe,{className:"w-3 h-3"}),z.singular]})})]}),s&&!r&&n.jsxs("div",{className:"flex gap-1 opacity-0 group-hover:opacity-100",children:[!a&&n.jsx("button",{onClick:i,className:"text-gray-400 hover:text-blue-600 p-1",title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),n.jsx("button",{onClick:()=>{confirm("Aufgabe wirklich löschen?")&&y.mutate(e.id)},className:"text-gray-400 hover:text-red-600 p-1",title:"Löschen",children:n.jsx(be,{className:"w-4 h-4"})})]})]})})}function AS({contractId:e,canEdit:t,isCustomerPortal:s}){var x;const[r,a]=w.useState(!1),[i,l]=w.useState(null),{data:o,isLoading:c}=ge({queryKey:["contract-tasks",e],queryFn:()=>Xe.getByContract(e),staleTime:0,gcTime:0,refetchOnMount:"always"}),{data:u,isLoading:d}=ge({queryKey:["app-settings-public"],queryFn:()=>Sr.getPublic(),enabled:s,staleTime:0}),m=!d&&((x=u==null?void 0:u.data)==null?void 0:x.customerSupportTicketsEnabled)==="true",p=(o==null?void 0:o.data)||[],h=p.filter(N=>N.status==="OPEN"),f=p.filter(N=>N.status==="COMPLETED"),g=s?{title:"Support-Anfragen",button:"Anfrage erstellen",empty:"Keine Support-Anfragen vorhanden."}:{title:"Aufgaben",button:"Aufgabe",empty:"Keine Aufgaben vorhanden."},b=s?Mi:Ii;if(c||s&&d)return n.jsx(Z,{className:"mb-6",title:g.title,children:n.jsx("div",{className:"text-center py-4 text-gray-500",children:"Laden..."})});const v=t&&!s||s&&m;return n.jsxs(Z,{className:"mb-6",title:g.title,children:[n.jsxs("div",{className:"flex items-center justify-between mb-4",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(b,{className:"w-5 h-5 text-gray-500"}),n.jsxs("span",{className:"text-sm text-gray-600",children:[h.length," offen, ",f.length," erledigt"]})]}),v&&n.jsxs(I,{size:"sm",onClick:()=>a(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-1"}),g.button]})]}),p.length===0?n.jsx("p",{className:"text-center py-4 text-gray-500",children:g.empty}):n.jsxs("div",{className:"space-y-2",children:[h.map(N=>n.jsx(Sp,{task:N,contractId:e,canEdit:t,isCustomerPortal:s,isCompleted:!1,onEdit:()=>l(N)},N.id)),f.length>0&&h.length>0&&n.jsx("div",{className:"border-t my-3"}),f.map(N=>n.jsx(Sp,{task:N,contractId:e,canEdit:t,isCustomerPortal:s,isCompleted:!0,onEdit:()=>{}},N.id))]}),(r||i)&&n.jsx(TS,{isOpen:!0,onClose:()=>{a(!1),l(null)},contractId:e,task:i,isCustomerPortal:s})]})}function TS({isOpen:e,onClose:t,contractId:s,task:r,isCustomerPortal:a=!1}){const i=pe(),l=!!r,[o,c]=w.useState({title:(r==null?void 0:r.title)||"",description:(r==null?void 0:r.description)||"",visibleInPortal:(r==null?void 0:r.visibleInPortal)||!1});w.useEffect(()=>{e&&c({title:(r==null?void 0:r.title)||"",description:(r==null?void 0:r.description)||"",visibleInPortal:(r==null?void 0:r.visibleInPortal)||!1})},[e,r]);const u=Y({mutationFn:g=>Xe.create(s,g),onSuccess:async()=>{await i.refetchQueries({queryKey:["contract-tasks",s]}),t()}}),d=Y({mutationFn:g=>Xe.createSupportTicket(s,g),onSuccess:async()=>{await i.refetchQueries({queryKey:["contract-tasks",s]}),t()}}),m=Y({mutationFn:g=>Xe.update(r.id,g),onSuccess:async()=>{await i.refetchQueries({queryKey:["contract-tasks",s]}),t()}}),p=g=>{g.preventDefault(),l?m.mutate({title:o.title,description:o.description||void 0,visibleInPortal:o.visibleInPortal}):a?d.mutate({title:o.title,description:o.description||void 0}):u.mutate({title:o.title,description:o.description||void 0,visibleInPortal:o.visibleInPortal})},h=u.isPending||d.isPending||m.isPending,f=a?{modalTitle:l?"Anfrage bearbeiten":"Neue Support-Anfrage",titleLabel:"Betreff",titlePlaceholder:"Kurze Beschreibung Ihrer Anfrage",descLabel:"Ihre Nachricht",descPlaceholder:"Beschreiben Sie Ihr Anliegen...",submitBtn:l?"Speichern":"Anfrage senden"}:{modalTitle:l?"Aufgabe bearbeiten":"Neue Aufgabe",titleLabel:"Titel",titlePlaceholder:"Kurze Beschreibung der Aufgabe",descLabel:"Beschreibung (optional)",descPlaceholder:"Details zur Aufgabe...",submitBtn:l?"Speichern":"Erstellen"};return n.jsx(dt,{isOpen:e,onClose:t,title:f.modalTitle,children:n.jsxs("form",{onSubmit:p,className:"space-y-4",children:[n.jsx($,{label:f.titleLabel,value:o.title,onChange:g=>c({...o,title:g.target.value}),required:!0,placeholder:f.titlePlaceholder}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:f.descLabel}),n.jsx("textarea",{value:o.description,onChange:g=>c({...o,description:g.target.value}),className:"w-full px-3 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500",rows:a?5:3,placeholder:f.descPlaceholder})]}),!a&&n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:o.visibleInPortal,onChange:g=>c({...o,visibleInPortal:g.target.checked}),className:"w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500"}),n.jsx("span",{className:"text-sm text-gray-700",children:"Im Kundenportal sichtbar"})]}),n.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:h||!o.title.trim(),children:h?"Speichern...":f.submitBtn})]})]})})}function FS(){var B,J,ee,me,ve,it;const{id:e}=_o(),t=Ut(),r=dn().state,a=pe(),{hasPermission:i,isCustomer:l,isCustomerPortal:o}=st(),c=parseInt(e),[u,d]=w.useState(!1),[m,p]=w.useState(null),[h,f]=w.useState(!1),[g,b]=w.useState(!1),[y,v]=w.useState(null),[x,N]=w.useState({}),[k,D]=w.useState({}),{data:F,isLoading:S}=ge({queryKey:["contract",e],queryFn:()=>$e.getById(c)}),L=Y({mutationFn:()=>$e.delete(c),onSuccess:()=>{a.invalidateQueries({queryKey:["contracts"]}),t("/contracts")}}),T=Y({mutationFn:()=>$e.createFollowUp(c),onSuccess:V=>{a.invalidateQueries({queryKey:["contracts"]}),V.data&&t(`/contracts/${V.data.id}/edit`)}}),_=Y({mutationFn:V=>{const Me={cancellationConfirmationDate:V?new Date(V).toISOString():null};return $e.update(c,Me)},onSuccess:()=>{a.invalidateQueries({queryKey:["contract",e]}),a.invalidateQueries({queryKey:["contract-cockpit"]})},onError:V=>{console.error("Fehler beim Speichern des Datums:",V),alert("Fehler beim Speichern des Datums")}}),K=Y({mutationFn:V=>{const Me={cancellationConfirmationOptionsDate:V?new Date(V).toISOString():null};return $e.update(c,Me)},onSuccess:()=>{a.invalidateQueries({queryKey:["contract",e]}),a.invalidateQueries({queryKey:["contract-cockpit"]})},onError:V=>{console.error("Fehler beim Speichern des Datums:",V),alert("Fehler beim Speichern des Datums")}}),W=async()=>{var V;if(u)d(!1),p(null);else try{const Ce=await $e.getPassword(c);(V=Ce.data)!=null&&V.password&&(p(Ce.data.password),d(!0))}catch{alert("Passwort konnte nicht entschlüsselt werden")}},Q=async()=>{var V;if(g)b(!1),v(null);else try{const Ce=await $e.getInternetCredentials(c);(V=Ce.data)!=null&&V.password&&(v(Ce.data.password),b(!0))}catch{alert("Internet-Passwort konnte nicht entschlüsselt werden")}},z=async V=>{var Ce;if(x[V])N(Me=>({...Me,[V]:!1})),D(Me=>({...Me,[V]:null}));else try{const ht=(Ce=(await $e.getSipCredentials(V)).data)==null?void 0:Ce.password;ht&&(D(Tt=>({...Tt,[V]:ht})),N(Tt=>({...Tt,[V]:!0})))}catch{alert("SIP-Passwort konnte nicht entschlüsselt werden")}},P=async()=>{var Me,ht,Tt;const V=F==null?void 0:F.data,Ce=((Me=V==null?void 0:V.stressfreiEmail)==null?void 0:Me.email)||(V==null?void 0:V.portalUsername);if(!((ht=V==null?void 0:V.provider)!=null&&ht.portalUrl)||!Ce){alert("Portal-URL oder Benutzername fehlt");return}f(!0);try{const Jt=await $e.getPassword(c);if(!((Tt=Jt.data)!=null&&Tt.password)){alert("Passwort konnte nicht entschlüsselt werden");return}const Pe=V.provider,Xt=Pe.portalUrl,Gn=Pe.usernameFieldName||"username",Er=Pe.passwordFieldName||"password",hn=new URL(Xt);hn.searchParams.set(Gn,Ce),hn.searchParams.set(Er,Jt.data.password),window.open(hn.toString(),"_blank")}catch{alert("Fehler beim Auto-Login")}finally{f(!1)}};if(S)return n.jsx("div",{className:"text-center py-8",children:"Laden..."});if(!(F!=null&&F.data))return n.jsx("div",{className:"text-center py-8 text-red-600",children:"Vertrag nicht gefunden"});const j=F.data;return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-2",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{if((r==null?void 0:r.from)==="customer"&&(r!=null&&r.customerId))t(`/customers/${r.customerId}?tab=contracts`);else if((r==null?void 0:r.from)==="cockpit"){const V=r.filter?`?filter=${r.filter}`:"";t(`/contracts/cockpit${V}`)}else(r==null?void 0:r.from)==="contracts"?t("/contracts"):j.customer?t(`/customers/${j.customer.id}?tab=contracts`):t("/contracts")},children:n.jsx($s,{className:"w-4 h-4"})}),n.jsx("h1",{className:"text-2xl font-bold",children:j.contractNumber}),n.jsx(he,{children:wS[j.type]}),n.jsx(he,{variant:kS[j.status],children:SS[j.status]})]}),j.customer&&n.jsxs("p",{className:"text-gray-500 ml-10",children:["Kunde:"," ",n.jsx(Se,{to:`/customers/${j.customer.id}`,className:"text-blue-600 hover:underline",children:j.customer.companyName||`${j.customer.firstName} ${j.customer.lastName}`})]})]}),!l&&n.jsxs("div",{className:"flex gap-2",children:[i("contracts:create")&&n.jsxs(I,{variant:"secondary",onClick:()=>T.mutate(),disabled:T.isPending,children:[n.jsx(Gy,{className:"w-4 h-4 mr-2"}),"Folgevertrag"]}),i("contracts:update")&&n.jsx(Se,{to:`/contracts/${e}/edit`,children:n.jsxs(I,{variant:"secondary",children:[n.jsx(We,{className:"w-4 h-4 mr-2"}),"Bearbeiten"]})}),i("contracts:delete")&&n.jsxs(I,{variant:"danger",onClick:()=>{confirm("Vertrag wirklich löschen?")&&L.mutate()},children:[n.jsx(be,{className:"w-4 h-4 mr-2"}),"Löschen"]})]})]}),j.previousContract&&n.jsx(Z,{className:"mb-6 border-l-4 border-l-blue-500",title:"Vorgängervertrag",children:n.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vertragsnummer"}),n.jsx("dd",{children:n.jsx(Se,{to:`/contracts/${j.previousContract.id}`,className:"text-blue-600 hover:underline",children:j.previousContract.contractNumber})})]}),j.previousContract.providerName&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Anbieter"}),n.jsx("dd",{children:j.previousContract.providerName})]}),j.previousContract.customerNumberAtProvider&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Kundennummer"}),n.jsx("dd",{className:"font-mono",children:j.previousContract.customerNumberAtProvider})]}),j.previousContract.portalUsername&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Zugangsdaten"}),n.jsx("dd",{children:j.previousContract.portalUsername})]})]})}),j.cancellationConfirmationDate&&n.jsxs("div",{className:"mb-6 p-4 bg-red-50 border-2 border-red-400 rounded-lg flex items-start gap-3",children:[n.jsx("span",{className:"text-red-600 text-xl font-bold",children:"!"}),n.jsxs("div",{children:[n.jsx("p",{className:"font-semibold text-red-800",children:"Kündigungsbestätigung vorhanden"}),n.jsxs("p",{className:"text-sm text-red-700 mt-1",children:["Dieser Vertrag hat eine Kündigungsbestätigung vom"," ",n.jsx("strong",{children:new Date(j.cancellationConfirmationDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})}),".",j.cancellationConfirmationOptionsDate&&n.jsxs(n.Fragment,{children:[" Optionen-Bestätigung: ",n.jsx("strong",{children:new Date(j.cancellationConfirmationOptionsDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})}),"."]})]})]})]}),j.type==="MOBILE"&&((B=j.mobileDetails)==null?void 0:B.requiresMultisim)&&n.jsxs("div",{className:"mb-6 p-4 bg-amber-50 border border-amber-300 rounded-lg flex items-start gap-3",children:[n.jsx("span",{className:"text-amber-600 text-xl font-bold",children:"!"}),n.jsxs("div",{children:[n.jsx("p",{className:"font-semibold text-amber-800",children:"Multisim erforderlich"}),n.jsx("p",{className:"text-sm text-amber-700 mt-1",children:"Dieser Kunde benötigt eine Multisim-Karte. Multisim ist bei Klarmobil, Congstar und Otelo nicht buchbar. Bitte einen Anbieter wie Freenet oder vergleichbar wählen."})]})]}),n.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6",children:[n.jsx(Z,{title:"Anbieter & Tarif",children:n.jsxs("dl",{className:"space-y-3",children:[(j.provider||j.providerName)&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Anbieter"}),n.jsx("dd",{className:"font-medium",children:((J=j.provider)==null?void 0:J.name)||j.providerName})]}),(j.tariff||j.tariffName)&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Tarif"}),n.jsx("dd",{children:((ee=j.tariff)==null?void 0:ee.name)||j.tariffName})]}),j.customerNumberAtProvider&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Kundennummer"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.customerNumberAtProvider,n.jsx(oe,{value:j.customerNumberAtProvider})]})]}),j.salesPlatform&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vertriebsplattform"}),n.jsx("dd",{children:j.salesPlatform.name})]}),j.commission!==null&&j.commission!==void 0&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Provision"}),n.jsx("dd",{children:j.commission.toLocaleString("de-DE",{style:"currency",currency:"EUR"})})]}),j.priceFirst12Months&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Preis erste 12 Monate"}),n.jsx("dd",{children:j.priceFirst12Months})]}),j.priceFrom13Months&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Preis ab 13. Monat"}),n.jsx("dd",{children:j.priceFrom13Months})]}),j.priceAfter24Months&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Preis nach 24 Monaten"}),n.jsx("dd",{children:j.priceAfter24Months})]})]})}),n.jsxs(Z,{title:"Laufzeit und Kündigung",className:j.cancellationConfirmationDate?"border-2 border-red-400":"",children:[j.contractDuration&&CS(j.contractDuration.code)&&n.jsxs("p",{className:"text-sm text-gray-500 mb-4 bg-blue-50 border border-blue-200 rounded-lg p-3",children:[n.jsx("strong",{children:"Hinweis:"})," Dieser Vertrag gilt als unbefristet mit der jeweiligen Kündigungsfrist."]}),n.jsxs("dl",{className:"space-y-3",children:[j.startDate&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vertragsbeginn"}),n.jsx("dd",{children:new Date(j.startDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]}),j.endDate&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vertragsende"}),n.jsx("dd",{children:new Date(j.endDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]}),j.contractDuration&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vertragslaufzeit"}),n.jsx("dd",{children:j.contractDuration.description})]}),j.cancellationPeriod&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Kündigungsfrist"}),n.jsx("dd",{children:j.cancellationPeriod.description})]}),j.cancellationConfirmationDate&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Kündigungsbestätigungsdatum"}),n.jsx("dd",{children:new Date(j.cancellationConfirmationDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]}),j.cancellationConfirmationOptionsDate&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Kündigungsbestätigungsoptionendatum"}),n.jsx("dd",{children:new Date(j.cancellationConfirmationOptionsDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})]}),j.wasSpecialCancellation&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Sonderkündigung"}),n.jsx("dd",{children:n.jsx(he,{variant:"warning",children:"Ja"})})]})]}),i("contracts:update")&&n.jsxs("div",{className:"mt-6 pt-6 border-t",children:[n.jsx("h4",{className:"font-medium mb-4",children:"Kündigungsdokumente"}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500 mb-1",children:"Kündigungsschreiben"}),j.cancellationLetterPath?n.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[n.jsxs("a",{href:`/api${j.cancellationLetterPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${j.cancellationLetterPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),n.jsx(xt,{onUpload:async V=>{await Ye.uploadCancellationLetter(c,V),a.invalidateQueries({queryKey:["contract",e]})},existingFile:j.cancellationLetterPath,accept:".pdf",label:"Ersetzen"}),n.jsxs("button",{onClick:async()=>{confirm("Dokument wirklich löschen?")&&(await Ye.deleteCancellationLetter(c),a.invalidateQueries({queryKey:["contract",e]}))},className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]}):n.jsx(xt,{onUpload:async V=>{await Ye.uploadCancellationLetter(c,V),a.invalidateQueries({queryKey:["contract",e]})},accept:".pdf",label:"PDF hochladen"})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500 mb-1",children:"Kündigungsbestätigung"}),j.cancellationConfirmationPath?n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[n.jsxs("a",{href:`/api${j.cancellationConfirmationPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${j.cancellationConfirmationPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),n.jsx(xt,{onUpload:async V=>{await Ye.uploadCancellationConfirmation(c,V),a.invalidateQueries({queryKey:["contract",e]})},existingFile:j.cancellationConfirmationPath,accept:".pdf",label:"Ersetzen"}),n.jsxs("button",{onClick:async()=>{confirm("Dokument wirklich löschen?")&&(await Ye.deleteCancellationConfirmation(c),a.invalidateQueries({queryKey:["contract",e]}))},className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]}),n.jsxs("div",{className:"mt-2",children:[n.jsx("label",{className:"text-xs text-gray-500 block mb-1",children:"Bestätigung erhalten am"}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"date",value:j.cancellationConfirmationDate?j.cancellationConfirmationDate.split("T")[0]:"",onChange:V=>{const Ce=V.target.value||null;_.mutate(Ce)},className:"block w-full max-w-[180px] px-2 py-1 text-sm border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500"}),j.cancellationConfirmationDate&&n.jsx("button",{onClick:()=>_.mutate(null),className:"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded",title:"Datum löschen",children:n.jsx(be,{className:"w-4 h-4"})})]})]})]}):n.jsx(xt,{onUpload:async V=>{await Ye.uploadCancellationConfirmation(c,V),a.invalidateQueries({queryKey:["contract",e]})},accept:".pdf",label:"PDF hochladen"})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500 mb-1",children:"Kündigungsschreiben Optionen"}),j.cancellationLetterOptionsPath?n.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[n.jsxs("a",{href:`/api${j.cancellationLetterOptionsPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${j.cancellationLetterOptionsPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),n.jsx(xt,{onUpload:async V=>{await Ye.uploadCancellationLetterOptions(c,V),a.invalidateQueries({queryKey:["contract",e]})},existingFile:j.cancellationLetterOptionsPath,accept:".pdf",label:"Ersetzen"}),n.jsxs("button",{onClick:async()=>{confirm("Dokument wirklich löschen?")&&(await Ye.deleteCancellationLetterOptions(c),a.invalidateQueries({queryKey:["contract",e]}))},className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]}):n.jsx(xt,{onUpload:async V=>{await Ye.uploadCancellationLetterOptions(c,V),a.invalidateQueries({queryKey:["contract",e]})},accept:".pdf",label:"PDF hochladen"})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500 mb-1",children:"Kündigungsbestätigung Optionen"}),j.cancellationConfirmationOptionsPath?n.jsxs(n.Fragment,{children:[n.jsxs("div",{className:"flex items-center gap-3 flex-wrap",children:[n.jsxs("a",{href:`/api${j.cancellationConfirmationOptionsPath}`,target:"_blank",rel:"noopener noreferrer",className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(Ee,{className:"w-4 h-4"}),"Anzeigen"]}),n.jsxs("a",{href:`/api${j.cancellationConfirmationOptionsPath}`,download:!0,className:"text-blue-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(tn,{className:"w-4 h-4"}),"Download"]}),n.jsx(xt,{onUpload:async V=>{await Ye.uploadCancellationConfirmationOptions(c,V),a.invalidateQueries({queryKey:["contract",e]})},existingFile:j.cancellationConfirmationOptionsPath,accept:".pdf",label:"Ersetzen"}),n.jsxs("button",{onClick:async()=>{confirm("Dokument wirklich löschen?")&&(await Ye.deleteCancellationConfirmationOptions(c),a.invalidateQueries({queryKey:["contract",e]}))},className:"text-red-600 hover:underline text-sm flex items-center gap-1",children:[n.jsx(be,{className:"w-4 h-4"}),"Löschen"]})]}),n.jsxs("div",{className:"mt-2",children:[n.jsx("label",{className:"text-xs text-gray-500 block mb-1",children:"Bestätigung erhalten am"}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"date",value:j.cancellationConfirmationOptionsDate?j.cancellationConfirmationOptionsDate.split("T")[0]:"",onChange:V=>{const Ce=V.target.value||null;K.mutate(Ce)},className:"block w-full max-w-[180px] px-2 py-1 text-sm border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500"}),j.cancellationConfirmationOptionsDate&&n.jsx("button",{onClick:()=>K.mutate(null),className:"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded",title:"Datum löschen",children:n.jsx(be,{className:"w-4 h-4"})})]})]})]}):n.jsx(xt,{onUpload:async V=>{await Ye.uploadCancellationConfirmationOptions(c,V),a.invalidateQueries({queryKey:["contract",e]})},accept:".pdf",label:"PDF hochladen"})]})]})]})]})]}),(j.portalUsername||j.stressfreiEmail||j.portalPasswordEncrypted)&&n.jsxs(Z,{className:"mb-6",title:"Zugangsdaten",children:[n.jsxs("dl",{className:"grid grid-cols-2 gap-4",children:[(j.portalUsername||j.stressfreiEmail)&&n.jsxs("div",{children:[n.jsxs("dt",{className:"text-sm text-gray-500",children:["Benutzername",j.stressfreiEmail&&n.jsx("span",{className:"ml-2 text-xs text-blue-600",children:"(Stressfrei-Wechseln)"})]}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[((me=j.stressfreiEmail)==null?void 0:me.email)||j.portalUsername,n.jsx(oe,{value:((ve=j.stressfreiEmail)==null?void 0:ve.email)||j.portalUsername||""})]})]}),j.portalPasswordEncrypted&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Passwort"}),n.jsxs("dd",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"font-mono",children:u&&m?m:"••••••••"}),u&&m&&n.jsx(oe,{value:m}),n.jsx(I,{variant:"ghost",size:"sm",onClick:W,children:u?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]})]})]}),((it=j.provider)==null?void 0:it.portalUrl)&&(j.portalUsername||j.stressfreiEmail)&&j.portalPasswordEncrypted&&n.jsxs("div",{className:"mt-4 pt-4 border-t",children:[n.jsxs(I,{onClick:P,disabled:h,className:"w-full sm:w-auto",children:[n.jsx(Yy,{className:"w-4 h-4 mr-2"}),h?"Wird geöffnet...":"Zum Kundenportal (Auto-Login)"]}),n.jsx("p",{className:"text-xs text-gray-500 mt-2",children:"Öffnet das Portal mit vorausgefüllten Zugangsdaten"})]})]}),n.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6",children:[j.address&&n.jsx(Z,{title:"Adresse",children:n.jsxs(nv,{values:[`${j.address.street} ${j.address.houseNumber}`,`${j.address.postalCode} ${j.address.city}`,j.address.country],children:[n.jsxs("p",{children:[j.address.street," ",j.address.houseNumber]}),n.jsxs("p",{children:[j.address.postalCode," ",j.address.city]}),n.jsx("p",{className:"text-gray-500",children:j.address.country})]})}),j.bankCard&&n.jsxs(Z,{title:"Bankkarte",children:[n.jsx("p",{className:"font-medium",children:j.bankCard.accountHolder}),n.jsxs("p",{className:"font-mono flex items-center gap-1",children:[j.bankCard.iban,n.jsx(oe,{value:j.bankCard.iban})]}),j.bankCard.bankName&&n.jsx("p",{className:"text-gray-500",children:j.bankCard.bankName})]}),j.identityDocument&&n.jsxs(Z,{title:"Ausweis",children:[n.jsxs("p",{className:"font-mono flex items-center gap-1",children:[j.identityDocument.documentNumber,n.jsx(oe,{value:j.identityDocument.documentNumber})]}),n.jsx("p",{className:"text-gray-500",children:j.identityDocument.type})]})]}),j.energyDetails&&n.jsxs(Z,{className:"mb-6",title:j.type==="ELECTRICITY"?"Strom-Details":"Gas-Details",children:[n.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[j.energyDetails.meter&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Zählernummer"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.energyDetails.meter.meterNumber,n.jsx(oe,{value:j.energyDetails.meter.meterNumber})]})]}),j.energyDetails.annualConsumption&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Jahresverbrauch"}),n.jsxs("dd",{children:[j.energyDetails.annualConsumption.toLocaleString("de-DE")," ",j.type==="ELECTRICITY"?"kWh":"m³"]})]}),j.energyDetails.basePrice&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Grundpreis"}),n.jsxs("dd",{children:[j.energyDetails.basePrice.toLocaleString("de-DE")," €/Monat"]})]}),j.energyDetails.unitPrice&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Arbeitspreis"}),n.jsxs("dd",{children:[j.energyDetails.unitPrice.toLocaleString("de-DE")," ct/",j.type==="ELECTRICITY"?"kWh":"m³"]})]}),j.energyDetails.bonus&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Bonus"}),n.jsxs("dd",{children:[j.energyDetails.bonus.toLocaleString("de-DE")," €"]})]}),j.energyDetails.previousProviderName&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vorversorger"}),n.jsx("dd",{children:j.energyDetails.previousProviderName})]}),j.energyDetails.previousCustomerNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vorherige Kundennr."}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.energyDetails.previousCustomerNumber,n.jsx(oe,{value:j.energyDetails.previousCustomerNumber})]})]})]}),j.energyDetails.meter&&n.jsx(DS,{meterId:j.energyDetails.meter.id,meterType:j.energyDetails.meter.type,readings:j.energyDetails.meter.readings||[],contractId:c,canEdit:i("contracts:update")&&!l})]}),j.internetDetails&&n.jsxs(Z,{className:"mb-6",title:j.type==="DSL"?"DSL-Details":j.type==="CABLE"?"Kabelinternet-Details":"Glasfaser-Details",children:[n.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[j.internetDetails.downloadSpeed&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Download"}),n.jsxs("dd",{children:[j.internetDetails.downloadSpeed," Mbit/s"]})]}),j.internetDetails.uploadSpeed&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Upload"}),n.jsxs("dd",{children:[j.internetDetails.uploadSpeed," Mbit/s"]})]}),j.internetDetails.routerModel&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Router"}),n.jsx("dd",{children:j.internetDetails.routerModel})]}),j.internetDetails.routerSerialNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Router S/N"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.internetDetails.routerSerialNumber,n.jsx(oe,{value:j.internetDetails.routerSerialNumber})]})]}),j.internetDetails.installationDate&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Installation"}),n.jsx("dd",{children:new Date(j.internetDetails.installationDate).toLocaleDateString("de-DE")})]}),j.internetDetails.homeId&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Home-ID"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.internetDetails.homeId,n.jsx(oe,{value:j.internetDetails.homeId})]})]}),j.internetDetails.activationCode&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Aktivierungscode"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.internetDetails.activationCode,n.jsx(oe,{value:j.internetDetails.activationCode})]})]})]}),(j.internetDetails.internetUsername||j.internetDetails.internetPasswordEncrypted)&&n.jsxs("div",{className:"mt-4 pt-4 border-t",children:[n.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-3",children:"Internet-Zugangsdaten"}),n.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[j.internetDetails.internetUsername&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Benutzername"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.internetDetails.internetUsername,n.jsx(oe,{value:j.internetDetails.internetUsername})]})]}),j.internetDetails.internetPasswordEncrypted&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Passwort"}),n.jsxs("dd",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"font-mono",children:g&&y?y:"••••••••"}),g&&y&&n.jsx(oe,{value:y}),n.jsx(I,{variant:"ghost",size:"sm",onClick:Q,children:g?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]})]})]})]}),j.internetDetails.phoneNumbers&&j.internetDetails.phoneNumbers.length>0&&n.jsxs("div",{className:"mt-4 pt-4 border-t",children:[n.jsx("h4",{className:"text-sm font-medium text-gray-700 mb-3",children:"Rufnummern & SIP-Zugangsdaten"}),n.jsx("div",{className:"space-y-3",children:j.internetDetails.phoneNumbers.map(V=>n.jsxs("div",{className:"p-3 bg-gray-50 rounded-lg",children:[n.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[n.jsxs("span",{className:"font-mono font-medium flex items-center gap-1",children:[V.phoneNumber,n.jsx(oe,{value:V.phoneNumber})]}),V.isMain&&n.jsx(he,{variant:"success",children:"Hauptnummer"})]}),(V.sipUsername||V.sipPasswordEncrypted||V.sipServer)&&n.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-3 text-sm",children:[V.sipUsername&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"SIP-Benutzer"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[V.sipUsername,n.jsx(oe,{value:V.sipUsername})]})]}),V.sipPasswordEncrypted&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"SIP-Passwort"}),n.jsxs("dd",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"font-mono",children:x[V.id]&&k[V.id]?k[V.id]:"••••••••"}),x[V.id]&&k[V.id]&&n.jsx(oe,{value:k[V.id]}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>z(V.id),children:x[V.id]?n.jsx(Pt,{className:"w-3 h-3"}):n.jsx(Ee,{className:"w-3 h-3"})})]})]}),V.sipServer&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"SIP-Server"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[V.sipServer,n.jsx(oe,{value:V.sipServer})]})]})]})]},V.id))})]})]}),j.mobileDetails&&n.jsxs(Z,{className:"mb-6",title:"Mobilfunk-Details",children:[n.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[j.mobileDetails.dataVolume&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Datenvolumen"}),n.jsxs("dd",{children:[j.mobileDetails.dataVolume," GB"]})]}),j.mobileDetails.includedMinutes&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Inklusiv-Minuten"}),n.jsx("dd",{children:j.mobileDetails.includedMinutes})]}),j.mobileDetails.includedSMS&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Inklusiv-SMS"}),n.jsx("dd",{children:j.mobileDetails.includedSMS})]}),j.mobileDetails.deviceModel&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Gerät"}),n.jsx("dd",{children:j.mobileDetails.deviceModel})]}),j.mobileDetails.deviceImei&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"IMEI"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.mobileDetails.deviceImei,n.jsx(oe,{value:j.mobileDetails.deviceImei})]})]}),j.mobileDetails.requiresMultisim&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Multisim"}),n.jsx("dd",{children:n.jsx(he,{variant:"warning",children:"Erforderlich"})})]})]}),j.mobileDetails.simCards&&j.mobileDetails.simCards.length>0&&n.jsxs("div",{className:"mt-6 pt-6 border-t",children:[n.jsx("h4",{className:"font-medium mb-4",children:"SIM-Karten"}),n.jsx("div",{className:"space-y-3",children:j.mobileDetails.simCards.map(V=>n.jsx(ES,{simCard:V},V.id))})]}),(!j.mobileDetails.simCards||j.mobileDetails.simCards.length===0)&&(j.mobileDetails.phoneNumber||j.mobileDetails.simCardNumber)&&n.jsxs("div",{className:"mt-6 pt-6 border-t",children:[n.jsx("h4",{className:"font-medium mb-4",children:"SIM-Karte (Legacy)"}),n.jsxs("dl",{className:"grid grid-cols-2 gap-4",children:[j.mobileDetails.phoneNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Rufnummer"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.mobileDetails.phoneNumber,n.jsx(oe,{value:j.mobileDetails.phoneNumber})]})]}),j.mobileDetails.simCardNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"SIM-Kartennummer"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.mobileDetails.simCardNumber,n.jsx(oe,{value:j.mobileDetails.simCardNumber})]})]})]})]})]}),j.tvDetails&&n.jsx(Z,{className:"mb-6",title:"TV-Details",children:n.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-3 gap-4",children:[j.tvDetails.receiverModel&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Receiver"}),n.jsx("dd",{children:j.tvDetails.receiverModel})]}),j.tvDetails.smartcardNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Smartcard"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.tvDetails.smartcardNumber,n.jsx(oe,{value:j.tvDetails.smartcardNumber})]})]}),j.tvDetails.package&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Paket"}),n.jsx("dd",{children:j.tvDetails.package})]})]})}),j.carInsuranceDetails&&n.jsx(Z,{className:"mb-6",title:"KFZ-Versicherung Details",children:n.jsxs("dl",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[j.carInsuranceDetails.licensePlate&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Kennzeichen"}),n.jsxs("dd",{className:"font-mono font-bold flex items-center gap-1",children:[j.carInsuranceDetails.licensePlate,n.jsx(oe,{value:j.carInsuranceDetails.licensePlate})]})]}),j.carInsuranceDetails.vehicleType&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Fahrzeug"}),n.jsx("dd",{children:j.carInsuranceDetails.vehicleType})]}),j.carInsuranceDetails.hsn&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"HSN/TSN"}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.carInsuranceDetails.hsn,"/",j.carInsuranceDetails.tsn,n.jsx(oe,{value:`${j.carInsuranceDetails.hsn}/${j.carInsuranceDetails.tsn}`})]})]}),j.carInsuranceDetails.vin&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"FIN"}),n.jsxs("dd",{className:"font-mono text-sm flex items-center gap-1",children:[j.carInsuranceDetails.vin,n.jsx(oe,{value:j.carInsuranceDetails.vin})]})]}),j.carInsuranceDetails.firstRegistration&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Erstzulassung"}),n.jsx("dd",{children:new Date(j.carInsuranceDetails.firstRegistration).toLocaleDateString("de-DE")})]}),j.carInsuranceDetails.noClaimsClass&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"SF-Klasse"}),n.jsx("dd",{children:j.carInsuranceDetails.noClaimsClass})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Versicherungsart"}),n.jsx("dd",{children:n.jsx(he,{variant:j.carInsuranceDetails.insuranceType==="FULL"?"success":j.carInsuranceDetails.insuranceType==="PARTIAL"?"warning":"default",children:j.carInsuranceDetails.insuranceType==="FULL"?"Vollkasko":j.carInsuranceDetails.insuranceType==="PARTIAL"?"Teilkasko":"Haftpflicht"})})]}),j.carInsuranceDetails.deductiblePartial&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"SB Teilkasko"}),n.jsxs("dd",{children:[j.carInsuranceDetails.deductiblePartial," €"]})]}),j.carInsuranceDetails.deductibleFull&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"SB Vollkasko"}),n.jsxs("dd",{children:[j.carInsuranceDetails.deductibleFull," €"]})]}),j.carInsuranceDetails.policyNumber&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Versicherungsschein-Nr."}),n.jsxs("dd",{className:"font-mono flex items-center gap-1",children:[j.carInsuranceDetails.policyNumber,n.jsx(oe,{value:j.carInsuranceDetails.policyNumber})]})]}),j.carInsuranceDetails.previousInsurer&&n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Vorversicherer"}),n.jsx("dd",{children:j.carInsuranceDetails.previousInsurer})]})]})}),n.jsx(AS,{contractId:c,canEdit:i("contracts:update"),isCustomerPortal:o}),j.notes&&n.jsx(Z,{title:"Notizen",children:n.jsx("p",{className:"whitespace-pre-wrap",children:j.notes})})]})}const IS=[{value:"DRAFT",label:"Entwurf"},{value:"PENDING",label:"Ausstehend"},{value:"ACTIVE",label:"Aktiv"},{value:"CANCELLED",label:"Gekündigt"},{value:"EXPIRED",label:"Abgelaufen"}];function kp(){var gs,Ji,Pr,Ar,Xi,Fa,el,Ia,jh;const{id:e}=_o(),[t]=Uo(),s=Ut(),r=pe(),a=!!e,i=t.get("customerId"),{register:l,handleSubmit:o,reset:c,watch:u,setValue:d,formState:{errors:m}}=dv({defaultValues:{customerId:i||"",type:"ELECTRICITY",status:"DRAFT"}}),p=u("type"),h=u("customerId"),{data:f}=ge({queryKey:["contract",e],queryFn:()=>$e.getById(parseInt(e)),enabled:a}),{data:g}=ge({queryKey:["customers-all"],queryFn:()=>yt.getAll({limit:1e3})}),{data:b}=ge({queryKey:["customer",h],queryFn:()=>yt.getById(parseInt(h)),enabled:!!h}),{data:y}=ge({queryKey:["platforms"],queryFn:()=>Pi.getAll()}),{data:v}=ge({queryKey:["cancellation-periods"],queryFn:()=>Ai.getAll()}),{data:x}=ge({queryKey:["contract-durations"],queryFn:()=>Ti.getAll()}),{data:N}=ge({queryKey:["providers"],queryFn:()=>Na.getAll()}),{data:k}=ge({queryKey:["contract-categories"],queryFn:()=>Fi.getAll()}),D=u("providerId"),[F,S]=w.useState(null),[L,T]=w.useState([]),[_,K]=w.useState([]),[W,Q]=w.useState(!1),[z,P]=w.useState("manual"),[j,B]=w.useState(""),[J,ee]=w.useState(!1),[me,ve]=w.useState(!1),[it,V]=w.useState({}),[Ce,Me]=w.useState({}),[ht,Tt]=w.useState({});w.useEffect(()=>{a||Q(!0)},[a]),w.useEffect(()=>{W&&F!==null&&D!==F&&d("tariffId",""),S(D)},[D,F,d,W]),w.useEffect(()=>{if(!a&&(k!=null&&k.data)&&k.data.length>0){const A=u("type"),ne=k.data.filter(ie=>ie.isActive),fe=ne.some(ie=>ie.code===A);if(!A||!fe){const ie=ne.sort((de,Ge)=>de.sortOrder-Ge.sortOrder)[0];ie&&d("type",ie.code)}}},[k,a,d,u]),w.useEffect(()=>{var A,ne,fe,ie,de,Ge,je,Ma,bh,Nh,wh,Sh,kh,Ch,Eh,Dh,Ph,Ah,Th,Fh,Ih,Mh,Lh,Rh,Oh,_h,zh,Uh,$h,Bh,Kh,Vh,qh,Qh,Hh,Wh,Gh,Zh,Yh,Jh,Xh,em,tm,sm,nm,rm,am,im,lm;if(f!=null&&f.data){const X=f.data;c({customerId:X.customerId.toString(),type:X.type,status:X.status,addressId:((A=X.addressId)==null?void 0:A.toString())||"",bankCardId:((ne=X.bankCardId)==null?void 0:ne.toString())||"",identityDocumentId:((fe=X.identityDocumentId)==null?void 0:fe.toString())||"",salesPlatformId:((ie=X.salesPlatformId)==null?void 0:ie.toString())||"",providerId:((de=X.providerId)==null?void 0:de.toString())||"",tariffId:((Ge=X.tariffId)==null?void 0:Ge.toString())||"",providerName:X.providerName||"",tariffName:X.tariffName||"",customerNumberAtProvider:X.customerNumberAtProvider||"",priceFirst12Months:X.priceFirst12Months||"",priceFrom13Months:X.priceFrom13Months||"",priceAfter24Months:X.priceAfter24Months||"",startDate:X.startDate?X.startDate.split("T")[0]:"",endDate:X.endDate?X.endDate.split("T")[0]:"",cancellationPeriodId:((je=X.cancellationPeriodId)==null?void 0:je.toString())||"",contractDurationId:((Ma=X.contractDurationId)==null?void 0:Ma.toString())||"",commission:X.commission||"",portalUsername:X.portalUsername||"",notes:X.notes||"",meterId:((Nh=(bh=X.energyDetails)==null?void 0:bh.meterId)==null?void 0:Nh.toString())||"",annualConsumption:((wh=X.energyDetails)==null?void 0:wh.annualConsumption)||"",basePrice:((Sh=X.energyDetails)==null?void 0:Sh.basePrice)||"",unitPrice:((kh=X.energyDetails)==null?void 0:kh.unitPrice)||"",bonus:((Ch=X.energyDetails)==null?void 0:Ch.bonus)||"",previousProviderName:((Eh=X.energyDetails)==null?void 0:Eh.previousProviderName)||"",previousCustomerNumber:((Dh=X.energyDetails)==null?void 0:Dh.previousCustomerNumber)||"",downloadSpeed:((Ph=X.internetDetails)==null?void 0:Ph.downloadSpeed)||"",uploadSpeed:((Ah=X.internetDetails)==null?void 0:Ah.uploadSpeed)||"",routerModel:((Th=X.internetDetails)==null?void 0:Th.routerModel)||"",routerSerialNumber:((Fh=X.internetDetails)==null?void 0:Fh.routerSerialNumber)||"",installationDate:(Ih=X.internetDetails)!=null&&Ih.installationDate?X.internetDetails.installationDate.split("T")[0]:"",internetUsername:((Mh=X.internetDetails)==null?void 0:Mh.internetUsername)||"",homeId:((Lh=X.internetDetails)==null?void 0:Lh.homeId)||"",activationCode:((Rh=X.internetDetails)==null?void 0:Rh.activationCode)||"",requiresMultisim:((Oh=X.mobileDetails)==null?void 0:Oh.requiresMultisim)||!1,dataVolume:((_h=X.mobileDetails)==null?void 0:_h.dataVolume)||"",includedMinutes:((zh=X.mobileDetails)==null?void 0:zh.includedMinutes)||"",includedSMS:((Uh=X.mobileDetails)==null?void 0:Uh.includedSMS)||"",deviceModel:(($h=X.mobileDetails)==null?void 0:$h.deviceModel)||"",deviceImei:((Bh=X.mobileDetails)==null?void 0:Bh.deviceImei)||"",phoneNumber:((Kh=X.mobileDetails)==null?void 0:Kh.phoneNumber)||"",simCardNumber:((Vh=X.mobileDetails)==null?void 0:Vh.simCardNumber)||"",receiverModel:((qh=X.tvDetails)==null?void 0:qh.receiverModel)||"",smartcardNumber:((Qh=X.tvDetails)==null?void 0:Qh.smartcardNumber)||"",tvPackage:((Hh=X.tvDetails)==null?void 0:Hh.package)||"",licensePlate:((Wh=X.carInsuranceDetails)==null?void 0:Wh.licensePlate)||"",hsn:((Gh=X.carInsuranceDetails)==null?void 0:Gh.hsn)||"",tsn:((Zh=X.carInsuranceDetails)==null?void 0:Zh.tsn)||"",vin:((Yh=X.carInsuranceDetails)==null?void 0:Yh.vin)||"",vehicleType:((Jh=X.carInsuranceDetails)==null?void 0:Jh.vehicleType)||"",firstRegistration:(Xh=X.carInsuranceDetails)!=null&&Xh.firstRegistration?X.carInsuranceDetails.firstRegistration.split("T")[0]:"",noClaimsClass:((em=X.carInsuranceDetails)==null?void 0:em.noClaimsClass)||"",insuranceType:((tm=X.carInsuranceDetails)==null?void 0:tm.insuranceType)||"LIABILITY",deductiblePartial:((sm=X.carInsuranceDetails)==null?void 0:sm.deductiblePartial)||"",deductibleFull:((nm=X.carInsuranceDetails)==null?void 0:nm.deductibleFull)||"",policyNumber:((rm=X.carInsuranceDetails)==null?void 0:rm.policyNumber)||"",previousInsurer:((am=X.carInsuranceDetails)==null?void 0:am.previousInsurer)||"",cancellationConfirmationDate:X.cancellationConfirmationDate?X.cancellationConfirmationDate.split("T")[0]:"",cancellationConfirmationOptionsDate:X.cancellationConfirmationOptionsDate?X.cancellationConfirmationOptionsDate.split("T")[0]:"",wasSpecialCancellation:X.wasSpecialCancellation||!1}),(im=X.mobileDetails)!=null&&im.simCards&&X.mobileDetails.simCards.length>0?T(X.mobileDetails.simCards.map($t=>({id:$t.id,phoneNumber:$t.phoneNumber||"",simCardNumber:$t.simCardNumber||"",pin:"",puk:"",hasExistingPin:!!$t.pin,hasExistingPuk:!!$t.puk,isMultisim:$t.isMultisim,isMain:$t.isMain}))):T([]),(lm=X.internetDetails)!=null&&lm.phoneNumbers&&X.internetDetails.phoneNumbers.length>0?K(X.internetDetails.phoneNumbers.map($t=>({id:$t.id,phoneNumber:$t.phoneNumber||"",sipUsername:$t.sipUsername||"",sipPassword:"",hasExistingSipPassword:!!$t.sipPasswordEncrypted,sipServer:$t.sipServer||"",isMain:$t.isMain}))):K([]),X.stressfreiEmailId?(P("stressfrei"),B(X.stressfreiEmailId.toString())):(P("manual"),B("")),Q(!0)}},[f,c]);const Jt=u("startDate"),Pe=u("contractDurationId");w.useEffect(()=>{if(Jt&&Pe&&(x!=null&&x.data)){const A=x.data.find(ne=>ne.id===parseInt(Pe));if(A){const ne=new Date(Jt),ie=A.code.match(/^(\d+)([MTJ])$/);if(ie){const de=parseInt(ie[1]),Ge=ie[2];let je=new Date(ne);Ge==="T"?je.setDate(je.getDate()+de):Ge==="M"?je.setMonth(je.getMonth()+de):Ge==="J"&&je.setFullYear(je.getFullYear()+de),d("endDate",je.toISOString().split("T")[0])}}}},[Jt,Pe,x,d]);const Xt=Y({mutationFn:$e.create,onSuccess:(A,ne)=>{r.invalidateQueries({queryKey:["contracts"]}),ne.customerId&&r.invalidateQueries({queryKey:["customer",ne.customerId.toString()]}),r.invalidateQueries({queryKey:["customers"]}),s(i?`/customers/${i}?tab=contracts`:"/contracts")}}),Gn=Y({mutationFn:A=>$e.update(parseInt(e),A),onSuccess:(A,ne)=>{r.invalidateQueries({queryKey:["contracts"]}),r.invalidateQueries({queryKey:["contract",e]}),ne.customerId&&r.invalidateQueries({queryKey:["customer",ne.customerId.toString()]}),r.invalidateQueries({queryKey:["customers"]}),s(`/contracts/${e}`)}}),Er=A=>{const ne=je=>{if(je==null||je==="")return;const Ma=parseInt(String(je));return isNaN(Ma)?void 0:Ma},fe=H.find(je=>je.code===A.type),ie=ne(A.customerId);if(!ie){alert("Bitte wählen Sie einen Kunden aus");return}if(!A.type||!fe){alert("Bitte wählen Sie einen Vertragstyp aus");return}const de=je=>je==null||je===""?null:je,Ge={customerId:ie,type:A.type,contractCategoryId:fe.id,status:A.status,addressId:ne(A.addressId)??null,bankCardId:ne(A.bankCardId)??null,identityDocumentId:ne(A.identityDocumentId)??null,salesPlatformId:ne(A.salesPlatformId)??null,providerId:ne(A.providerId)??null,tariffId:ne(A.tariffId)??null,providerName:de(A.providerName),tariffName:de(A.tariffName),customerNumberAtProvider:de(A.customerNumberAtProvider),priceFirst12Months:de(A.priceFirst12Months),priceFrom13Months:de(A.priceFrom13Months),priceAfter24Months:de(A.priceAfter24Months),startDate:A.startDate?new Date(A.startDate):null,endDate:A.endDate?new Date(A.endDate):null,cancellationPeriodId:ne(A.cancellationPeriodId)??null,contractDurationId:ne(A.contractDurationId)??null,commission:A.commission?parseFloat(A.commission):null,portalUsername:z==="manual"?de(A.portalUsername):null,stressfreiEmailId:z==="stressfrei"&&j?parseInt(j):null,portalPassword:A.portalPassword||void 0,notes:de(A.notes),cancellationConfirmationDate:A.cancellationConfirmationDate?new Date(A.cancellationConfirmationDate):null,cancellationConfirmationOptionsDate:A.cancellationConfirmationOptionsDate?new Date(A.cancellationConfirmationOptionsDate):null,wasSpecialCancellation:A.wasSpecialCancellation||!1};["ELECTRICITY","GAS"].includes(A.type)&&(Ge.energyDetails={meterId:ne(A.meterId)??null,annualConsumption:A.annualConsumption?parseFloat(A.annualConsumption):null,basePrice:A.basePrice?parseFloat(A.basePrice):null,unitPrice:A.unitPrice?parseFloat(A.unitPrice):null,bonus:A.bonus?parseFloat(A.bonus):null,previousProviderName:de(A.previousProviderName),previousCustomerNumber:de(A.previousCustomerNumber)}),["DSL","CABLE","FIBER"].includes(A.type)&&(Ge.internetDetails={downloadSpeed:ne(A.downloadSpeed)??null,uploadSpeed:ne(A.uploadSpeed)??null,routerModel:de(A.routerModel),routerSerialNumber:de(A.routerSerialNumber),installationDate:A.installationDate?new Date(A.installationDate):null,internetUsername:de(A.internetUsername),internetPassword:A.internetPassword||void 0,homeId:de(A.homeId),activationCode:de(A.activationCode),phoneNumbers:_.length>0?_.map(je=>({id:je.id,phoneNumber:je.phoneNumber||"",isMain:je.isMain??!1,sipUsername:de(je.sipUsername),sipPassword:je.sipPassword||void 0,sipServer:de(je.sipServer)})):void 0}),A.type==="MOBILE"&&(Ge.mobileDetails={requiresMultisim:A.requiresMultisim||!1,dataVolume:A.dataVolume?parseFloat(A.dataVolume):null,includedMinutes:ne(A.includedMinutes)??null,includedSMS:ne(A.includedSMS)??null,deviceModel:de(A.deviceModel),deviceImei:de(A.deviceImei),phoneNumber:de(A.phoneNumber),simCardNumber:de(A.simCardNumber),simCards:L.length>0?L.map(je=>({id:je.id,phoneNumber:de(je.phoneNumber),simCardNumber:de(je.simCardNumber),pin:je.pin||void 0,puk:je.puk||void 0,isMultisim:je.isMultisim,isMain:je.isMain})):void 0}),A.type==="TV"&&(Ge.tvDetails={receiverModel:de(A.receiverModel),smartcardNumber:de(A.smartcardNumber),package:de(A.tvPackage)}),A.type==="CAR_INSURANCE"&&(Ge.carInsuranceDetails={licensePlate:de(A.licensePlate),hsn:de(A.hsn),tsn:de(A.tsn),vin:de(A.vin),vehicleType:de(A.vehicleType),firstRegistration:A.firstRegistration?new Date(A.firstRegistration):null,noClaimsClass:de(A.noClaimsClass),insuranceType:A.insuranceType,deductiblePartial:A.deductiblePartial?parseFloat(A.deductiblePartial):null,deductibleFull:A.deductibleFull?parseFloat(A.deductibleFull):null,policyNumber:de(A.policyNumber),previousInsurer:de(A.previousInsurer)}),a?Gn.mutate(Ge):Xt.mutate(Ge)},hn=Xt.isPending||Gn.isPending,Dr=Xt.error||Gn.error,mt=b==null?void 0:b.data,Zo=(mt==null?void 0:mt.addresses)||[],Yo=((gs=mt==null?void 0:mt.bankCards)==null?void 0:gs.filter(A=>A.isActive))||[],vh=((Ji=mt==null?void 0:mt.identityDocuments)==null?void 0:Ji.filter(A=>A.isActive))||[],Yi=((Pr=mt==null?void 0:mt.meters)==null?void 0:Pr.filter(A=>A.isActive))||[],E=((Ar=mt==null?void 0:mt.stressfreiEmails)==null?void 0:Ar.filter(A=>A.isActive))||[],M=(y==null?void 0:y.data)||[],U=(v==null?void 0:v.data)||[],se=(x==null?void 0:x.data)||[],G=((Xi=N==null?void 0:N.data)==null?void 0:Xi.filter(A=>A.isActive))||[],H=((Fa=k==null?void 0:k.data)==null?void 0:Fa.filter(A=>A.isActive).sort((A,ne)=>A.sortOrder-ne.sortOrder))||[],ce=H.map(A=>({value:A.code,label:A.name})),we=G.find(A=>A.id===parseInt(D||"0")),Ae=((el=we==null?void 0:we.tariffs)==null?void 0:el.filter(A=>A.isActive))||[],ft=A=>{const ne=A.companyName||`${A.firstName} ${A.lastName}`,fe=A.birthDate?` (geb. ${new Date(A.birthDate).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"})})`:"";return`${A.customerNumber} - ${ne}${fe}`},Bs=(()=>{var fe;const ne=((g==null?void 0:g.data)||[]).map(ie=>({value:ie.id.toString(),label:ft(ie)}));if(a&&((fe=f==null?void 0:f.data)!=null&&fe.customer)){const ie=f.data.customer;ne.some(Ge=>Ge.value===ie.id.toString())||ne.unshift({value:ie.id.toString(),label:ft(ie)})}return ne})();return n.jsxs("div",{children:[n.jsx("h1",{className:"text-2xl font-bold mb-6",children:a?"Vertrag bearbeiten":"Neuer Vertrag"}),Dr&&n.jsx("div",{className:"mb-4 p-4 bg-red-50 border border-red-200 text-red-700 rounded-lg",children:Dr instanceof Error?Dr.message:"Ein Fehler ist aufgetreten"}),n.jsxs("form",{onSubmit:o(Er),children:[n.jsx(Z,{className:"mb-6",title:"Vertragsdaten",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx(Le,{label:"Kunde *",...l("customerId",{required:"Kunde erforderlich"}),options:Bs,error:(Ia=m.customerId)==null?void 0:Ia.message}),n.jsx(Le,{label:"Vertragstyp *",...l("type",{required:"Typ erforderlich"}),options:ce}),n.jsx(Le,{label:"Status",...l("status"),options:IS}),n.jsx(Le,{label:"Vertriebsplattform",...l("salesPlatformId"),options:M.map(A=>({value:A.id,label:A.name}))})]})}),h&&n.jsx(Z,{className:"mb-6",title:"Kundendaten verknüpfen",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[n.jsx(Le,{label:"Adresse",...l("addressId"),options:Zo.map(A=>({value:A.id,label:`${A.street} ${A.houseNumber}, ${A.postalCode} ${A.city} (${A.type==="BILLING"?"Rechnung":"Liefer"})`}))}),n.jsx(Le,{label:"Bankkarte",...l("bankCardId"),options:Yo.map(A=>({value:A.id,label:`${A.iban} (${A.accountHolder})`}))}),n.jsx(Le,{label:"Ausweis",...l("identityDocumentId"),options:vh.map(A=>({value:A.id,label:`${A.documentNumber} (${A.type})`}))})]})}),n.jsx(Z,{className:"mb-6",title:"Anbieter & Tarif",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx(Le,{label:"Anbieter",...l("providerId"),options:G.map(A=>({value:A.id,label:A.name}))}),n.jsx(Le,{label:"Tarif",...l("tariffId"),options:Ae.map(A=>({value:A.id,label:A.name})),disabled:!D}),n.jsx($,{label:"Kundennummer beim Anbieter",...l("customerNumberAtProvider")}),n.jsx($,{label:"Provision (€)",type:"number",step:"0.01",...l("commission")}),n.jsx($,{label:"Preis erste 12 Monate",...l("priceFirst12Months"),placeholder:"z.B. 29,99 €/Monat"}),n.jsx($,{label:"Preis ab 13. Monat",...l("priceFrom13Months"),placeholder:"z.B. 39,99 €/Monat"}),n.jsx($,{label:"Preis nach 24 Monaten",...l("priceAfter24Months"),placeholder:"z.B. 49,99 €/Monat"})]})}),n.jsxs(Z,{className:"mb-6",title:"Laufzeit und Kündigung",children:[n.jsxs("p",{className:"text-sm text-gray-500 mb-4 bg-blue-50 border border-blue-200 rounded-lg p-3",children:[n.jsx("strong",{children:"Hinweis:"})," Ist die Laufzeit ≤ 4 Wochen, 1 Monat oder 30 Tage, gilt der Vertrag als unbefristet mit der jeweiligen Kündigungsfrist."]}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx($,{label:"Vertragsbeginn",type:"date",...l("startDate"),value:u("startDate")||"",onClear:()=>d("startDate","")}),n.jsx($,{label:"Vertragsende (berechnet)",type:"date",...l("endDate"),disabled:!0,className:"bg-gray-50"}),n.jsx(Le,{label:"Vertragslaufzeit",...l("contractDurationId"),options:se.map(A=>({value:A.id,label:A.description}))}),n.jsx(Le,{label:"Kündigungsfrist",...l("cancellationPeriodId"),options:U.map(A=>({value:A.id,label:A.description}))}),n.jsx($,{label:"Kündigungsbestätigungsdatum",type:"date",...l("cancellationConfirmationDate"),value:u("cancellationConfirmationDate")||"",onClear:()=>d("cancellationConfirmationDate","")}),n.jsx($,{label:"Kündigungsbestätigungsoptionendatum",type:"date",...l("cancellationConfirmationOptionsDate"),value:u("cancellationConfirmationOptionsDate")||"",onClear:()=>d("cancellationConfirmationOptionsDate","")}),n.jsx("div",{className:"col-span-2",children:n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"checkbox",...l("wasSpecialCancellation"),className:"rounded border-gray-300"}),n.jsx("span",{children:"Wurde sondergekündigt?"})]})})]})]}),n.jsx(Z,{className:"mb-6",title:"Zugangsdaten (verschlüsselt gespeichert)",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Portal Benutzername"}),n.jsxs("div",{className:"space-y-2",children:[n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"radio",name:"usernameType",checked:z==="manual",onChange:()=>{P("manual"),B("")},className:"text-blue-600"}),n.jsx("span",{className:"text-sm",children:"Manuell eingeben"})]}),z==="manual"&&n.jsx($,{...l("portalUsername"),placeholder:"Benutzername eingeben..."}),n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"radio",name:"usernameType",checked:z==="stressfrei",onChange:()=>{P("stressfrei"),d("portalUsername","")},className:"text-blue-600"}),n.jsx("span",{className:"text-sm",children:"Stressfrei-Wechseln Adresse"})]}),z==="stressfrei"&&n.jsx(Le,{value:j,onChange:A=>B(A.target.value),options:E.map(A=>({value:A.id,label:A.email+(A.notes?` (${A.notes})`:"")})),placeholder:E.length===0?"Keine Stressfrei-Adressen vorhanden":"Adresse auswählen..."}),z==="stressfrei"&&E.length===0&&n.jsx("p",{className:"text-xs text-amber-600",children:"Keine Stressfrei-Wechseln Adressen für diesen Kunden vorhanden. Bitte zuerst beim Kunden anlegen."})]})]}),n.jsxs("div",{className:"mt-8",children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:a?"Neues Passwort (leer lassen = unverändert)":"Portal Passwort"}),n.jsxs("div",{className:"relative",children:[n.jsx("input",{type:J?"text":"password",...l("portalPassword"),className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),n.jsx("button",{type:"button",onClick:()=>ee(!J),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:J?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]})]})]})}),["ELECTRICITY","GAS"].includes(p)&&n.jsx(Z,{className:"mb-6",title:p==="ELECTRICITY"?"Strom-Details":"Gas-Details",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx(Le,{label:"Zähler",...l("meterId"),options:Yi.filter(A=>A.type===p).map(A=>({value:A.id,label:`${A.meterNumber}${A.location?` (${A.location})`:""}`}))}),n.jsx($,{label:`Jahresverbrauch (${p==="ELECTRICITY"?"kWh":"m³"})`,type:"number",...l("annualConsumption")}),n.jsx($,{label:"Grundpreis (€/Monat)",type:"number",step:"0.01",...l("basePrice")}),n.jsx($,{label:`Arbeitspreis (ct/${p==="ELECTRICITY"?"kWh":"m³"})`,type:"number",step:"0.01",...l("unitPrice")}),n.jsx($,{label:"Bonus (€)",type:"number",step:"0.01",...l("bonus")}),n.jsx($,{label:"Vorversorger",...l("previousProviderName")}),n.jsx($,{label:"Kundennr. beim Vorversorger",...l("previousCustomerNumber")})]})}),["DSL","CABLE","FIBER"].includes(p)&&n.jsxs(n.Fragment,{children:[n.jsx(Z,{className:"mb-6",title:p==="DSL"?"DSL-Details":p==="CABLE"?"Kabelinternet-Details":"Glasfaser-Details",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx($,{label:"Download (Mbit/s)",type:"number",...l("downloadSpeed")}),n.jsx($,{label:"Upload (Mbit/s)",type:"number",...l("uploadSpeed")}),n.jsx($,{label:"Router Modell",...l("routerModel")}),n.jsx($,{label:"Router Seriennummer",...l("routerSerialNumber")}),n.jsx($,{label:"Installationsdatum",type:"date",...l("installationDate"),value:u("installationDate")||"",onClear:()=>d("installationDate","")}),p==="FIBER"&&n.jsx($,{label:"Home-ID",...l("homeId")}),((jh=we==null?void 0:we.name)==null?void 0:jh.toLowerCase().includes("vodafone"))&&["DSL","CABLE"].includes(p)&&n.jsx($,{label:"Aktivierungscode",...l("activationCode")})]})}),n.jsx(Z,{className:"mb-6",title:"Internet-Zugangsdaten (verschlüsselt)",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx($,{label:"Benutzername",...l("internetUsername")}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:a?"Neues Passwort (leer = beibehalten)":"Passwort"}),n.jsxs("div",{className:"relative",children:[n.jsx("input",{type:me?"text":"password",...l("internetPassword"),className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),n.jsx("button",{type:"button",onClick:()=>ve(!me),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:me?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]})]})]})}),n.jsxs(Z,{className:"mb-6",title:"Rufnummern & SIP-Zugangsdaten",children:[n.jsx("p",{className:"text-sm text-gray-500 mb-4",children:"Hier können Sie Festnetz-Rufnummern mit SIP-Zugangsdaten erfassen."}),_.length>0&&n.jsx("div",{className:"space-y-4 mb-4",children:_.map((A,ne)=>n.jsxs("div",{className:"p-4 border rounded-lg bg-gray-50",children:[n.jsxs("div",{className:"flex justify-between items-center mb-3",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsxs("span",{className:"font-medium",children:["Rufnummer ",ne+1]}),n.jsxs("label",{className:"flex items-center gap-1 text-sm",children:[n.jsx("input",{type:"checkbox",checked:A.isMain,onChange:fe=>{const ie=[..._];fe.target.checked?ie.forEach((de,Ge)=>de.isMain=Ge===ne):ie[ne].isMain=!1,K(ie)},className:"rounded border-gray-300"}),"Hauptnummer"]})]}),n.jsx(I,{type:"button",variant:"ghost",size:"sm",onClick:()=>{K(_.filter((fe,ie)=>ie!==ne))},children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3",children:[n.jsx($,{label:"Rufnummer",value:A.phoneNumber,onChange:fe=>{const ie=[..._];ie[ne].phoneNumber=fe.target.value,K(ie)},placeholder:"z.B. 030 123456"}),n.jsx($,{label:"SIP-Benutzername",value:A.sipUsername,onChange:fe=>{const ie=[..._];ie[ne].sipUsername=fe.target.value,K(ie)}}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:A.hasExistingSipPassword?"SIP-Passwort (bereits hinterlegt)":"SIP-Passwort"}),n.jsxs("div",{className:"relative",children:[n.jsx("input",{type:it[ne]?"text":"password",value:A.sipPassword,onChange:fe=>{const ie=[..._];ie[ne].sipPassword=fe.target.value,K(ie)},placeholder:A.hasExistingSipPassword?"Leer = beibehalten":"",className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),n.jsx("button",{type:"button",onClick:()=>V(fe=>({...fe,[ne]:!fe[ne]})),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:it[ne]?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]})]}),n.jsx($,{label:"SIP-Server",value:A.sipServer,onChange:fe=>{const ie=[..._];ie[ne].sipServer=fe.target.value,K(ie)},placeholder:"z.B. sip.provider.de"})]})]},ne))}),n.jsxs(I,{type:"button",variant:"secondary",onClick:()=>{K([..._,{phoneNumber:"",sipUsername:"",sipPassword:"",sipServer:"",isMain:_.length===0}])},children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Rufnummer hinzufügen"]})]})]}),p==="MOBILE"&&n.jsxs(n.Fragment,{children:[n.jsxs(Z,{className:"mb-6",title:"Mobilfunk-Details",children:[n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx($,{label:"Datenvolumen (GB)",type:"number",...l("dataVolume")}),n.jsx($,{label:"Inklusiv-Minuten",type:"number",...l("includedMinutes")}),n.jsx($,{label:"Inklusiv-SMS",type:"number",...l("includedSMS")}),n.jsx($,{label:"Gerät (Modell)",...l("deviceModel")}),n.jsx($,{label:"Gerät (IMEI)",...l("deviceImei")})]}),n.jsx("div",{className:"mt-4 pt-4 border-t",children:n.jsxs("label",{className:"flex items-start gap-3 cursor-pointer",children:[n.jsx("input",{type:"checkbox",...l("requiresMultisim"),className:"mt-1 rounded border-gray-300"}),n.jsxs("div",{children:[n.jsx("span",{className:"font-medium",children:"Multisim erforderlich"}),n.jsx("p",{className:"text-sm text-amber-600 mt-1",children:"Hinweis: Multisim ist bei Klarmobil, Congstar und Otelo nicht buchbar. Muss Freenet oder vergleichbar sein."})]})]})})]}),n.jsxs(Z,{className:"mb-6",title:"SIM-Karten",children:[n.jsx("p",{className:"text-sm text-gray-500 mb-4",children:"Hier können Sie alle SIM-Karten zum Vertrag erfassen (Hauptkarte und Multisim-Karten)."}),L.length>0&&n.jsx("div",{className:"space-y-4 mb-4",children:L.map((A,ne)=>n.jsxs("div",{className:"p-4 border rounded-lg bg-gray-50",children:[n.jsxs("div",{className:"flex justify-between items-center mb-3",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsxs("span",{className:"font-medium",children:["SIM-Karte ",ne+1]}),n.jsxs("label",{className:"flex items-center gap-1 text-sm",children:[n.jsx("input",{type:"checkbox",checked:A.isMain,onChange:fe=>{const ie=[...L];fe.target.checked?ie.forEach((de,Ge)=>de.isMain=Ge===ne):ie[ne].isMain=!1,T(ie)},className:"rounded border-gray-300"}),"Hauptkarte"]}),n.jsxs("label",{className:"flex items-center gap-1 text-sm",children:[n.jsx("input",{type:"checkbox",checked:A.isMultisim,onChange:fe=>{const ie=[...L];ie[ne].isMultisim=fe.target.checked,T(ie)},className:"rounded border-gray-300"}),"Multisim"]})]}),n.jsx(I,{type:"button",variant:"ghost",size:"sm",onClick:()=>{T(L.filter((fe,ie)=>ie!==ne))},children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-3",children:[n.jsx($,{label:"Rufnummer",value:A.phoneNumber,onChange:fe=>{const ie=[...L];ie[ne].phoneNumber=fe.target.value,T(ie)},placeholder:"z.B. 0171 1234567"}),n.jsx($,{label:"SIM-Kartennummer",value:A.simCardNumber,onChange:fe=>{const ie=[...L];ie[ne].simCardNumber=fe.target.value,T(ie)},placeholder:"ICCID"}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:A.hasExistingPin?"PIN (bereits hinterlegt)":"PIN"}),n.jsxs("div",{className:"relative",children:[n.jsx("input",{type:Ce[ne]?"text":"password",value:A.pin,onChange:fe=>{const ie=[...L];ie[ne].pin=fe.target.value,T(ie)},placeholder:A.hasExistingPin?"Leer = beibehalten":"4-stellig",className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),n.jsx("button",{type:"button",onClick:()=>Me(fe=>({...fe,[ne]:!fe[ne]})),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:Ce[ne]?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:A.hasExistingPuk?"PUK (bereits hinterlegt)":"PUK"}),n.jsxs("div",{className:"relative",children:[n.jsx("input",{type:ht[ne]?"text":"password",value:A.puk,onChange:fe=>{const ie=[...L];ie[ne].puk=fe.target.value,T(ie)},placeholder:A.hasExistingPuk?"Leer = beibehalten":"8-stellig",className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),n.jsx("button",{type:"button",onClick:()=>Tt(fe=>({...fe,[ne]:!fe[ne]})),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:ht[ne]?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]})]})]})]},ne))}),n.jsxs(I,{type:"button",variant:"secondary",onClick:()=>{T([...L,{phoneNumber:"",simCardNumber:"",pin:"",puk:"",isMultisim:!1,isMain:L.length===0}])},children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"SIM-Karte hinzufügen"]})]})]}),p==="TV"&&n.jsx(Z,{className:"mb-6",title:"TV-Details",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx($,{label:"Receiver Modell",...l("receiverModel")}),n.jsx($,{label:"Smartcard-Nummer",...l("smartcardNumber")}),n.jsx($,{label:"Paket",...l("tvPackage"),placeholder:"z.B. Basis, Premium, Sport"})]})}),p==="CAR_INSURANCE"&&n.jsx(Z,{className:"mb-6",title:"KFZ-Versicherung Details",children:n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[n.jsx($,{label:"Kennzeichen",...l("licensePlate")}),n.jsx($,{label:"HSN",...l("hsn")}),n.jsx($,{label:"TSN",...l("tsn")}),n.jsx($,{label:"FIN (VIN)",...l("vin")}),n.jsx($,{label:"Fahrzeugtyp",...l("vehicleType")}),n.jsx($,{label:"Erstzulassung",type:"date",...l("firstRegistration"),value:u("firstRegistration")||"",onClear:()=>d("firstRegistration","")}),n.jsx($,{label:"SF-Klasse",...l("noClaimsClass")}),n.jsx(Le,{label:"Versicherungsart",...l("insuranceType"),options:[{value:"LIABILITY",label:"Haftpflicht"},{value:"PARTIAL",label:"Teilkasko"},{value:"FULL",label:"Vollkasko"}]}),n.jsx($,{label:"SB Teilkasko (€)",type:"number",...l("deductiblePartial")}),n.jsx($,{label:"SB Vollkasko (€)",type:"number",...l("deductibleFull")}),n.jsx($,{label:"Versicherungsscheinnummer",...l("policyNumber")}),n.jsx($,{label:"Vorversicherer",...l("previousInsurer")})]})}),n.jsx(Z,{className:"mb-6",title:"Notizen",children:n.jsx("textarea",{...l("notes"),rows:4,className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"Interne Notizen..."})}),n.jsxs("div",{className:"flex justify-end gap-4",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:()=>s(-1),children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:hn,children:hn?"Speichern...":"Speichern"})]})]})]})}const MS={ELECTRICITY:mh,GAS:Jy,DSL:ea,CABLE:ea,FIBER:ea,MOBILE:dh,TV:sv,CAR_INSURANCE:Hy},LS={ELECTRICITY:"Strom",GAS:"Gas",DSL:"DSL",CABLE:"Kabel",FIBER:"Glasfaser",MOBILE:"Mobilfunk",TV:"TV",CAR_INSURANCE:"KFZ"},RS={critical:"bg-red-100 border-red-300 text-red-800",warning:"bg-yellow-100 border-yellow-300 text-yellow-800",ok:"bg-green-100 border-green-300 text-green-800",none:"bg-gray-100 border-gray-300 text-gray-800"},OS={critical:"danger",warning:"warning",ok:"success",none:"default"},_S={cancellation_deadline:Qy,contract_ending:qn,missing_cancellation_letter:vt,missing_cancellation_confirmation:vt,missing_portal_credentials:y1,missing_customer_number:vt,missing_provider:vt,missing_address:vt,missing_bank:vt,missing_meter:mh,missing_sim:dh,open_tasks:Ii,pending_status:qn,draft_status:vt},zS={cancellationDeadlines:"Kündigungsfristen",contractEnding:"Vertragsenden",missingCredentials:"Fehlende Zugangsdaten",missingData:"Fehlende Daten",openTasks:"Offene Aufgaben",pendingContracts:"Wartende Verträge"};function US(){var g;const[e,t]=Uo(),[s,r]=w.useState(new Set),a=e.get("filter"),[i,l]=w.useState(a||"all");w.useEffect(()=>{i==="all"?e.delete("filter"):e.set("filter",i),t(e,{replace:!0})},[i,e,t]);const{data:o,isLoading:c,error:u}=ge({queryKey:["contract-cockpit"],queryFn:()=>$e.getCockpit(),staleTime:0}),d=b=>{r(y=>{const v=new Set(y);return v.has(b)?v.delete(b):v.add(b),v})},m=w.useMemo(()=>{var y;if(!((y=o==null?void 0:o.data)!=null&&y.contracts))return[];const b=o.data.contracts;switch(i){case"critical":return b.filter(v=>v.highestUrgency==="critical");case"warning":return b.filter(v=>v.highestUrgency==="warning");case"ok":return b.filter(v=>v.highestUrgency==="ok");case"deadlines":return b.filter(v=>v.issues.some(x=>["cancellation_deadline","contract_ending"].includes(x.type)));case"credentials":return b.filter(v=>v.issues.some(x=>x.type.includes("credentials")));case"data":return b.filter(v=>v.issues.some(x=>x.type.startsWith("missing_")&&!x.type.includes("credentials")));case"tasks":return b.filter(v=>v.issues.some(x=>["open_tasks","pending_status","draft_status"].includes(x.type)));default:return b}},[(g=o==null?void 0:o.data)==null?void 0:g.contracts,i]);if(c)return n.jsx("div",{className:"flex items-center justify-center py-12",children:n.jsx("div",{className:"text-gray-500",children:"Laden..."})});if(u||!(o!=null&&o.data))return n.jsx("div",{className:"text-center py-12",children:n.jsx("p",{className:"text-red-500",children:"Fehler beim Laden des Cockpits"})});const{summary:p,thresholds:h}=o.data,f=b=>{var x,N,k,D;const y=s.has(b.id),v=MS[b.type]||vt;return n.jsxs("div",{className:`border rounded-lg mb-2 ${RS[b.highestUrgency]}`,children:[n.jsxs("div",{className:"flex items-center p-4 cursor-pointer hover:bg-opacity-50",onClick:()=>d(b.id),children:[n.jsx("div",{className:"w-6 mr-2",children:y?n.jsx(Qo,{className:"w-5 h-5"}):n.jsx(Ys,{className:"w-5 h-5"})}),n.jsx(v,{className:"w-5 h-5 mr-3"}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsx(Se,{to:`/contracts/${b.id}`,state:{from:"cockpit",filter:i!=="all"?i:void 0},className:"font-medium hover:underline",onClick:F=>F.stopPropagation(),children:b.contractNumber}),n.jsxs(he,{variant:OS[b.highestUrgency],children:[b.issues.length," ",b.highestUrgency==="ok"?b.issues.length===1?"Hinweis":"Hinweise":b.issues.length===1?"Problem":"Probleme"]}),n.jsx("span",{className:"text-sm",children:LS[b.type]})]}),n.jsxs("div",{className:"text-sm mt-1",children:[n.jsxs(Se,{to:`/customers/${b.customer.id}`,className:"hover:underline",onClick:F=>F.stopPropagation(),children:[b.customer.customerNumber," - ",b.customer.name]}),(((x=b.provider)==null?void 0:x.name)||b.providerName)&&n.jsxs("span",{className:"ml-2",children:["| ",((N=b.provider)==null?void 0:N.name)||b.providerName,(((k=b.tariff)==null?void 0:k.name)||b.tariffName)&&` - ${((D=b.tariff)==null?void 0:D.name)||b.tariffName}`]})]})]}),n.jsx(Se,{to:`/contracts/${b.id}`,state:{from:"cockpit",filter:i!=="all"?i:void 0},className:"ml-4 p-2 hover:bg-white hover:bg-opacity-50 rounded",onClick:F=>F.stopPropagation(),title:"Zum Vertrag",children:n.jsx(Ee,{className:"w-4 h-4"})})]}),y&&n.jsx("div",{className:"border-t px-4 py-3 bg-white bg-opacity-50",children:n.jsx("div",{className:"space-y-2",children:b.issues.map((F,S)=>{const L=_S[F.type]||en,T=F.urgency==="critical"?en:F.urgency==="warning"?Li:F.urgency==="ok"?hs:qn;return n.jsxs("div",{className:"flex items-start gap-3 text-sm",children:[n.jsx(T,{className:`w-4 h-4 mt-0.5 flex-shrink-0 ${F.urgency==="critical"?"text-red-500":F.urgency==="warning"?"text-yellow-500":F.urgency==="ok"?"text-green-500":"text-gray-500"}`}),n.jsx(L,{className:"w-4 h-4 mt-0.5 flex-shrink-0 text-gray-500"}),n.jsxs("div",{children:[n.jsx("span",{className:"font-medium",children:F.label}),F.details&&n.jsx("span",{className:"text-gray-600 ml-2",children:F.details})]})]},S)})})})]},b.id)};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(en,{className:"w-6 h-6 text-red-500"}),n.jsx("h1",{className:"text-2xl font-bold",children:"Vertrags-Cockpit"})]}),n.jsx(Se,{to:"/settings/deadlines",className:"text-sm text-blue-600 hover:underline",children:"Fristenschwellen anpassen"})]}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-4 mb-6",children:[n.jsx(Z,{className:"!p-4",children:n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx("div",{className:"p-2 bg-red-100 rounded-lg",children:n.jsx(en,{className:"w-6 h-6 text-red-500"})}),n.jsxs("div",{children:[n.jsx("p",{className:"text-2xl font-bold text-red-600",children:p.criticalCount}),n.jsxs("p",{className:"text-sm text-gray-500",children:["Kritisch (<",h.criticalDays," Tage)"]})]})]})}),n.jsx(Z,{className:"!p-4",children:n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx("div",{className:"p-2 bg-yellow-100 rounded-lg",children:n.jsx(Li,{className:"w-6 h-6 text-yellow-500"})}),n.jsxs("div",{children:[n.jsx("p",{className:"text-2xl font-bold text-yellow-600",children:p.warningCount}),n.jsxs("p",{className:"text-sm text-gray-500",children:["Warnung (<",h.warningDays," Tage)"]})]})]})}),n.jsx(Z,{className:"!p-4",children:n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx("div",{className:"p-2 bg-green-100 rounded-lg",children:n.jsx(hs,{className:"w-6 h-6 text-green-500"})}),n.jsxs("div",{children:[n.jsx("p",{className:"text-2xl font-bold text-green-600",children:p.okCount}),n.jsxs("p",{className:"text-sm text-gray-500",children:["OK (<",h.okDays," Tage)"]})]})]})}),n.jsx(Z,{className:"!p-4",children:n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx("div",{className:"p-2 bg-gray-100 rounded-lg",children:n.jsx(vt,{className:"w-6 h-6 text-gray-500"})}),n.jsxs("div",{children:[n.jsx("p",{className:"text-2xl font-bold text-gray-600",children:p.totalContracts}),n.jsx("p",{className:"text-sm text-gray-500",children:"Verträge mit Handlungsbedarf"})]})]})})]}),n.jsx(Z,{className:"mb-6",children:n.jsx("div",{className:"flex flex-wrap gap-4",children:Object.entries(p.byCategory).map(([b,y])=>y>0&&n.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[n.jsxs("span",{className:"font-medium",children:[zS[b]||b,":"]}),n.jsx(he,{variant:"default",children:y})]},b))})}),n.jsx(Z,{className:"mb-6",children:n.jsxs("div",{className:"flex items-center gap-4",children:[n.jsx("span",{className:"text-sm text-gray-600",children:"Filter:"}),n.jsx(Le,{value:i,onChange:b=>l(b.target.value),options:[{value:"all",label:`Alle (${o.data.contracts.length})`},{value:"critical",label:`Kritisch (${p.criticalCount})`},{value:"warning",label:`Warnung (${p.warningCount})`},{value:"ok",label:`OK (${p.okCount})`},{value:"deadlines",label:`Fristen (${p.byCategory.cancellationDeadlines+p.byCategory.contractEnding})`},{value:"credentials",label:`Zugangsdaten (${p.byCategory.missingCredentials})`},{value:"data",label:`Fehlende Daten (${p.byCategory.missingData})`},{value:"tasks",label:`Aufgaben/Status (${p.byCategory.openTasks+p.byCategory.pendingContracts})`}],className:"w-64"}),n.jsxs("span",{className:"text-sm text-gray-500",children:[m.length," Verträge angezeigt"]})]})}),m.length===0?n.jsx(Z,{children:n.jsx("div",{className:"text-center py-8 text-gray-500",children:i==="all"?n.jsxs(n.Fragment,{children:[n.jsx(hs,{className:"w-12 h-12 mx-auto mb-4 text-green-500"}),n.jsx("p",{className:"text-lg font-medium",children:"Alles in Ordnung!"}),n.jsx("p",{children:"Keine Verträge mit Handlungsbedarf gefunden."})]}):n.jsx("p",{children:"Keine Verträge für diesen Filter gefunden."})})}):n.jsx("div",{children:m.map(f)})]})}const Cp={OPEN:"Offen",COMPLETED:"Erledigt"},$S={OPEN:"warning",COMPLETED:"success"};function BS(){var Q;const e=Ut(),t=pe(),{isCustomerPortal:s,user:r,hasPermission:a}=st(),[i,l]=w.useState("OPEN"),[o,c]=w.useState(new Set),[u,d]=w.useState(!1),[m,p]=w.useState({}),h=s?"Support-Anfragen":"Aufgaben",f=s?"Anfrage":"Aufgabe",{data:g,isLoading:b}=ge({queryKey:["app-settings-public"],queryFn:()=>Sr.getPublic(),enabled:s,staleTime:0}),y=!b&&((Q=g==null?void 0:g.data)==null?void 0:Q.customerSupportTicketsEnabled)==="true",{data:v,isLoading:x}=ge({queryKey:["all-tasks",i],queryFn:()=>Xe.getAll({status:i||void 0}),staleTime:0}),N=Y({mutationFn:z=>Xe.completeSubtask(z),onSuccess:()=>{t.invalidateQueries({queryKey:["all-tasks"]}),t.invalidateQueries({queryKey:["task-stats"]})}}),k=Y({mutationFn:z=>Xe.reopenSubtask(z),onSuccess:()=>{t.invalidateQueries({queryKey:["all-tasks"]}),t.invalidateQueries({queryKey:["task-stats"]})}}),D=Y({mutationFn:({taskId:z,title:P})=>s?Xe.createReply(z,P):Xe.createSubtask(z,P),onSuccess:(z,{taskId:P})=>{t.invalidateQueries({queryKey:["all-tasks"]}),p(j=>({...j,[P]:""}))}}),F=w.useMemo(()=>{var B;if(!(v!=null&&v.data))return{ownTasks:[],representedTasks:[],allTasks:[]};const z=v.data;if(!s)return{allTasks:z,ownTasks:[],representedTasks:[]};const P=[],j=[];for(const J of z)((B=J.contract)==null?void 0:B.customerId)===(r==null?void 0:r.customerId)?P.push(J):j.push(J);return{ownTasks:P,representedTasks:j,allTasks:[]}},[v==null?void 0:v.data,s,r==null?void 0:r.customerId]),S=z=>{c(P=>{const j=new Set(P);return j.has(z)?j.delete(z):j.add(z),j})},L=z=>{N.isPending||k.isPending||(z.status==="COMPLETED"?k.mutate(z.id):N.mutate(z.id))},T=z=>{var j;const P=(j=m[z])==null?void 0:j.trim();P&&D.mutate({taskId:z,title:P})},_=!s&&a("contracts:update"),K=(z,P=!1)=>{var V,Ce,Me,ht,Tt,Jt;const j=o.has(z.id),B=z.subtasks&&z.subtasks.length>0,J=((V=z.subtasks)==null?void 0:V.filter(Pe=>Pe.status==="COMPLETED").length)||0,ee=((Ce=z.subtasks)==null?void 0:Ce.length)||0,me=z.status==="COMPLETED",ve=z.contract?`${z.contract.contractNumber} - ${((Me=z.contract.provider)==null?void 0:Me.name)||z.contract.providerName||"Kein Anbieter"}`:`Vertrag #${z.contractId}`,it=(ht=z.contract)!=null&&ht.customer?z.contract.customer.companyName||`${z.contract.customer.firstName} ${z.contract.customer.lastName}`:"";return n.jsxs("div",{className:"border rounded-lg mb-2",children:[n.jsxs("div",{className:"flex items-center p-4 hover:bg-gray-50 cursor-pointer",onClick:()=>S(z.id),children:[n.jsx("div",{className:"w-6 mr-2",children:j?n.jsx(Qo,{className:"w-5 h-5 text-gray-400"}):n.jsx(Ys,{className:"w-5 h-5 text-gray-400"})}),n.jsx("div",{className:"mr-3",children:z.status==="COMPLETED"?n.jsx(hs,{className:"w-5 h-5 text-green-500"}):n.jsx(qn,{className:"w-5 h-5 text-yellow-500"})}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsx("span",{className:"font-medium",children:z.title}),n.jsx(he,{variant:$S[z.status],children:Cp[z.status]}),B&&n.jsxs("span",{className:"text-xs text-gray-500",children:["(",J,"/",ee," erledigt)"]})]}),n.jsxs("div",{className:"text-sm text-gray-500 mt-1 flex items-center gap-2",children:[n.jsx(vt,{className:"w-4 h-4"}),n.jsx(Se,{to:`/contracts/${z.contractId}`,className:"text-blue-600 hover:underline",onClick:Pe=>Pe.stopPropagation(),children:ve}),P&&it&&n.jsxs(n.Fragment,{children:[n.jsx("span",{className:"text-gray-400",children:"|"}),n.jsx("span",{children:it})]})]}),z.description&&n.jsx("p",{className:"text-sm text-gray-600 mt-1 line-clamp-2",children:z.description})]}),n.jsx("div",{className:"ml-4 flex gap-2",children:n.jsx(I,{variant:"ghost",size:"sm",onClick:Pe=>{Pe.stopPropagation(),e(`/contracts/${z.contractId}`)},title:"Zum Vertrag",children:n.jsx(Ee,{className:"w-4 h-4"})})})]}),j&&n.jsxs("div",{className:"border-t bg-gray-50 px-4 py-3",children:[B&&n.jsx("div",{className:"space-y-2 mb-4",children:(Tt=z.subtasks)==null?void 0:Tt.map(Pe=>{const Xt=new Date(Pe.createdAt).toLocaleDateString("de-DE",{day:"2-digit",month:"2-digit",year:"numeric"});return n.jsxs("div",{className:`flex items-start gap-2 text-sm ml-6 ${_?"cursor-pointer hover:bg-gray-100 rounded px-2 py-1 -mx-2":""}`,onClick:_?()=>L(Pe):void 0,children:[n.jsx("span",{className:"flex-shrink-0 mt-0.5",children:Pe.status==="COMPLETED"?n.jsx(hs,{className:"w-4 h-4 text-green-500"}):n.jsx(_l,{className:"w-4 h-4 text-gray-400"})}),n.jsxs("span",{className:Pe.status==="COMPLETED"?"text-gray-500 line-through":"",children:[Pe.title,n.jsxs("span",{className:"text-xs text-gray-400 ml-2",children:[Pe.createdBy," • ",Xt]})]})]},Pe.id)})}),!me&&(_||s)&&n.jsxs("div",{className:"flex gap-2 ml-6",children:[n.jsx($,{placeholder:s?"Antwort schreiben...":"Neue Unteraufgabe...",value:m[z.id]||"",onChange:Pe=>p(Xt=>({...Xt,[z.id]:Pe.target.value})),onKeyDown:Pe=>{Pe.key==="Enter"&&!Pe.shiftKey&&(Pe.preventDefault(),T(z.id))},className:"flex-1"}),n.jsx(I,{size:"sm",onClick:()=>T(z.id),disabled:!((Jt=m[z.id])!=null&&Jt.trim())||D.isPending,children:n.jsx(k1,{className:"w-4 h-4"})})]}),!B&&me&&n.jsx("p",{className:"text-gray-500 text-sm text-center py-2",children:"Keine Unteraufgaben vorhanden."})]})]},z.id)},W=s?y:a("contracts:update");return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsx("h1",{className:"text-2xl font-bold",children:h}),W&&n.jsxs(I,{onClick:()=>d(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neue ",f]})]}),n.jsx(Z,{className:"mb-6",children:n.jsx("div",{className:"flex gap-4 flex-wrap items-center",children:n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"text-sm text-gray-600",children:"Status:"}),n.jsx(Le,{value:i,onChange:z=>l(z.target.value),options:[{value:"",label:"Alle"},...Object.entries(Cp).map(([z,P])=>({value:z,label:P}))],className:"w-40"})]})})}),x?n.jsx(Z,{children:n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."})}):n.jsx(n.Fragment,{children:s?n.jsxs("div",{className:"space-y-6",children:[n.jsxs(Z,{children:[n.jsxs("div",{className:"flex items-center gap-3 mb-4 pb-3 border-b",children:[n.jsx(hh,{className:"w-5 h-5 text-blue-600"}),n.jsxs("h2",{className:"text-lg font-semibold text-gray-900",children:["Meine ",h]}),n.jsx(he,{variant:"default",children:F.ownTasks.length})]}),F.ownTasks.length>0?n.jsx("div",{children:F.ownTasks.map(z=>K(z,!1))}):n.jsxs("p",{className:"text-gray-500 text-center py-4",children:["Keine eigenen ",h.toLowerCase()," vorhanden."]})]}),F.representedTasks.length>0&&n.jsxs(Z,{children:[n.jsxs("div",{className:"flex items-center gap-3 mb-4 pb-3 border-b",children:[n.jsx(Xr,{className:"w-5 h-5 text-purple-600"}),n.jsxs("h2",{className:"text-lg font-semibold text-gray-900",children:[h," freigegebener Kunden"]}),n.jsx(he,{variant:"default",children:F.representedTasks.length})]}),n.jsx("div",{children:F.representedTasks.map(z=>K(z,!0))})]})]}):n.jsx(Z,{children:F.allTasks&&F.allTasks.length>0?n.jsx("div",{children:F.allTasks.map(z=>K(z,!0))}):n.jsxs("div",{className:"text-center py-8 text-gray-500",children:["Keine ",h.toLowerCase()," gefunden."]})})}),s?n.jsx(KS,{isOpen:u,onClose:()=>d(!1)}):n.jsx(VS,{isOpen:u,onClose:()=>d(!1)})]})}function KS({isOpen:e,onClose:t}){const{user:s}=st(),r=Ut(),a=pe(),[i,l]=w.useState("own"),[o,c]=w.useState(null),[u,d]=w.useState(""),[m,p]=w.useState(""),[h,f]=w.useState(!1),[g,b]=w.useState(""),{data:y}=ge({queryKey:["contracts",s==null?void 0:s.customerId],queryFn:()=>$e.getAll({customerId:s==null?void 0:s.customerId}),enabled:e}),v=w.useMemo(()=>{if(!(y!=null&&y.data))return{own:[],represented:{}};const S=[],L={};for(const T of y.data)if(T.customerId===(s==null?void 0:s.customerId))S.push(T);else{if(!L[T.customerId]){const _=T.customer?T.customer.companyName||`${T.customer.firstName} ${T.customer.lastName}`:`Kunde ${T.customerId}`;L[T.customerId]={name:_,contracts:[]}}L[T.customerId].contracts.push(T)}return{own:S,represented:L}},[y==null?void 0:y.data,s==null?void 0:s.customerId]),x=Object.keys(v.represented).length>0,N=w.useMemo(()=>{var S;return i==="own"?v.own:((S=v.represented[i])==null?void 0:S.contracts)||[]},[i,v]),k=w.useMemo(()=>{if(!g)return N;const S=g.toLowerCase();return N.filter(L=>L.contractNumber.toLowerCase().includes(S)||(L.providerName||"").toLowerCase().includes(S)||(L.tariffName||"").toLowerCase().includes(S))},[N,g]),D=async()=>{if(!(!o||!u.trim())){f(!0);try{await Xe.createSupportTicket(o,{title:u.trim(),description:m.trim()||void 0}),a.invalidateQueries({queryKey:["all-tasks"]}),a.invalidateQueries({queryKey:["task-stats"]}),t(),d(""),p(""),c(null),l("own"),r(`/contracts/${o}`)}catch(S){console.error("Fehler beim Erstellen der Support-Anfrage:",S),alert("Fehler beim Erstellen der Support-Anfrage. Bitte versuchen Sie es erneut.")}finally{f(!1)}}},F=()=>{d(""),p(""),c(null),l("own"),b(""),t()};return n.jsx(dt,{isOpen:e,onClose:F,title:"Neue Support-Anfrage",children:n.jsxs("div",{className:"space-y-4",children:[x&&n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Kunde"}),n.jsxs("select",{value:i,onChange:S=>{const L=S.target.value;l(L==="own"?"own":parseInt(L)),c(null),b("")},className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500",children:[n.jsx("option",{value:"own",children:"Eigene Verträge"}),Object.entries(v.represented).map(([S,{name:L}])=>n.jsx("option",{value:S,children:L},S))]})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Vertrag *"}),n.jsx($,{placeholder:"Vertrag suchen...",value:g,onChange:S=>b(S.target.value),className:"mb-2"}),n.jsx("div",{className:"max-h-48 overflow-y-auto border rounded-lg",children:k.length>0?k.map(S=>n.jsxs("div",{onClick:()=>c(S.id),className:`p-3 cursor-pointer border-b last:border-b-0 hover:bg-gray-50 ${o===S.id?"bg-blue-50 border-blue-200":""}`,children:[n.jsx("div",{className:"font-medium",children:S.contractNumber}),n.jsxs("div",{className:"text-sm text-gray-500",children:[S.providerName||"Kein Anbieter",S.tariffName&&` - ${S.tariffName}`]})]},S.id)):n.jsx("div",{className:"p-3 text-gray-500 text-center",children:"Keine Verträge gefunden."})})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Titel *"}),n.jsx($,{value:u,onChange:S=>d(S.target.value),placeholder:"Kurze Beschreibung Ihres Anliegens"})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Beschreibung"}),n.jsx("textarea",{value:m,onChange:S=>p(S.target.value),placeholder:"Detaillierte Beschreibung (optional)",rows:4,className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),n.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[n.jsx(I,{variant:"secondary",onClick:F,children:"Abbrechen"}),n.jsx(I,{onClick:D,disabled:!o||!u.trim()||h,children:h?"Wird erstellt...":"Anfrage erstellen"})]})]})})}function VS({isOpen:e,onClose:t}){const s=Ut(),r=pe(),[a,i]=w.useState(null),[l,o]=w.useState(null),[c,u]=w.useState(""),[d,m]=w.useState(""),[p,h]=w.useState(!1),[f,g]=w.useState(!1),[b,y]=w.useState(""),[v,x]=w.useState(""),{data:N}=ge({queryKey:["customers-for-task"],queryFn:()=>yt.getAll({limit:100}),enabled:e}),{data:k}=ge({queryKey:["contracts-for-task",a],queryFn:()=>$e.getAll({customerId:a}),enabled:e&&a!==null}),D=w.useMemo(()=>{if(!(N!=null&&N.data))return[];if(!b)return N.data;const _=b.toLowerCase();return N.data.filter(K=>K.customerNumber.toLowerCase().includes(_)||K.firstName.toLowerCase().includes(_)||K.lastName.toLowerCase().includes(_)||(K.companyName||"").toLowerCase().includes(_))},[N==null?void 0:N.data,b]),F=w.useMemo(()=>{if(!(k!=null&&k.data))return[];if(!v)return k.data;const _=v.toLowerCase();return k.data.filter(K=>K.contractNumber.toLowerCase().includes(_)||(K.providerName||"").toLowerCase().includes(_)||(K.tariffName||"").toLowerCase().includes(_))},[k==null?void 0:k.data,v]),S=async()=>{if(!(!l||!c.trim())){g(!0);try{await Xe.create(l,{title:c.trim(),description:d.trim()||void 0,visibleInPortal:p}),r.invalidateQueries({queryKey:["all-tasks"]}),r.invalidateQueries({queryKey:["task-stats"]}),t(),u(""),m(""),h(!1),o(null),i(null),s(`/contracts/${l}`)}catch(_){console.error("Fehler beim Erstellen der Aufgabe:",_),alert("Fehler beim Erstellen der Aufgabe. Bitte versuchen Sie es erneut.")}finally{g(!1)}}},L=()=>{u(""),m(""),h(!1),o(null),i(null),y(""),x(""),t()},T=_=>{const K=_.companyName||`${_.firstName} ${_.lastName}`;return`${_.customerNumber} - ${K}`};return n.jsx(dt,{isOpen:e,onClose:L,title:"Neue Aufgabe",children:n.jsxs("div",{className:"space-y-4",children:[n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Kunde *"}),n.jsx($,{placeholder:"Kunde suchen...",value:b,onChange:_=>y(_.target.value),className:"mb-2"}),n.jsx("div",{className:"max-h-40 overflow-y-auto border rounded-lg",children:D.length>0?D.map(_=>n.jsx("div",{onClick:()=>{i(_.id),o(null),x("")},className:`p-3 cursor-pointer border-b last:border-b-0 hover:bg-gray-50 ${a===_.id?"bg-blue-50 border-blue-200":""}`,children:n.jsx("div",{className:"font-medium",children:T(_)})},_.id)):n.jsx("div",{className:"p-3 text-gray-500 text-center",children:"Keine Kunden gefunden."})})]}),a&&n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Vertrag *"}),n.jsx($,{placeholder:"Vertrag suchen...",value:v,onChange:_=>x(_.target.value),className:"mb-2"}),n.jsx("div",{className:"max-h-40 overflow-y-auto border rounded-lg",children:F.length>0?F.map(_=>n.jsxs("div",{onClick:()=>o(_.id),className:`p-3 cursor-pointer border-b last:border-b-0 hover:bg-gray-50 ${l===_.id?"bg-blue-50 border-blue-200":""}`,children:[n.jsx("div",{className:"font-medium",children:_.contractNumber}),n.jsxs("div",{className:"text-sm text-gray-500",children:[_.providerName||"Kein Anbieter",_.tariffName&&` - ${_.tariffName}`]})]},_.id)):n.jsx("div",{className:"p-3 text-gray-500 text-center",children:k?"Keine Verträge gefunden.":"Laden..."})})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Titel *"}),n.jsx($,{value:c,onChange:_=>u(_.target.value),placeholder:"Aufgabentitel"})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Beschreibung"}),n.jsx("textarea",{value:d,onChange:_=>m(_.target.value),placeholder:"Detaillierte Beschreibung (optional)",rows:3,className:"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),n.jsx("div",{children:n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:p,onChange:_=>h(_.target.checked),className:"rounded border-gray-300 text-blue-600 focus:ring-blue-500"}),n.jsx("span",{className:"text-sm text-gray-700",children:"Im Kundenportal sichtbar"})]})}),n.jsxs("div",{className:"flex justify-end gap-2 pt-4",children:[n.jsx(I,{variant:"secondary",onClick:L,children:"Abbrechen"}),n.jsx(I,{onClick:S,disabled:!l||!c.trim()||f,children:f?"Wird erstellt...":"Aufgabe erstellen"})]})]})})}function qS(){const[e,t]=w.useState(!1),[s,r]=w.useState(null),[a,i]=w.useState(!1),{hasPermission:l}=st(),o=pe(),{data:c,isLoading:u}=ge({queryKey:["platforms",a],queryFn:()=>Pi.getAll(a)}),d=Y({mutationFn:Pi.delete,onSuccess:()=>{o.invalidateQueries({queryKey:["platforms"]})}}),m=h=>{r(h),t(!0)},p=()=>{t(!1),r(null)};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsx("h1",{className:"text-2xl font-bold",children:"Vertriebsplattformen"}),l("platforms:create")&&n.jsxs(I,{onClick:()=>t(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neue Plattform"]})]}),n.jsxs(Z,{children:[n.jsx("div",{className:"mb-4",children:n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:a,onChange:h=>i(h.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),u?n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):c!=null&&c.data&&c.data.length>0?n.jsx("div",{className:"overflow-x-auto",children:n.jsxs("table",{className:"w-full",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b",children:[n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Name"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Kontakt"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),n.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),n.jsx("tbody",{children:c.data.map(h=>n.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[n.jsx("td",{className:"py-3 px-4 font-medium",children:h.name}),n.jsx("td",{className:"py-3 px-4 text-gray-500",children:h.contactInfo||"-"}),n.jsx("td",{className:"py-3 px-4",children:n.jsx(he,{variant:h.isActive?"success":"danger",children:h.isActive?"Aktiv":"Inaktiv"})}),n.jsx("td",{className:"py-3 px-4 text-right",children:n.jsxs("div",{className:"flex justify-end gap-2",children:[l("platforms:update")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>m(h),children:n.jsx(We,{className:"w-4 h-4"})}),l("platforms:delete")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Plattform wirklich löschen?")&&d.mutate(h.id)},children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})})]},h.id))})]})}):n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Plattformen vorhanden."})]}),n.jsx(QS,{isOpen:e,onClose:p,platform:s})]})}function QS({isOpen:e,onClose:t,platform:s}){const r=pe(),[a,i]=w.useState({name:"",contactInfo:"",isActive:!0});w.useState(()=>{i(s?{name:s.name,contactInfo:s.contactInfo||"",isActive:s.isActive}:{name:"",contactInfo:"",isActive:!0})}),s&&a.name!==s.name?i({name:s.name,contactInfo:s.contactInfo||"",isActive:s.isActive}):!s&&a.name;const l=Y({mutationFn:Pi.create,onSuccess:()=>{r.invalidateQueries({queryKey:["platforms"]}),t(),i({name:"",contactInfo:"",isActive:!0})}}),o=Y({mutationFn:d=>Pi.update(s.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["platforms"]}),t()}}),c=d=>{d.preventDefault(),s?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:s?"Plattform bearbeiten":"Neue Plattform",children:n.jsxs("form",{onSubmit:c,className:"space-y-4",children:[n.jsx($,{label:"Name *",value:a.name,onChange:d=>i({...a,name:d.target.value}),required:!0}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Kontaktinformationen"}),n.jsx("textarea",{value:a.contactInfo,onChange:d=>i({...a,contactInfo:d.target.value}),rows:3,className:"block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500",placeholder:"E-Mail, Telefon, Ansprechpartner..."})]}),s&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}function HS(){const[e,t]=w.useState(!1),[s,r]=w.useState(null),[a,i]=w.useState(!1),{hasPermission:l}=st(),o=pe(),{data:c,isLoading:u}=ge({queryKey:["cancellation-periods",a],queryFn:()=>Ai.getAll(a)}),d=Y({mutationFn:Ai.delete,onSuccess:()=>{o.invalidateQueries({queryKey:["cancellation-periods"]})}}),m=h=>{r(h),t(!0)},p=()=>{t(!1),r(null)};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsx(Se,{to:"/settings",children:n.jsx(I,{variant:"ghost",size:"sm",children:n.jsx($s,{className:"w-4 h-4"})})}),n.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Kündigungsfristen"}),l("platforms:create")&&n.jsxs(I,{onClick:()=>t(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neue Frist"]})]}),n.jsxs(Z,{children:[n.jsx("div",{className:"mb-4",children:n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:a,onChange:h=>i(h.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),n.jsxs("div",{className:"mb-4 p-4 bg-blue-50 border border-blue-200 rounded-lg text-sm",children:[n.jsx("strong",{children:"Code-Format:"})," Zahl + Buchstabe (T=Tage, M=Monate, J=Jahre)",n.jsx("br",{}),n.jsx("strong",{children:"Beispiele:"})," 14T = 14 Tage, 3M = 3 Monate, 1J = 1 Jahr"]}),u?n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):c!=null&&c.data&&c.data.length>0?n.jsx("div",{className:"overflow-x-auto",children:n.jsxs("table",{className:"w-full",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b",children:[n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Code"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Beschreibung"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),n.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),n.jsx("tbody",{children:c.data.map(h=>n.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[n.jsx("td",{className:"py-3 px-4 font-mono font-medium",children:h.code}),n.jsx("td",{className:"py-3 px-4",children:h.description}),n.jsx("td",{className:"py-3 px-4",children:n.jsx(he,{variant:h.isActive?"success":"danger",children:h.isActive?"Aktiv":"Inaktiv"})}),n.jsx("td",{className:"py-3 px-4 text-right",children:n.jsxs("div",{className:"flex justify-end gap-2",children:[l("platforms:update")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>m(h),children:n.jsx(We,{className:"w-4 h-4"})}),l("platforms:delete")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Kündigungsfrist wirklich löschen?")&&d.mutate(h.id)},children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})})]},h.id))})]})}):n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Kündigungsfristen vorhanden."})]}),n.jsx(WS,{isOpen:e,onClose:p,period:s})]})}function WS({isOpen:e,onClose:t,period:s}){const r=pe(),[a,i]=w.useState({code:"",description:"",isActive:!0});w.useEffect(()=>{e&&i(s?{code:s.code,description:s.description,isActive:s.isActive}:{code:"",description:"",isActive:!0})},[e,s]);const l=Y({mutationFn:Ai.create,onSuccess:()=>{r.invalidateQueries({queryKey:["cancellation-periods"]}),t(),i({code:"",description:"",isActive:!0})}}),o=Y({mutationFn:d=>Ai.update(s.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["cancellation-periods"]}),t()}}),c=d=>{d.preventDefault(),s?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:s?"Kündigungsfrist bearbeiten":"Neue Kündigungsfrist",children:n.jsxs("form",{onSubmit:c,className:"space-y-4",children:[n.jsx($,{label:"Code *",value:a.code,onChange:d=>i({...a,code:d.target.value.toUpperCase()}),required:!0,placeholder:"z.B. 14T, 3M, 1J"}),n.jsx($,{label:"Beschreibung *",value:a.description,onChange:d=>i({...a,description:d.target.value}),required:!0,placeholder:"z.B. 14 Tage, 3 Monate, 1 Jahr"}),s&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}function GS(){const[e,t]=w.useState(!1),[s,r]=w.useState(null),[a,i]=w.useState(!1),{hasPermission:l}=st(),o=pe(),{data:c,isLoading:u}=ge({queryKey:["contract-durations",a],queryFn:()=>Ti.getAll(a)}),d=Y({mutationFn:Ti.delete,onSuccess:()=>{o.invalidateQueries({queryKey:["contract-durations"]})}}),m=h=>{r(h),t(!0)},p=()=>{t(!1),r(null)};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsx(Se,{to:"/settings",children:n.jsx(I,{variant:"ghost",size:"sm",children:n.jsx($s,{className:"w-4 h-4"})})}),n.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Vertragslaufzeiten"}),l("platforms:create")&&n.jsxs(I,{onClick:()=>t(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neue Laufzeit"]})]}),n.jsxs(Z,{children:[n.jsx("div",{className:"mb-4",children:n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:a,onChange:h=>i(h.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),n.jsxs("div",{className:"mb-4 p-4 bg-blue-50 border border-blue-200 rounded-lg text-sm",children:[n.jsx("strong",{children:"Code-Format:"})," Zahl + Buchstabe (T=Tage, M=Monate, J=Jahre)",n.jsx("br",{}),n.jsx("strong",{children:"Beispiele:"})," 12M = 12 Monate, 24M = 24 Monate, 2J = 2 Jahre"]}),u?n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):c!=null&&c.data&&c.data.length>0?n.jsx("div",{className:"overflow-x-auto",children:n.jsxs("table",{className:"w-full",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b",children:[n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Code"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Beschreibung"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),n.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),n.jsx("tbody",{children:c.data.map(h=>n.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[n.jsx("td",{className:"py-3 px-4 font-mono font-medium",children:h.code}),n.jsx("td",{className:"py-3 px-4",children:h.description}),n.jsx("td",{className:"py-3 px-4",children:n.jsx(he,{variant:h.isActive?"success":"danger",children:h.isActive?"Aktiv":"Inaktiv"})}),n.jsx("td",{className:"py-3 px-4 text-right",children:n.jsxs("div",{className:"flex justify-end gap-2",children:[l("platforms:update")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>m(h),children:n.jsx(We,{className:"w-4 h-4"})}),l("platforms:delete")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Laufzeit wirklich löschen?")&&d.mutate(h.id)},children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})})]},h.id))})]})}):n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Laufzeiten vorhanden."})]}),n.jsx(ZS,{isOpen:e,onClose:p,duration:s})]})}function ZS({isOpen:e,onClose:t,duration:s}){const r=pe(),[a,i]=w.useState({code:"",description:"",isActive:!0});w.useEffect(()=>{e&&i(s?{code:s.code,description:s.description,isActive:s.isActive}:{code:"",description:"",isActive:!0})},[e,s]);const l=Y({mutationFn:Ti.create,onSuccess:()=>{r.invalidateQueries({queryKey:["contract-durations"]}),t(),i({code:"",description:"",isActive:!0})}}),o=Y({mutationFn:d=>Ti.update(s.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["contract-durations"]}),t()}}),c=d=>{d.preventDefault(),s?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:s?"Laufzeit bearbeiten":"Neue Laufzeit",children:n.jsxs("form",{onSubmit:c,className:"space-y-4",children:[n.jsx($,{label:"Code *",value:a.code,onChange:d=>i({...a,code:d.target.value.toUpperCase()}),required:!0,placeholder:"z.B. 12M, 24M, 2J"}),n.jsx($,{label:"Beschreibung *",value:a.description,onChange:d=>i({...a,description:d.target.value}),required:!0,placeholder:"z.B. 12 Monate, 24 Monate, 2 Jahre"}),s&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}function YS(){const[e,t]=w.useState(!1),[s,r]=w.useState(null),[a,i]=w.useState(!1),[l,o]=w.useState(new Set),{hasPermission:c}=st(),u=pe(),{data:d,isLoading:m}=ge({queryKey:["providers",a],queryFn:()=>Na.getAll(a)}),p=Y({mutationFn:Na.delete,onSuccess:()=>{u.invalidateQueries({queryKey:["providers"]})},onError:b=>{alert(b.message)}}),h=b=>{o(y=>{const v=new Set(y);return v.has(b)?v.delete(b):v.add(b),v})},f=b=>{r(b),t(!0)},g=()=>{t(!1),r(null)};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsx(Se,{to:"/settings",children:n.jsx(I,{variant:"ghost",size:"sm",children:n.jsx($s,{className:"w-4 h-4"})})}),n.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Anbieter & Tarife"}),c("providers:create")&&n.jsxs(I,{onClick:()=>t(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neuer Anbieter"]})]}),n.jsxs(Z,{children:[n.jsx("div",{className:"mb-4",children:n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:a,onChange:b=>i(b.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),m?n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):d!=null&&d.data&&d.data.length>0?n.jsx("div",{className:"space-y-2",children:d.data.map(b=>n.jsx(JS,{provider:b,isExpanded:l.has(b.id),onToggle:()=>h(b.id),onEdit:()=>f(b),onDelete:()=>{confirm("Anbieter wirklich löschen?")&&p.mutate(b.id)},hasPermission:c,showInactive:a},b.id))}):n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Anbieter vorhanden."})]}),n.jsx(XS,{isOpen:e,onClose:g,provider:s})]})}function JS({provider:e,isExpanded:t,onToggle:s,onEdit:r,onDelete:a,hasPermission:i,showInactive:l}){var f,g;const[o,c]=w.useState(!1),[u,d]=w.useState(null),m=pe(),p=Y({mutationFn:$y.delete,onSuccess:()=>{m.invalidateQueries({queryKey:["providers"]})},onError:b=>{alert(b.message)}}),h=((f=e.tariffs)==null?void 0:f.filter(b=>l||b.isActive))||[];return n.jsxs("div",{className:"border rounded-lg",children:[n.jsxs("div",{className:"flex items-center p-4 hover:bg-gray-50",children:[n.jsx("button",{onClick:s,className:"mr-3 p-1 hover:bg-gray-200 rounded",children:t?n.jsx(Qo,{className:"w-5 h-5 text-gray-400"}):n.jsx(Ys,{className:"w-5 h-5 text-gray-400"})}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsx("span",{className:"font-medium",children:e.name}),n.jsx(he,{variant:e.isActive?"success":"danger",children:e.isActive?"Aktiv":"Inaktiv"}),n.jsxs("span",{className:"text-sm text-gray-500",children:["(",h.length," Tarife, ",((g=e._count)==null?void 0:g.contracts)||0," Verträge)"]})]}),e.portalUrl&&n.jsxs("a",{href:e.portalUrl,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-blue-600 hover:underline flex items-center gap-1 mt-1",children:[n.jsx(Yy,{className:"w-3 h-3"}),e.portalUrl]})]}),n.jsxs("div",{className:"flex gap-2 ml-4",children:[i("providers:update")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:r,title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),i("providers:delete")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:a,title:"Löschen",children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]}),t&&n.jsxs("div",{className:"border-t bg-gray-50 p-4",children:[n.jsxs("div",{className:"flex justify-between items-center mb-3",children:[n.jsx("h4",{className:"font-medium text-gray-700",children:"Tarife"}),i("providers:create")&&n.jsxs(I,{size:"sm",onClick:()=>c(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-1"}),"Tarif hinzufügen"]})]}),h.length>0?n.jsx("div",{className:"space-y-2",children:h.map(b=>{var y;return n.jsxs("div",{className:"flex items-center justify-between bg-white p-3 rounded border",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("span",{children:b.name}),n.jsx(he,{variant:b.isActive?"success":"danger",className:"text-xs",children:b.isActive?"Aktiv":"Inaktiv"}),((y=b._count)==null?void 0:y.contracts)!==void 0&&n.jsxs("span",{className:"text-xs text-gray-500",children:["(",b._count.contracts," Verträge)"]})]}),n.jsxs("div",{className:"flex gap-1",children:[i("providers:update")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{d(b),c(!0)},title:"Bearbeiten",children:n.jsx(We,{className:"w-3 h-3"})}),i("providers:delete")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Tarif wirklich löschen?")&&p.mutate(b.id)},title:"Löschen",children:n.jsx(be,{className:"w-3 h-3 text-red-500"})})]})]},b.id)})}):n.jsx("p",{className:"text-sm text-gray-500",children:"Keine Tarife vorhanden."})]}),n.jsx(e2,{isOpen:o,onClose:()=>{c(!1),d(null)},providerId:e.id,tariff:u})]})}function XS({isOpen:e,onClose:t,provider:s}){const r=pe(),[a,i]=w.useState({name:"",portalUrl:"",usernameFieldName:"",passwordFieldName:"",isActive:!0});w.useEffect(()=>{e&&i(s?{name:s.name,portalUrl:s.portalUrl||"",usernameFieldName:s.usernameFieldName||"",passwordFieldName:s.passwordFieldName||"",isActive:s.isActive}:{name:"",portalUrl:"",usernameFieldName:"",passwordFieldName:"",isActive:!0})},[e,s]);const l=Y({mutationFn:Na.create,onSuccess:()=>{r.invalidateQueries({queryKey:["providers"]}),t()},onError:d=>{alert(d.message)}}),o=Y({mutationFn:d=>Na.update(s.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["providers"]}),t()},onError:d=>{alert(d.message)}}),c=d=>{d.preventDefault(),s?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:s?"Anbieter bearbeiten":"Neuer Anbieter",children:n.jsxs("form",{onSubmit:c,className:"space-y-4",children:[n.jsx($,{label:"Anbietername *",value:a.name,onChange:d=>i({...a,name:d.target.value}),required:!0,placeholder:"z.B. Vodafone, E.ON, Allianz"}),n.jsx($,{label:"Portal-URL (Login-Seite)",value:a.portalUrl,onChange:d=>i({...a,portalUrl:d.target.value}),placeholder:"https://kundenportal.anbieter.de/login"}),n.jsxs("div",{className:"p-3 bg-gray-50 rounded-lg space-y-3",children:[n.jsxs("p",{className:"text-sm text-gray-600",children:[n.jsx("strong",{children:"Auto-Login Felder"})," (optional)",n.jsx("br",{}),"Feldnamen für URL-Parameter beim Auto-Login:"]}),n.jsx($,{label:"Benutzername-Feldname",value:a.usernameFieldName,onChange:d=>i({...a,usernameFieldName:d.target.value}),placeholder:"z.B. username, email, login"}),n.jsx($,{label:"Passwort-Feldname",value:a.passwordFieldName,onChange:d=>i({...a,passwordFieldName:d.target.value}),placeholder:"z.B. password, pwd, kennwort"})]}),s&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}function e2({isOpen:e,onClose:t,providerId:s,tariff:r}){const a=pe(),[i,l]=w.useState({name:"",isActive:!0});w.useEffect(()=>{e&&l(r?{name:r.name,isActive:r.isActive}:{name:"",isActive:!0})},[e,r]);const o=Y({mutationFn:m=>Na.createTariff(s,m),onSuccess:()=>{a.invalidateQueries({queryKey:["providers"]}),t()},onError:m=>{alert(m.message)}}),c=Y({mutationFn:m=>$y.update(r.id,m),onSuccess:()=>{a.invalidateQueries({queryKey:["providers"]}),t()},onError:m=>{alert(m.message)}}),u=m=>{m.preventDefault(),r?c.mutate(i):o.mutate(i)},d=o.isPending||c.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:r?"Tarif bearbeiten":"Neuer Tarif",children:n.jsxs("form",{onSubmit:u,className:"space-y-4",children:[n.jsx($,{label:"Tarifname *",value:i.name,onChange:m=>l({...i,name:m.target.value}),required:!0,placeholder:"z.B. Comfort Plus, Basic 100"}),r&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:i.isActive,onChange:m=>l({...i,isActive:m.target.checked}),className:"rounded"}),"Aktiv"]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:d,children:d?"Speichern...":"Speichern"})]})]})})}const sd={Zap:n.jsx(mh,{className:"w-5 h-5"}),Flame:n.jsx(Jy,{className:"w-5 h-5"}),Wifi:n.jsx(ea,{className:"w-5 h-5"}),Cable:n.jsx(m1,{className:"w-5 h-5"}),Smartphone:n.jsx(dh,{className:"w-5 h-5"}),Tv:n.jsx(sv,{className:"w-5 h-5"}),Car:n.jsx(Hy,{className:"w-5 h-5"}),FileText:n.jsx(vt,{className:"w-5 h-5"})},t2=[{value:"Zap",label:"Blitz (Strom)"},{value:"Flame",label:"Flamme (Gas)"},{value:"Wifi",label:"WLAN (DSL)"},{value:"Cable",label:"Kabel (Glasfaser)"},{value:"Smartphone",label:"Smartphone (Mobilfunk)"},{value:"Tv",label:"TV"},{value:"Car",label:"Auto (KFZ)"},{value:"FileText",label:"Dokument (Sonstige)"}],s2=[{value:"#FFC107",label:"Gelb"},{value:"#FF5722",label:"Orange"},{value:"#2196F3",label:"Blau"},{value:"#9C27B0",label:"Lila"},{value:"#4CAF50",label:"Grün"},{value:"#E91E63",label:"Pink"},{value:"#607D8B",label:"Grau"},{value:"#795548",label:"Braun"},{value:"#00BCD4",label:"Cyan"},{value:"#F44336",label:"Rot"}];function n2(){const[e,t]=w.useState(!1),[s,r]=w.useState(null),[a,i]=w.useState(!1),{hasPermission:l}=st(),o=pe(),{data:c,isLoading:u}=ge({queryKey:["contract-categories",a],queryFn:()=>Fi.getAll(a)}),d=Y({mutationFn:Fi.delete,onSuccess:()=>{o.invalidateQueries({queryKey:["contract-categories"]})},onError:h=>{alert(h.message)}}),m=h=>{r(h),t(!0)},p=()=>{t(!1),r(null)};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsx(Se,{to:"/settings",children:n.jsx(I,{variant:"ghost",size:"sm",children:n.jsx($s,{className:"w-4 h-4"})})}),n.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Vertragstypen"}),l("platforms:create")&&n.jsxs(I,{onClick:()=>t(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neuer Vertragstyp"]})]}),n.jsxs(Z,{children:[n.jsx("div",{className:"mb-4",children:n.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[n.jsx("input",{type:"checkbox",checked:a,onChange:h=>i(h.target.checked),className:"rounded"}),"Inaktive anzeigen"]})}),u?n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):c!=null&&c.data&&c.data.length>0?n.jsx("div",{className:"space-y-2",children:c.data.map(h=>{var f;return n.jsxs("div",{className:"flex items-center p-4 border rounded-lg hover:bg-gray-50",children:[n.jsx("div",{className:"mr-3 text-gray-400",children:n.jsx(x1,{className:"w-5 h-5"})}),n.jsx("div",{className:"w-10 h-10 rounded-lg flex items-center justify-center mr-4",style:{backgroundColor:h.color||"#E5E7EB",color:"#fff"},children:h.icon&&sd[h.icon]?sd[h.icon]:n.jsx(vt,{className:"w-5 h-5"})}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[n.jsx("span",{className:"font-medium",children:h.name}),n.jsx(he,{variant:h.isActive?"success":"danger",children:h.isActive?"Aktiv":"Inaktiv"}),n.jsxs("span",{className:"text-sm text-gray-500",children:["(",((f=h._count)==null?void 0:f.contracts)||0," Verträge)"]})]}),n.jsxs("div",{className:"text-sm text-gray-500",children:["Code: ",n.jsx("span",{className:"font-mono",children:h.code})]})]}),n.jsxs("div",{className:"flex gap-2 ml-4",children:[l("platforms:update")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>m(h),title:"Bearbeiten",children:n.jsx(We,{className:"w-4 h-4"})}),l("platforms:delete")&&n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>{confirm("Vertragstyp wirklich löschen?")&&d.mutate(h.id)},title:"Löschen",children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]},h.id)})}):n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Vertragstypen vorhanden."})]}),n.jsx(r2,{isOpen:e,onClose:p,category:s})]})}function r2({isOpen:e,onClose:t,category:s}){const r=pe(),[a,i]=w.useState({code:"",name:"",icon:"FileText",color:"#607D8B",sortOrder:0,isActive:!0});w.useEffect(()=>{e&&i(s?{code:s.code,name:s.name,icon:s.icon||"FileText",color:s.color||"#607D8B",sortOrder:s.sortOrder,isActive:s.isActive}:{code:"",name:"",icon:"FileText",color:"#607D8B",sortOrder:0,isActive:!0})},[e,s]);const l=Y({mutationFn:Fi.create,onSuccess:()=>{r.invalidateQueries({queryKey:["contract-categories"]}),t()},onError:d=>{alert(d.message)}}),o=Y({mutationFn:d=>Fi.update(s.id,d),onSuccess:()=>{r.invalidateQueries({queryKey:["contract-categories"]}),t()},onError:d=>{alert(d.message)}}),c=d=>{d.preventDefault(),s?o.mutate(a):l.mutate(a)},u=l.isPending||o.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:s?"Vertragstyp bearbeiten":"Neuer Vertragstyp",children:n.jsxs("form",{onSubmit:c,className:"space-y-4",children:[n.jsx($,{label:"Code (technisch) *",value:a.code,onChange:d=>i({...a,code:d.target.value.toUpperCase().replace(/[^A-Z0-9_]/g,"")}),required:!0,placeholder:"z.B. ELECTRICITY, MOBILE_BUSINESS",disabled:!!s}),n.jsx($,{label:"Anzeigename *",value:a.name,onChange:d=>i({...a,name:d.target.value}),required:!0,placeholder:"z.B. Strom, Mobilfunk Business"}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Icon"}),n.jsx("div",{className:"grid grid-cols-4 gap-2",children:t2.map(d=>n.jsxs("button",{type:"button",onClick:()=>i({...a,icon:d.value}),className:`p-3 border rounded-lg flex flex-col items-center gap-1 text-xs ${a.icon===d.value?"border-blue-500 bg-blue-50":"border-gray-200 hover:bg-gray-50"}`,children:[sd[d.value],n.jsx("span",{className:"truncate w-full text-center",children:d.label.split(" ")[0]})]},d.value))})]}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:"Farbe"}),n.jsx("div",{className:"flex flex-wrap gap-2",children:s2.map(d=>n.jsx("button",{type:"button",onClick:()=>i({...a,color:d.value}),className:`w-8 h-8 rounded-full border-2 ${a.color===d.value?"border-gray-800 ring-2 ring-offset-2 ring-gray-400":"border-transparent"}`,style:{backgroundColor:d.value},title:d.label},d.value))})]}),n.jsx($,{label:"Sortierung",type:"number",value:a.sortOrder,onChange:d=>i({...a,sortOrder:parseInt(d.target.value)||0}),placeholder:"0"}),s&&n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:a.isActive,onChange:d=>i({...a,isActive:d.target.checked}),className:"rounded"}),"Aktiv"]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:u,children:u?"Speichern...":"Speichern"})]})]})})}const a2=[{value:"0.1",label:"10%"},{value:"0.2",label:"20%"},{value:"0.3",label:"30%"},{value:"0.4",label:"40%"},{value:"0.5",label:"50%"},{value:"0.6",label:"60%"},{value:"0.7",label:"70% (Standard)"},{value:"0.8",label:"80%"},{value:"0.9",label:"90%"},{value:"999",label:"Deaktiviert"}];function i2(){const{settings:e,updateSettings:t}=Vy();return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsx(Se,{to:"/settings",className:"p-2 hover:bg-gray-100 rounded-lg transition-colors",children:n.jsx($s,{className:"w-5 h-5"})}),n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(Ee,{className:"w-6 h-6"}),n.jsx("h1",{className:"text-2xl font-bold",children:"Ansicht"})]})]}),n.jsx(Z,{title:"Scroll-Verhalten",children:n.jsx("div",{className:"space-y-6",children:n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsxs("div",{children:[n.jsx("p",{className:"font-medium",children:"Nach-oben-Button"}),n.jsx("p",{className:"text-sm text-gray-500",children:"Ab welcher Scroll-Position der Button unten rechts erscheinen soll"})]}),n.jsx("div",{className:"w-48",children:n.jsx(Le,{options:a2,value:e.scrollToTopThreshold.toString(),onChange:s=>t({scrollToTopThreshold:parseFloat(s.target.value)})})})]})})})]})}function l2(){const e=pe(),{data:t,isLoading:s}=ge({queryKey:["app-settings"],queryFn:()=>Sr.getAll()}),[r,a]=w.useState(!1);w.useEffect(()=>{t!=null&&t.data&&a(t.data.customerSupportTicketsEnabled==="true")},[t]);const i=Y({mutationFn:o=>Sr.update(o),onSuccess:()=>{e.invalidateQueries({queryKey:["app-settings"]}),e.invalidateQueries({queryKey:["app-settings-public"]})}}),l=o=>{a(o),i.mutate({customerSupportTicketsEnabled:o?"true":"false"})};return s?n.jsx("div",{className:"flex items-center justify-center py-12",children:n.jsx("div",{className:"text-gray-500",children:"Laden..."})}):n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsx(Se,{to:"/settings",className:"text-gray-500 hover:text-gray-700",children:n.jsx($s,{className:"w-5 h-5"})}),n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(uh,{className:"w-6 h-6"}),n.jsx("h1",{className:"text-2xl font-bold",children:"Kundenportal"})]})]}),n.jsxs(Z,{title:"Support-Anfragen",children:[n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(Mi,{className:"w-5 h-5 text-gray-500"}),n.jsxs("div",{children:[n.jsx("p",{className:"font-medium",children:"Kunden können Support-Anfragen erstellen"}),n.jsx("p",{className:"text-sm text-gray-500",children:"Wenn aktiviert, können Kunden im Portal Support-Anfragen zu ihren Verträgen erstellen. Diese erscheinen als Aufgaben in der Vertragsdetailansicht."})]})]}),n.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:r,onChange:o=>l(o.target.checked),disabled:i.isPending,className:"sr-only peer"}),n.jsx("div",{className:"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"})]})]}),r&&n.jsx("div",{className:"mt-4 p-3 bg-blue-50 border border-blue-200 rounded-lg",children:n.jsxs("p",{className:"text-sm text-blue-800",children:[n.jsx("strong",{children:"Hinweis:"}),' Kunden sehen diese Anfragen als "Support-Anfragen" in ihrem Portal. Sie können die Anfrage mit einem Titel und einer Beschreibung erstellen. Ihre Mitarbeiter können dann mit Antworten (Unteraufgaben) reagieren.']})})]})]})}function o2(){const e=pe(),{data:t,isLoading:s}=ge({queryKey:["app-settings"],queryFn:()=>Sr.getAll()}),[r,a]=w.useState("14"),[i,l]=w.useState("42"),[o,c]=w.useState("90"),[u,d]=w.useState(!1);w.useEffect(()=>{t!=null&&t.data&&(a(t.data.deadlineCriticalDays||"14"),l(t.data.deadlineWarningDays||"42"),c(t.data.deadlineOkDays||"90"),d(!1))},[t]);const m=Y({mutationFn:f=>Sr.update(f),onSuccess:()=>{e.invalidateQueries({queryKey:["app-settings"]}),e.invalidateQueries({queryKey:["contract-cockpit"]}),d(!1)}}),p=()=>{const f=parseInt(r),g=parseInt(i),b=parseInt(o);if(isNaN(f)||isNaN(g)||isNaN(b)){alert("Bitte gültige Zahlen eingeben");return}if(f>=g||g>=b){alert("Die Werte müssen aufsteigend sein: Kritisch < Warnung < OK");return}m.mutate({deadlineCriticalDays:r,deadlineWarningDays:i,deadlineOkDays:o})},h=(f,g)=>{f(g),d(!0)};return s?n.jsx("div",{className:"flex items-center justify-center py-12",children:n.jsx("div",{className:"text-gray-500",children:"Laden..."})}):n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsx(Se,{to:"/settings",className:"text-gray-500 hover:text-gray-700",children:n.jsx($s,{className:"w-5 h-5"})}),n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(qn,{className:"w-6 h-6"}),n.jsx("h1",{className:"text-2xl font-bold",children:"Fristenschwellen"})]})]}),n.jsxs(Z,{title:"Farbkodierung für Fristen",children:[n.jsx("p",{className:"text-gray-600 mb-6",children:"Definiere, ab wann Vertragsfristen als kritisch (rot), Warnung (gelb) oder OK (grün) angezeigt werden sollen. Die Werte geben die Anzahl der Tage bis zur Frist an."}),n.jsxs("div",{className:"space-y-6",children:[n.jsxs("div",{className:"flex items-center gap-4 p-4 bg-red-50 border border-red-200 rounded-lg",children:[n.jsx(en,{className:"w-8 h-8 text-red-500 flex-shrink-0"}),n.jsxs("div",{className:"flex-1",children:[n.jsx("label",{className:"block font-medium text-red-800 mb-1",children:"Kritisch (Rot)"}),n.jsx("p",{className:"text-sm text-red-600 mb-2",children:"Fristen mit weniger als X Tagen werden rot markiert"}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx($,{type:"number",min:"1",value:r,onChange:f=>h(a,f.target.value),className:"w-24"}),n.jsx("span",{className:"text-red-700",children:"Tage"})]})]})]}),n.jsxs("div",{className:"flex items-center gap-4 p-4 bg-yellow-50 border border-yellow-200 rounded-lg",children:[n.jsx(Li,{className:"w-8 h-8 text-yellow-500 flex-shrink-0"}),n.jsxs("div",{className:"flex-1",children:[n.jsx("label",{className:"block font-medium text-yellow-800 mb-1",children:"Warnung (Gelb)"}),n.jsx("p",{className:"text-sm text-yellow-600 mb-2",children:"Fristen mit weniger als X Tagen werden gelb markiert"}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx($,{type:"number",min:"1",value:i,onChange:f=>h(l,f.target.value),className:"w-24"}),n.jsx("span",{className:"text-yellow-700",children:"Tage"})]})]})]}),n.jsxs("div",{className:"flex items-center gap-4 p-4 bg-green-50 border border-green-200 rounded-lg",children:[n.jsx(hs,{className:"w-8 h-8 text-green-500 flex-shrink-0"}),n.jsxs("div",{className:"flex-1",children:[n.jsx("label",{className:"block font-medium text-green-800 mb-1",children:"OK (Grün)"}),n.jsx("p",{className:"text-sm text-green-600 mb-2",children:"Fristen mit weniger als X Tagen werden grün markiert (darüber nicht angezeigt)"}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx($,{type:"number",min:"1",value:o,onChange:f=>h(c,f.target.value),className:"w-24"}),n.jsx("span",{className:"text-green-700",children:"Tage"})]})]})]})]}),n.jsxs("div",{className:"mt-6 pt-4 border-t flex justify-between items-center",children:[n.jsx("p",{className:"text-sm text-gray-500",children:"Beispiel: Bei 14/42/90 Tagen wird eine Frist die in 10 Tagen abläuft rot, eine in 30 Tagen gelb, und eine in 60 Tagen grün markiert."}),n.jsx(I,{onClick:p,disabled:!u||m.isPending,children:m.isPending?"Speichere...":"Speichern"})]})]})]})}const c2=[{value:"PLESK",label:"Plesk"},{value:"CPANEL",label:"cPanel"},{value:"DIRECTADMIN",label:"DirectAdmin"}],Lc={name:"",type:"PLESK",apiUrl:"",apiKey:"",username:"",password:"",domain:"stressfrei-wechseln.de",defaultForwardEmail:"",isActive:!0,isDefault:!1};function u2(){const e=Ut(),t=pe(),[s,r]=w.useState(!1),[a,i]=w.useState(null),[l,o]=w.useState(Lc),[c,u]=w.useState(!1),[d,m]=w.useState(null),[p,h]=w.useState(!1),[f,g]=w.useState({}),[b,y]=w.useState(null),{data:v,isLoading:x}=ge({queryKey:["email-provider-configs"],queryFn:()=>xn.getConfigs()}),N=Y({mutationFn:P=>xn.createConfig(P),onSuccess:()=>{t.invalidateQueries({queryKey:["email-provider-configs"]}),T()}}),k=Y({mutationFn:({id:P,data:j})=>xn.updateConfig(P,j),onSuccess:()=>{t.invalidateQueries({queryKey:["email-provider-configs"]}),T()}}),D=Y({mutationFn:P=>xn.deleteConfig(P),onSuccess:()=>{t.invalidateQueries({queryKey:["email-provider-configs"]})}}),F=(v==null?void 0:v.data)||[],S=()=>{o(Lc),i(null),u(!1),m(null),r(!0)},L=P=>{o({name:P.name,type:P.type,apiUrl:P.apiUrl,apiKey:P.apiKey||"",username:P.username||"",password:"",domain:P.domain,defaultForwardEmail:P.defaultForwardEmail||"",isActive:P.isActive,isDefault:P.isDefault}),i(P.id),u(!1),m(null),r(!0)},T=()=>{r(!1),i(null),o(Lc),u(!1),m(null)},_=async P=>{var j,B,J;y(P.id),g(ee=>({...ee,[P.id]:null}));try{const ee=await xn.testConnection({id:P.id}),me={success:((j=ee.data)==null?void 0:j.success)||!1,message:(B=ee.data)==null?void 0:B.message,error:(J=ee.data)==null?void 0:J.error};g(ve=>({...ve,[P.id]:me}))}catch(ee){g(me=>({...me,[P.id]:{success:!1,error:ee instanceof Error?ee.message:"Unbekannter Fehler beim Testen"}}))}finally{y(null)}},K=async()=>{var P,j,B;if(!l.apiUrl||!l.domain){m({success:!1,error:"Bitte geben Sie API-URL und Domain ein."});return}if(a&&!l.password&&!l.apiKey){m({success:!1,error:"Um die Verbindung zu testen, geben Sie bitte entweder einen API-Key oder das Passwort ein."});return}if(!a&&!l.apiKey&&(!l.username||!l.password)){m({success:!1,error:"Bitte geben Sie entweder einen API-Key oder Benutzername und Passwort ein."});return}h(!0),m(null);try{const J=await xn.testConnection({testData:{type:l.type,apiUrl:l.apiUrl,apiKey:l.apiKey||void 0,username:l.username||void 0,password:l.password||void 0,domain:l.domain}});m({success:((P=J.data)==null?void 0:P.success)||!1,message:(j=J.data)==null?void 0:j.message,error:(B=J.data)==null?void 0:B.error})}catch(J){m({success:!1,error:J instanceof Error?J.message:"Unbekannter Fehler beim Verbindungstest"})}finally{h(!1)}},W=P=>{P.preventDefault();const j={name:l.name,type:l.type,apiUrl:l.apiUrl,apiKey:l.apiKey||void 0,username:l.username||void 0,domain:l.domain,defaultForwardEmail:l.defaultForwardEmail||void 0,isActive:l.isActive,isDefault:l.isDefault};l.password&&(j.password=l.password),a?k.mutate({id:a,data:j}):N.mutate(j)},Q=(P,j)=>{confirm(`Möchten Sie den Provider "${j}" wirklich löschen?`)&&D.mutate(P)},z=P=>P.error?P.error:P.message?P.message:"Verbindung fehlgeschlagen";return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsxs(I,{variant:"ghost",onClick:()=>e("/settings"),children:[n.jsx($s,{className:"w-4 h-4 mr-2"}),"Zurück"]}),n.jsx("h1",{className:"text-2xl font-bold",children:"Email-Provisionierung"})]}),n.jsxs(Z,{className:"mb-6",children:[n.jsx("p",{className:"text-gray-600 mb-4",children:'Hier konfigurieren Sie die automatische Erstellung von Stressfrei-Wechseln E-Mail-Adressen. Wenn beim Anlegen einer Stressfrei-Adresse die Option "Bei Provider anlegen" aktiviert ist, wird die E-Mail-Weiterleitung automatisch erstellt.'}),n.jsxs(I,{onClick:S,children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Provider hinzufügen"]})]}),x?n.jsx("div",{className:"text-center py-8",children:"Laden..."}):F.length===0?n.jsx(Z,{children:n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Noch keine Email-Provider konfiguriert."})}):n.jsx("div",{className:"space-y-4",children:F.map(P=>{const j=f[P.id],B=b===P.id;return n.jsx(Z,{children:n.jsxs("div",{className:"flex items-start justify-between",children:[n.jsxs("div",{className:"flex-1",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx("h3",{className:"font-semibold text-lg",children:P.name}),n.jsx("span",{className:"px-2 py-1 text-xs rounded bg-blue-100 text-blue-800",children:P.type}),P.isDefault&&n.jsx("span",{className:"px-2 py-1 text-xs rounded bg-green-100 text-green-800",children:"Standard"}),!P.isActive&&n.jsx("span",{className:"px-2 py-1 text-xs rounded bg-gray-100 text-gray-600",children:"Inaktiv"})]}),n.jsxs("dl",{className:"mt-3 grid grid-cols-2 md:grid-cols-4 gap-4 text-sm",children:[n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"API-URL"}),n.jsx("dd",{className:"font-mono text-xs truncate",children:P.apiUrl})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"Domain"}),n.jsx("dd",{children:P.domain})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"Benutzer"}),n.jsx("dd",{children:P.username||"-"})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-gray-500",children:"Standard-Weiterleitung"}),n.jsx("dd",{className:"truncate",children:P.defaultForwardEmail||"-"})]})]}),j&&n.jsx("div",{className:`mt-3 p-3 rounded-lg text-sm ${j.success?"bg-green-50 text-green-800":"bg-red-50 text-red-800"}`,children:j.success?n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(Xu,{className:"w-4 h-4 flex-shrink-0"}),n.jsx("span",{children:"Verbindung erfolgreich!"})]}):n.jsxs("div",{className:"flex items-start gap-2",children:[n.jsx(np,{className:"w-4 h-4 flex-shrink-0 mt-0.5"}),n.jsx("span",{children:z(j)})]})})]}),n.jsxs("div",{className:"flex gap-2 ml-4",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>_(P),disabled:B,title:"Verbindung testen",children:B?n.jsx("span",{className:"w-4 h-4 border-2 border-gray-400 border-t-transparent rounded-full animate-spin"}):n.jsx(ea,{className:"w-4 h-4 text-blue-500"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>L(P),children:n.jsx(We,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>Q(P.id,P.name),children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})]})},P.id)})}),s&&n.jsx("div",{className:"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",children:n.jsx("div",{className:"bg-white rounded-lg shadow-xl w-full max-w-lg mx-4 max-h-[90vh] overflow-y-auto",children:n.jsxs("div",{className:"p-6",children:[n.jsxs("div",{className:"flex items-center justify-between mb-4",children:[n.jsx("h2",{className:"text-xl font-semibold",children:a?"Provider bearbeiten":"Neuer Provider"}),n.jsx("button",{onClick:T,className:"text-gray-400 hover:text-gray-600",children:n.jsx(wa,{className:"w-5 h-5"})})]}),(N.error||k.error)&&n.jsx("div",{className:"mb-4 p-3 rounded-lg bg-red-50 text-red-800 text-sm",children:n.jsxs("div",{className:"flex items-start gap-2",children:[n.jsx(wa,{className:"w-4 h-4 flex-shrink-0 mt-0.5"}),n.jsx("span",{children:N.error instanceof Error?N.error.message:k.error instanceof Error?k.error.message:"Fehler beim Speichern"})]})}),n.jsxs("form",{onSubmit:W,className:"space-y-4",children:[n.jsx($,{label:"Name *",value:l.name,onChange:P=>o({...l,name:P.target.value}),placeholder:"z.B. Plesk Hauptserver",required:!0}),n.jsx(Le,{label:"Provider-Typ *",value:l.type,onChange:P=>o({...l,type:P.target.value}),options:c2}),n.jsx($,{label:"API-URL *",value:l.apiUrl,onChange:P=>o({...l,apiUrl:P.target.value}),placeholder:"https://server.de:8443",required:!0}),n.jsx($,{label:"API-Key",value:l.apiKey,onChange:P=>o({...l,apiKey:P.target.value}),placeholder:"Optional - alternativ zu Benutzername/Passwort"}),n.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[n.jsx($,{label:"Benutzername",value:l.username,onChange:P=>o({...l,username:P.target.value}),placeholder:"admin"}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:a?"Neues Passwort (leer = beibehalten)":"Passwort"}),n.jsxs("div",{className:"relative",children:[n.jsx("input",{type:c?"text":"password",value:l.password,onChange:P=>o({...l,password:P.target.value}),className:"block w-full px-3 py-2 pr-10 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500"}),n.jsx("button",{type:"button",onClick:()=>u(!c),className:"absolute inset-y-0 right-0 flex items-center pr-3 text-gray-400 hover:text-gray-600",children:c?n.jsx(Pt,{className:"w-4 h-4"}):n.jsx(Ee,{className:"w-4 h-4"})})]})]})]}),n.jsx($,{label:"Domain *",value:l.domain,onChange:P=>o({...l,domain:P.target.value}),placeholder:"stressfrei-wechseln.de",required:!0}),n.jsx($,{label:"Standard-Weiterleitungsadresse",value:l.defaultForwardEmail,onChange:P=>o({...l,defaultForwardEmail:P.target.value}),placeholder:"info@meinefirma.de",type:"email"}),n.jsx("p",{className:"text-xs text-gray-500 -mt-2",children:"Diese E-Mail-Adresse wird zusätzlich zur Kunden-E-Mail als Weiterleitungsziel hinzugefügt."}),n.jsxs("div",{className:"flex gap-4",children:[n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:l.isActive,onChange:P=>o({...l,isActive:P.target.checked}),className:"rounded border-gray-300"}),n.jsx("span",{className:"text-sm",children:"Aktiv"})]}),n.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:l.isDefault,onChange:P=>o({...l,isDefault:P.target.checked}),className:"rounded border-gray-300"}),n.jsx("span",{className:"text-sm",children:"Als Standard verwenden"})]})]}),n.jsxs("div",{className:"pt-4 border-t",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:K,disabled:p,className:"w-full",children:p?"Teste Verbindung...":n.jsxs(n.Fragment,{children:[n.jsx(ea,{className:"w-4 h-4 mr-2"}),"Verbindung testen"]})}),d&&n.jsx("div",{className:`mt-2 p-3 rounded-lg text-sm ${d.success?"bg-green-50 text-green-800":"bg-red-50 text-red-800"}`,children:d.success?n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx(Xu,{className:"w-4 h-4 flex-shrink-0"}),n.jsx("span",{children:"Verbindung erfolgreich!"})]}):n.jsxs("div",{className:"flex items-start gap-2",children:[n.jsx(np,{className:"w-4 h-4 flex-shrink-0 mt-0.5"}),n.jsx("span",{children:z(d)})]})})]}),n.jsxs("div",{className:"flex justify-end gap-3 pt-4 border-t",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:T,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:N.isPending||k.isPending,children:N.isPending||k.isPending?"Speichern...":"Speichern"})]})]})]})})})]})}function d2(){var v;const[e,t]=w.useState(""),[s,r]=w.useState(1),[a,i]=w.useState(!1),[l,o]=w.useState(null),c=pe(),{refreshUser:u}=st(),{data:d,isLoading:m}=ge({queryKey:["users",e,s],queryFn:()=>ii.getAll({search:e||void 0,page:s,limit:20})}),{data:p}=ge({queryKey:["roles"],queryFn:()=>ii.getRoles()}),h=Y({mutationFn:ii.delete,onSuccess:()=>{c.invalidateQueries({queryKey:["users"]})},onError:x=>{alert((x==null?void 0:x.message)||"Fehler beim Löschen des Benutzers")}}),f=x=>{var N;return(N=x.roles)==null?void 0:N.some(k=>k.name==="Admin")},g=((v=d==null?void 0:d.data)==null?void 0:v.filter(x=>x.isActive&&f(x)).length)||0,b=x=>{o(x),i(!0)},y=()=>{i(!1),o(null)};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[n.jsx(Se,{to:"/settings",children:n.jsx(I,{variant:"ghost",size:"sm",children:n.jsx($s,{className:"w-4 h-4"})})}),n.jsx("h1",{className:"text-2xl font-bold flex-1",children:"Benutzer"}),n.jsxs(I,{onClick:()=>i(!0),children:[n.jsx(Oe,{className:"w-4 h-4 mr-2"}),"Neuer Benutzer"]})]}),n.jsx(Z,{className:"mb-6",children:n.jsxs("div",{className:"flex gap-4",children:[n.jsx("div",{className:"flex-1",children:n.jsx($,{placeholder:"Suchen...",value:e,onChange:x=>t(x.target.value)})}),n.jsx(I,{variant:"secondary",children:n.jsx(Wo,{className:"w-4 h-4"})})]})}),n.jsx(Z,{children:m?n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Laden..."}):d!=null&&d.data&&d.data.length>0?n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"overflow-x-auto",children:n.jsxs("table",{className:"w-full",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b",children:[n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Name"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"E-Mail"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Rollen"}),n.jsx("th",{className:"text-left py-3 px-4 font-medium text-gray-600",children:"Status"}),n.jsx("th",{className:"text-right py-3 px-4 font-medium text-gray-600",children:"Aktionen"})]})}),n.jsx("tbody",{children:d.data.map(x=>{var N;return n.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[n.jsxs("td",{className:"py-3 px-4",children:[x.firstName," ",x.lastName]}),n.jsx("td",{className:"py-3 px-4",children:x.email}),n.jsx("td",{className:"py-3 px-4",children:n.jsx("div",{className:"flex gap-1 flex-wrap",children:(N=x.roles)==null?void 0:N.filter(k=>k.name!=="Developer").map(k=>n.jsx(he,{variant:"info",children:k.name},k.id||k.name))})}),n.jsx("td",{className:"py-3 px-4",children:n.jsxs("div",{className:"flex gap-2",children:[n.jsx(he,{variant:x.isActive?"success":"danger",children:x.isActive?"Aktiv":"Inaktiv"}),x.hasDeveloperAccess&&n.jsxs(he,{variant:"warning",className:"flex items-center gap-1",children:[n.jsx(Ho,{className:"w-3 h-3"}),"Dev"]})]})}),n.jsx("td",{className:"py-3 px-4 text-right",children:n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>b(x),children:n.jsx(We,{className:"w-4 h-4"})}),(()=>{const k=f(x)&&x.isActive&&g<=1;return n.jsx(I,{variant:"ghost",size:"sm",disabled:k,title:k?"Letzter Administrator kann nicht gelöscht werden":void 0,onClick:()=>{confirm("Benutzer wirklich löschen?")&&h.mutate(x.id)},children:n.jsx(be,{className:`w-4 h-4 ${k?"text-gray-300":"text-red-500"}`})})})()]})})]},x.id)})})]})}),d.pagination&&d.pagination.totalPages>1&&n.jsxs("div",{className:"mt-4 flex items-center justify-between",children:[n.jsxs("p",{className:"text-sm text-gray-500",children:["Seite ",d.pagination.page," von ",d.pagination.totalPages]}),n.jsxs("div",{className:"flex gap-2",children:[n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>r(x=>Math.max(1,x-1)),disabled:s===1,children:"Zurück"}),n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>r(x=>x+1),disabled:s>=d.pagination.totalPages,children:"Weiter"})]})]})]}):n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Keine Benutzer gefunden."})}),n.jsx(h2,{isOpen:a,onClose:y,user:l,roles:(p==null?void 0:p.data)||[],onUserUpdated:u})]})}function h2({isOpen:e,onClose:t,user:s,roles:r,onUserUpdated:a}){const i=pe(),[l,o]=w.useState(null),[c,u]=w.useState({email:"",password:"",firstName:"",lastName:"",roleIds:[],isActive:!0,hasDeveloperAccess:!1});w.useEffect(()=>{var g;e&&(o(null),u(s?{email:s.email,password:"",firstName:s.firstName,lastName:s.lastName,roleIds:((g=s.roles)==null?void 0:g.filter(b=>b.name!=="Developer").map(b=>b.id))||[],isActive:s.isActive??!0,hasDeveloperAccess:s.hasDeveloperAccess??!1}:{email:"",password:"",firstName:"",lastName:"",roleIds:[],isActive:!0,hasDeveloperAccess:!1}))},[e,s]);const d=Y({mutationFn:ii.create,onSuccess:()=>{i.invalidateQueries({queryKey:["users"]}),t()},onError:g=>{o((g==null?void 0:g.message)||"Fehler beim Erstellen des Benutzers")}}),m=Y({mutationFn:g=>ii.update(s.id,g),onSuccess:async()=>{i.invalidateQueries({queryKey:["users"]}),await a(),t()},onError:g=>{o((g==null?void 0:g.message)||"Fehler beim Aktualisieren des Benutzers")}}),p=g=>{if(g.preventDefault(),s){const b={email:c.email,firstName:c.firstName,lastName:c.lastName,roleIds:c.roleIds,isActive:c.isActive,hasDeveloperAccess:c.hasDeveloperAccess};c.password&&(b.password=c.password),m.mutate(b)}else d.mutate({email:c.email,password:c.password,firstName:c.firstName,lastName:c.lastName,roleIds:c.roleIds})},h=g=>{u(b=>({...b,roleIds:b.roleIds.includes(g)?b.roleIds.filter(y=>y!==g):[...b.roleIds,g]}))},f=d.isPending||m.isPending;return n.jsx(dt,{isOpen:e,onClose:t,title:s?"Benutzer bearbeiten":"Neuer Benutzer",children:n.jsxs("form",{onSubmit:p,className:"space-y-4",children:[l&&n.jsxs("div",{className:"bg-red-50 border border-red-200 rounded-lg p-3 flex items-start gap-2",children:[n.jsx(Li,{className:"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5"}),n.jsx("p",{className:"text-red-700 text-sm",children:l})]}),n.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[n.jsx($,{label:"Vorname *",value:c.firstName,onChange:g=>u({...c,firstName:g.target.value}),required:!0}),n.jsx($,{label:"Nachname *",value:c.lastName,onChange:g=>u({...c,lastName:g.target.value}),required:!0})]}),n.jsx($,{label:"E-Mail *",type:"email",value:c.email,onChange:g=>u({...c,email:g.target.value}),required:!0}),n.jsx($,{label:s?"Neues Passwort (leer = unverändert)":"Passwort *",type:"password",value:c.password,onChange:g=>u({...c,password:g.target.value}),required:!s}),n.jsxs("div",{children:[n.jsx("label",{className:"block text-sm font-medium text-gray-700 mb-2",children:"Rollen"}),n.jsx("div",{className:"space-y-2",children:r.filter(g=>g.name!=="Developer").map(g=>n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:c.roleIds.includes(g.id),onChange:()=>h(g.id),className:"rounded"}),n.jsx("span",{children:g.name}),g.description&&n.jsxs("span",{className:"text-sm text-gray-500",children:["(",g.description,")"]})]},g.id))})]}),s&&n.jsxs("div",{className:"space-y-3 pt-3 border-t",children:[n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:c.isActive,onChange:g=>u({...c,isActive:g.target.checked}),className:"rounded"}),"Aktiv"]}),n.jsxs("label",{className:"flex items-center gap-2",children:[n.jsx("input",{type:"checkbox",checked:c.hasDeveloperAccess,onChange:g=>u({...c,hasDeveloperAccess:g.target.checked}),className:"rounded border-purple-300 text-purple-600 focus:ring-purple-500"}),n.jsxs("span",{className:"flex items-center gap-1",children:[n.jsx(Ho,{className:"w-4 h-4 text-purple-600"}),"Entwicklerzugriff"]}),n.jsx("span",{className:"text-sm text-gray-500",children:"(Datenbanktools)"})]})]}),n.jsxs("div",{className:"flex justify-end gap-2",children:[n.jsx(I,{type:"button",variant:"secondary",onClick:t,children:"Abbrechen"}),n.jsx(I,{type:"submit",disabled:f,children:f?"Speichern...":"Speichern"})]})]})})}function m2(){const{hasPermission:e,developerMode:t,setDeveloperMode:s}=st(),r=[{to:"/settings/users",icon:P1,title:"Benutzer",description:"Verwalten Sie Benutzerkonten, Rollen und Berechtigungen.",show:e("users:read")},{to:"/settings/platforms",icon:C1,title:"Vertriebsplattformen",description:"Verwalten Sie die Plattformen, über die Verträge abgeschlossen werden.",show:e("platforms:read")},{to:"/settings/cancellation-periods",icon:qn,title:"Kündigungsfristen",description:"Konfigurieren Sie die verfügbaren Kündigungsfristen für Verträge.",show:e("platforms:read")},{to:"/settings/contract-durations",icon:Qy,title:"Vertragslaufzeiten",description:"Konfigurieren Sie die verfügbaren Laufzeiten für Verträge.",show:e("platforms:read")},{to:"/settings/providers",icon:h1,title:"Anbieter & Tarife",description:"Verwalten Sie Anbieter und deren Tarife für Verträge.",show:e("providers:read")||e("platforms:read")},{to:"/settings/contract-categories",icon:g1,title:"Vertragstypen",description:"Konfigurieren Sie die verfügbaren Vertragstypen (Strom, Gas, Mobilfunk, etc.).",show:e("platforms:read")}];return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center gap-3 mb-6",children:[n.jsx(tv,{className:"w-6 h-6"}),n.jsx("h1",{className:"text-2xl font-bold",children:"Einstellungen"})]}),n.jsxs("div",{className:"mb-8",children:[n.jsx("h2",{className:"text-lg font-semibold mb-4 text-gray-700",children:"Stammdaten"}),n.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:r.filter(a=>a.show).map(a=>n.jsx(Se,{to:a.to,className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:n.jsxs("div",{className:"flex items-start gap-4",children:[n.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:n.jsx(a.icon,{className:"w-6 h-6 text-blue-600"})}),n.jsxs("div",{className:"flex-1",children:[n.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:[a.title,n.jsx(Ys,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),n.jsx("p",{className:"text-sm text-gray-500 mt-1",children:a.description})]})]})},a.to))})]}),e("settings:update")&&n.jsxs("div",{className:"mb-8",children:[n.jsx("h2",{className:"text-lg font-semibold mb-4 text-gray-700",children:"System"}),n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsx(Se,{to:"/settings/portal",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:n.jsxs("div",{className:"flex items-start gap-4",children:[n.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:n.jsx(uh,{className:"w-6 h-6 text-blue-600"})}),n.jsxs("div",{className:"flex-1",children:[n.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Kundenportal",n.jsx(Ys,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),n.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Konfigurieren Sie das Kundenportal und Support-Anfragen."})]})]})}),n.jsx(Se,{to:"/settings/deadlines",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:n.jsxs("div",{className:"flex items-start gap-4",children:[n.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:n.jsx(qn,{className:"w-6 h-6 text-blue-600"})}),n.jsxs("div",{className:"flex-1",children:[n.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Fristenschwellen",n.jsx(Ys,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),n.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Konfigurieren Sie die Farbkodierung für Vertragsfristen im Cockpit."})]})]})}),n.jsx(Se,{to:"/settings/email-providers",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:n.jsxs("div",{className:"flex items-start gap-4",children:[n.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:n.jsx(ev,{className:"w-6 h-6 text-blue-600"})}),n.jsxs("div",{className:"flex-1",children:[n.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Email-Provisionierung",n.jsx(Ys,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),n.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Konfigurieren Sie die automatische E-Mail-Erstellung für Stressfrei-Wechseln Adressen."})]})]})})]})]}),n.jsxs("div",{className:"mb-8",children:[n.jsx("h2",{className:"text-lg font-semibold mb-4 text-gray-700",children:"Persönlich"}),n.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:n.jsx(Se,{to:"/settings/view",className:"block p-4 bg-white border border-gray-200 rounded-lg shadow-sm hover:shadow-md hover:border-blue-300 transition-all group",children:n.jsxs("div",{className:"flex items-start gap-4",children:[n.jsx("div",{className:"p-2 bg-blue-50 rounded-lg group-hover:bg-blue-100 transition-colors",children:n.jsx(Ee,{className:"w-6 h-6 text-blue-600"})}),n.jsxs("div",{className:"flex-1",children:[n.jsxs("h3",{className:"font-semibold text-gray-900 group-hover:text-blue-600 transition-colors flex items-center gap-2",children:["Ansicht",n.jsx(Ys,{className:"w-4 h-4 opacity-0 group-hover:opacity-100 transition-opacity"})]}),n.jsx("p",{className:"text-sm text-gray-500 mt-1",children:"Passen Sie die Darstellung der Anwendung an."})]})]})})})]}),e("developer:access")&&n.jsxs(Z,{title:"Entwickleroptionen",className:"mb-6",children:[n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(Ho,{className:"w-5 h-5 text-gray-500"}),n.jsxs("div",{children:[n.jsx("p",{className:"font-medium",children:"Entwicklermodus"}),n.jsx("p",{className:"text-sm text-gray-500",children:"Aktiviert erweiterte Funktionen wie direkten Datenbankzugriff"})]})]}),n.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[n.jsx("input",{type:"checkbox",checked:t,onChange:a=>s(a.target.checked),className:"sr-only peer"}),n.jsx("div",{className:"w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-blue-600"})]})]}),t&&n.jsx("div",{className:"mt-4 p-3 bg-yellow-50 border border-yellow-200 rounded-lg",children:n.jsxs("p",{className:"text-sm text-yellow-800",children:[n.jsx("strong",{children:"Warnung:"})," Der Entwicklermodus ermöglicht direkten Zugriff auf die Datenbank. Unsachgemäße Änderungen können zu Datenverlust oder Inkonsistenzen führen."]})})]}),n.jsx(Z,{title:"Über",children:n.jsxs("dl",{className:"space-y-3",children:[n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"Version"}),n.jsx("dd",{children:"1.0.0"})]}),n.jsxs("div",{children:[n.jsx("dt",{className:"text-sm text-gray-500",children:"System"}),n.jsx("dd",{children:"OpenCRM"})]})]})})]})}function f2({onSelectTable:e}){const t=w.useRef(null),[s,r]=w.useState(1),[a,i]=w.useState({x:0,y:0}),[l,o]=w.useState(!1),[c,u]=w.useState({x:0,y:0}),[d,m]=w.useState({}),[p,h]=w.useState(null),{data:f,isLoading:g}=ge({queryKey:["developer-schema"],queryFn:Za.getSchema}),b=(f==null?void 0:f.data)||[];w.useEffect(()=>{if(b.length>0&&Object.keys(d).length===0){const S=Math.ceil(Math.sqrt(b.length)),L={x:280,y:200},T={};b.forEach((_,K)=>{const W=K%S,Q=Math.floor(K/S);T[_.name]={x:50+W*L.x,y:50+Q*L.y}}),m(T)}},[b,d]);const y=w.useCallback(S=>{(S.target===S.currentTarget||S.target.tagName==="svg")&&(o(!0),u({x:S.clientX-a.x,y:S.clientY-a.y}))},[a]),v=w.useCallback(S=>{var L;if(l&&!p)i({x:S.clientX-c.x,y:S.clientY-c.y});else if(p){const T=(L=t.current)==null?void 0:L.getBoundingClientRect();T&&m(_=>({..._,[p]:{x:(S.clientX-T.left-a.x)/s-100,y:(S.clientY-T.top-a.y)/s-20}}))}},[l,p,c,a,s]),x=w.useCallback(()=>{o(!1),h(null)},[]),N=S=>{r(L=>Math.min(2,Math.max(.3,L+S)))},k=()=>{r(1),i({x:0,y:0})},D=w.useCallback(()=>{const S=[];return b.forEach(L=>{const T=d[L.name];T&&L.foreignKeys.forEach(_=>{const K=d[_.targetTable];if(!K)return;const W=b.find(z=>z.name===_.targetTable),Q=W==null?void 0:W.relations.find(z=>z.targetTable===L.name);S.push({from:{table:L.name,x:T.x+100,y:T.y+60},to:{table:_.targetTable,x:K.x+100,y:K.y+60},type:(Q==null?void 0:Q.type)||"one",label:_.field})})}),S},[b,d]);if(g)return n.jsx("div",{className:"flex items-center justify-center h-full",children:"Laden..."});const F=D();return n.jsxs("div",{className:"relative h-full w-full bg-gray-50 overflow-hidden",ref:t,children:[n.jsxs("div",{className:"absolute top-4 right-4 z-10 flex gap-2 bg-white rounded-lg shadow-md p-2",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>N(.1),title:"Vergrößern",children:n.jsx(T1,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>N(-.1),title:"Verkleinern",children:n.jsx(F1,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:k,title:"Zurücksetzen",children:n.jsx(N1,{className:"w-4 h-4"})}),n.jsxs("div",{className:"text-xs text-gray-500 flex items-center px-2",children:[Math.round(s*100),"%"]})]}),n.jsxs("div",{className:"absolute top-4 left-4 z-10 bg-white rounded-lg shadow-md p-2 text-xs text-gray-500",children:[n.jsx(w1,{className:"w-3 h-3 inline mr-1"}),"Tabellen ziehen zum Verschieben"]}),n.jsx("svg",{className:"w-full h-full cursor-grab",style:{cursor:l?"grabbing":"grab"},onMouseDown:y,onMouseMove:v,onMouseUp:x,onMouseLeave:x,children:n.jsxs("g",{transform:`translate(${a.x}, ${a.y}) scale(${s})`,children:[n.jsxs("defs",{children:[n.jsx("marker",{id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"9",refY:"3.5",orient:"auto",children:n.jsx("polygon",{points:"0 0, 10 3.5, 0 7",fill:"#6b7280"})}),n.jsx("marker",{id:"many-marker",markerWidth:"12",markerHeight:"12",refX:"6",refY:"6",orient:"auto",children:n.jsx("circle",{cx:"6",cy:"6",r:"3",fill:"#6b7280"})})]}),F.map((S,L)=>{const T=S.to.x-S.from.x,_=S.to.y-S.from.y,K=S.from.x+T/2,W=S.from.y+_/2,Q=S.from.x+T*.25,z=S.from.y,P=S.from.x+T*.75,j=S.to.y;return n.jsxs("g",{children:[n.jsx("path",{d:`M ${S.from.x} ${S.from.y} C ${Q} ${z}, ${P} ${j}, ${S.to.x} ${S.to.y}`,fill:"none",stroke:"#9ca3af",strokeWidth:"2",markerEnd:"url(#arrowhead)"}),n.jsx("text",{x:K,y:W-8,fontSize:"10",fill:"#6b7280",textAnchor:"middle",className:"select-none",children:S.type==="many"?"1:n":"1:1"})]},L)}),b.map(S=>{const L=d[S.name];if(!L)return null;const T=200,_=32,K=20,W=[...new Set([S.primaryKey,...S.foreignKeys.map(z=>z.field)])],Q=_+Math.min(W.length,5)*K+8;return n.jsxs("g",{transform:`translate(${L.x}, ${L.y})`,style:{cursor:"move"},onMouseDown:z=>{z.stopPropagation(),h(S.name)},children:[n.jsx("rect",{x:"3",y:"3",width:T,height:Q,rx:"6",fill:"rgba(0,0,0,0.1)"}),n.jsx("rect",{x:"0",y:"0",width:T,height:Q,rx:"6",fill:"white",stroke:"#e5e7eb",strokeWidth:"1"}),n.jsx("rect",{x:"0",y:"0",width:T,height:_,rx:"6",fill:"#3b82f6",className:"cursor-pointer",onClick:()=>e==null?void 0:e(S.name)}),n.jsx("rect",{x:"0",y:_-6,width:T,height:"6",fill:"#3b82f6"}),n.jsx("text",{x:T/2,y:"21",fontSize:"13",fontWeight:"bold",fill:"white",textAnchor:"middle",className:"select-none pointer-events-none",children:S.name}),W.slice(0,5).map((z,P)=>{const j=z===S.primaryKey||S.primaryKey.includes(z),B=S.foreignKeys.some(J=>J.field===z);return n.jsx("g",{transform:`translate(8, ${_+4+P*K})`,children:n.jsxs("text",{x:"0",y:"14",fontSize:"11",fill:j?"#dc2626":B?"#2563eb":"#374151",fontFamily:"monospace",className:"select-none",children:[j&&"🔑 ",B&&!j&&"🔗 ",z]})},z)}),W.length>5&&n.jsxs("text",{x:T/2,y:Q-4,fontSize:"10",fill:"#9ca3af",textAnchor:"middle",className:"select-none",children:["+",W.length-5," mehr..."]})]},S.name)})]})}),n.jsxs("div",{className:"absolute bottom-4 left-4 bg-white rounded-lg shadow-md p-3 text-xs",children:[n.jsx("div",{className:"font-medium mb-2",children:"Legende"}),n.jsxs("div",{className:"space-y-1",children:[n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"text-red-600",children:"🔑"}),n.jsx("span",{children:"Primary Key"})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("span",{className:"text-blue-600",children:"🔗"}),n.jsx("span",{children:"Foreign Key"})]}),n.jsxs("div",{className:"flex items-center gap-2",children:[n.jsx("div",{className:"w-6 h-0.5 bg-gray-400"}),n.jsx("span",{children:"Beziehung"})]})]})]})]})}function p2(){var F;const[e,t]=w.useState(null),[s,r]=w.useState(1),[a,i]=w.useState(null),[l,o]=w.useState(!1),c=pe(),{data:u,isLoading:d,error:m}=ge({queryKey:["developer-schema"],queryFn:Za.getSchema});console.log("Schema data:",u),console.log("Schema error:",m);const{data:p,isLoading:h}=ge({queryKey:["developer-table",e,s],queryFn:()=>Za.getTableData(e,s),enabled:!!e}),f=Y({mutationFn:({tableName:S,id:L,data:T})=>Za.updateRow(S,L,T),onSuccess:()=>{c.invalidateQueries({queryKey:["developer-table",e]}),i(null)},onError:S=>{var L,T;alert(((T=(L=S.response)==null?void 0:L.data)==null?void 0:T.error)||"Fehler beim Speichern")}}),g=Y({mutationFn:({tableName:S,id:L})=>Za.deleteRow(S,L),onSuccess:()=>{c.invalidateQueries({queryKey:["developer-table",e]})},onError:S=>{var L,T;alert(((T=(L=S.response)==null?void 0:L.data)==null?void 0:T.error)||"Fehler beim Löschen")}}),b=(u==null?void 0:u.data)||[],y=b.find(S=>S.name===e),v=(S,L)=>L.primaryKey.includes(",")?L.primaryKey.split(",").map(T=>S[T]).join("-"):String(S[L.primaryKey]),x=S=>S==null?"-":typeof S=="boolean"?S?"Ja":"Nein":typeof S=="object"?S instanceof Date||typeof S=="string"&&S.match(/^\d{4}-\d{2}-\d{2}/)?new Date(S).toLocaleString("de-DE"):JSON.stringify(S):String(S),N=()=>{!a||!e||f.mutate({tableName:e,id:a.id,data:a.data})},k=S=>{e&&confirm("Datensatz wirklich löschen?")&&g.mutate({tableName:e,id:S})};if(d)return n.jsx("div",{className:"text-center py-8",children:"Laden..."});const D=S=>{t(S),r(1),o(!1)};return n.jsxs("div",{children:[n.jsxs("div",{className:"flex items-center justify-between mb-6",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(Zy,{className:"w-6 h-6"}),n.jsx("h1",{className:"text-2xl font-bold",children:"Datenbankstruktur"})]}),n.jsxs(I,{onClick:()=>o(!0),children:[n.jsx(sp,{className:"w-4 h-4 mr-2"}),"ER-Diagramm"]})]}),n.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-4 gap-6",children:[n.jsx(Z,{title:"Tabellen",className:"lg:col-span-1",children:n.jsx("div",{className:"space-y-1 max-h-[600px] overflow-y-auto",children:b.map(S=>n.jsxs("button",{onClick:()=>{t(S.name),r(1)},className:`w-full text-left px-3 py-2 rounded-lg flex items-center gap-2 transition-colors ${e===S.name?"bg-blue-100 text-blue-700":"hover:bg-gray-100"}`,children:[n.jsx(E1,{className:"w-4 h-4"}),n.jsx("span",{className:"text-sm font-mono",children:S.name})]},S.name))})}),n.jsx("div",{className:"lg:col-span-3 space-y-6",children:e&&y?n.jsxs(n.Fragment,{children:[n.jsxs(Z,{title:`${e} - Beziehungen`,children:[n.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[n.jsxs("div",{children:[n.jsx("h4",{className:"text-sm font-medium text-gray-500 mb-2",children:"Fremdschlüssel (referenziert)"}),y.foreignKeys.length>0?n.jsx("div",{className:"space-y-1",children:y.foreignKeys.map(S=>n.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[n.jsx("span",{className:"font-mono text-gray-600",children:S.field}),n.jsx(d1,{className:"w-4 h-4 text-gray-400"}),n.jsx(he,{variant:"info",className:"cursor-pointer",onClick:()=>{t(S.targetTable),r(1)},children:S.targetTable})]},S.field))}):n.jsx("p",{className:"text-sm text-gray-400",children:"Keine"})]}),n.jsxs("div",{children:[n.jsx("h4",{className:"text-sm font-medium text-gray-500 mb-2",children:"Relationen (wird referenziert von)"}),y.relations.length>0?n.jsx("div",{className:"space-y-1",children:y.relations.map(S=>n.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[n.jsx("span",{className:"font-mono text-gray-600",children:S.field}),n.jsx(he,{variant:S.type==="many"?"warning":"default",children:S.type==="many"?"1:n":"1:1"}),n.jsx(he,{variant:"info",className:"cursor-pointer",onClick:()=>{t(S.targetTable),r(1)},children:S.targetTable})]},S.field))}):n.jsx("p",{className:"text-sm text-gray-400",children:"Keine"})]})]}),n.jsx("div",{className:"mt-4 pt-4 border-t",children:n.jsxs("div",{className:"flex gap-4 text-sm",children:[n.jsxs("div",{children:[n.jsx("span",{className:"text-gray-500",children:"Primary Key:"})," ",n.jsx("span",{className:"font-mono",children:y.primaryKey})]}),n.jsxs("div",{children:[n.jsx("span",{className:"text-gray-500",children:"Readonly:"})," ",n.jsx("span",{className:"font-mono text-red-600",children:y.readonlyFields.join(", ")||"-"})]}),n.jsxs("div",{children:[n.jsx("span",{className:"text-gray-500",children:"Required:"})," ",n.jsx("span",{className:"font-mono text-green-600",children:y.requiredFields.join(", ")||"-"})]})]})})]}),n.jsx(Z,{title:`${e} - Daten`,children:h?n.jsx("div",{className:"text-center py-4",children:"Laden..."}):n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"overflow-x-auto",children:n.jsxs("table",{className:"w-full text-sm",children:[n.jsx("thead",{children:n.jsxs("tr",{className:"border-b bg-gray-50",children:[(p==null?void 0:p.data)&&p.data.length>0&&Object.keys(p.data[0]).map(S=>n.jsxs("th",{className:"text-left py-2 px-3 font-medium text-gray-600 whitespace-nowrap",children:[S,y.readonlyFields.includes(S)&&n.jsx("span",{className:"ml-1 text-red-400 text-xs",children:"*"}),y.requiredFields.includes(S)&&n.jsx("span",{className:"ml-1 text-green-400 text-xs",children:"!"})]},S)),n.jsx("th",{className:"text-right py-2 px-3 font-medium text-gray-600",children:"Aktionen"})]})}),n.jsxs("tbody",{children:[(F=p==null?void 0:p.data)==null?void 0:F.map(S=>{const L=v(S,y);return n.jsxs("tr",{className:"border-b hover:bg-gray-50",children:[Object.entries(S).map(([T,_])=>n.jsx("td",{className:"py-2 px-3 font-mono text-xs max-w-[200px] truncate",children:x(_)},T)),n.jsx("td",{className:"py-2 px-3 text-right whitespace-nowrap",children:n.jsxs("div",{className:"flex justify-end gap-1",children:[n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>i({id:L,data:{...S}}),children:n.jsx(We,{className:"w-4 h-4"})}),n.jsx(I,{variant:"ghost",size:"sm",onClick:()=>k(L),children:n.jsx(be,{className:"w-4 h-4 text-red-500"})})]})})]},L)}),(!(p!=null&&p.data)||p.data.length===0)&&n.jsx("tr",{children:n.jsx("td",{colSpan:100,className:"py-4 text-center text-gray-500",children:"Keine Daten vorhanden"})})]})]})}),(p==null?void 0:p.pagination)&&p.pagination.totalPages>1&&n.jsxs("div",{className:"mt-4 flex items-center justify-between",children:[n.jsxs("p",{className:"text-sm text-gray-500",children:["Seite ",p.pagination.page," von ",p.pagination.totalPages," (",p.pagination.total," Einträge)"]}),n.jsxs("div",{className:"flex gap-2",children:[n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>r(S=>Math.max(1,S-1)),disabled:s===1,children:n.jsx(f1,{className:"w-4 h-4"})}),n.jsx(I,{variant:"secondary",size:"sm",onClick:()=>r(S=>S+1),disabled:s>=p.pagination.totalPages,children:n.jsx(Ys,{className:"w-4 h-4"})})]})]})]})})]}):n.jsx(Z,{children:n.jsx("div",{className:"text-center py-8 text-gray-500",children:"Wähle eine Tabelle aus der Liste aus"})})})]}),n.jsx(dt,{isOpen:!!a,onClose:()=>i(null),title:`${e} bearbeiten`,children:a&&y&&n.jsxs("div",{className:"space-y-4 max-h-[60vh] overflow-y-auto",children:[Object.entries(a.data).map(([S,L])=>{const T=y.readonlyFields.includes(S),_=y.requiredFields.includes(S);return n.jsxs("div",{children:[n.jsxs("label",{className:"block text-sm font-medium text-gray-700 mb-1",children:[S,T&&n.jsx("span",{className:"ml-1 text-red-400",children:"(readonly)"}),_&&n.jsx("span",{className:"ml-1 text-green-600",children:"*"})]}),T?n.jsx("div",{className:"px-3 py-2 bg-gray-100 rounded-lg font-mono text-sm",children:x(L)}):typeof L=="boolean"?n.jsxs("select",{value:String(a.data[S]),onChange:K=>i({...a,data:{...a.data,[S]:K.target.value==="true"}}),className:"w-full px-3 py-2 border rounded-lg",children:[n.jsx("option",{value:"true",children:"Ja"}),n.jsx("option",{value:"false",children:"Nein"})]}):n.jsx("input",{type:typeof L=="number"?"number":"text",value:a.data[S]??"",onChange:K=>i({...a,data:{...a.data,[S]:typeof L=="number"?K.target.value?Number(K.target.value):null:K.target.value||null}}),className:"w-full px-3 py-2 border rounded-lg font-mono text-sm",disabled:T})]},S)}),n.jsxs("div",{className:"flex justify-end gap-2 pt-4 border-t",children:[n.jsxs(I,{variant:"secondary",onClick:()=>i(null),children:[n.jsx(wa,{className:"w-4 h-4 mr-2"}),"Abbrechen"]}),n.jsxs(I,{onClick:N,disabled:f.isPending,children:[n.jsx(S1,{className:"w-4 h-4 mr-2"}),f.isPending?"Speichern...":"Speichern"]})]})]})}),l&&n.jsxs("div",{className:"fixed inset-0 z-50 flex items-center justify-center",children:[n.jsx("div",{className:"absolute inset-0 bg-black/50",onClick:()=>o(!1)}),n.jsxs("div",{className:"relative bg-white rounded-xl shadow-2xl w-[90vw] h-[85vh] flex flex-col",children:[n.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b",children:[n.jsxs("div",{className:"flex items-center gap-3",children:[n.jsx(sp,{className:"w-5 h-5 text-blue-600"}),n.jsx("h2",{className:"text-lg font-semibold",children:"ER-Diagramm - Datenbankbeziehungen"})]}),n.jsx("button",{onClick:()=>o(!1),className:"p-2 hover:bg-gray-100 rounded-lg transition-colors",children:n.jsx(wa,{className:"w-5 h-5"})})]}),n.jsx("div",{className:"flex-1 overflow-hidden",children:n.jsx(f2,{onSelectTable:D})})]})]})]})}function g2({children:e}){const{isAuthenticated:t,isLoading:s}=st();return s?n.jsx("div",{className:"min-h-screen flex items-center justify-center",children:n.jsx("div",{className:"text-gray-500",children:"Laden..."})}):t?n.jsx(n.Fragment,{children:e}):n.jsx(Qr,{to:"/login",replace:!0})}function x2({children:e}){const{hasPermission:t,developerMode:s}=st();return!t("developer:access")||!s?n.jsx(Qr,{to:"/",replace:!0}):n.jsx(n.Fragment,{children:e})}function y2(){const{isAuthenticated:e,isLoading:t}=st();return t?n.jsx("div",{className:"min-h-screen flex items-center justify-center",children:n.jsx("div",{className:"text-gray-500",children:"Laden..."})}):n.jsxs(n.Fragment,{children:[n.jsx(l1,{}),n.jsxs(Ib,{children:[n.jsx(Fe,{path:"/login",element:e?n.jsx(Qr,{to:"/",replace:!0}):n.jsx(R1,{})}),n.jsxs(Fe,{path:"/",element:n.jsx(g2,{children:n.jsx(L1,{})}),children:[n.jsx(Fe,{index:!0,element:n.jsx(O1,{})}),n.jsx(Fe,{path:"customers",element:n.jsx(z1,{})}),n.jsx(Fe,{path:"customers/new",element:n.jsx(Np,{})}),n.jsx(Fe,{path:"customers/:id",element:n.jsx($1,{})}),n.jsx(Fe,{path:"customers/:id/edit",element:n.jsx(Np,{})}),n.jsx(Fe,{path:"contracts",element:n.jsx(NS,{})}),n.jsx(Fe,{path:"contracts/cockpit",element:n.jsx(US,{})}),n.jsx(Fe,{path:"contracts/new",element:n.jsx(kp,{})}),n.jsx(Fe,{path:"contracts/:id",element:n.jsx(FS,{})}),n.jsx(Fe,{path:"contracts/:id/edit",element:n.jsx(kp,{})}),n.jsx(Fe,{path:"tasks",element:n.jsx(BS,{})}),n.jsx(Fe,{path:"settings",element:n.jsx(m2,{})}),n.jsx(Fe,{path:"settings/users",element:n.jsx(d2,{})}),n.jsx(Fe,{path:"settings/platforms",element:n.jsx(qS,{})}),n.jsx(Fe,{path:"settings/cancellation-periods",element:n.jsx(HS,{})}),n.jsx(Fe,{path:"settings/contract-durations",element:n.jsx(GS,{})}),n.jsx(Fe,{path:"settings/providers",element:n.jsx(YS,{})}),n.jsx(Fe,{path:"settings/contract-categories",element:n.jsx(n2,{})}),n.jsx(Fe,{path:"settings/view",element:n.jsx(i2,{})}),n.jsx(Fe,{path:"settings/portal",element:n.jsx(l2,{})}),n.jsx(Fe,{path:"settings/deadlines",element:n.jsx(o2,{})}),n.jsx(Fe,{path:"settings/email-providers",element:n.jsx(u2,{})}),n.jsx(Fe,{path:"users",element:n.jsx(Qr,{to:"/settings/users",replace:!0})}),n.jsx(Fe,{path:"platforms",element:n.jsx(Qr,{to:"/settings/platforms",replace:!0})}),n.jsx(Fe,{path:"developer/database",element:n.jsx(x2,{children:n.jsx(p2,{})})})]}),n.jsx(Fe,{path:"*",element:n.jsx(Qr,{to:"/",replace:!0})})]})]})}const v2=new xN({defaultOptions:{queries:{retry:1,staleTime:5*60*1e3}}});Rc.createRoot(document.getElementById("root")).render(n.jsx(Nt.StrictMode,{children:n.jsx(yN,{client:v2,children:n.jsx(Bb,{children:n.jsx(i1,{children:n.jsx(a1,{children:n.jsx(y2,{})})})})})})); diff --git a/frontend/dist/assets/index-_pEZoPeF.css b/frontend/dist/assets/index-_pEZoPeF.css deleted file mode 100644 index f26e38c3..00000000 --- a/frontend/dist/assets/index-_pEZoPeF.css +++ /dev/null @@ -1 +0,0 @@ -*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-4{left:1rem}.right-0{right:0}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.z-10{z-index:10}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-3{margin-top:.75rem;margin-bottom:.75rem}.-mb-px{margin-bottom:-1px}.-mt-2{margin-top:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-10{margin-left:2.5rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-\[85vh\]{height:85vh}.h-full{height:100%}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-\[600px\]{max-height:600px}.max-h-\[60vh\]{max-height:60vh}.max-h-\[90vh\]{max-height:90vh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[90vw\]{width:90vw}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(2rem * var(--tw-space-x-reverse));margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l-0{border-left-width:0px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-green-300{--tw-border-opacity: 1;border-color:rgb(134 239 172 / var(--tw-border-opacity, 1))}.border-purple-300{--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-red-400{--tw-border-opacity: 1;border-color:rgb(248 113 113 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-yellow-300{--tw-border-opacity: 1;border-color:rgb(253 224 71 / var(--tw-border-opacity, 1))}.border-l-blue-500{--tw-border-opacity: 1;border-left-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/50{background-color:#00000080}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-50\/50{background-color:#f9fafb80}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-purple-600{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.\!p-4{padding:1rem!important}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-wider{letter-spacing:.05em}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-gray-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(156 163 175 / var(--tw-ring-opacity, 1))}.ring-offset-2{--tw-ring-offset-width: 2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}body{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:h-5:after{content:var(--tw-content);height:1.25rem}.after\:w-5:after{content:var(--tw-content);width:1.25rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:border:after{content:var(--tw-content);border-width:1px}.after\:border-gray-300:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-blue-300:hover{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.hover\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-opacity-50:hover{--tw-bg-opacity: .5}.hover\:text-blue-600:hover{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:text-green-600:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:text-yellow-600:hover{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.focus\:ring-gray-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1))}.focus\:ring-purple-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(168 85 247 / var(--tw-ring-opacity, 1))}.focus\:ring-red-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.group:hover .group-hover\:text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.group\/subtask:hover .group-hover\/subtask\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}.peer:checked~.peer-checked\:bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.peer:checked~.peer-checked\:after\:translate-x-full:after{content:var(--tw-content);--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:checked~.peer-checked\:after\:border-white:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\:ring-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.peer:focus~.peer-focus\:ring-blue-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1))}@media (min-width: 640px){.sm\:w-auto{width:auto}}@media (min-width: 768px){.md\:col-span-2{grid-column:span 2 / span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:col-span-1{grid-column:span 1 / span 1}.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:block{display:block}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}} diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 47904a43..056b0c74 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -5,8 +5,8 @@ OpenCRM - - + +
diff --git a/frontend/node_modules/.package-lock.json b/frontend/node_modules/.package-lock.json index 0c4a9706..58af1c44 100644 --- a/frontend/node_modules/.package-lock.json +++ b/frontend/node_modules/.package-lock.json @@ -791,8 +791,7 @@ "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" }, "node_modules/debug": { "version": "4.4.3", @@ -1098,6 +1097,14 @@ "node": ">=10.13.0" } }, + "node_modules/goober": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz", + "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==", + "peerDependencies": { + "csstype": "^3.0.10" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1664,6 +1671,22 @@ "react": "^16.8.0 || ^17 || ^18 || ^19" } }, + "node_modules/react-hot-toast": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz", + "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==", + "dependencies": { + "csstype": "^3.1.3", + "goober": "^2.1.16" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", diff --git a/frontend/node_modules/.vite/deps/_metadata.json b/frontend/node_modules/.vite/deps/_metadata.json index 77d7d6ee..28055e4f 100644 --- a/frontend/node_modules/.vite/deps/_metadata.json +++ b/frontend/node_modules/.vite/deps/_metadata.json @@ -1,67 +1,73 @@ { - "hash": "eeae1b35", + "hash": "b8db82d9", "configHash": "c7be2068", - "lockfileHash": "9edb0d4c", - "browserHash": "fe173fb8", + "lockfileHash": "ee9bf28c", + "browserHash": "deb47249", "optimized": { "react": { "src": "../../react/index.js", "file": "react.js", - "fileHash": "6771d2e5", + "fileHash": "304f33a9", "needsInterop": true }, "react-dom": { "src": "../../react-dom/index.js", "file": "react-dom.js", - "fileHash": "4b5e071f", + "fileHash": "96d32bc1", "needsInterop": true }, "react/jsx-dev-runtime": { "src": "../../react/jsx-dev-runtime.js", "file": "react_jsx-dev-runtime.js", - "fileHash": "053f8773", + "fileHash": "6424b7ea", "needsInterop": true }, "react/jsx-runtime": { "src": "../../react/jsx-runtime.js", "file": "react_jsx-runtime.js", - "fileHash": "5bc5ee39", + "fileHash": "af95a7a1", "needsInterop": true }, "@tanstack/react-query": { "src": "../../@tanstack/react-query/build/modern/index.js", "file": "@tanstack_react-query.js", - "fileHash": "25a02139", + "fileHash": "c9459c14", "needsInterop": false }, "axios": { "src": "../../axios/index.js", "file": "axios.js", - "fileHash": "7d1ba6fe", + "fileHash": "032e1913", "needsInterop": false }, "lucide-react": { "src": "../../lucide-react/dist/esm/lucide-react.js", "file": "lucide-react.js", - "fileHash": "3ebbc663", + "fileHash": "341675db", "needsInterop": false }, "react-dom/client": { "src": "../../react-dom/client.js", "file": "react-dom_client.js", - "fileHash": "8b0b7734", + "fileHash": "6520a32f", "needsInterop": true }, "react-hook-form": { "src": "../../react-hook-form/dist/index.esm.mjs", "file": "react-hook-form.js", - "fileHash": "d05e0352", + "fileHash": "29e58164", "needsInterop": false }, "react-router-dom": { "src": "../../react-router-dom/dist/index.js", "file": "react-router-dom.js", - "fileHash": "0c95dc90", + "fileHash": "4b5d4fdc", + "needsInterop": false + }, + "react-hot-toast": { + "src": "../../react-hot-toast/dist/index.mjs", + "file": "react-hot-toast.js", + "fileHash": "7423c32d", "needsInterop": false } }, diff --git a/frontend/node_modules/.vite/deps/react-hot-toast.js b/frontend/node_modules/.vite/deps/react-hot-toast.js new file mode 100644 index 00000000..469d84fb --- /dev/null +++ b/frontend/node_modules/.vite/deps/react-hot-toast.js @@ -0,0 +1,486 @@ +"use client"; +import { + require_react +} from "./chunk-3TFVT2CW.js"; +import { + __toESM +} from "./chunk-4MBMRILA.js"; + +// node_modules/react-hot-toast/dist/index.mjs +var import_react = __toESM(require_react(), 1); +var import_react2 = __toESM(require_react(), 1); +var y = __toESM(require_react(), 1); + +// node_modules/goober/dist/goober.modern.js +var e = { data: "" }; +var t = (t2) => { + if ("object" == typeof window) { + let e2 = (t2 ? t2.querySelector("#_goober") : window._goober) || Object.assign(document.createElement("style"), { innerHTML: " ", id: "_goober" }); + return e2.nonce = window.__nonce__, e2.parentNode || (t2 || document.head).appendChild(e2), e2.firstChild; + } + return t2 || e; +}; +var l = /(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g; +var a = /\/\*[^]*?\*\/| +/g; +var n = /\n+/g; +var o = (e2, t2) => { + let r = "", l2 = "", a2 = ""; + for (let n3 in e2) { + let c2 = e2[n3]; + "@" == n3[0] ? "i" == n3[1] ? r = n3 + " " + c2 + ";" : l2 += "f" == n3[1] ? o(c2, n3) : n3 + "{" + o(c2, "k" == n3[1] ? "" : t2) + "}" : "object" == typeof c2 ? l2 += o(c2, t2 ? t2.replace(/([^,])+/g, (e3) => n3.replace(/([^,]*:\S+\([^)]*\))|([^,])+/g, (t3) => /&/.test(t3) ? t3.replace(/&/g, e3) : e3 ? e3 + " " + t3 : t3)) : n3) : null != c2 && (n3 = /^--/.test(n3) ? n3 : n3.replace(/[A-Z]/g, "-$&").toLowerCase(), a2 += o.p ? o.p(n3, c2) : n3 + ":" + c2 + ";"); + } + return r + (t2 && a2 ? t2 + "{" + a2 + "}" : a2) + l2; +}; +var c = {}; +var s = (e2) => { + if ("object" == typeof e2) { + let t2 = ""; + for (let r in e2) t2 += r + s(e2[r]); + return t2; + } + return e2; +}; +var i = (e2, t2, r, i2, p2) => { + let u2 = s(e2), d2 = c[u2] || (c[u2] = ((e3) => { + let t3 = 0, r2 = 11; + for (; t3 < e3.length; ) r2 = 101 * r2 + e3.charCodeAt(t3++) >>> 0; + return "go" + r2; + })(u2)); + if (!c[d2]) { + let t3 = u2 !== e2 ? e2 : ((e3) => { + let t4, r2, o2 = [{}]; + for (; t4 = l.exec(e3.replace(a, "")); ) t4[4] ? o2.shift() : t4[3] ? (r2 = t4[3].replace(n, " ").trim(), o2.unshift(o2[0][r2] = o2[0][r2] || {})) : o2[0][t4[1]] = t4[2].replace(n, " ").trim(); + return o2[0]; + })(e2); + c[d2] = o(p2 ? { ["@keyframes " + d2]: t3 } : t3, r ? "" : "." + d2); + } + let f3 = r && c.g ? c.g : null; + return r && (c.g = c[d2]), ((e3, t3, r2, l2) => { + l2 ? t3.data = t3.data.replace(l2, e3) : -1 === t3.data.indexOf(e3) && (t3.data = r2 ? e3 + t3.data : t3.data + e3); + })(c[d2], t2, i2, f3), d2; +}; +var p = (e2, t2, r) => e2.reduce((e3, l2, a2) => { + let n3 = t2[a2]; + if (n3 && n3.call) { + let e4 = n3(r), t3 = e4 && e4.props && e4.props.className || /^go/.test(e4) && e4; + n3 = t3 ? "." + t3 : e4 && "object" == typeof e4 ? e4.props ? "" : o(e4, "") : false === e4 ? "" : e4; + } + return e3 + l2 + (null == n3 ? "" : n3); +}, ""); +function u(e2) { + let r = this || {}, l2 = e2.call ? e2(r.p) : e2; + return i(l2.unshift ? l2.raw ? p(l2, [].slice.call(arguments, 1), r.p) : l2.reduce((e3, t2) => Object.assign(e3, t2 && t2.call ? t2(r.p) : t2), {}) : l2, t(r.target), r.g, r.o, r.k); +} +var d; +var f; +var g; +var b = u.bind({ g: 1 }); +var h = u.bind({ k: 1 }); +function m(e2, t2, r, l2) { + o.p = t2, d = e2, f = r, g = l2; +} +function w(e2, t2) { + let r = this || {}; + return function() { + let l2 = arguments; + function a2(n3, o2) { + let c2 = Object.assign({}, n3), s2 = c2.className || a2.className; + r.p = Object.assign({ theme: f && f() }, c2), r.o = / *go\d+/.test(s2), c2.className = u.apply(r, l2) + (s2 ? " " + s2 : ""), t2 && (c2.ref = o2); + let i2 = e2; + return e2[0] && (i2 = c2.as || e2, delete c2.as), g && i2[0] && g(c2), d(i2, c2); + } + return t2 ? t2(a2) : a2; + }; +} + +// node_modules/react-hot-toast/dist/index.mjs +var b2 = __toESM(require_react(), 1); +var x = __toESM(require_react(), 1); +var Z = (e2) => typeof e2 == "function"; +var h2 = (e2, t2) => Z(e2) ? e2(t2) : e2; +var W = /* @__PURE__ */ (() => { + let e2 = 0; + return () => (++e2).toString(); +})(); +var E = /* @__PURE__ */ (() => { + let e2; + return () => { + if (e2 === void 0 && typeof window < "u") { + let t2 = matchMedia("(prefers-reduced-motion: reduce)"); + e2 = !t2 || t2.matches; + } + return e2; + }; +})(); +var re = 20; +var k = "default"; +var H = (e2, t2) => { + let { toastLimit: o2 } = e2.settings; + switch (t2.type) { + case 0: + return { ...e2, toasts: [t2.toast, ...e2.toasts].slice(0, o2) }; + case 1: + return { ...e2, toasts: e2.toasts.map((r) => r.id === t2.toast.id ? { ...r, ...t2.toast } : r) }; + case 2: + let { toast: s2 } = t2; + return H(e2, { type: e2.toasts.find((r) => r.id === s2.id) ? 1 : 0, toast: s2 }); + case 3: + let { toastId: a2 } = t2; + return { ...e2, toasts: e2.toasts.map((r) => r.id === a2 || a2 === void 0 ? { ...r, dismissed: true, visible: false } : r) }; + case 4: + return t2.toastId === void 0 ? { ...e2, toasts: [] } : { ...e2, toasts: e2.toasts.filter((r) => r.id !== t2.toastId) }; + case 5: + return { ...e2, pausedAt: t2.time }; + case 6: + let i2 = t2.time - (e2.pausedAt || 0); + return { ...e2, pausedAt: void 0, toasts: e2.toasts.map((r) => ({ ...r, pauseDuration: r.pauseDuration + i2 })) }; + } +}; +var v = []; +var j = { toasts: [], pausedAt: void 0, settings: { toastLimit: re } }; +var f2 = {}; +var Y = (e2, t2 = k) => { + f2[t2] = H(f2[t2] || j, e2), v.forEach(([o2, s2]) => { + o2 === t2 && s2(f2[t2]); + }); +}; +var _ = (e2) => Object.keys(f2).forEach((t2) => Y(e2, t2)); +var Q = (e2) => Object.keys(f2).find((t2) => f2[t2].toasts.some((o2) => o2.id === e2)); +var S = (e2 = k) => (t2) => { + Y(t2, e2); +}; +var se = { blank: 4e3, error: 4e3, success: 2e3, loading: 1 / 0, custom: 4e3 }; +var V = (e2 = {}, t2 = k) => { + let [o2, s2] = (0, import_react.useState)(f2[t2] || j), a2 = (0, import_react.useRef)(f2[t2]); + (0, import_react.useEffect)(() => (a2.current !== f2[t2] && s2(f2[t2]), v.push([t2, s2]), () => { + let r = v.findIndex(([l2]) => l2 === t2); + r > -1 && v.splice(r, 1); + }), [t2]); + let i2 = o2.toasts.map((r) => { + var l2, g2, T; + return { ...e2, ...e2[r.type], ...r, removeDelay: r.removeDelay || ((l2 = e2[r.type]) == null ? void 0 : l2.removeDelay) || (e2 == null ? void 0 : e2.removeDelay), duration: r.duration || ((g2 = e2[r.type]) == null ? void 0 : g2.duration) || (e2 == null ? void 0 : e2.duration) || se[r.type], style: { ...e2.style, ...(T = e2[r.type]) == null ? void 0 : T.style, ...r.style } }; + }); + return { ...o2, toasts: i2 }; +}; +var ie = (e2, t2 = "blank", o2) => ({ createdAt: Date.now(), visible: true, dismissed: false, type: t2, ariaProps: { role: "status", "aria-live": "polite" }, message: e2, pauseDuration: 0, ...o2, id: (o2 == null ? void 0 : o2.id) || W() }); +var P = (e2) => (t2, o2) => { + let s2 = ie(t2, e2, o2); + return S(s2.toasterId || Q(s2.id))({ type: 2, toast: s2 }), s2.id; +}; +var n2 = (e2, t2) => P("blank")(e2, t2); +n2.error = P("error"); +n2.success = P("success"); +n2.loading = P("loading"); +n2.custom = P("custom"); +n2.dismiss = (e2, t2) => { + let o2 = { type: 3, toastId: e2 }; + t2 ? S(t2)(o2) : _(o2); +}; +n2.dismissAll = (e2) => n2.dismiss(void 0, e2); +n2.remove = (e2, t2) => { + let o2 = { type: 4, toastId: e2 }; + t2 ? S(t2)(o2) : _(o2); +}; +n2.removeAll = (e2) => n2.remove(void 0, e2); +n2.promise = (e2, t2, o2) => { + let s2 = n2.loading(t2.loading, { ...o2, ...o2 == null ? void 0 : o2.loading }); + return typeof e2 == "function" && (e2 = e2()), e2.then((a2) => { + let i2 = t2.success ? h2(t2.success, a2) : void 0; + return i2 ? n2.success(i2, { id: s2, ...o2, ...o2 == null ? void 0 : o2.success }) : n2.dismiss(s2), a2; + }).catch((a2) => { + let i2 = t2.error ? h2(t2.error, a2) : void 0; + i2 ? n2.error(i2, { id: s2, ...o2, ...o2 == null ? void 0 : o2.error }) : n2.dismiss(s2); + }), e2; +}; +var ce = 1e3; +var w2 = (e2, t2 = "default") => { + let { toasts: o2, pausedAt: s2 } = V(e2, t2), a2 = (0, import_react2.useRef)(/* @__PURE__ */ new Map()).current, i2 = (0, import_react2.useCallback)((c2, m2 = ce) => { + if (a2.has(c2)) return; + let p2 = setTimeout(() => { + a2.delete(c2), r({ type: 4, toastId: c2 }); + }, m2); + a2.set(c2, p2); + }, []); + (0, import_react2.useEffect)(() => { + if (s2) return; + let c2 = Date.now(), m2 = o2.map((p2) => { + if (p2.duration === 1 / 0) return; + let R = (p2.duration || 0) + p2.pauseDuration - (c2 - p2.createdAt); + if (R < 0) { + p2.visible && n2.dismiss(p2.id); + return; + } + return setTimeout(() => n2.dismiss(p2.id, t2), R); + }); + return () => { + m2.forEach((p2) => p2 && clearTimeout(p2)); + }; + }, [o2, s2, t2]); + let r = (0, import_react2.useCallback)(S(t2), [t2]), l2 = (0, import_react2.useCallback)(() => { + r({ type: 5, time: Date.now() }); + }, [r]), g2 = (0, import_react2.useCallback)((c2, m2) => { + r({ type: 1, toast: { id: c2, height: m2 } }); + }, [r]), T = (0, import_react2.useCallback)(() => { + s2 && r({ type: 6, time: Date.now() }); + }, [s2, r]), d2 = (0, import_react2.useCallback)((c2, m2) => { + let { reverseOrder: p2 = false, gutter: R = 8, defaultPosition: z } = m2 || {}, O = o2.filter((u2) => (u2.position || z) === (c2.position || z) && u2.height), K = O.findIndex((u2) => u2.id === c2.id), B = O.filter((u2, I) => I < K && u2.visible).length; + return O.filter((u2) => u2.visible).slice(...p2 ? [B + 1] : [0, B]).reduce((u2, I) => u2 + (I.height || 0) + R, 0); + }, [o2]); + return (0, import_react2.useEffect)(() => { + o2.forEach((c2) => { + if (c2.dismissed) i2(c2.id, c2.removeDelay); + else { + let m2 = a2.get(c2.id); + m2 && (clearTimeout(m2), a2.delete(c2.id)); + } + }); + }, [o2, i2]), { toasts: o2, handlers: { updateHeight: g2, startPause: l2, endPause: T, calculateOffset: d2 } }; +}; +var de = h` +from { + transform: scale(0) rotate(45deg); + opacity: 0; +} +to { + transform: scale(1) rotate(45deg); + opacity: 1; +}`; +var me = h` +from { + transform: scale(0); + opacity: 0; +} +to { + transform: scale(1); + opacity: 1; +}`; +var le = h` +from { + transform: scale(0) rotate(90deg); + opacity: 0; +} +to { + transform: scale(1) rotate(90deg); + opacity: 1; +}`; +var C = w("div")` + width: 20px; + opacity: 0; + height: 20px; + border-radius: 10px; + background: ${(e2) => e2.primary || "#ff4b4b"}; + position: relative; + transform: rotate(45deg); + + animation: ${de} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) + forwards; + animation-delay: 100ms; + + &:after, + &:before { + content: ''; + animation: ${me} 0.15s ease-out forwards; + animation-delay: 150ms; + position: absolute; + border-radius: 3px; + opacity: 0; + background: ${(e2) => e2.secondary || "#fff"}; + bottom: 9px; + left: 4px; + height: 2px; + width: 12px; + } + + &:before { + animation: ${le} 0.15s ease-out forwards; + animation-delay: 180ms; + transform: rotate(90deg); + } +`; +var Te = h` + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +`; +var F = w("div")` + width: 12px; + height: 12px; + box-sizing: border-box; + border: 2px solid; + border-radius: 100%; + border-color: ${(e2) => e2.secondary || "#e0e0e0"}; + border-right-color: ${(e2) => e2.primary || "#616161"}; + animation: ${Te} 1s linear infinite; +`; +var ge = h` +from { + transform: scale(0) rotate(45deg); + opacity: 0; +} +to { + transform: scale(1) rotate(45deg); + opacity: 1; +}`; +var he = h` +0% { + height: 0; + width: 0; + opacity: 0; +} +40% { + height: 0; + width: 6px; + opacity: 1; +} +100% { + opacity: 1; + height: 10px; +}`; +var L = w("div")` + width: 20px; + opacity: 0; + height: 20px; + border-radius: 10px; + background: ${(e2) => e2.primary || "#61d345"}; + position: relative; + transform: rotate(45deg); + + animation: ${ge} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) + forwards; + animation-delay: 100ms; + &:after { + content: ''; + box-sizing: border-box; + animation: ${he} 0.2s ease-out forwards; + opacity: 0; + animation-delay: 200ms; + position: absolute; + border-right: 2px solid; + border-bottom: 2px solid; + border-color: ${(e2) => e2.secondary || "#fff"}; + bottom: 6px; + left: 6px; + height: 10px; + width: 6px; + } +`; +var be = w("div")` + position: absolute; +`; +var Se = w("div")` + position: relative; + display: flex; + justify-content: center; + align-items: center; + min-width: 20px; + min-height: 20px; +`; +var Ae = h` +from { + transform: scale(0.6); + opacity: 0.4; +} +to { + transform: scale(1); + opacity: 1; +}`; +var Pe = w("div")` + position: relative; + transform: scale(0.6); + opacity: 0.4; + min-width: 20px; + animation: ${Ae} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275) + forwards; +`; +var $ = ({ toast: e2 }) => { + let { icon: t2, type: o2, iconTheme: s2 } = e2; + return t2 !== void 0 ? typeof t2 == "string" ? b2.createElement(Pe, null, t2) : t2 : o2 === "blank" ? null : b2.createElement(Se, null, b2.createElement(F, { ...s2 }), o2 !== "loading" && b2.createElement(be, null, o2 === "error" ? b2.createElement(C, { ...s2 }) : b2.createElement(L, { ...s2 }))); +}; +var Re = (e2) => ` +0% {transform: translate3d(0,${e2 * -200}%,0) scale(.6); opacity:.5;} +100% {transform: translate3d(0,0,0) scale(1); opacity:1;} +`; +var Ee = (e2) => ` +0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;} +100% {transform: translate3d(0,${e2 * -150}%,-1px) scale(.6); opacity:0;} +`; +var ve = "0%{opacity:0;} 100%{opacity:1;}"; +var De = "0%{opacity:1;} 100%{opacity:0;}"; +var Oe = w("div")` + display: flex; + align-items: center; + background: #fff; + color: #363636; + line-height: 1.3; + will-change: transform; + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05); + max-width: 350px; + pointer-events: auto; + padding: 8px 10px; + border-radius: 8px; +`; +var Ie = w("div")` + display: flex; + justify-content: center; + margin: 4px 10px; + color: inherit; + flex: 1 1 auto; + white-space: pre-line; +`; +var ke = (e2, t2) => { + let s2 = e2.includes("top") ? 1 : -1, [a2, i2] = E() ? [ve, De] : [Re(s2), Ee(s2)]; + return { animation: t2 ? `${h(a2)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards` : `${h(i2)} 0.4s forwards cubic-bezier(.06,.71,.55,1)` }; +}; +var N = y.memo(({ toast: e2, position: t2, style: o2, children: s2 }) => { + let a2 = e2.height ? ke(e2.position || t2 || "top-center", e2.visible) : { opacity: 0 }, i2 = y.createElement($, { toast: e2 }), r = y.createElement(Ie, { ...e2.ariaProps }, h2(e2.message, e2)); + return y.createElement(Oe, { className: e2.className, style: { ...a2, ...o2, ...e2.style } }, typeof s2 == "function" ? s2({ icon: i2, message: r }) : y.createElement(y.Fragment, null, i2, r)); +}); +m(x.createElement); +var we = ({ id: e2, className: t2, style: o2, onHeightUpdate: s2, children: a2 }) => { + let i2 = x.useCallback((r) => { + if (r) { + let l2 = () => { + let g2 = r.getBoundingClientRect().height; + s2(e2, g2); + }; + l2(), new MutationObserver(l2).observe(r, { subtree: true, childList: true, characterData: true }); + } + }, [e2, s2]); + return x.createElement("div", { ref: i2, className: t2, style: o2 }, a2); +}; +var Me = (e2, t2) => { + let o2 = e2.includes("top"), s2 = o2 ? { top: 0 } : { bottom: 0 }, a2 = e2.includes("center") ? { justifyContent: "center" } : e2.includes("right") ? { justifyContent: "flex-end" } : {}; + return { left: 0, right: 0, display: "flex", position: "absolute", transition: E() ? void 0 : "all 230ms cubic-bezier(.21,1.02,.73,1)", transform: `translateY(${t2 * (o2 ? 1 : -1)}px)`, ...s2, ...a2 }; +}; +var Ce = u` + z-index: 9999; + > * { + pointer-events: auto; + } +`; +var D = 16; +var Fe = ({ reverseOrder: e2, position: t2 = "top-center", toastOptions: o2, gutter: s2, children: a2, toasterId: i2, containerStyle: r, containerClassName: l2 }) => { + let { toasts: g2, handlers: T } = w2(o2, i2); + return x.createElement("div", { "data-rht-toaster": i2 || "", style: { position: "fixed", zIndex: 9999, top: D, left: D, right: D, bottom: D, pointerEvents: "none", ...r }, className: l2, onMouseEnter: T.startPause, onMouseLeave: T.endPause }, g2.map((d2) => { + let c2 = d2.position || t2, m2 = T.calculateOffset(d2, { reverseOrder: e2, gutter: s2, defaultPosition: t2 }), p2 = Me(c2, m2); + return x.createElement(we, { id: d2.id, key: d2.id, onHeightUpdate: T.updateHeight, className: d2.visible ? Ce : "", style: p2 }, d2.type === "custom" ? h2(d2.message, d2) : a2 ? a2(d2) : x.createElement(N, { toast: d2, position: c2 })); + })); +}; +var zt = n2; +export { + L as CheckmarkIcon, + C as ErrorIcon, + F as LoaderIcon, + N as ToastBar, + $ as ToastIcon, + Fe as Toaster, + zt as default, + h2 as resolveValue, + n2 as toast, + w2 as useToaster, + V as useToasterStore +}; +//# sourceMappingURL=react-hot-toast.js.map diff --git a/frontend/node_modules/.vite/deps/react-hot-toast.js.map b/frontend/node_modules/.vite/deps/react-hot-toast.js.map new file mode 100644 index 00000000..86d4e565 --- /dev/null +++ b/frontend/node_modules/.vite/deps/react-hot-toast.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../../react-hot-toast/src/core/types.ts", "../../react-hot-toast/src/core/utils.ts", "../../react-hot-toast/src/core/store.ts", "../../react-hot-toast/src/core/toast.ts", "../../react-hot-toast/src/core/use-toaster.ts", "../../react-hot-toast/src/components/toast-bar.tsx", "../../react-hot-toast/src/components/toast-icon.tsx", "../../react-hot-toast/src/components/error.tsx", "../../react-hot-toast/src/components/loader.tsx", "../../react-hot-toast/src/components/checkmark.tsx", "../../react-hot-toast/src/components/toaster.tsx", "../../react-hot-toast/src/index.ts", "../../goober/dist/goober.modern.js"], + "sourcesContent": ["import { CSSProperties } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'loading' | 'blank' | 'custom';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type Renderable = React.ReactElement | string | null;\n\nexport interface IconTheme {\n primary: string;\n secondary: string;\n}\n\nexport type ValueFunction = (arg: TArg) => TValue;\nexport type ValueOrFunction =\n | TValue\n | ValueFunction;\n\nconst isFunction = (\n valOrFunction: ValueOrFunction\n): valOrFunction is ValueFunction =>\n typeof valOrFunction === 'function';\n\nexport const resolveValue = (\n valOrFunction: ValueOrFunction,\n arg: TArg\n): TValue => (isFunction(valOrFunction) ? valOrFunction(arg) : valOrFunction);\n\nexport interface Toast {\n type: ToastType;\n id: string;\n toasterId?: string;\n message: ValueOrFunction;\n icon?: Renderable;\n duration?: number;\n pauseDuration: number;\n position?: ToastPosition;\n removeDelay?: number;\n\n ariaProps: {\n role: 'status' | 'alert';\n 'aria-live': 'assertive' | 'off' | 'polite';\n };\n\n style?: CSSProperties;\n className?: string;\n iconTheme?: IconTheme;\n\n createdAt: number;\n visible: boolean;\n dismissed: boolean;\n height?: number;\n}\n\nexport type ToastOptions = Partial<\n Pick<\n Toast,\n | 'id'\n | 'icon'\n | 'duration'\n | 'ariaProps'\n | 'className'\n | 'style'\n | 'position'\n | 'iconTheme'\n | 'toasterId'\n | 'removeDelay'\n >\n>;\n\nexport type DefaultToastOptions = ToastOptions & {\n [key in ToastType]?: ToastOptions;\n};\n\nexport interface ToasterProps {\n position?: ToastPosition;\n toastOptions?: DefaultToastOptions;\n reverseOrder?: boolean;\n gutter?: number;\n containerStyle?: React.CSSProperties;\n containerClassName?: string;\n toasterId?: string;\n children?: (toast: Toast) => React.ReactElement;\n}\n\nexport interface ToastWrapperProps {\n id: string;\n className?: string;\n style?: React.CSSProperties;\n onHeightUpdate: (id: string, height: number) => void;\n children?: React.ReactNode;\n}\n", "export const genId = (() => {\n let count = 0;\n return () => {\n return (++count).toString();\n };\n})();\n\nexport const prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined;\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== 'undefined') {\n const mediaQuery = matchMedia('(prefers-reduced-motion: reduce)');\n shouldReduceMotion = !mediaQuery || mediaQuery.matches;\n }\n return shouldReduceMotion;\n };\n})();\n", "import { useEffect, useState, useRef } from 'react';\nimport { DefaultToastOptions, Toast, ToastType } from './types';\n\nexport const TOAST_EXPIRE_DISMISS_DELAY = 1000;\nexport const TOAST_LIMIT = 20;\nexport const DEFAULT_TOASTER_ID = 'default';\n\ninterface ToasterSettings {\n toastLimit: number;\n}\n\nexport enum ActionType {\n ADD_TOAST,\n UPDATE_TOAST,\n UPSERT_TOAST,\n DISMISS_TOAST,\n REMOVE_TOAST,\n START_PAUSE,\n END_PAUSE,\n}\n\nexport type Action =\n | {\n type: ActionType.ADD_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPSERT_TOAST;\n toast: Toast;\n }\n | {\n type: ActionType.UPDATE_TOAST;\n toast: Partial;\n }\n | {\n type: ActionType.DISMISS_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.REMOVE_TOAST;\n toastId?: string;\n }\n | {\n type: ActionType.START_PAUSE;\n time: number;\n }\n | {\n type: ActionType.END_PAUSE;\n time: number;\n };\n\ninterface ToasterState {\n toasts: Toast[];\n settings: ToasterSettings;\n pausedAt: number | undefined;\n}\n\ninterface State {\n [toasterId: string]: ToasterState;\n}\n\nexport const reducer = (state: ToasterState, action: Action): ToasterState => {\n const { toastLimit } = state.settings;\n\n switch (action.type) {\n case ActionType.ADD_TOAST:\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, toastLimit),\n };\n\n case ActionType.UPDATE_TOAST:\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case ActionType.UPSERT_TOAST:\n const { toast } = action;\n return reducer(state, {\n type: state.toasts.find((t) => t.id === toast.id)\n ? ActionType.UPDATE_TOAST\n : ActionType.ADD_TOAST,\n toast,\n });\n\n case ActionType.DISMISS_TOAST:\n const { toastId } = action;\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n dismissed: true,\n visible: false,\n }\n : t\n ),\n };\n case ActionType.REMOVE_TOAST:\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n\n case ActionType.START_PAUSE:\n return {\n ...state,\n pausedAt: action.time,\n };\n\n case ActionType.END_PAUSE:\n const diff = action.time - (state.pausedAt || 0);\n\n return {\n ...state,\n pausedAt: undefined,\n toasts: state.toasts.map((t) => ({\n ...t,\n pauseDuration: t.pauseDuration + diff,\n })),\n };\n }\n};\n\nconst listeners: Array<\n [toasterId: string, reducer: (state: ToasterState) => void]\n> = [];\n\nconst defaultToasterState: ToasterState = {\n toasts: [],\n pausedAt: undefined,\n settings: {\n toastLimit: TOAST_LIMIT,\n },\n};\nlet memoryState: State = {};\n\nexport const dispatch = (action: Action, toasterId = DEFAULT_TOASTER_ID) => {\n memoryState[toasterId] = reducer(\n memoryState[toasterId] || defaultToasterState,\n action\n );\n listeners.forEach(([id, listener]) => {\n if (id === toasterId) {\n listener(memoryState[toasterId]);\n }\n });\n};\n\nexport const dispatchAll = (action: Action) =>\n Object.keys(memoryState).forEach((toasterId) => dispatch(action, toasterId));\n\nexport const getToasterIdFromToastId = (toastId: string) =>\n Object.keys(memoryState).find((toasterId) =>\n memoryState[toasterId].toasts.some((t) => t.id === toastId)\n );\n\nexport const createDispatch =\n (toasterId = DEFAULT_TOASTER_ID) =>\n (action: Action) => {\n dispatch(action, toasterId);\n };\n\nexport const defaultTimeouts: {\n [key in ToastType]: number;\n} = {\n blank: 4000,\n error: 4000,\n success: 2000,\n loading: Infinity,\n custom: 4000,\n};\n\nexport const useStore = (\n toastOptions: DefaultToastOptions = {},\n toasterId: string = DEFAULT_TOASTER_ID\n): ToasterState => {\n const [state, setState] = useState(\n memoryState[toasterId] || defaultToasterState\n );\n const initial = useRef(memoryState[toasterId]);\n\n // TODO: Switch to useSyncExternalStore when targeting React 18+\n useEffect(() => {\n if (initial.current !== memoryState[toasterId]) {\n setState(memoryState[toasterId]);\n }\n listeners.push([toasterId, setState]);\n return () => {\n const index = listeners.findIndex(([id]) => id === toasterId);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, [toasterId]);\n\n const mergedToasts = state.toasts.map((t) => ({\n ...toastOptions,\n ...toastOptions[t.type],\n ...t,\n removeDelay:\n t.removeDelay ||\n toastOptions[t.type]?.removeDelay ||\n toastOptions?.removeDelay,\n duration:\n t.duration ||\n toastOptions[t.type]?.duration ||\n toastOptions?.duration ||\n defaultTimeouts[t.type],\n style: {\n ...toastOptions.style,\n ...toastOptions[t.type]?.style,\n ...t.style,\n },\n }));\n\n return {\n ...state,\n toasts: mergedToasts,\n };\n};\n", "import {\n Renderable,\n Toast,\n ToastOptions,\n ToastType,\n DefaultToastOptions,\n ValueOrFunction,\n resolveValue,\n} from './types';\nimport { genId } from './utils';\nimport {\n createDispatch,\n Action,\n ActionType,\n dispatchAll,\n getToasterIdFromToastId,\n} from './store';\n\ntype Message = ValueOrFunction;\n\ntype ToastHandler = (message: Message, options?: ToastOptions) => string;\n\nconst createToast = (\n message: Message,\n type: ToastType = 'blank',\n opts?: ToastOptions\n): Toast => ({\n createdAt: Date.now(),\n visible: true,\n dismissed: false,\n type,\n ariaProps: {\n role: 'status',\n 'aria-live': 'polite',\n },\n message,\n pauseDuration: 0,\n ...opts,\n id: opts?.id || genId(),\n});\n\nconst createHandler =\n (type?: ToastType): ToastHandler =>\n (message, options) => {\n const toast = createToast(message, type, options);\n\n const dispatch = createDispatch(\n toast.toasterId || getToasterIdFromToastId(toast.id)\n );\n\n dispatch({ type: ActionType.UPSERT_TOAST, toast });\n return toast.id;\n };\n\nconst toast = (message: Message, opts?: ToastOptions) =>\n createHandler('blank')(message, opts);\n\ntoast.error = createHandler('error');\ntoast.success = createHandler('success');\ntoast.loading = createHandler('loading');\ntoast.custom = createHandler('custom');\n\n/**\n * Dismisses the toast with the given id. If no id is given, dismisses all toasts.\n * The toast will transition out and then be removed from the DOM.\n * Applies to all toasters, except when a `toasterId` is given.\n */\ntoast.dismiss = (toastId?: string, toasterId?: string) => {\n const action: Action = {\n type: ActionType.DISMISS_TOAST,\n toastId,\n };\n\n if (toasterId) {\n createDispatch(toasterId)(action);\n } else {\n dispatchAll(action);\n }\n};\n\n/**\n * Dismisses all toasts.\n */\ntoast.dismissAll = (toasterId?: string) => toast.dismiss(undefined, toasterId);\n\n/**\n * Removes the toast with the given id.\n * The toast will be removed from the DOM without any transition.\n */\ntoast.remove = (toastId?: string, toasterId?: string) => {\n const action: Action = {\n type: ActionType.REMOVE_TOAST,\n toastId,\n };\n if (toasterId) {\n createDispatch(toasterId)(action);\n } else {\n dispatchAll(action);\n }\n};\n\n/**\n * Removes all toasts.\n */\ntoast.removeAll = (toasterId?: string) => toast.remove(undefined, toasterId);\n\n/**\n * Create a loading toast that will automatically updates with the promise.\n */\ntoast.promise = (\n promise: Promise | (() => Promise),\n msgs: {\n loading: Renderable;\n success?: ValueOrFunction;\n error?: ValueOrFunction;\n },\n opts?: DefaultToastOptions\n) => {\n const id = toast.loading(msgs.loading, { ...opts, ...opts?.loading });\n\n if (typeof promise === 'function') {\n promise = promise();\n }\n\n promise\n .then((p) => {\n const successMessage = msgs.success\n ? resolveValue(msgs.success, p)\n : undefined;\n\n if (successMessage) {\n toast.success(successMessage, {\n id,\n ...opts,\n ...opts?.success,\n });\n } else {\n toast.dismiss(id);\n }\n return p;\n })\n .catch((e) => {\n const errorMessage = msgs.error ? resolveValue(msgs.error, e) : undefined;\n\n if (errorMessage) {\n toast.error(errorMessage, {\n id,\n ...opts,\n ...opts?.error,\n });\n } else {\n toast.dismiss(id);\n }\n });\n\n return promise;\n};\n\nexport { toast };\n", "import { useEffect, useCallback, useRef } from 'react';\nimport { createDispatch, ActionType, useStore, dispatch } from './store';\nimport { toast } from './toast';\nimport { DefaultToastOptions, Toast, ToastPosition } from './types';\n\nexport const REMOVE_DELAY = 1000;\n\nexport const useToaster = (\n toastOptions?: DefaultToastOptions,\n toasterId: string = 'default'\n) => {\n const { toasts, pausedAt } = useStore(toastOptions, toasterId);\n const toastTimeouts = useRef(\n new Map>()\n ).current;\n\n const addToRemoveQueue = useCallback(\n (toastId: string, removeDelay = REMOVE_DELAY) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: ActionType.REMOVE_TOAST,\n toastId: toastId,\n });\n }, removeDelay);\n\n toastTimeouts.set(toastId, timeout);\n },\n []\n );\n\n useEffect(() => {\n if (pausedAt) {\n return;\n }\n\n const now = Date.now();\n const timeouts = toasts.map((t) => {\n if (t.duration === Infinity) {\n return;\n }\n\n const durationLeft =\n (t.duration || 0) + t.pauseDuration - (now - t.createdAt);\n\n if (durationLeft < 0) {\n if (t.visible) {\n toast.dismiss(t.id);\n }\n return;\n }\n return setTimeout(() => toast.dismiss(t.id, toasterId), durationLeft);\n });\n\n return () => {\n timeouts.forEach((timeout) => timeout && clearTimeout(timeout));\n };\n }, [toasts, pausedAt, toasterId]);\n\n const dispatch = useCallback(createDispatch(toasterId), [toasterId]);\n\n const startPause = useCallback(() => {\n dispatch({\n type: ActionType.START_PAUSE,\n time: Date.now(),\n });\n }, [dispatch]);\n\n const updateHeight = useCallback(\n (toastId: string, height: number) => {\n dispatch({\n type: ActionType.UPDATE_TOAST,\n toast: { id: toastId, height },\n });\n },\n [dispatch]\n );\n\n const endPause = useCallback(() => {\n if (pausedAt) {\n dispatch({ type: ActionType.END_PAUSE, time: Date.now() });\n }\n }, [pausedAt, dispatch]);\n\n const calculateOffset = useCallback(\n (\n toast: Toast,\n opts?: {\n reverseOrder?: boolean;\n gutter?: number;\n defaultPosition?: ToastPosition;\n }\n ) => {\n const { reverseOrder = false, gutter = 8, defaultPosition } = opts || {};\n\n const relevantToasts = toasts.filter(\n (t) =>\n (t.position || defaultPosition) ===\n (toast.position || defaultPosition) && t.height\n );\n const toastIndex = relevantToasts.findIndex((t) => t.id === toast.id);\n const toastsBefore = relevantToasts.filter(\n (toast, i) => i < toastIndex && toast.visible\n ).length;\n\n const offset = relevantToasts\n .filter((t) => t.visible)\n .slice(...(reverseOrder ? [toastsBefore + 1] : [0, toastsBefore]))\n .reduce((acc, t) => acc + (t.height || 0) + gutter, 0);\n\n return offset;\n },\n [toasts]\n );\n\n // Keep track of dismissed toasts and remove them after the delay\n useEffect(() => {\n toasts.forEach((toast) => {\n if (toast.dismissed) {\n addToRemoveQueue(toast.id, toast.removeDelay);\n } else {\n // If toast becomes visible again, remove it from the queue\n const timeout = toastTimeouts.get(toast.id);\n if (timeout) {\n clearTimeout(timeout);\n toastTimeouts.delete(toast.id);\n }\n }\n });\n }, [toasts, addToRemoveQueue]);\n\n return {\n toasts,\n handlers: {\n updateHeight,\n startPause,\n endPause,\n calculateOffset,\n },\n };\n};\n", "import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast, ToastPosition, resolveValue, Renderable } from '../core/types';\nimport { ToastIcon } from './toast-icon';\nimport { prefersReducedMotion } from '../core/utils';\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`;\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`;\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`;\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`;\n\nconst ToastBarBase = styled('div')`\n display: flex;\n align-items: center;\n background: #fff;\n color: #363636;\n line-height: 1.3;\n will-change: transform;\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);\n max-width: 350px;\n pointer-events: auto;\n padding: 8px 10px;\n border-radius: 8px;\n`;\n\nconst Message = styled('div')`\n display: flex;\n justify-content: center;\n margin: 4px 10px;\n color: inherit;\n flex: 1 1 auto;\n white-space: pre-line;\n`;\n\ninterface ToastBarProps {\n toast: Toast;\n position?: ToastPosition;\n style?: React.CSSProperties;\n children?: (components: {\n icon: Renderable;\n message: Renderable;\n }) => Renderable;\n}\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes('top');\n const factor = top ? 1 : -1;\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)];\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n };\n};\n\nexport const ToastBar: React.FC = React.memo(\n ({ toast, position, style, children }) => {\n const animationStyle: React.CSSProperties = toast.height\n ? getAnimationStyle(\n toast.position || position || 'top-center',\n toast.visible\n )\n : { opacity: 0 };\n\n const icon = ;\n const message = (\n \n {resolveValue(toast.message, toast)}\n \n );\n\n return (\n \n {typeof children === 'function' ? (\n children({\n icon,\n message,\n })\n ) : (\n <>\n {icon}\n {message}\n \n )}\n \n );\n }\n);\n", "import * as React from 'react';\nimport { styled, keyframes } from 'goober';\n\nimport { Toast } from '../core/types';\nimport { ErrorIcon, ErrorTheme } from './error';\nimport { LoaderIcon, LoaderTheme } from './loader';\nimport { CheckmarkIcon, CheckmarkTheme } from './checkmark';\n\nconst StatusWrapper = styled('div')`\n position: absolute;\n`;\n\nconst IndicatorWrapper = styled('div')`\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n min-width: 20px;\n min-height: 20px;\n`;\n\nconst enter = keyframes`\nfrom {\n transform: scale(0.6);\n opacity: 0.4;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nexport const AnimatedIconWrapper = styled('div')`\n position: relative;\n transform: scale(0.6);\n opacity: 0.4;\n min-width: 20px;\n animation: ${enter} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n`;\n\nexport type IconThemes = Partial<{\n success: CheckmarkTheme;\n error: ErrorTheme;\n loading: LoaderTheme;\n}>;\n\nexport const ToastIcon: React.FC<{\n toast: Toast;\n}> = ({ toast }) => {\n const { icon, type, iconTheme } = toast;\n if (icon !== undefined) {\n if (typeof icon === 'string') {\n return {icon};\n } else {\n return icon;\n }\n }\n\n if (type === 'blank') {\n return null;\n }\n\n return (\n \n \n {type !== 'loading' && (\n \n {type === 'error' ? (\n \n ) : (\n \n )}\n \n )}\n \n );\n};\n", "import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n opacity: 1;\n}`;\n\nconst firstLineAnimation = keyframes`\nfrom {\n transform: scale(0);\n opacity: 0;\n}\nto {\n transform: scale(1);\n opacity: 1;\n}`;\n\nconst secondLineAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(90deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(90deg);\n\topacity: 1;\n}`;\n\nexport interface ErrorTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const ErrorIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#ff4b4b'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n\n &:after,\n &:before {\n content: '';\n animation: ${firstLineAnimation} 0.15s ease-out forwards;\n animation-delay: 150ms;\n position: absolute;\n border-radius: 3px;\n opacity: 0;\n background: ${(p) => p.secondary || '#fff'};\n bottom: 9px;\n left: 4px;\n height: 2px;\n width: 12px;\n }\n\n &:before {\n animation: ${secondLineAnimation} 0.15s ease-out forwards;\n animation-delay: 180ms;\n transform: rotate(90deg);\n }\n`;\n", "import { styled, keyframes } from 'goober';\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport interface LoaderTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const LoaderIcon = styled('div')`\n width: 12px;\n height: 12px;\n box-sizing: border-box;\n border: 2px solid;\n border-radius: 100%;\n border-color: ${(p) => p.secondary || '#e0e0e0'};\n border-right-color: ${(p) => p.primary || '#616161'};\n animation: ${rotate} 1s linear infinite;\n`;\n", "import { styled, keyframes } from 'goober';\n\nconst circleAnimation = keyframes`\nfrom {\n transform: scale(0) rotate(45deg);\n\topacity: 0;\n}\nto {\n transform: scale(1) rotate(45deg);\n\topacity: 1;\n}`;\n\nconst checkmarkAnimation = keyframes`\n0% {\n\theight: 0;\n\twidth: 0;\n\topacity: 0;\n}\n40% {\n height: 0;\n\twidth: 6px;\n\topacity: 1;\n}\n100% {\n opacity: 1;\n height: 10px;\n}`;\n\nexport interface CheckmarkTheme {\n primary?: string;\n secondary?: string;\n}\n\nexport const CheckmarkIcon = styled('div')`\n width: 20px;\n opacity: 0;\n height: 20px;\n border-radius: 10px;\n background: ${(p) => p.primary || '#61d345'};\n position: relative;\n transform: rotate(45deg);\n\n animation: ${circleAnimation} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)\n forwards;\n animation-delay: 100ms;\n &:after {\n content: '';\n box-sizing: border-box;\n animation: ${checkmarkAnimation} 0.2s ease-out forwards;\n opacity: 0;\n animation-delay: 200ms;\n position: absolute;\n border-right: 2px solid;\n border-bottom: 2px solid;\n border-color: ${(p) => p.secondary || '#fff'};\n bottom: 6px;\n left: 6px;\n height: 10px;\n width: 6px;\n }\n`;\n", "import { css, setup } from 'goober';\nimport * as React from 'react';\nimport {\n resolveValue,\n ToasterProps,\n ToastPosition,\n ToastWrapperProps,\n} from '../core/types';\nimport { useToaster } from '../core/use-toaster';\nimport { prefersReducedMotion } from '../core/utils';\nimport { ToastBar } from './toast-bar';\n\nsetup(React.createElement);\n\nconst ToastWrapper = ({\n id,\n className,\n style,\n onHeightUpdate,\n children,\n}: ToastWrapperProps) => {\n const ref = React.useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const updateHeight = () => {\n const height = el.getBoundingClientRect().height;\n onHeightUpdate(id, height);\n };\n updateHeight();\n new MutationObserver(updateHeight).observe(el, {\n subtree: true,\n childList: true,\n characterData: true,\n });\n }\n },\n [id, onHeightUpdate]\n );\n\n return (\n
\n {children}\n
\n );\n};\n\nconst getPositionStyle = (\n position: ToastPosition,\n offset: number\n): React.CSSProperties => {\n const top = position.includes('top');\n const verticalStyle: React.CSSProperties = top ? { top: 0 } : { bottom: 0 };\n const horizontalStyle: React.CSSProperties = position.includes('center')\n ? {\n justifyContent: 'center',\n }\n : position.includes('right')\n ? {\n justifyContent: 'flex-end',\n }\n : {};\n return {\n left: 0,\n right: 0,\n display: 'flex',\n position: 'absolute',\n transition: prefersReducedMotion()\n ? undefined\n : `all 230ms cubic-bezier(.21,1.02,.73,1)`,\n transform: `translateY(${offset * (top ? 1 : -1)}px)`,\n ...verticalStyle,\n ...horizontalStyle,\n };\n};\n\nconst activeClass = css`\n z-index: 9999;\n > * {\n pointer-events: auto;\n }\n`;\n\nconst DEFAULT_OFFSET = 16;\n\nexport const Toaster: React.FC = ({\n reverseOrder,\n position = 'top-center',\n toastOptions,\n gutter,\n children,\n toasterId,\n containerStyle,\n containerClassName,\n}) => {\n const { toasts, handlers } = useToaster(toastOptions, toasterId);\n\n return (\n \n {toasts.map((t) => {\n const toastPosition = t.position || position;\n const offset = handlers.calculateOffset(t, {\n reverseOrder,\n gutter,\n defaultPosition: position,\n });\n const positionStyle = getPositionStyle(toastPosition, offset);\n\n return (\n \n {t.type === 'custom' ? (\n resolveValue(t.message, t)\n ) : children ? (\n children(t)\n ) : (\n \n )}\n \n );\n })}\n \n );\n};\n", "import { toast } from './core/toast';\n\nexport * from './headless';\n\nexport { ToastBar } from './components/toast-bar';\nexport { ToastIcon } from './components/toast-icon';\nexport { Toaster } from './components/toaster';\nexport { CheckmarkIcon } from './components/checkmark';\nexport { ErrorIcon } from './components/error';\nexport { LoaderIcon } from './components/loader';\n\nexport { toast };\nexport default toast;\n", "let e={data:\"\"},t=t=>{if(\"object\"==typeof window){let e=(t?t.querySelector(\"#_goober\"):window._goober)||Object.assign(document.createElement(\"style\"),{innerHTML:\" \",id:\"_goober\"});return e.nonce=window.__nonce__,e.parentNode||(t||document.head).appendChild(e),e.firstChild}return t||e},r=e=>{let r=t(e),l=r.data;return r.data=\"\",l},l=/(?:([\\u0080-\\uFFFF\\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\\s*)/g,a=/\\/\\*[^]*?\\*\\/| +/g,n=/\\n+/g,o=(e,t)=>{let r=\"\",l=\"\",a=\"\";for(let n in e){let c=e[n];\"@\"==n[0]?\"i\"==n[1]?r=n+\" \"+c+\";\":l+=\"f\"==n[1]?o(c,n):n+\"{\"+o(c,\"k\"==n[1]?\"\":t)+\"}\":\"object\"==typeof c?l+=o(c,t?t.replace(/([^,])+/g,e=>n.replace(/([^,]*:\\S+\\([^)]*\\))|([^,])+/g,t=>/&/.test(t)?t.replace(/&/g,e):e?e+\" \"+t:t)):n):null!=c&&(n=/^--/.test(n)?n:n.replace(/[A-Z]/g,\"-$&\").toLowerCase(),a+=o.p?o.p(n,c):n+\":\"+c+\";\")}return r+(t&&a?t+\"{\"+a+\"}\":a)+l},c={},s=e=>{if(\"object\"==typeof e){let t=\"\";for(let r in e)t+=r+s(e[r]);return t}return e},i=(e,t,r,i,p)=>{let u=s(e),d=c[u]||(c[u]=(e=>{let t=0,r=11;for(;t>>0;return\"go\"+r})(u));if(!c[d]){let t=u!==e?e:(e=>{let t,r,o=[{}];for(;t=l.exec(e.replace(a,\"\"));)t[4]?o.shift():t[3]?(r=t[3].replace(n,\" \").trim(),o.unshift(o[0][r]=o[0][r]||{})):o[0][t[1]]=t[2].replace(n,\" \").trim();return o[0]})(e);c[d]=o(p?{[\"@keyframes \"+d]:t}:t,r?\"\":\".\"+d)}let f=r&&c.g?c.g:null;return r&&(c.g=c[d]),((e,t,r,l)=>{l?t.data=t.data.replace(l,e):-1===t.data.indexOf(e)&&(t.data=r?e+t.data:t.data+e)})(c[d],t,i,f),d},p=(e,t,r)=>e.reduce((e,l,a)=>{let n=t[a];if(n&&n.call){let e=n(r),t=e&&e.props&&e.props.className||/^go/.test(e)&&e;n=t?\".\"+t:e&&\"object\"==typeof e?e.props?\"\":o(e,\"\"):!1===e?\"\":e}return e+l+(null==n?\"\":n)},\"\");function u(e){let r=this||{},l=e.call?e(r.p):e;return i(l.unshift?l.raw?p(l,[].slice.call(arguments,1),r.p):l.reduce((e,t)=>Object.assign(e,t&&t.call?t(r.p):t),{}):l,t(r.target),r.g,r.o,r.k)}let d,f,g,b=u.bind({g:1}),h=u.bind({k:1});function m(e,t,r,l){o.p=t,d=e,f=r,g=l}function w(e,t){let r=this||{};return function(){let l=arguments;function a(n,o){let c=Object.assign({},n),s=c.className||a.className;r.p=Object.assign({theme:f&&f()},c),r.o=/ *go\\d+/.test(s),c.className=u.apply(r,l)+(s?\" \"+s:\"\"),t&&(c.ref=o);let i=e;return e[0]&&(i=c.as||e,delete c.as),g&&i[0]&&g(c),d(i,c)}return t?t(a):a}}export{u as css,r as extractCss,b as glob,h as keyframes,m as setup,w as styled};\n"], + "mappings": "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", + "names": ["import_react", "t", "e", "e", "t", "l", "a", "n", "c", "i", "p", "u", "d", "r", "o", "f", "s", "b", "isFunction", "valOrFunction", "resolveValue", "arg", "genId", "count", "prefersReducedMotion", "shouldReduceMotion", "mediaQuery", "TOAST_LIMIT", "DEFAULT_TOASTER_ID", "reducer", "state", "action", "toastLimit", "t", "toast", "toastId", "diff", "listeners", "defaultToasterState", "memoryState", "dispatch", "toasterId", "id", "listener", "dispatchAll", "getToasterIdFromToastId", "createDispatch", "defaultTimeouts", "useStore", "toastOptions", "setState", "useState", "initial", "useRef", "useEffect", "index", "mergedToasts", "_a", "_b", "_c", "createToast", "message", "type", "opts", "createHandler", "options", "promise", "msgs", "p", "successMessage", "e", "errorMessage", "REMOVE_DELAY", "useToaster", "toasts", "pausedAt", "toastTimeouts", "addToRemoveQueue", "useCallback", "removeDelay", "timeout", "now", "timeouts", "durationLeft", "startPause", "updateHeight", "height", "endPause", "calculateOffset", "reverseOrder", "gutter", "defaultPosition", "relevantToasts", "toastIndex", "toastsBefore", "i", "acc", "circleAnimation", "keyframes", "firstLineAnimation", "secondLineAnimation", "ErrorIcon", "styled", "rotate", "LoaderIcon", "checkmarkAnimation", "CheckmarkIcon", "StatusWrapper", "IndicatorWrapper", "enter", "AnimatedIconWrapper", "ToastIcon", "icon", "iconTheme", "enterAnimation", "factor", "exitAnimation", "fadeInAnimation", "fadeOutAnimation", "ToastBarBase", "Message", "getAnimationStyle", "position", "visible", "exit", "ToastBar", "style", "children", "animationStyle", "setup", "ToastWrapper", "className", "onHeightUpdate", "ref", "el", "getPositionStyle", "offset", "top", "verticalStyle", "horizontalStyle", "activeClass", "css", "DEFAULT_OFFSET", "Toaster", "containerStyle", "containerClassName", "handlers", "toastPosition", "positionStyle", "src_default"] +} diff --git a/frontend/node_modules/goober/LICENSE b/frontend/node_modules/goober/LICENSE new file mode 100644 index 00000000..2f4a507d --- /dev/null +++ b/frontend/node_modules/goober/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Cristian Bote + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/frontend/node_modules/goober/README.md b/frontend/node_modules/goober/README.md new file mode 100644 index 00000000..0dfe1484 --- /dev/null +++ b/frontend/node_modules/goober/README.md @@ -0,0 +1,857 @@ +

+ goober +

+ +🥜 goober, a less than 1KB css-in-js solution. + +[![Backers on Open Collective](https://opencollective.com/goober/backers/badge.svg)](#backers) +[![Sponsors on Open Collective](https://opencollective.com/goober/sponsors/badge.svg)](#sponsors) + +[![version](https://img.shields.io/npm/v/goober)](https://www.npmjs.com/package/goober) +[![status](https://travis-ci.org/cristianbote/goober.svg?branch=master)](https://travis-ci.org/cristianbote/goober) +[![gzip size](https://img.badgesize.io/https://unpkg.com/goober@latest/dist/goober.modern.js?compression=gzip)](https://unpkg.com/goober) +[![downloads](https://img.shields.io/npm/dm/goober)](https://www.npmjs.com/package/goober) +[![coverage](https://img.shields.io/codecov/c/github/cristianbote/goober.svg?maxAge=2592000)](https://codecov.io/github/cristianbote/goober?branch=master) +[![Slack](https://img.shields.io/badge/slack-join-orange)](https://join.slack.com/t/gooberdev/shared_invite/enQtOTM5NjUyOTcwNzI1LWUwNzg0NTQwODY1NDJmMzQ2NzdlODI4YTM3NWUwYjlkY2ZkNGVmMTFlNGMwZGUyOWQyZmI4OTYwYmRiMzE0NGQ) + +# 🪒 The Great Shave Off Challenge + +Can you shave off bytes from goober? Do it and you're gonna get paid! [More info here](https://goober.rocks/the-great-shave-off) + +# Motivation + +I've always wondered if you could get a working solution for css-in-js with a smaller footprint. While I was working on a side project I wanted to use styled-components, or more accurately the `styled` pattern. Looking at the JavaScript bundle sizes, I quickly realized that I would have to include ~12kB([styled-components](https://github.com/styled-components/styled-components)) or ~11kB([emotion](https://github.com/emotion-js/emotion)) just so I can use the `styled` paradigm. So, I embarked on a mission to create a smaller alternative for these well established APIs. + +# Why the peanuts emoji? + +It's a pun on the tagline. + +> css-in-js at the cost of peanuts! +> 🥜goober + +# Talks and Podcasts + +* [React Round Up](https://reactroundup.com/wrangle-your-css-in-js-for-peanuts-using-goober-ft-cristian-bote-rru-177) 👉 https://reactroundup.com/wrangle-your-css-in-js-for-peanuts-using-goober-ft-cristian-bote-rru-177 +* ReactDay Berlin 2019 👉 https://www.youtube.com/watch?v=k4-AVy3acqk +* [PodRocket](https://podrocket.logrocket.com/) by [LogRocket](https://logrocket.com/) 👉 https://podrocket.logrocket.com/goober +* [ngParty](https://www.ngparty.cz/) 👉 https://www.youtube.com/watch?v=XKFvOBDPeB0 + +# Table of contents + +- [Usage](#usage) +- [Examples](#examples) +- [Tradeoffs](#comparison-and-tradeoffs) +- [SSR](#ssr) +- [Benchmarks](#benchmarks) + - [Browser](#browser) + - [SSR](#ssr-1) +- [API](#api) + - [styled](#styledtagname-string--function-forwardref-function) + - [setup](#setuppragma-function-prefixer-function-theme-function-forwardprops-function) + - [With prefixer](#with-prefixer) + - [With theme](#with-theme) + - [With forwardProps](#with-forwardProps) + - [css](#csstaggedtemplate) + - [targets](#targets) + - [extractCss](#extractcsstarget) + - [createGlobalStyles](#createglobalstyles) + - [keyframes](#keyframes) + - [shouldForwardProp](#shouldForwardProp) +- [Integrations](#integrations) + - [Babel Plugin](#babel-plugin) + - [Babel Macro Plugin](#babel-macro-plugin) + - [Next.js](#nextjs) + - [Gatsby](#gatsby) + - [Preact CLI Plugin](#preact-cli-plugin) + - [CSS Prop](#css-prop) +- [Features](#features) + - [Sharing Style](#sharing-style) + - [Autoprefixer](#autoprefixer) + - [TypeScript](#typescript) + - [Content Security Policy (CSP)](#content-security-policy-csp)- +- [Browser Support](#browser-support) +- [Contributing](#contributing) + +# Usage + +The API is inspired by emotion `styled` function. Meaning, you call it with your `tagName`, and it returns a vDOM component for that tag. Note, `setup` needs to be ran before the `styled` function is used. + +```jsx +import { h } from 'preact'; +import { styled, setup } from 'goober'; + +// Should be called here, and just once +setup(h); + +const Icon = styled('span')` + display: flex; + flex: 1; + color: red; +`; + +const Button = styled('button')` + background: dodgerblue; + color: white; + border: ${Math.random()}px solid white; + + &:focus, + &:hover { + padding: 1em; + } + + .otherClass { + margin: 0; + } + + ${Icon} { + color: black; + } +`; +``` + +# Examples + +- [Vanilla](https://codesandbox.io/s/qlywyp7z4q) +- [React](https://codesandbox.io/s/k0mnp40n7v) +- [Preact](https://codesandbox.io/s/r15wj2qm7o) +- [SSR with Preact](https://codesandbox.io/s/7m9zzl6746) +- [Fre](https://codesandbox.io/s/fre-goober-ffqjv) + +# Comparison and tradeoffs + +In this section I would like to compare goober, as objectively as I can, with the latest versions of two most well known css-in-js packages: styled-components and emotion. + +I've used the following markers to reflect the state of each feature: + +- ✅ Supported +- 🟡 Partially supported +- 🛑 Not supported + +Here we go: + +| Feature name | Goober | Styled Components | Emotion | +| ---------------------- | ------- | ----------------- | ------- | +| Base bundle size | 1.25 kB | 12.6 kB | 7.4 kB | +| Framework agnostic | ✅ | 🛑 | 🛑 | +| Render with target \*1 | ✅ | 🛑 | 🛑 | +| `css` api | ✅ | ✅ | ✅ | +| `css` prop | ✅ | ✅ | ✅ | +| `styled` | ✅ | ✅ | ✅ | +| `styled.` | ✅ \*2 | ✅ | ✅ | +| default export | 🛑 | ✅ | ✅ | +| `as` | ✅ | ✅ | ✅ | +| `.withComponent` | 🛑 | ✅ | ✅ | +| `.attrs` | 🛑 | ✅ | 🛑 | +| `shouldForwardProp` | ✅ | ✅ | ✅ | +| `keyframes` | ✅ | ✅ | ✅ | +| Labels | 🛑 | 🛑 | ✅ | +| ClassNames | 🛑 | 🛑 | ✅ | +| Global styles | ✅ | ✅ | ✅ | +| SSR | ✅ | ✅ | ✅ | +| Theming | ✅ | ✅ | ✅ | +| Tagged Templates | ✅ | ✅ | ✅ | +| Object styles | ✅ | ✅ | ✅ | +| Dynamic styles | ✅ | ✅ | ✅ | + +Footnotes + +- [1] `goober` can render in _any_ dom target. Meaning you can use `goober` to define scoped styles in any context. Really useful for web-components. +- [2] Supported only via `babel-plugin-transform-goober` + +# SSR + +You can get the critical CSS for SSR via `extractCss`. Take a look at this example: [CodeSandbox: SSR with Preact and goober](https://codesandbox.io/s/7m9zzl6746) and read the full explanation for `extractCSS` and `targets` below. + +# Benchmarks + +The results are included inside the build output as well. + +## Browser + +Coming soon! + +## SSR + +The benchmark is testing the following scenario: + +```jsx +import styled from ''; + +// Create the dynamic styled component +const Foo = styled('div')((props) => ({ + opacity: props.counter > 0.5 ? 1 : 0, + '@media (min-width: 1px)': { + rule: 'all' + }, + '&:hover': { + another: 1, + display: 'space' + } +})); + +// Serialize the component +renderToString(); +``` + +The results are: + +``` +goober x 200,437 ops/sec ±1.93% (87 runs sampled) +styled-components@5.2.1 x 12,650 ops/sec ±9.09% (48 runs sampled) +emotion@11.0.0 x 104,229 ops/sec ±2.06% (88 runs sampled) + +Fastest is: goober +``` + +# API + +As you can see, goober supports most of the CSS syntax. If you find any issues, please submit a ticket, or open a PR with a fix. + +### `styled(tagName: String | Function, forwardRef?: Function)` + +- `@param {String|Function} tagName` The name of the DOM element you'd like the styles to be applied to +- `@param {Function} forwardRef` Forward ref function. Usually `React.forwardRef` +- `@returns {Function}` Returns the tag template function. + +```js +import { styled } from 'goober'; + +const Btn = styled('button')` + border-radius: 4px; +`; +``` + +#### Different ways of customizing the styles + +##### Tagged templates functions + +```js +import { styled } from 'goober'; + +const Btn = styled('button')` + border-radius: ${(props) => props.size}px; +`; + +; +``` + +##### Function that returns a string + +```js +import { styled } from 'goober'; + +const Btn = styled('button')( + (props) => ` + border-radius: ${props.size}px; +` +); + +; +``` + +##### JSON/Object + +```js +import { styled } from 'goober'; + +const Btn = styled('button')((props) => ({ + borderRadius: props.size + 'px' +})); + +; +``` + +##### Arrays + +```js +import { styled } from 'goober'; + +const Btn = styled('button')([ + { color: 'tomato' }, + ({ isPrimary }) => ({ background: isPrimary ? 'cyan' : 'gray' }) +]); + +; // This will render the `Button` with `background: gray;` +; // This will render the `Button` with `background: cyan;` +``` + +##### Forward ref function + +As goober is JSX library agnostic, you need to pass in the forward ref function for the library you are using. Here's how you do it for React. + +```js +const Title = styled('h1', React.forwardRef)` + font-weight: bold; + color: dodgerblue; +`; +``` + +### `setup(pragma: Function, prefixer?: Function, theme?: Function, forwardProps?: Function)` + +The call to `setup()` should occur only once. It should be called in the entry file of your project. + +Given the fact that `react` uses `createElement` for the transformed elements and `preact` uses `h`, `setup` should be called with the proper _pragma_ function. This was added to reduce the bundled size and being able to bundle an esmodule version. At the moment, it's the best tradeoff I can think of. + +```js +import React from 'react'; +import { setup } from 'goober'; + +setup(React.createElement); +``` + +#### With prefixer + +```js +import React from 'react'; +import { setup } from 'goober'; + +const customPrefixer = (key, value) => `${key}: ${value};\n`; + +setup(React.createElement, customPrefixer); +``` + +#### With theme + +```js +import React, { createContext, useContext, createElement } from 'react'; +import { setup, styled } from 'goober'; + +const theme = { primary: 'blue' }; +const ThemeContext = createContext(theme); +const useTheme = () => useContext(ThemeContext); + +setup(createElement, undefined, useTheme); + +const ContainerWithTheme = styled('div')` + color: ${(props) => props.theme.primary}; +`; +``` + +#### With forwardProps + +The `forwardProps` function offers a way to achieve the same `shouldForwardProps` functionality as emotion and styled-components (with transient props) offer. The difference here is that the function receives the whole props and you are in charge of removing the props that should not end up in the DOM. + +This is a super useful functionality when paired with theme object, variants, or any other customisation one might need. + +```js +import React from 'react'; +import { setup, styled } from 'goober'; + +setup(React.createElement, undefined, undefined, (props) => { + for (let prop in props) { + // Or any other conditions. + // This could also check if this is a dev build and not remove the props + if (prop === 'size') { + delete props[prop]; + } + } +}); +``` + +The functionality of "transient props" (with a "\$" prefix) can be implemented as follows: + +```js +import React from 'react'; +import { setup, styled } from 'goober'; + +setup(React.createElement, undefined, undefined, (props) => { + for (let prop in props) { + if (prop[0] === '$') { + delete props[prop]; + } + } +}); +``` + +Alternatively you can use `goober/should-forward-prop` addon to pass only the filter function and not have to deal with the full `props` object. + +```js +import React from 'react'; +import { setup, styled } from 'goober'; +import { shouldForwardProp } from 'goober/should-forward-prop'; + +setup( + React.createElement, + undefined, + undefined, + // This package accepts a `filter` function. If you return false that prop + // won't be included in the forwarded props. + shouldForwardProp((prop) => { + return prop !== 'size'; + }) +); +``` + +### `css(taggedTemplate)` + +- `@returns {String}` Returns the className. + +To create a className, you need to call `css` with your style rules in a tagged template. + +```js +import { css } from "goober"; + +const BtnClassName = css` + border-radius: 4px; +`; + +// vanilla JS +const btn = document.querySelector("#btn"); +// BtnClassName === 'g016232' +btn.classList.add(BtnClassName); + +// JSX +// BtnClassName === 'g016232' +const App => +``` + +#### Different ways of customizing `css` + +##### Passing props to `css` tagged templates + +```js +import { css } from 'goober'; + +// JSX +const CustomButton = (props) => ( + +); +``` + +##### Using `css` with JSON/Object + +```js +import { css } from 'goober'; +const BtnClassName = (props) => + css({ + background: props.color, + borderRadius: props.radius + 'px' + }); +``` + +**Notice:** using `css` with object can reduce your bundle size. + +We can also declare styles at the top of the file by wrapping `css` into a function that we call to get the className. + +```js +import { css } from 'goober'; + +const BtnClassName = (props) => css` + border-radius: ${props.size}px; +`; + +// vanilla JS +// BtnClassName({size:20}) -> g016360 +const btn = document.querySelector('#btn'); +btn.classList.add(BtnClassName({ size: 20 })); + +// JSX +// BtnClassName({size:20}) -> g016360 +const App = () => ; +``` + +The difference between calling `css` directly and wrapping into a function is the timing of its execution. The former is when the component(file) is imported, the latter is when it is actually rendered. + +If you use `extractCSS` for SSR, you may prefer to use the latter, or the `styled` API to avoid inconsistent results. + +### `targets` + +By default, goober will append a style tag to the `` of a document. You might want to target a different node, for instance, when you want to use goober with web components (so you'd want it to append style tags to individual shadowRoots). For this purpose, you can `.bind` a new target to the `styled` and `css` methods: + +```js +import * as goober from 'goober'; +const target = document.getElementById('target'); +const css = goober.css.bind({ target: target }); +const styled = goober.styled.bind({ target: target }); +``` + +If you don't provide a target, goober always defaults to `` and in environments without a DOM (think certain SSR solutions), it will just use a plain string cache to store generated styles which you can extract with `extractCSS`(see below). + +### `extractCss(target?)` + +- `@returns {String}` + +Returns the ``; + +// Note: To be able to `hydrate` the styles you should use the proper `id` so `goober` can pick it up and use it as the target from now on +``` + +### `createGlobalStyles` + +To define your global styles you need to create a `GlobalStyles` component and use it as part of your tree. The `createGlobalStyles` is available at `goober/global` addon. + +```js +import { createGlobalStyles } from 'goober/global'; + +const GlobalStyles = createGlobalStyles` + html, + body { + background: light; + } + + * { + box-sizing: border-box; + } +`; + +export default function App() { + return ( +
+ + + +
+ ) +} +``` + +#### How about using `glob` function directly? + +Before the global addon, `goober/global`, there was a method named `glob` that was part of the main package that would do the same thing, more or less. Having only that method to define global styles usually led to missing global styles from the extracted css, since the pattern did not enforce the evaluation of the styles at render time. The `glob` method is still exported from `goober/global`, in case you have a hard dependency on it. It still has the same API: + +```js +import { glob } from 'goober'; + +glob` + html, + body { + background: light; + } + + * { + box-sizing: border-box; + } +`; +``` + +### `keyframes` + +`keyframes` is a helpful method to define reusable animations that can be decoupled from the main style declaration and shared across components. + +```js +import { keyframes } from 'goober'; + +const rotate = keyframes` + from, to { + transform: rotate(0deg); + } + + 50% { + transform: rotate(180deg); + } +`; + +const Wicked = styled('div')` + background: tomato; + color: white; + animation: ${rotate} 1s ease-in-out; +`; +``` + +### `shouldForwardProp` + +To implement the `shouldForwardProp` without the need to provide the full loop over `props` you can use the `goober/should-forward-prop` addon. + +```js +import { h } from 'preact'; +import { setup } from 'goober'; +import { shouldForwardProp } from 'goober/should-forward-prop'; + +setup( + h, + undefined, + undefined, + shouldForwardProp((prop) => { + // Do NOT forward props that start with `$` symbol + return prop['0'] !== '$'; + }) +); +``` + +# Integrations + +## Babel plugin + +You're in love with the `styled.div` syntax? Fear no more! We got you covered with a babel plugin that will take your lovely syntax from `styled.tag` and translate it to goober's `styled("tag")` call. + +```sh +npm i --save-dev babel-plugin-transform-goober +# or +yarn add --dev babel-plugin-transform-goober +``` + +Visit the package in here for more info (https://github.com/cristianbote/goober/tree/master/packages/babel-plugin-transform-goober) + +## Babel macro plugin + +A babel-plugin-macros macro for [🥜goober][goober], rewriting `styled.div` syntax to `styled('div')` calls. + +### Usage + +Once you've configured [babel-plugin-macros](https://github.com/kentcdodds/babel-plugin-macros), change your imports from `goober` to `goober/macro`. + +Now you can create your components using `styled.*` syntax:. + +```js +import { styled } from 'goober/macro'; + +const Button = styled.button` + margin: 0; + padding: 1rem; + font-size: 1rem; + background-color: tomato; +`; +``` + +## [Next.js](https://github.com/vercel/next.js) + +Want to use `goober` with Next.js? We've got you covered! Follow the example below or from the main [examples](https://github.com/vercel/next.js/tree/canary/examples/with-goober) directory. + +```sh +npx create-next-app --example with-goober with-goober-app +# or +yarn create next-app --example with-goober with-goober-app +``` + +## [Gatsby](https://github.com/gatsbyjs/gatsby) + +Want to use `goober` with Gatsby? We've got you covered! We have our own plugin to deal with styling your Gatsby projects. + +```sh +npm i --save goober gatsby-plugin-goober +# or +yarn add goober gatsby-plugin-goober +``` + +## Preact CLI plugin + +If you use Goober with Preact CLI, you can use [preact-cli-goober-ssr](https://github.com/gerhardsletten/preact-cli-goober-ssr) + +```sh +npm i --save-dev preact-cli-goober-ssr +# or +yarn add --dev preact-cli-goober-ssr + +# preact.config.js +const gooberPlugin = require('preact-cli-goober-ssr') + +export default (config, env) => { + gooberPlugin(config, env) +} +``` + +When you build your Preact application, this will run `extractCss` on your pre-rendered pages and add critical styles for each page. + +## CSS Prop + +You can use a custom `css` prop to pass in styles on HTML elements with this Babel plugin. + +Installation: + +```sh +npm install --save-dev @agney/babel-plugin-goober-css-prop +``` + +List the plugin in `.babelrc`: + +``` +{ + "plugins": [ + "@agney/babel-plugin-goober-css-prop" + ] +} +``` + +Usage: + +```javascript +
+

Goober

+
+``` + +# Features + +- [x] Basic CSS parsing +- [x] Nested rules with pseudo selectors +- [x] Nested styled components +- [x] [Extending Styles](#sharing-style) +- [x] Media queries (@media) +- [x] Keyframes (@keyframes) +- [x] Smart (lazy) client-side hydration +- [x] Styling any component + - via `` const Btn = ({className}) => {...}; const TomatoBtn = styled(Btn)`color: tomato;` `` +- [x] Vanilla (via `css` function) +- [x] `globalStyle` (via `glob`) so one would be able to create global styles +- [x] target/extract from elements other than `` +- [x] [vendor prefixing](#autoprefixer) + +# Content Security Policy (CSP) + +goober supports Content Security Policy nonces for inline styles. Set `window.__nonce__` before loading the library: + +```js + +``` + +The nonce will be added to goober's `