factory-defaults: HTML-Templates + Import über UI
Erweitert das bestehende Factory-Defaults-Bundle um vier HTML-Standardtexte (Datenschutzerklärung, Impressum, Vollmacht-Vorlage, Website-Datenschutz) und ergänzt den bisherigen CLI-Only-Import um einen Upload-Pfad in der UI. Backend: - collectFactoryDefaults() zieht jetzt auch die Whitelist-AppSettings - exportFactoryDefaults() legt sie als app-settings/app-settings.json ins ZIP - importFactoryDefaults(buffer) liest die ZIP idempotent ein – upserts pro Kategorie, Whitelist-Filter für AppSettings, Anti-Zip-Slip durch basename beim PDF-Lookup - POST /api/factory-defaults/import (multer memoryStorage, max 50 MB, settings:update) - seed-factory-defaults.ts (CLI) gleichermaßen um seedAppSettings() erweitert Frontend: - Import-Card in FactoryDefaults.tsx: Datei-Upload statt CLI-Anleitung - Erfolgs-Box mit Counts pro Kategorie + Warnings (z.B. fehlende PDFs im ZIP) - Preview zeigt jetzt auch die Anzahl HTML-Templates Live verifiziert: Round-Trip Export → DELETE privacyPolicyHtml → Import → Wert (13.6 KB) wieder vollständig hergestellt, Audit-Log zeigt EXPORT + UPDATE-Eintrag mit Detail-Counts. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,15 +18,21 @@ backend/factory-defaults/
|
||||
│ ├── cancellation-periods.json # Kündigungsfristen
|
||||
│ ├── contract-durations.json # Vertragslaufzeiten
|
||||
│ └── contract-categories.json # Vertragskategorien (Strom/Gas/DSL/...)
|
||||
└── pdf-templates/
|
||||
├── pdf-templates.json # Metadaten + Feldzuordnungen
|
||||
└── *.pdf # PDF-Vorlagen-Dateien
|
||||
├── pdf-templates/
|
||||
│ ├── pdf-templates.json # Metadaten + Feldzuordnungen
|
||||
│ └── *.pdf # PDF-Vorlagen-Dateien
|
||||
└── app-settings/
|
||||
└── app-settings.json # HTML-Templates: Datenschutz / Impressum /
|
||||
# Vollmacht / Website-Datenschutz
|
||||
```
|
||||
|
||||
**Was NICHT enthalten ist:** Kundendaten, Verträge, Dokumente, E-Mails, SMTP-Einstellungen,
|
||||
Datenschutzerklärungen oder andere AppSettings. Dafür gibt es den separaten
|
||||
Secrets oder benutzerspezifische AppSettings. Dafür gibt es den separaten
|
||||
**Datenbank-Backup-Export** (Einstellungen → Datenbank & Zurücksetzen).
|
||||
|
||||
Bei den AppSettings ist nur eine **Whitelist** vorgesehen (HTML-Texte für rechtliche
|
||||
Standardpflichten) – andere Keys werden beim Import ignoriert.
|
||||
|
||||
---
|
||||
|
||||
## Export (aus einer bestehenden Installation)
|
||||
@@ -46,7 +52,8 @@ factory-defaults-2026-04-23.zip
|
||||
├── contract-meta/contract-durations.json
|
||||
├── contract-meta/contract-categories.json
|
||||
├── pdf-templates/pdf-templates.json
|
||||
└── pdf-templates/*.pdf
|
||||
├── pdf-templates/*.pdf
|
||||
└── app-settings/app-settings.json
|
||||
```
|
||||
|
||||
Die ZIP kann an andere Installationen weitergegeben werden – z.B. für Test-Systeme,
|
||||
@@ -56,7 +63,15 @@ neue Installationen oder Partner-Setups.
|
||||
|
||||
## Import (in eine andere Installation)
|
||||
|
||||
### Schritt-für-Schritt
|
||||
### Variante A: Über die UI (empfohlen)
|
||||
|
||||
1. Im Ziel-CRM als Admin einloggen
|
||||
2. **Einstellungen → Factory-Defaults**
|
||||
3. Im Bereich **Import** auf **„ZIP hochladen"** klicken
|
||||
4. Die exportierte ZIP wählen – der Import läuft direkt
|
||||
5. Erfolgsmeldung zeigt Counts pro Kategorie an
|
||||
|
||||
### Variante B: Über die CLI (für Bare-Metal / Migration / mehrere ZIPs zusammenführen)
|
||||
|
||||
1. **ZIP herunterladen** (aus einer Export-Installation oder von einer Vorlage)
|
||||
2. **Inhalt entpacken** in diesen Ordner (`backend/factory-defaults/`),
|
||||
@@ -234,6 +249,24 @@ Array von Providern, jeweils inkl. zugehöriger Tarife:
|
||||
**Unique Key:** `name`
|
||||
**Wichtig:** Die `pdfFilename` muss zu einer PDF-Datei im selben Ordner passen.
|
||||
|
||||
### `app-settings/app-settings.json`
|
||||
|
||||
HTML-Standardtexte als Werkseinstellung. Es ist eine **Whitelist** aktiv – andere Keys
|
||||
werden beim Import ignoriert (Schutz vor versehentlichem Überschreiben von Secrets).
|
||||
|
||||
```json
|
||||
[
|
||||
{ "key": "privacyPolicyHtml", "value": "<h1>Datenschutzerklärung</h1>..." },
|
||||
{ "key": "imprintHtml", "value": "<h1>Impressum</h1>..." },
|
||||
{ "key": "authorizationTemplateHtml","value": "<h1>Vollmacht</h1>..." },
|
||||
{ "key": "websitePrivacyPolicyHtml", "value": "<h1>Website-Datenschutz</h1>..." }
|
||||
]
|
||||
```
|
||||
|
||||
**Unique Key:** `key`
|
||||
**Erlaubte Keys:** `privacyPolicyHtml`, `imprintHtml`, `authorizationTemplateHtml`,
|
||||
`websitePrivacyPolicyHtml`.
|
||||
|
||||
---
|
||||
|
||||
## Berechtigungen
|
||||
@@ -242,6 +275,7 @@ Array von Providern, jeweils inkl. zugehöriger Tarife:
|
||||
|--------|--------------|
|
||||
| Factory-Defaults Vorschau | `settings:read` |
|
||||
| Factory-Defaults Export (UI) | `settings:update` |
|
||||
| Factory-Defaults Import (UI) | `settings:update` |
|
||||
| Factory-Defaults Import (CLI) | Server-Zugang (SSH/Shell) |
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user