Kunden und Projekte in der Verwaltung anlegen, inklusive Testzugang

Wunsch 22.08.2026: "ich will einen provisorischen zugang fuer mich".
Der richtige Weg dahin war ohnehin ueberfaellig -- Kundenzugaenge
entstehen ausschliesslich hier, es gibt bewusst keine Selbstregistrierung.

Neu:
* Kundenzugang anlegen (Name, E-Mail, Firma, Sprache, sofort freischalten
  ja/nein) mit Einladungslink
* "Testzugang fuer mich" -- ein Klick, legt einen als Test erkennbaren
  Zugang mit Datumsstempel an. Bewusst NICHT die echte Geschaeftsadresse:
  die E-Mail ist gleichzeitig der Anmeldename und laesst sich aus gutem
  Grund nicht mehr aendern, ein Test wuerde also spaeter mit einem echten
  Kundenkonto kollidieren.
* Zugaenge auflisten, freischalten, sperren, neuen Einladungslink erzeugen
* Projekte anlegen und aendern, Aenderungswuensche beziffern, Nachrichten

Entscheidungen:
* Der Einladungslink geht EINMAL im Klartext raus, direkt beim Anlegen.
  In der Datenbank liegt nur sein Hash. Wer ihn verliert, bekommt einen
  neuen -- das ist sicherer, als ihn dauerhaft abrufbar zu halten. Die
  Oberflaeche sagt das auch klar dazu, sonst klickt man ihn weg und
  wundert sich.
* Ein neuer Link entwertet alle offenen alten. Sonst sammeln sich mehrere
  gueltige Generalschluessel fuer dasselbe Konto an.
* "Sofort freischalten" ist eine bewusste Handlung. Ohne Haekchen wird der
  Zugang angelegt, kommt aber noch nicht hinein -- Masterplan S.12
  verlangt, dass Projektkauf oder Betreuung VOR der Freischaltung geprueft
  werden.
* Sperren beendet laufende Sitzungen sofort, nicht erst nach Ablauf.
* Die 30 % Anzahlung werden aus dem Preis BERECHNET, nicht eingetippt.
  Ein Tippfehler in der Anzahlung faellt sonst erst beim Geldeingang auf.
* Preise kommen als Euro herein und werden sofort in Cent umgerechnet
  (Math.round, damit 49.99 nicht zu 4998 wird). Ab da nie wieder Komma.
* Vier klar unterscheidbare Zustaende in der Liste. Wichtig vor allem
  "Einladung offen": freigeschaltet, aber noch kein Passwort gesetzt --
  der Kunde war also noch nie drin.
* Kopieren faellt auf Markieren zurueck, wenn die Zwischenablage
  blockiert ist. Eine Fehlermeldung waere dort nutzlos.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-22 21:23:15 +02:00
co-authored by Claude Opus 5
parent 1b432f456f
commit 2542a2598e
3 changed files with 609 additions and 1 deletions
+16
View File
@@ -95,6 +95,12 @@ import {
portalUebersicht, portalProjekt, portalAenderungEinreichen,
portalAenderungEntscheiden, portalNachricht, portalProfilSpeichern,
} from "./routes/webdesign-portal.js";
/* Kunden und Projekte verwalten (Masterplan S.13). Hier entstehen
Kundenzugaenge -- es gibt bewusst keine Selbstregistrierung. */
import {
kundeAnlegen, kundeEinladungNeu, kundenListe, kundeSchalten,
projektAnlegen, projektAendern, aenderungBeziffern, projektNachricht,
} from "./routes/webdesign-kunden.js";
initDb();
@@ -250,6 +256,16 @@ app.post("/webdesign/portal/aenderung/:id/entscheiden", wrap(portalAenderungEnts
app.post("/webdesign/portal/nachricht", wrap(portalNachricht));
app.post("/webdesign/portal/profil", wrap(portalProfilSpeichern));
/* ---------- Kunden und Projekte (Verwaltung) ---------- */
app.get("/webdesign/admin/kunden", wrap(kundenListe));
app.post("/webdesign/admin/kunden", wrap(kundeAnlegen));
app.post("/webdesign/admin/kunden/:id/einladung", wrap(kundeEinladungNeu));
app.post("/webdesign/admin/kunden/:id/zugang", wrap(kundeSchalten));
app.post("/webdesign/admin/projekte", wrap(projektAnlegen));
app.post("/webdesign/admin/projekte/:id", wrap(projektAendern));
app.post("/webdesign/admin/aenderungen/:id/beziffern", wrap(aenderungBeziffern));
app.post("/webdesign/admin/projekt-nachricht", wrap(projektNachricht));
app.post("/supporter/register", wrap(registerSupporter));
app.post("/supporter/verify-email", wrap(verifySupporterEmail));
// Normaler Login seit 21.08.2026: E-Mail + selbst gewählter Zugangscode.