schliesseAb ist die einzige Stelle fuer den Status bezahlt: Sperre je Bestellung, Konto muss zum Shop passen, idempotent, spaete Zahlung nach Ablauf wird angenommen, SEPA erst bei bezahlt, Bestandsabzug mit Ueberverkauft-Hinweis, G09 an den Kaeufer und K25 an den Haendler (Mailfehler machen nichts rueckgaengig). pruefeOffene und jobs.js minutenJob gleichen offene Bestellungen mit Stripe ab. fakeStripe: completeSession. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32 lines
1.1 KiB
JavaScript
32 lines
1.1 KiB
JavaScript
import { pruefeOffene } from './bestellungen.js'
|
|
import { shopModus } from './schalter.js'
|
|
|
|
/**
|
|
* Jobs des Webshops (Plan 2026-10-05-webshop.md, E2; J3 ergaenzt den Tagesjob und die Registrierung in index.js).
|
|
* Jeder Job laeuft hoechstens einmal gleichzeitig (ein Lauf, der noch haengt, ueberspringt den naechsten Takt) und wirft nie.
|
|
*/
|
|
|
|
const laufend = new Set()
|
|
|
|
async function einzeln(name, arbeit) {
|
|
if (laufend.has(name)) {
|
|
console.warn(`[shop-jobs] ${name}: der vorige Lauf ist noch nicht fertig, dieser Takt wird übersprungen`)
|
|
return { uebersprungen: true }
|
|
}
|
|
laufend.add(name)
|
|
try {
|
|
return await arbeit()
|
|
} catch (err) {
|
|
console.error(`[shop-jobs] ${name} fehlgeschlagen: ${err?.name}: ${String(err?.message).slice(0, 200)}`)
|
|
return { fehler: true }
|
|
} finally {
|
|
laufend.delete(name)
|
|
}
|
|
}
|
|
|
|
/** Minutenjob: offene Bestellungen mit verstrichener Frist bei Stripe abgleichen (bezahlt abschliessen oder verwerfen). Bei SHOP_ENABLED=off aus. */
|
|
export async function minutenJob(now = new Date()) {
|
|
if (shopModus() === 'off') return { aus: true }
|
|
return einzeln('minutenJob', () => pruefeOffene(now))
|
|
}
|