From 6ff63a7a11309c511eecb894efa36abc3614b976 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 21:49:18 +0000 Subject: [PATCH] =?UTF-8?q?Kundenansicht=20neu=20E-Fix=20M10:=20hatLoeschV?= =?UTF-8?q?ermerk=20pr=C3=BCft=20den=20strengen=20Vermerk=20der=20L=C3=B6s?= =?UTF-8?q?chjobs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hatLoeschVermerk erkannte gelöschte Daten an /gelöscht am/ in adminNote. Der Vermerk der Jobs ist strenger (Shopdaten bzw. Buchungsdaten gelöscht am JJJJ-MM-TT), freier Text des Teams ("Domain gelöscht am Kundenwunsch") traf das lockere Muster: das Abo kam zurück, der Abgleich hielt die Daten für gelöscht und setzte das Dokument auf off statt die Funktion wieder einzuschalten. Jetzt je Funktion das Muster des Jobs mit Datum. Test in knLoeschVermerk.test.js. Co-Authored-By: Claude Sonnet 5.5 --- server/services/aboFunktionenAbgleich.js | 4 +++- test/knLoeschVermerk.test.js | 28 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 test/knLoeschVermerk.test.js diff --git a/server/services/aboFunktionenAbgleich.js b/server/services/aboFunktionenAbgleich.js index b551b1a..dd9dad0 100644 --- a/server/services/aboFunktionenAbgleich.js +++ b/server/services/aboFunktionenAbgleich.js @@ -86,7 +86,9 @@ const TAG_FELDER_LEER = Object.freeze({ ticketId: null, activatedAt: null, aboEn /** Vermerk der bestehenden Loeschjobs von Webshop und Buchungskalender in der Notiz. */ const LOESCH_VERMERK = /\s*(?:[-–|]\s*)?(?:Shopdaten|Buchungsdaten) gelöscht am \d{4}-\d{2}-\d{2}/g -const hatLoeschVermerk = (doc) => (doc.featureKey === 'shop' || doc.featureKey === 'unterkunft') && /gelöscht am/.test(String(doc.adminNote ?? '')) +// E-Fix M10: nur der Vermerk des jeweiligen Loeschjobs mit Datum (shop/jobs.js, unterkunft/aufbewahrung.js: MARKER_RE), nie freier Text des Teams wie "Domain geloescht am Kundenwunsch" +const LOESCH_VERMERK_JE_FUNKTION = Object.freeze({ shop: /Shopdaten gelöscht am \d{4}-\d{2}-\d{2}/, unterkunft: /Buchungsdaten gelöscht am \d{4}-\d{2}-\d{2}/ }) +export const hatLoeschVermerk = (doc) => LOESCH_VERMERK_JE_FUNKTION[doc.featureKey]?.test(String(doc.adminNote ?? '')) === true /** News: ist disabledAt plus die Loeschfrist (30 Tage) am Berliner Kalendertag erreicht? Ohne gueltiges disabledAt nie. */ function loeschReif(doc, now) { diff --git a/test/knLoeschVermerk.test.js b/test/knLoeschVermerk.test.js new file mode 100644 index 0000000..be66b1c --- /dev/null +++ b/test/knLoeschVermerk.test.js @@ -0,0 +1,28 @@ +import { test, after } from 'node:test' +import assert from 'node:assert/strict' +import { startAppwriteMock } from './support/appwriteMock.js' +import { startFakeStripe } from './support/fakeStripe.js' +import { useTestEnv } from './support/testEnv.js' + +// E-Fix M10: hatLoeschVermerk erkennt gelöschte Daten nur am strengen Vermerk der Löschjobs (Shopdaten|Buchungsdaten gelöscht am JJJJ-MM-TT), +// nicht an freiem Text des Teams in adminNote. +const aw = await startAppwriteMock({ schema: {} }) +const st = await startFakeStripe() +useTestEnv({ appwriteUrl: aw.url, stripeUrl: st.url }) +after(() => Promise.all([aw.close(), st.close()])) +const { hatLoeschVermerk } = await import('../server/services/aboFunktionenAbgleich.js') + +test('M10: hatLoeschVermerk braucht den Vermerk des jeweiligen Löschjobs mit Datum; freier Text des Teams zählt nicht', () => { + assert.equal(hatLoeschVermerk({ featureKey: 'shop', adminNote: 'Shopdaten gelöscht am 2026-10-04' }), true) + assert.equal(hatLoeschVermerk({ featureKey: 'unterkunft', adminNote: 'Buchungsdaten gelöscht am 2026-10-04' }), true) + assert.equal(hatLoeschVermerk({ featureKey: 'unterkunft', adminNote: '2026-10-05T09:00:00.000Z Kenso: disable | Buchungsdaten gelöscht am 2026-10-04' }), true, 'der Vermerk steht auch hinter Teamnotizen') + // freier Text: kein Löschvermerk, die Funktion kommt mit dem Abo zurück + for (const note of ['Domain gelöscht am Kundenwunsch', 'Daten gelöscht am 2026-10-04', 'gelöscht am', '2026-10-05T09:00:00.000Z Kenso: disable – Konto gelöscht am Montag']) { + for (const featureKey of ['shop', 'unterkunft']) assert.equal(hatLoeschVermerk({ featureKey, adminNote: note }), false, `${featureKey}: ${note}`) + } + // je Funktion getrennt: der Shop-Vermerk gilt nicht für den Buchungskalender und umgekehrt; andere Funktionen haben keinen + assert.equal(hatLoeschVermerk({ featureKey: 'unterkunft', adminNote: 'Shopdaten gelöscht am 2026-10-04' }), false) + assert.equal(hatLoeschVermerk({ featureKey: 'shop', adminNote: 'Buchungsdaten gelöscht am 2026-10-04' }), false) + for (const featureKey of ['news', 'termine', 'zeiten']) assert.equal(hatLoeschVermerk({ featureKey, adminNote: 'Shopdaten gelöscht am 2026-10-04' }), false) + assert.equal(hatLoeschVermerk({ featureKey: 'shop' }), false) +})