Funktionen: disable() idempotent, disabledReason, Schema-Skript feature-setup
disable() laeuft unter einer Sperre je Dokument und aendert ein schon
abgeschaltetes Dokument nicht mehr (disabledAt als Beginn der 30-Tage-Frist,
Grund und Notiz bleiben); nur Altbestand ohne disabledAt bekommt dieses Feld.
Neu: DISABLED_REASONS und der Parameter reason (Vorgabe team, unbekannt = 400),
disableCustomerFeatures reicht ihn durch, die Kundenloeschung nutzt
kunde_geloescht. activate() leert zusaetzlich disabledReason und aboEndeMailAt
und laesst zahlungMeldung unberuehrt.
scripts/feature-setup.mjs legt portalFeatures.disabledReason, aboEndeMailAt und
zahlungMeldung idempotent an (--check meldet Luecken mit Exit 1);
schemaKeys('portalFeatures') zieht die Schluessel mit.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
39225594e5
commit
aaed273b62
9 files changed
+472
-18
No files matched your search
@@ -71,16 +71,24 @@ test('/news bleibt gleichwertig und aendert den Terminplaner nicht', async () =>
|
||||
assert.equal(after.state, 'active')
|
||||
})
|
||||
|
||||
test('Abschalten setzt disabledAt, erneutes Aktivieren leert es (R36)', async () => {
|
||||
test('Abschalten setzt disabledAt und den Grund team, erneutes Aktivieren leert beides (R36)', async () => {
|
||||
const off = await team('c1', 'termine', { projectId: 'pt1', action: 'disable' })
|
||||
assert.equal(off.status, 200)
|
||||
assert.equal(featuresOf(off, 'pt1').termine.state, 'disabled')
|
||||
const doc = await docOf('pt1', 'termine')
|
||||
assert.equal(doc.enabled, false)
|
||||
assert.ok(Math.abs(Date.parse(doc.disabledAt) - Date.now()) < 5000)
|
||||
assert.equal(doc.disabledReason, 'team', 'das WOMS schaltet mit dem Vorgabegrund ab')
|
||||
// zweiter Klick (Doppelklick im WOMS): Beginn der 30 Tage, Grund und Notiz bleiben
|
||||
const nochmal = await team('c1', 'termine', { projectId: 'pt1', action: 'disable', note: 'zweiter Klick' })
|
||||
assert.equal(nochmal.status, 200)
|
||||
const gleich = await docOf('pt1', 'termine')
|
||||
assert.deepEqual([gleich.disabledAt, gleich.disabledReason, gleich.adminNote], [doc.disabledAt, 'team', doc.adminNote])
|
||||
const on = await team('c1', 'termine', { projectId: 'pt1', action: 'activate' })
|
||||
assert.equal(featuresOf(on, 'pt1').termine.state, 'active')
|
||||
assert.equal((await docOf('pt1', 'termine')).disabledAt, null)
|
||||
const aktiv = await docOf('pt1', 'termine')
|
||||
assert.equal(aktiv.disabledAt, null)
|
||||
assert.equal(aktiv.disabledReason, null)
|
||||
})
|
||||
|
||||
test('unbekannter Schluessel -> 404, auch /kalender; nichts wird angelegt', async () => {
|
||||
@@ -170,7 +178,7 @@ test('GET /api/funktionen: Projekte tragen features.termine und News wie bisher'
|
||||
})
|
||||
|
||||
// --------------------------------------------------------- Kunde loeschen ---
|
||||
test('Kunde loeschen schaltet seine Terminplaner ab (Notiz Kunde geloescht), nur seine', async () => {
|
||||
test('Kunde loeschen schaltet seine Terminplaner ab (Notiz Kunde geloescht, Grund kunde_geloescht), nur seine', async () => {
|
||||
aw.seed('customers', { $id: 'kt1', name: 'Weg Salon', email: 'weg@example.invalid' })
|
||||
aw.seed('websiteProjects', { $id: 'ktp1', customerId: 'kt1', projectName: 'Weg Eins' })
|
||||
aw.seed('websiteProjects', { $id: 'ktp2', customerId: 'kt1', projectName: 'Weg Zwei' })
|
||||
@@ -187,10 +195,12 @@ test('Kunde loeschen schaltet seine Terminplaner ab (Notiz Kunde geloescht), nur
|
||||
assert.equal(aw.docs('customers').has('kt1'), false)
|
||||
for (const projekt of ['ktp1', 'ktp2']) {
|
||||
const doc = await sf.getFeatureDoc('kt1', projekt, 'termine')
|
||||
assert.deepEqual([doc.state, doc.enabled, doc.adminNote], ['disabled', false, 'Kunde gelöscht'], projekt)
|
||||
assert.deepEqual([doc.state, doc.enabled, doc.adminNote, doc.disabledReason], ['disabled', false, 'Kunde gelöscht', 'kunde_geloescht'], projekt)
|
||||
assert.ok(Math.abs(Date.parse(doc.disabledAt) - Date.now()) < 5000, projekt)
|
||||
}
|
||||
assert.equal((await sf.getFeatureDoc('kt1', 'ktp3', 'termine')).disabledAt, frueher, 'Beginn der 30 Tage bleibt')
|
||||
const schonAusNachher = await sf.getFeatureDoc('kt1', 'ktp3', 'termine')
|
||||
assert.equal(schonAusNachher.disabledAt, frueher, 'Beginn der 30 Tage bleibt')
|
||||
assert.equal(schonAusNachher.disabledReason, 'team', 'ein schon abgeschalteter Terminplaner behaelt seinen Grund')
|
||||
assert.equal((await sf.getFeatureDoc('kt1', 'ktp1', 'news')).state, 'active', 'News ist nicht Sache des Terminplaners')
|
||||
assert.equal((await sf.getFeatureDoc('c1', 'pt1', 'termine')).state, fremd.state, 'anderer Kunde')
|
||||
})
|
||||
|
||||
Reference in new issue
Block a user