gdpr audit implemented, email log, vollmachten, pdf delete cancel data privacy and vollmachten, removed message no id card in engergy car, and other contracts that are not telecom contracts, added insert counter for engery
This commit is contained in:
@@ -20,6 +20,7 @@ Web-basiertes CRM-System für Kundenverwaltung mit Verträgen (Energie, Telekomm
|
||||
- **Email-Provisionierung**: Automatische E-Mail-Weiterleitung bei Plesk/cPanel/DirectAdmin
|
||||
- **Berechtigungssystem**: Admin, Mitarbeiter, Nur-Lesen, Kundenportal
|
||||
- **Verschlüsselte Zugangsdaten**: Portal-Passwörter AES-256-GCM verschlüsselt
|
||||
- **DSGVO-Compliance**: Audit-Logging, Einwilligungsverwaltung, Datenexport, Löschanfragen
|
||||
- **Developer-Tools**: Datenbank-Browser und interaktives ER-Diagramm
|
||||
|
||||
## Tech Stack
|
||||
@@ -207,7 +208,7 @@ npm run build # Produktions-Build erstellen
|
||||
npm run preview # Build-Vorschau
|
||||
```
|
||||
|
||||
### Docker
|
||||
### Docker (Entwicklung)
|
||||
|
||||
```bash
|
||||
docker-compose up -d # Container starten
|
||||
@@ -216,6 +217,40 @@ docker-compose down -v # Container stoppen + Daten löschen
|
||||
docker-compose logs -f # Logs anzeigen
|
||||
```
|
||||
|
||||
### Docker (Produktion)
|
||||
|
||||
Im `docker/` Verzeichnis liegt ein komplettes Produktions-Setup:
|
||||
|
||||
```bash
|
||||
cd docker
|
||||
|
||||
# Image bauen
|
||||
docker-compose build
|
||||
|
||||
# Container starten
|
||||
docker-compose up -d
|
||||
|
||||
# Logs anzeigen
|
||||
docker-compose logs -f app
|
||||
```
|
||||
|
||||
**Komponenten:**
|
||||
- **MariaDB 10.11**: Datenbank
|
||||
- **App**: Backend + Frontend in einem Container
|
||||
- **Caddy**: Reverse-Proxy mit automatischem SSL
|
||||
|
||||
**Umgebungsvariablen (`docker/.env`):**
|
||||
```env
|
||||
MYSQL_ROOT_PASSWORD=sicheres-root-passwort
|
||||
MYSQL_DATABASE=opencrm
|
||||
MYSQL_USER=opencrm
|
||||
MYSQL_PASSWORD=sicheres-passwort
|
||||
JWT_SECRET=sehr-langer-zufaelliger-string
|
||||
ENCRYPTION_KEY=64-zeichen-hex-string
|
||||
DOMAIN=crm.example.com
|
||||
RUN_SEED=true # Nur beim ersten Start
|
||||
```
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
```
|
||||
@@ -223,9 +258,20 @@ opencrm/
|
||||
├── backend/
|
||||
│ ├── src/
|
||||
│ │ ├── controllers/ # Request-Handler
|
||||
│ │ │ ├── auditLog.controller.ts # Audit-Log API
|
||||
│ │ │ └── gdpr.controller.ts # DSGVO API
|
||||
│ │ ├── middleware/ # Auth, Validation
|
||||
│ │ │ ├── audit.ts # Automatisches API-Logging
|
||||
│ │ │ └── auditContext.ts # Before/After Context
|
||||
│ │ ├── routes/ # API-Endpunkte
|
||||
│ │ │ ├── auditLog.routes.ts # Audit-Log Routes
|
||||
│ │ │ └── gdpr.routes.ts # DSGVO Routes
|
||||
│ │ ├── services/ # Business-Logik
|
||||
│ │ │ ├── audit.service.ts # Hash-Kette, Logging
|
||||
│ │ │ ├── consent.service.ts # Einwilligungen
|
||||
│ │ │ └── gdpr.service.ts # Export, Löschung
|
||||
│ │ ├── lib/
|
||||
│ │ │ └── prisma.ts # Prisma mit Audit-Middleware
|
||||
│ │ ├── types/ # TypeScript-Typen
|
||||
│ │ └── index.ts # Server-Einstiegspunkt
|
||||
│ ├── prisma/
|
||||
@@ -235,6 +281,7 @@ opencrm/
|
||||
│ │ ├── bank-cards/ # Bankkarten-Dokumente
|
||||
│ │ ├── documents/ # Ausweis-Scans
|
||||
│ │ ├── invoices/ # Rechnungsdokumente (Strom/Gas)
|
||||
│ │ ├── gdpr/ # DSGVO-Löschnachweise
|
||||
│ │ ├── business-registrations/ # Gewerbeanmeldungen
|
||||
│ │ ├── commercial-registers/ # Handelsregisterauszüge
|
||||
│ │ ├── privacy-policies/ # Datenschutzerklärungen
|
||||
@@ -246,23 +293,31 @@ opencrm/
|
||||
│ ├── src/
|
||||
│ │ ├── components/ # UI-Komponenten
|
||||
│ │ ├── pages/ # Seiten
|
||||
│ │ │ └── settings/
|
||||
│ │ │ ├── AuditLogs.tsx # Audit-Protokoll
|
||||
│ │ │ └── GDPRDashboard.tsx # DSGVO-Dashboard
|
||||
│ │ ├── hooks/ # Custom Hooks
|
||||
│ │ ├── services/ # API-Client
|
||||
│ │ ├── types/ # TypeScript-Typen
|
||||
│ │ └── App.tsx # Haupt-Komponente
|
||||
│ └── package.json
|
||||
├── docker-compose.yml # MariaDB-Container
|
||||
├── docker/ # Docker-Deployment
|
||||
│ ├── Dockerfile # Multi-Stage Build
|
||||
│ ├── docker-compose.yml # Produktion (MariaDB, App, Caddy)
|
||||
│ ├── Caddyfile # Reverse-Proxy mit SSL
|
||||
│ └── entrypoint.sh # Container-Startup
|
||||
├── docker-compose.yml # MariaDB-Container (Entwicklung)
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## Berechtigungen
|
||||
|
||||
| Rolle | Kunden | Verträge | Benutzer | Plattformen | Developer |
|
||||
|-------|--------|----------|----------|-------------|-----------|
|
||||
| Admin | CRUD | CRUD | CRUD | CRUD | Optional |
|
||||
| Mitarbeiter | CRUD | CRUD | - | Lesen | - |
|
||||
| Mitarbeiter (Lesen) | Lesen | Lesen | - | Lesen | - |
|
||||
| Kunde | Eigene | Eigene | - | - | - |
|
||||
| Rolle | Kunden | Verträge | Benutzer | Plattformen | Audit/DSGVO | Developer |
|
||||
|-------|--------|----------|----------|-------------|-------------|-----------|
|
||||
| Admin | CRUD | CRUD | CRUD | CRUD | Vollzugriff | Optional |
|
||||
| Mitarbeiter | CRUD | CRUD | - | Lesen | Lesen | - |
|
||||
| Mitarbeiter (Lesen) | Lesen | Lesen | - | Lesen | - | - |
|
||||
| Kunde | Eigene | Eigene | - | - | - | - |
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
@@ -708,6 +763,159 @@ In der Kundendetailansicht werden Verträge als **Baumstruktur** mit Vorgänger-
|
||||
|
||||
> **Hinweis:** In der Hauptvertragsliste (`/contracts`) wird weiterhin die flache Ansicht ohne Baumstruktur verwendet.
|
||||
|
||||
## DSGVO-Compliance & Audit-Logging
|
||||
|
||||
Umfassendes Audit-Logging-System mit DSGVO-Compliance-Features.
|
||||
|
||||
### Audit-Protokoll
|
||||
|
||||
Automatische Protokollierung aller API-Zugriffe mit:
|
||||
|
||||
| Feld | Beschreibung |
|
||||
|------|--------------|
|
||||
| **Benutzer** | User-ID, E-Mail, Rolle |
|
||||
| **Aktion** | CREATE, READ, UPDATE, DELETE, EXPORT, ANONYMIZE, LOGIN, LOGOUT |
|
||||
| **Ressource** | Tabelle + ID + lesbare Bezeichnung |
|
||||
| **Kontext** | Endpoint, HTTP-Methode, IP-Adresse, User-Agent |
|
||||
| **Änderungen** | Vorher/Nachher-Werte (bei Updates) |
|
||||
| **Sensitivität** | LOW, MEDIUM, HIGH, CRITICAL |
|
||||
| **Integrität** | SHA-256 Hash-Kette für Manipulationsschutz |
|
||||
|
||||
#### Sensitivitätsstufen
|
||||
|
||||
| Stufe | Ressourcen |
|
||||
|-------|------------|
|
||||
| **LOW** | Einstellungen, Plattformen, Tarife |
|
||||
| **MEDIUM** | Verträge, Provider |
|
||||
| **HIGH** | Kundendaten, Benutzerdaten |
|
||||
| **CRITICAL** | Authentifizierung, Bankdaten, Ausweisdokumente |
|
||||
|
||||
#### Zugriff
|
||||
|
||||
- **Einstellungen** → **Audit-Protokoll**
|
||||
- Filter nach: Datum, Benutzer, Aktion, Ressource, Sensitivität
|
||||
- Detail-Ansicht mit Vorher/Nachher-Diff
|
||||
- Export als JSON
|
||||
- Integritätsprüfung (Hash-Kette verifizieren)
|
||||
|
||||
### DSGVO-Dashboard
|
||||
|
||||
Zentrale Verwaltung für DSGVO-Anfragen unter **Einstellungen** → **DSGVO-Dashboard**.
|
||||
|
||||
#### Dashboard-Statistiken
|
||||
|
||||
- Offene Löschanfragen
|
||||
- Abgeschlossene Löschungen (letzte 30 Tage)
|
||||
- Datenexporte (letzte 30 Tage)
|
||||
- Aktive Einwilligungen
|
||||
|
||||
#### Einwilligungsverwaltung (Consents)
|
||||
|
||||
| Consent-Typ | Beschreibung |
|
||||
|-------------|--------------|
|
||||
| **DATA_PROCESSING** | Grundlegende Datenverarbeitung |
|
||||
| **MARKETING_EMAIL** | E-Mail-Marketing |
|
||||
| **MARKETING_PHONE** | Telefonmarketing |
|
||||
| **DATA_SHARING_PARTNER** | Datenweitergabe an Partner |
|
||||
|
||||
Einwilligungen können pro Kunde im Tab "Einwilligungen" verwaltet werden.
|
||||
|
||||
#### Löschanfragen (Art. 17)
|
||||
|
||||
Workflow für DSGVO-Löschanfragen:
|
||||
|
||||
| Status | Beschreibung |
|
||||
|--------|--------------|
|
||||
| **PENDING** | Anfrage eingegangen |
|
||||
| **IN_PROGRESS** | Wird bearbeitet |
|
||||
| **COMPLETED** | Vollständig gelöscht/anonymisiert |
|
||||
| **PARTIALLY_COMPLETED** | Teildaten behalten (z.B. aktive Verträge) |
|
||||
| **REJECTED** | Abgelehnt mit Begründung |
|
||||
|
||||
**Anonymisierung statt Löschung:**
|
||||
- Kundendaten werden anonymisiert (nicht gelöscht)
|
||||
- Aktive Verträge werden beibehalten
|
||||
- PDF-Löschnachweis wird generiert
|
||||
|
||||
#### Datenexport (Art. 15)
|
||||
|
||||
Kunden können alle gespeicherten Daten als JSON exportieren:
|
||||
- Stammdaten
|
||||
- Adressen, Bankdaten, Ausweise
|
||||
- Verträge mit Details
|
||||
- Zähler und Ablesungen
|
||||
- Einwilligungen
|
||||
- Zugriffsprotokolle
|
||||
|
||||
### API-Endpunkte
|
||||
|
||||
```
|
||||
# Audit-Logs
|
||||
GET /api/audit-logs # Logs mit Filtern
|
||||
GET /api/audit-logs/:id # Einzelnes Log
|
||||
GET /api/audit-logs/customer/:id # Logs für Kunde
|
||||
GET /api/audit-logs/export # Export (JSON/CSV)
|
||||
POST /api/audit-logs/verify # Hash-Kette prüfen
|
||||
GET /api/audit-logs/retention-policies # Aufbewahrungsfristen
|
||||
PUT /api/audit-logs/retention-policies/:id
|
||||
POST /api/audit-logs/cleanup # Manuelle Bereinigung
|
||||
|
||||
# DSGVO
|
||||
GET /api/gdpr/dashboard # Dashboard-Statistiken
|
||||
GET /api/gdpr/customer/:id/export # Kundendaten-Export
|
||||
GET /api/gdpr/deletions # Löschanfragen
|
||||
POST /api/gdpr/deletions # Löschanfrage erstellen
|
||||
PUT /api/gdpr/deletions/:id/process # Löschanfrage bearbeiten
|
||||
GET /api/gdpr/customer/:id/consents # Einwilligungen abrufen
|
||||
PUT /api/gdpr/customer/:id/consents/:type # Einwilligung ändern
|
||||
GET /api/gdpr/consents/overview # Consent-Übersicht
|
||||
```
|
||||
|
||||
### Aufbewahrungsfristen
|
||||
|
||||
| Ressource | Frist | Rechtsgrundlage |
|
||||
|-----------|-------|-----------------|
|
||||
| Standard | 10 Jahre | AO §147, HGB §257 |
|
||||
| Authentifizierung | 2 Jahre | Sicherheit |
|
||||
| Kundendaten (HIGH) | 10 Jahre | Steuerrecht |
|
||||
| Verträge | 10 Jahre | Steuerrecht |
|
||||
| Allgemein (LOW) | 3 Jahre | Verjährung |
|
||||
|
||||
### Berechtigungen
|
||||
|
||||
| Aktion | Berechtigung |
|
||||
|--------|--------------|
|
||||
| Audit-Logs lesen | `audit:read` |
|
||||
| Audit-Logs exportieren | `audit:export` |
|
||||
| Audit-Administration | `audit:admin` |
|
||||
| DSGVO-Export | `gdpr:export` |
|
||||
| Löschanfrage erstellen | `gdpr:delete` |
|
||||
| DSGVO-Administration | `gdpr:admin` |
|
||||
|
||||
### Technische Details
|
||||
|
||||
#### Hash-Kette
|
||||
|
||||
Jeder Audit-Log-Eintrag enthält einen SHA-256-Hash über:
|
||||
- Alle Felder des Eintrags
|
||||
- Hash des vorherigen Eintrags
|
||||
|
||||
Dies ermöglicht die Erkennung von Manipulationen.
|
||||
|
||||
#### Sensitive Daten
|
||||
|
||||
Folgende Felder werden in Audit-Logs gefiltert:
|
||||
- `password`, `passwordHash`
|
||||
- `portalPasswordHash`, `portalPasswordEncrypted`
|
||||
- `emailPasswordEncrypted`, `internetPasswordEncrypted`
|
||||
- `sipPasswordEncrypted`, `pin`, `puk`, `apiKey`
|
||||
|
||||
#### Performance
|
||||
|
||||
- Logging erfolgt asynchron (`setImmediate`)
|
||||
- API-Response wird nicht blockiert
|
||||
- Before/After-Werte über Prisma Middleware
|
||||
|
||||
## Lizenz
|
||||
|
||||
MIT
|
||||
|
||||
Reference in New Issue
Block a user