Terminplaner TP2 E8: Nachbesserung 1 (offener Zahlungsfall bleibt sichtbar, R108)
setzeFunktionZurueck setzt ein Funktionsdokument mit offenem Zahlungsfall (zahlungMeldung nicht leer und nicht 'gemeldet') nicht auf off zurueck: Warnung ohne Kennungen, +1 in lauf.fehler, kein Wurf. Das Dokument bleibt disabled mit seinen Markern, der Abo-Abgleich holt T19 weiter nach, nach 'gemeldet' setzt der naechste Lauf zurueck. Buchungen und Einstellung werden wie bisher geloescht. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
30701ba277
commit
6bd6aed7d5
2 files changed
+114
-21
No files matched your search
@@ -44,7 +44,8 @@ import { gibZellenFrei, raeumeVerwaisteZellen } from './zellen.js'
|
||||
* Loeschdeckel in Folge, ab 20 Betrieben => Log und Team-Mail, meldeTagesjob in betrieb.js)
|
||||
* Abgeschaltete Funktionen: nach LOESCHFRIST_TAGE (30) Tagen Buchungen, Zellen, Einstellung loeschen
|
||||
* (Grund abo_ende: vor jedem unumkehrbaren Schritt frisch pruefen, ob das Wartungs-Abo wieder laeuft),
|
||||
* danach das Funktionsdokument auf `off` zuruecksetzen (siteKey bleibt)
|
||||
* danach das Funktionsdokument auf `off` zuruecksetzen (siteKey bleibt; mit offenem Zahlungsfall,
|
||||
* zahlungMeldung nicht leer und nicht 'gemeldet', bleibt es disabled bis zur Meldung, R108)
|
||||
*
|
||||
* Gemeinsame Regeln:
|
||||
* - Modus off: Minuten- und Fuenf-Minuten-Job kehren sofort zurueck, ohne Abfrage, mit { aus: true }. Der Tagesjob stellt eine einzige
|
||||
@@ -535,10 +536,11 @@ const ABGESCHALTET_NEU_PRUEFEN_ALLE = 50
|
||||
* kann: featureKey termine, state disabled und disabledAt vor der Grenze. Bei Grund `abo_ende` (nur dort haengt die Loeschung am Abo)
|
||||
* zusaetzlich frisch aboLage (nie der Memo): laeuft das Wartungs-Abo wieder, gilt sie nicht als abgeschaltet. Fuer `team`,
|
||||
* `kunde_geloescht`, `abo_ende_vor_einrichtung` und Altbestand ohne Grund gibt es keine Abo-Abfrage. mitAbo false: nichts
|
||||
* Unumkehrbares mehr offen (Zuruecksetzen), dann entfaellt auch die Abo-Pruefung. Sonst false mit Log, ohne Wurf – auch bei einem
|
||||
* Unumkehrbares mehr offen (Zuruecksetzen), dann entfaellt auch die Abo-Pruefung. Sonst null mit Log, ohne Wurf – auch bei einem
|
||||
* Lesefehler (Funktion oder Abo): im Zweifel wird nichts geloescht.
|
||||
* => das frisch gelesene Funktionsdokument, wenn es noch als abgeschaltet gilt, sonst null
|
||||
*/
|
||||
async function nochAbgeschaltet(lauf, funktionId, grenze, { mitAbo = true } = {}) {
|
||||
async function leseAbgeschaltet(lauf, funktionId, grenze, { mitAbo = true } = {}) {
|
||||
let frisch
|
||||
try {
|
||||
frisch = await getDocument(config.collections.portalFeatures, funktionId)
|
||||
@@ -548,23 +550,26 @@ async function nochAbgeschaltet(lauf, funktionId, grenze, { mitAbo = true } = {}
|
||||
} else {
|
||||
melde(lauf, 'Funktion vor dem Löschen nicht gelesen', err)
|
||||
}
|
||||
return false
|
||||
return null
|
||||
}
|
||||
if (!(frisch.featureKey === 'termine' && frisch.state === 'disabled' && zeitMs(frisch.disabledAt) < grenze)) {
|
||||
console.warn(`[termine-jobs] ${lauf.job}: eine Funktion ist inzwischen wieder aktiv oder neu abgeschaltet, die Löschung wird für sie abgebrochen`)
|
||||
return false
|
||||
return null
|
||||
}
|
||||
if (!mitAbo || frisch.disabledReason !== 'abo_ende') return true
|
||||
if (!mitAbo || frisch.disabledReason !== 'abo_ende') return frisch
|
||||
try {
|
||||
if (!frisch.customerId) throw new Error('Funktion ohne Kunde')
|
||||
if (!(await aboLage(frisch.customerId)).laeuft) return true
|
||||
if (!(await aboLage(frisch.customerId)).laeuft) return frisch
|
||||
console.warn(`[termine-jobs] ${lauf.job}: Abo läuft wieder, Löschung abgebrochen`)
|
||||
} catch (err) {
|
||||
melde(lauf, 'Abo vor dem Löschen nicht gelesen', err)
|
||||
}
|
||||
return false
|
||||
return null
|
||||
}
|
||||
|
||||
/** Wie leseAbgeschaltet, nur als Ja/Nein: gilt die Funktion unmittelbar vor einem unwiderruflichen Schritt noch als abgeschaltet? */
|
||||
const nochAbgeschaltet = async (lauf, funktionId, grenze, optionen) => (await leseAbgeschaltet(lauf, funktionId, grenze, optionen)) !== null
|
||||
|
||||
/**
|
||||
* Einstellung (termineConfig) einer abgeschalteten Funktion loeschen, unter der Sperre termine-cfg:<id>. Ist sie noch da, kommt vor
|
||||
* dem unumkehrbaren Loeschen die letzte Pruefung (nochAbgeschaltet, bei Grund abo_ende auch das frische Abo); ist sie schon weg (404),
|
||||
@@ -594,7 +599,11 @@ function loescheEinstellung(lauf, funktionId, grenze) {
|
||||
/**
|
||||
* Das Funktionsdokument nach der Loeschung zuruecksetzen, damit der Betrieb neu bestellen kann: unter den Sperren
|
||||
* feature-admin:<projectId> (wie Aktivieren und Abschalten im WOMS) und termine-cfg:<id> frisch lesen und nochmals pruefen
|
||||
* (nochAbgeschaltet ohne Abo: es gibt nichts Unumkehrbares mehr), dann schreiben. Hat das Team es inzwischen aktiviert, bleibt es.
|
||||
* (leseAbgeschaltet ohne Abo: es gibt nichts Unumkehrbares mehr), dann schreiben. Hat das Team es inzwischen aktiviert, bleibt es.
|
||||
* R108: steht am frisch gelesenen Dokument ein offener Zahlungsfall (zahlungMeldung nicht leer und nicht 'gemeldet'), wird NICHT
|
||||
* zurueckgesetzt (Warnung ohne Kennungen, +1 in lauf.fehler, kein Wurf): das Dokument bleibt disabled samt unlockedByPurchase, ticketId
|
||||
* und zahlungMeldung, der taegliche Abo-Abgleich (aboAbgleich, Nachholen der Erstattungsmeldung T19) bleibt zustaendig und ein
|
||||
* spaeterer Lauf setzt zurueck, sobald 'gemeldet' steht. Buchungen und Einstellung sind dann schon geloescht (bleibt so).
|
||||
* purchaseStatus 'zurueckgesetzt' ist die dauerhafte Marke "hier wurde nach dem Abo-Ende geloescht" (weder paid noch Meldezustand;
|
||||
* Block C6 loescht ein so markiertes Funktionsdokument nie, damit der siteKey besteht). siteKey sowie Bestell- und Rechnungsfelder
|
||||
* bleiben stehen bis zur naechsten Bestellung.
|
||||
@@ -602,7 +611,16 @@ function loescheEinstellung(lauf, funktionId, grenze) {
|
||||
*/
|
||||
function setzeFunktionZurueck(lauf, funktion, grenze) {
|
||||
return withLocks([`feature-admin:${funktion.projectId}`, `termine-cfg:${funktion.$id}`], async () => {
|
||||
if (!(await nochAbgeschaltet(lauf, funktion.$id, grenze, { mitAbo: false }))) return false
|
||||
const frisch = await leseAbgeschaltet(lauf, funktion.$id, grenze, { mitAbo: false })
|
||||
if (!frisch) return false
|
||||
// R108: ein offener Zahlungsfall (zahlungMeldung gesetzt, nicht 'gemeldet') bleibt sichtbar. Das Dokument bleibt disabled samt Markern
|
||||
// (unlockedByPurchase, ticketId, zahlungMeldung), damit der Abo-Abgleich die Meldung (T19) weiter nachholt; ein spaeterer Lauf setzt zurueck,
|
||||
// sobald 'gemeldet' steht. Ohne PII im Log, zaehlt in lauf.fehler (Tagesbericht), kein Wurf.
|
||||
if (frisch.zahlungMeldung && frisch.zahlungMeldung !== 'gemeldet') {
|
||||
lauf.fehler += 1
|
||||
console.warn(`[termine-jobs] ${lauf.job}: eine Funktion hat einen offenen Zahlungsfall, sie wird nicht zurückgesetzt (der Abo-Abgleich meldet ihn weiter)`)
|
||||
return false
|
||||
}
|
||||
await updateDocument(config.collections.portalFeatures, funktion.$id, {
|
||||
...stateFields('off'),
|
||||
unlockedByPurchase: false,
|
||||
@@ -628,7 +646,8 @@ function setzeFunktionZurueck(lauf, funktion, grenze) {
|
||||
* (loescheEinstellung, mit letzter Pruefung unter der Sperre termine-cfg:<id>); sind alle Buchungen weg und die Einstellung geloescht
|
||||
* oder schon nicht mehr da, setzt der Lauf das Funktionsdokument auf `off` zurueck (setzeFunktionZurueck, fuer jeden Grund, ohne
|
||||
* Abo-Pruefung). Sonst bleibt die Funktion samt altem disabledAt stehen und der naechste Tag macht weiter; scheitert nur das
|
||||
* Zuruecksetzen, holt der naechste Tag es nach (die Einstellung ist dann weg, das Abo spielt keine Rolle mehr).
|
||||
* Zuruecksetzen, holt der naechste Tag es nach (die Einstellung ist dann weg, das Abo spielt keine Rolle mehr); bei einem offenen
|
||||
* Zahlungsfall (R108) bleibt das Dokument disabled, bis zahlungMeldung 'gemeldet' ist.
|
||||
* => { geloescht, gedeckelt, einstellungWeg } (einstellungWeg: in diesem Lauf geloescht; ein reines Zuruecksetzen zaehlt nicht)
|
||||
*/
|
||||
async function loescheAbgeschalteteFunktion(lauf, funktion, grenze) {
|
||||
@@ -689,7 +708,7 @@ async function loescheAbgeschalteteFunktion(lauf, funktion, grenze) {
|
||||
/**
|
||||
* Funktionen im Zustand `disabled` seit mehr als LOESCHFRIST_TAGE (30) Tagen (disabledAt): alle Buchungen mit Zellen und zuletzt die
|
||||
* Einstellung loeschen, je Funktion seitenweise mit Deckel (loescheAbgeschalteteFunktion), danach das Funktionsdokument auf `off`
|
||||
* zuruecksetzen (es steht dann nicht mehr in der Liste dieses Jobs). Bei Grund `abo_ende` wird vor jedem unumkehrbaren Schritt frisch
|
||||
* zuruecksetzen (es steht dann nicht mehr in der Liste dieses Jobs; bei einem offenen Zahlungsfall erst nach der Meldung, R108). Bei Grund `abo_ende` wird vor jedem unumkehrbaren Schritt frisch
|
||||
* geprueft, ob das Wartungs-Abo wieder laeuft (dann bleibt alles). Endet eine Funktion am Deckel oder an einem Fehler, bleibt sie
|
||||
* `disabled` mit altem disabledAt und der naechste Tag macht weiter; die anderen Funktionen kommen im selben Lauf dran.
|
||||
* funktionen zaehlt die Funktionen, bei denen etwas geloescht wurde (Buchungen oder Einstellung; ein reines Zuruecksetzen zaehlt nicht),
|
||||
|
||||
Reference in new issue
Block a user