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) +})