added backup and email client
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user