From 71fa0fc8e24607ce2af427bec4c8d14a0de8cc6d Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 28 Sep 2026 08:39:27 +0000 Subject: [PATCH] =?UTF-8?q?Spec=20und=20Plan=202:=20Aufbewahrung=20bis=20J?= =?UTF-8?q?ahresende=20+=203=20Jahre,=20Hinweise=20zum=20Wechsel=20nach=20?= =?UTF-8?q?der=20Textpr=C3=BCfung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../plans/2026-09-27-vertraege-plan-2-sichtbar.md | 11 ++++++++--- .../specs/2026-09-27-vertraege-hosting-abo-design.md | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/superpowers/plans/2026-09-27-vertraege-plan-2-sichtbar.md b/docs/superpowers/plans/2026-09-27-vertraege-plan-2-sichtbar.md index 2da48b9..aab21d4 100644 --- a/docs/superpowers/plans/2026-09-27-vertraege-plan-2-sichtbar.md +++ b/docs/superpowers/plans/2026-09-27-vertraege-plan-2-sichtbar.md @@ -726,6 +726,10 @@ test('invoice.paid: bezahlte Menge aus regulärer Speicher-Zeile', async () => { > - Webhook `pending_update_expired` → `gescheitert` und K14. Webhook `pending_update_applied` → `erledigt` und T12. > - Wechsel bei ausstehendem Wechsel → 409. > - **Livegang:** Die neuen Webhook-Ereignisse am Stripe-Endpunkt freischalten (Task 20). +> - **Nach der Prüfung der Rechtsrunden-Texte:** +> - Mails nennen keine feste Frist von 23 Stunden, weil die Frist bei Stripe auch kürzer sein kann. +> - Bei gescheiterter SEPA-Lastschrift die Wechselrechnung sofort stornieren, damit ein automatischer Einzugsversuch sie nicht mehr einzieht. +> - Weitere Postfächer richten wir erst ein, wenn die Wechselrechnung bezahlt ist (Vertragsbedingungen § 9 Abs. 3). T12 nennt das. **Files:** - Create: `server/services/planSwitch.js` @@ -1066,7 +1070,8 @@ test('Ticketsystem-Schnittstelle: Produkt und aktiv', async () => { - Collections `subscriptions` (Felder `status`, `endedAt`, `canceledAt`, `currentPeriodEnd`, `customerId`), `contractEvents`, `takeoverCredits` - Produces: - **`findDueDeletions(now = new Date())`:** liefert `{ customers: [{ customerId, lastEndAt, subscriptionIds, eventIds }], takeover: [{ id, reason }] }`. - - Ein Kunde ist fällig, wenn alle seine Abos beendet sind und das späteste Ende mehr als drei Jahre zurückliegt („drei Jahre nach dem Ende Ihres letzten Abos“, Datenschutzerklärung Abschnitt 7). + - Ein Kunde ist fällig, wenn alle seine Abos beendet sind und seit dem Ende des Jahres, in dem sein letztes Abo endete, drei Jahre vergangen sind („drei Jahre nach Ablauf des Jahres, in dem Ihr letztes Abo endet“, Datenschutzerklärung Abschnitt 7). + - Das Skript läuft einmal im Jahr, im Januar. - Das Ende ist `endedAt`, sonst `canceledAt`. Fehlt beides bei `status: 'canceled'`, zählt `currentPeriodEnd`. - Anträge auf Übernahmegutschrift sind fällig nach den Fristen in Abschnitt 7 der Datenschutzerklärung. Sie stehen dort im Absatz zur Übernahmegutschrift und werden wörtlich übernommen. - **`applyDeletions(plan)`:** liefert `{ deleted, manual }`. @@ -1080,7 +1085,7 @@ test('Ticketsystem-Schnittstelle: Produkt und aktiv', async () => { - `LOESCHFRISTEN=apply` löscht. - [ ] **Step 1: Failing test** – `test/retention.test.js` (Appwrite- und Stripe-Nachbau) - - Abo beendet vor drei Jahren und einem Tag → fällig. + - Abo beendet am 15.03.2022 → fällig am 01.01.2026, nicht fällig am 31.12.2025. - Abo beendet vor zwei Jahren → nicht fällig. - Altes beendetes Abo und ein laufendes Abo desselben Kunden → nicht fällig. - `applyDeletions` löscht die Dokumente und schickt an Stripe leere Metadaten (Aufruf im Nachbau geprüft). Eine abgelehnte Stripe-Änderung landet in `manual`. @@ -1284,7 +1289,7 @@ Alle Prüfungen laufen gegen den Fixture-Server aus Task 14, Step 1. Die Ansicht > 2. Mit dem neuen `takeover.conditionsVersion` wird der Schlüssel in `TAKEOVER_CONDITIONS_SHA256` (`test/legalTexts.test.js`) mitgezogen. > 3. Den Auftragsverarbeitungsvertrag von UptimeRobot (uptimerobot.com/dpa) herunterladen und ablegen, denn die Datenschutzerklärung bietet eine Kopie an. Die Angaben zu UptimeRobot noch einmal prüfen. > 4. Am Stripe-Webhook-Endpunkt `customer.subscription.pending_update_applied`, `customer.subscription.pending_update_expired` und `invoice.payment_failed` freischalten (Task 9). Das nur mit Freigabe des Nutzers. -> 5. Die jährliche Erinnerung an die Löschfristen einrichten (Task 21). Ein Cron-Eintrag auf dem Server nur mit Freigabe des Nutzers. +> 5. Die jährliche Erinnerung an die Löschfristen einrichten (Task 21, Lauf im Januar). Ein Cron-Eintrag auf dem Server nur mit Freigabe des Nutzers. **Files:** `server/config.js` (`abo.termsVersion`), `public/abo-bedingungen.html` (Stand), `public/datenschutz.html` (Stand), PDFs diff --git a/docs/superpowers/specs/2026-09-27-vertraege-hosting-abo-design.md b/docs/superpowers/specs/2026-09-27-vertraege-hosting-abo-design.md index 893572c..4ae3bb5 100644 --- a/docs/superpowers/specs/2026-09-27-vertraege-hosting-abo-design.md +++ b/docs/superpowers/specs/2026-09-27-vertraege-hosting-abo-design.md @@ -506,7 +506,7 @@ Der Nutzer hat alle 19 Vorschläge des Übersichtsblatts freigegeben. Folgen fü - Vertragsbedingungen § 2 Abs. 5 und § 9. Umsetzung: Task 9 und 12. 2. **Zusatzspeicher auch teilweise über den Kündigungsbutton kündigen.** Das Formular fragt die Zahl der Pakete ab. Das geht auch bei gekündigtem Abo. - Vertragsbedingungen § 8 Abs. 7 und 8, § 10 Abs. 5. Umsetzung: Task 8, 10 und 12. -3. **Datenschutz: Aufbewahrung „drei Jahre nach dem Ende Ihres letzten Abos“.** Dazu kommt eine Löschroutine mit Probelauf, Bericht ans Team und jährlicher Erinnerung (Task 21). +3. **Datenschutz: Aufbewahrung „drei Jahre nach Ablauf des Jahres, in dem Ihr letztes Abo endet“.** Das ist eine Präzisierung nach der Textprüfung, passend zur Verjährung und zum jährlichen Lauf. Dazu kommt eine Löschroutine mit Probelauf, Bericht ans Team und einem Lauf im Januar (Task 21). 4. **AGB der Website:** - Modul C Nr. 4 (Haftungsausschluss für externe Anbieter) entfällt. Für die Abos gilt § 13 der Vertragsbedingungen. - Alte Hosting-Jahresverträge: Nach einer automatischen Verlängerung können Verbraucher mit einer Frist von einem Monat kündigen.