Files
Webklar-Kundenbereich/README.md
T
ClaudeandClaude Opus 5.5 18c3cdf3e5 Automatische Mails im neuen Design (HTML mit Textfassung)
Alle 22 automatischen Mails gehen jetzt als HTML nach den Vorlagen aus
server/mail-templates raus, dazu eine aus dem HTML erzeugte Textfassung
(multipart/alternative). Werte werden HTML-sicher eingesetzt, optionale
Blöcke (WENN/ENDE) je nach Fall ein- oder ausgeblendet.

- Neu: services/mailTemplates.js (Vorlagen lesen, Platzhalter, Blöcke,
  Textfassung); mailer.js nimmt { template, values, blocks }.
- K11 "Passwort geändert" war nicht im Design-Export: aus den Bausteinen
  von K02 zusammengesetzt.
- T09 (Widerruf, intern): Fälle "kein Abo gefunden" und "Stripe-Kündigung
  fehlgeschlagen" ergänzt; bisher stand dort immer "auf Kündigung gesetzt".
- Einheitlich: Datum TT.MM.JJJJ, Beträge deutsch (T04 "50,00 €"),
  "WEBklar" statt "Webklar", Anrede mit Kundennamen, Team-Absender
  "WEBklar Kundenportal", Betreff T05 "Kündigung (Stripe)".
- Logo für die Mails: public/webklar-logo.png (192 px, aus dem Design-SVG).

Tests: 52 neue (jede Vorlage: Kopf, Platzhalter, Blöcke, Rendern,
Escaping, Textfassung), npm test 97/97 auf Node 20.19.5; alle 40 Auslöser
einmal durch den Server geschickt (Appwrite-Mock, Stripe-Double,
SMTP-Falle mit STARTTLS).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 14:37:50 +00:00

80 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Webklar Kundenbereich
Kundenportal für Website-Projekte. Liest **ausschließlich** aus `woms-database` auf `ticket.webklar.com` (Ticketsystem). Es gibt **keine** eigene Portal-Datenbank mehr.
- **Keine** Kundenanlage im Portal
- **Keine** Admin-Funktionen
- Login über **Appwrite Auth** (ein User pro Kunde, verknüpft über `customers.appwriteUserId`)
Verwaltung (Kunden, Passwörter, Projekte, Freischaltung): **Ticketsystem**.
## Struktur
```
server/ Express-API, Appwrite, Gitea-Webhook
public/ Login & Dashboard (statisch)
```
## Schnellstart
```bash
cp .env.example .env
# SESSION_SECRET (min. 32 Zeichen) und APPWRITE_API_KEY setzen
npm install
npm run dev
```
Öffnen: http://localhost:3000
## API
| Methode | Pfad | Beschreibung |
|---------|------|----------------|
| POST | `/api/auth/login` | Appwrite Login + Portal-Prüfungen |
| POST | `/api/auth/logout` | Session beenden |
| GET | `/api/auth/me` | Aktueller Kunde |
| GET | `/api/projects` | Eigene `websiteProjects` |
| GET | `/api/features` | Eigene `portalFeatures` (enabled) |
| POST | `/webhook/gitea?token=…` | Gitea Push → Deploy + DB-Update |
## Appwrite
Schema und Collection-Anlage: siehe [APPWRITE_SCHEMA.md](./APPWRITE_SCHEMA.md).
```
Endpoint: https://ticket.webklar.com/v1
Project: 6a1058610003c5a13a05
Database: woms-database
```
## Gitea / Preview
- Template: https://git.webklar.com/knso/webklar-preview-template.git
- Webhook-URL: `https://project.webklar.com/webhook/gitea`
- Secret: `GITEA_WEBHOOK_TOKEN` in `.env`
- Vorschau: `https://<subdomain>.project.webklar.com`
`customerId` wird **im Ticketsystem** am `websiteProjects`-Eintrag gesetzt, nicht im Webhook.
## E-Mails
Alle automatischen Mails sind HTML-Vorlagen mit Textfassung in `server/mail-templates/`
(K01–K11 an Kunden, T01–T11 ans Team; Design aus Claude Design). Jede Vorlage nennt im
Kopfkommentar Betreff, Platzhalter (`{{name}}`) und optionale Blöcke
(`<!-- WENN x --> … <!-- ENDE x -->`). Eine neue Fassung aus dem Design kann die Datei direkt
ersetzen, solange Platzhalter und Blöcke gleich heißen; `npm test` prüft das. Das Logo in den
Mails liegt unter `public/webklar-logo.png`.
## Deployment
```bash
npm start
# Reverse Proxy (nginx) → Port 3000
# PREVIEW_DEPLOY_ROOT für statische Vorschau-Dateien
```
## Repositories
- Portal: https://git.webklar.com/knso/Webklar-Kundenbereich.git
- Template: https://git.webklar.com/knso/webklar-preview-template.git