"Dazu zählen" bezieht sich wieder direkt auf die aufgewendete Zeit; das Hosting-Abo
übernimmt Rundung, Abstimmung und Unterstützung (Satz 1, 2 und 4).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fix round 1 (Review C1/I1/I2/I3, Controller-Ruling R11):
- C1 (kritisch): Hooks haben in echtem Gitea kein Top-Level-url, nur config.url -
isInternalRepo/deletePortalHooks lasen bisher ein Feld, das es in Produktion nicht gibt.
- I1: Schritt-2-Namensvergleich jetzt ohne Ruecksicht auf Gross-/Kleinschreibung.
- I2: fs.rm in Schritt 9 gegen EACCES/EBUSY/ENOTEMPTY & Co. abgesichert.
- I3: Aufraeumen (Cache, alter Einzel-Webhook, Preview-Verzeichnis) laeuft jetzt ueber den
neuen idempotenten finishMove()-Baustein in jedem Fall, in dem das Repo tatsaechlich in
WEBklar liegt - auch nach einem Appwrite-Fehler, bei Selbstheilung und bei einem schon
dort liegenden Repo (WARN.hookNotRemoved bei fehlgeschlagenem Loeschen).
- Fake Gitea: Hook-Form ohne Top-Level-url, 301 mit relativer Location (auch fuer
Unterpfade) wie im echten Gitea 1.25.2, failNext() fuer gezielte Fehler in Tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Plan 1 Kundenportal (Gitea-Grundlage, Umzug, Nachtragen, Livegang),
Plan 2 Ticketsystem (Dialog, Knöpfe), Plan 3 Lead-Automatik
(neue Lead-Repos in WEBklar über das System-Konto).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Neutrales System-Konto statt knso, Organisation WEBklar mit einem
Webhook, automatischer Umzug beim Zuweisen, Pushes der letzten 30 Tage
nachtragen, Knopf "Preview einschalten", deutsche Uhrzeit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der Server erzeugt das SVG lokal unter /api/avatar.svg (Seed = Kunden-ID),
es geht also keine Anfrage an dicebear.com. Die Initialen bleiben als
Fallback, bis das Bild geladen ist.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- server/config.js: amountCents 2000, lookup_key webklar_hosting_monatlich_2000
- ensurePrice haengt einen neuen Preis an das vorhandene Stripe-Produkt (metadata.webklar),
statt ein zweites "WEBklar Hosting-Abo" anzulegen
- abo-bedingungen.html (Uebersicht, Preise, Leistungsbeschreibung) + PDF, Leitfaden + PDF
- Tests auf 20 € umgestellt (399/399)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ein verirrter Wert in Produktion kann den Live-Schlüssel so nie an einen
fremden Server schicken; getStripe() bricht mit klarer Meldung ab.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Schützt Webhooks und den öffentlichen Kündigungs-/Widerrufsknopf, falls das
Setup-Skript erst nach dem Deploy läuft; der Fehler steht laut im Log.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wie im Abo-Spiegel gelten Rechnungen ohne jeden bekannten Abo-Preis als
Wartung. Ein unbekannter Preis neben einem bekannten (z. B. Hosting) bringt
weiterhin keine Stunde.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die Rechnung wird frisch geladen; eine Stunde bringt nur eine reguläre
(nicht anteilige) Wartungs-Zeile über 0 €. Preis-IDs werden einmal bei
Stripe nachgeschlagen und zwischengespeichert.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Neues Appwrite-Feld subscriptions.productKey (Setup-Skript). Ohne bekannten
Abo-Preis gilt ein Abo weiter als Wartungs-Abo.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
getStripe() nutzt in Tests über STRIPE_API_BASE den Nachbau auf 127.0.0.1;
in Produktion ist der Wert leer und nichts ändert sich.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Plan 1: Produktkatalog, Abo-Spiegel mit productKey, Arbeitszeit nur für
Wartungs-Rechnungen, Stripe- und Appwrite-Nachbau für Tests. Kann vor den
neuen Vertragsbedingungen live gehen.
Plan 2: Rechtstexte (Gate Rechtsrunde), Vertragsereignisse, Zusatzspeicher,
Wechsel, öffentliche Formulare, Angebote je Produkt, Mails, Admin,
Ansicht "Verträge", Website, Ticketsystem, Livegang.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Postfächer liegen im Hetzner-Paket M (50 GB), Wechsel auf L ab 40 GB
belegt. Die Überwachung läuft mit UptimeRobot: Eintrag in der
Datenschutzerklärung, kein Unterauftragsverarbeiter nach Anlage 3,
Monitore beim Abo-Start anlegen und beim Ende entfernen. Die
HTML-Mailvorlagen auf feature/mail-vorlagen enthalten Produktangaben
fest und bekommen Platzhalter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entwurf zur Durchsicht, noch keine Umsetzung. Beschreibt den Bereich
"Verträge", das Hosting-Abo (15 €), beliebig viele Postfächer im
Wartungs-Abo, den Wechsel Hosting -> Wartung (12 neue Monate) und den
Zusatzspeicher (5 GB je 1 €/Monat, Stückzahl im Stripe-Abo) samt
betroffener Rechtstexte, Mails und Dateien.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
Die 21 HTML-Vorlagen aus dem Claude-Design-Projekt "Webklar Bestätigungsmail
gestalten" (Ordner WEBklar-Mail-Vorlagen), Byte für Byte wie im Export.
K01–K10 gehen an Kunden, T01–T11 intern ans Team.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Abschnitt 8 nennt Hetzner als E-Mail-Dienst (Deutschland, AV-Vertrag);
Porkbun nur noch als bisheriger Dienst, bis aeltere E-Mails dort geloescht
sind. Empfaengerliste entsprechend, PDF neu erzeugt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>