Shop Review A M2: Bestellaktionen, Erstattung und Widerruf erledigt auch bei abgeschaltetem Shop
Die Routen aktion, erstatten und widerrufe/erledigt akzeptieren jetzt auch den Zustand disabled; Einstellungen, Artikel und Oeffnen bleiben gesperrt. Die Oberflaeche laesst Bestellungen und Widerrufe bei abgeschaltetem Shop bearbeitbar (ctx.abwickeln), der Hinweis nennt es. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
21805c9a93
commit
c6706f88ff
6 files changed
+42
-15
No files matched your search
@@ -565,19 +565,32 @@ test('Routen: CSV als Download mit BOM, Dateiname und Zeitraum; ungültiges Datu
|
||||
assert.equal((await send('GET', `/api/shop/bestellungen.csv?projectId=${PROJEKT}`)).status, 401)
|
||||
})
|
||||
|
||||
test('Routen: deaktivierter Shop - Lesen und CSV gehen, Schreiben 409', async () => {
|
||||
test('Routen M2: deaktivierter Shop - Lesen, CSV, Status ändern, Erstatten und „Widerruf erledigt“ gehen weiter; Einstellungen und Artikel bleiben gesperrt', async () => {
|
||||
const id = bestellung()
|
||||
aw.seed('shopWiderrufe', { $id: 'w1', shopId, customerId: KUNDE, bestellnummer: '26-A', name: 'Alt', email: 'alt@example.com', nachricht: '', eingangAt: nach(1).toISOString() })
|
||||
await updateDocument(config.collections.portalFeatures, feature.$id, sf.stateFields('disabled'))
|
||||
assert.equal((await lesen('bestellungen')).status, 200)
|
||||
assert.equal((await lesen(`bestellungen/${id}`)).status, 200)
|
||||
assert.equal((await lesen('bestellungen.csv')).status, 200)
|
||||
assert.equal((await lesen('widerrufe')).status, 200)
|
||||
for (const [pfad, body] of [[`bestellungen/${id}/aktion`, { aktion: 'abgeschlossen' }], [`bestellungen/${id}/erstatten`, {}], ['widerrufe/w1/erledigt', {}]]) {
|
||||
const res = await schreiben(pfad, body)
|
||||
|
||||
const versand = await schreiben(`bestellungen/${id}/aktion`, { aktion: 'versendet' })
|
||||
assert.equal(versand.status, 200)
|
||||
assert.equal(order(id).status, 'versendet')
|
||||
const teil = await schreiben(`bestellungen/${id}/erstatten`, { betragCent: 300 })
|
||||
assert.deepEqual([teil.status, teil.body.voll], [200, false])
|
||||
assert.equal(refunds().length, 1)
|
||||
const rest = await schreiben(`bestellungen/${id}/erstatten`, {})
|
||||
assert.deepEqual([rest.status, rest.body.voll], [200, true])
|
||||
const erledigt = await schreiben('widerrufe/w1/erledigt')
|
||||
assert.equal(erledigt.status, 200)
|
||||
assert.ok(erledigt.body.widerruf.bearbeitetAt)
|
||||
|
||||
// Alles andere, was verwaltet oder geoeffnet wird, bleibt gesperrt
|
||||
for (const [methode, pfad, body] of [['POST', 'produkte', { produkt: { name: 'X', preisCent: 100 } }], ['PUT', 'einstellungen', { einstellungen: {} }], ['POST', 'oeffnen', { offen: true }]]) {
|
||||
const res = await send(methode, `/api/shop/${pfad}`, { cookie, body: { projectId: PROJEKT, ...body } })
|
||||
assert.deepEqual([res.status, res.body.code], [409, 'nicht_eingerichtet'], pfad)
|
||||
}
|
||||
assert.equal(order(id).status, 'bezahlt')
|
||||
assert.equal(refunds().length, 0)
|
||||
})
|
||||
|
||||
test('Routen: Widerrufe - Liste (neueste zuerst, nur eigener Shop) und als erledigt markieren', async () => {
|
||||
|
||||
@@ -39,9 +39,9 @@ const widerruf = (nr, extra = {}) => ({
|
||||
/** Fake-Server: jede Anfrage geht an route(aufruf) ⇒ { status, body }; Standard 200 {}. */
|
||||
const starte = (route) => installFakeDom({ antworten: Array.from({ length: 60 }, () => route) })
|
||||
|
||||
function baueCtx({ nurLesen = false } = {}) {
|
||||
function baueCtx({ nurLesen = false, abwickeln } = {}) {
|
||||
const ctx = {
|
||||
projectId: 'p1', status: { state: 'active' }, nurLesen, meldungen: [], aktuell: () => true, request,
|
||||
projectId: 'p1', status: { state: 'active' }, nurLesen, ...(abwickeln ? { abwickeln } : {}), meldungen: [], aktuell: () => true, request,
|
||||
zeigeMeldung: (text, art) => ctx.meldungen.push({ text, art }),
|
||||
neuLaden: async () => ctx.status,
|
||||
}
|
||||
@@ -496,6 +496,14 @@ test('nurLesen: keine Aktionen, kein Erstatten, kein „erledigt“; Lesen und C
|
||||
assert.equal(posts(fx).length, 0)
|
||||
}))
|
||||
|
||||
test('abwickeln (Shop abgeschaltet): Aktionen, Erstatten und „erledigt“ bleiben, obwohl nurLesen gilt', mit(server(), async (fx) => {
|
||||
const { panel } = await oeffneDetail(fx, { nurLesen: true, abwickeln: true })
|
||||
assert.ok(aktion(fx, panel, 'versendet') || aktion(fx, panel, 'abgeschlossen') || fx.finde(panel, 'form[data-form="erstatten"]'))
|
||||
await fx.klick(fx.finde(panel, '[data-ansicht="widerrufe"]'))
|
||||
await fx.ruhe()
|
||||
assert.ok(aktion(fx, panel, 'erledigt'))
|
||||
}))
|
||||
|
||||
test('Antwort nach dem Wechsel des Reiters zeichnet nicht in das fremde Panel', mit(server(), async (fx) => {
|
||||
const ctx = baueCtx()
|
||||
const panel = h('div')
|
||||
|
||||
@@ -431,8 +431,9 @@ test('Zustand disabled: Banner der Abschaltung, ctx.nurLesen = true', mitDom(wel
|
||||
REITER[0].laden = async () => ({ render: (panel, ctx) => { gesehen.push(ctx) } })
|
||||
try {
|
||||
const root = await oeffne(fx)
|
||||
assert.equal(fx.text(fx.finde(root, '[data-hinweis="disabled"]')), 'Dein Webshop ist abgeschaltet. Du kannst Bestellungen noch ansehen und exportieren.')
|
||||
assert.equal(fx.text(fx.finde(root, '[data-hinweis="disabled"]')), 'Dein Webshop ist abgeschaltet. Du kannst Bestellungen noch ansehen, bearbeiten, erstatten und exportieren.')
|
||||
assert.equal(gesehen[0].nurLesen, true)
|
||||
assert.equal(gesehen[0].abwickeln, true, 'Bestellungen und Widerrufe lassen sich auch bei abgeschaltetem Shop abwickeln (M2)')
|
||||
assert.equal(fx.alle(root, '[role="tab"]').length, 5)
|
||||
} finally {
|
||||
REITER[0].laden = alt
|
||||
|
||||
Reference in new issue
Block a user