Kundenansicht P6: Abo-Ende-Abgleich für News, Terminplaner, Webshop und Buchungskalender
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
de8b0c0fca
commit
92ac61dffd
3 files changed
+374
-1
No files matched your search
@@ -1,6 +1,8 @@
|
||||
import { updateDocument } from './appwriteAdmin.js'
|
||||
import { config } from '../config.js'
|
||||
import { aboProdukt } from './aboFunktionen.js'
|
||||
import { unterlagenFuer } from './aboUnterlagen.js'
|
||||
import { k38Mail, kontostandText, t24Mail } from './aboFunktionenMails.js'
|
||||
import { k38Mail, k39Mail, kontostandText, loeschFristTage, t24Mail } from './aboFunktionenMails.js'
|
||||
import { featureConfig } from './featureRegistry.js'
|
||||
import { getLedger } from './hourLedger.js'
|
||||
import { featureLegalAttachments } from './legalDocs.js'
|
||||
@@ -13,6 +15,7 @@ import { customerOf, projectName } from './siteFeatures.js'
|
||||
* nicht fuer zeiten, dort sendet holeZeitenNach die K27. Mit den Vertragsunterlagen als PDF (ohne Widerrufsbelehrung), wenn
|
||||
* die Funktion welche hat und sie lesbar sind.
|
||||
* T24 ans Team, nur wenn der Kunde selbst eingeschaltet hat (by 'kunde'), fuer alle fuenf Funktionen.
|
||||
* K39 an den Kunden, wenn der Tagesabgleich (aboFunktionenAbgleich.js) eine Funktion mit dem Abo beendet hat (meldeBeendet).
|
||||
* meldeEingeschaltet wirft nie: jeder Schritt steht in einem eigenen try, ein Fehler ist eine Logzeile mit Art und Status (weder
|
||||
* Name noch Adresse des Kunden) und der Rest laeuft weiter. Aufrufer ist einschalten() (funktionEinschalten.js).
|
||||
*/
|
||||
@@ -106,3 +109,44 @@ export async function meldeEingeschaltet({ doc, ticketWoid = null, by, abrechnun
|
||||
}
|
||||
return ergebnis
|
||||
}
|
||||
|
||||
const TAG_MS = 24 * 60 * 60 * 1000
|
||||
|
||||
/**
|
||||
* K39 (Deine Funktion wurde beendet) an den Kunden, danach der Marker aboEndeMailAt (erst nach erfolgreichem Versand): die Funktion
|
||||
* wurde mit dem Abo beendet (disabled, Grund abo_ende). loeschdatum ist disabledAt plus die Loeschfrist der Funktion (loeschFristTage;
|
||||
* disabledAt aendert dieser Pfad nie, eine Wiederholung nach einem Mailfehler nennt dasselbe Datum). Kunde nicht mehr vorhanden oder ohne
|
||||
* Adresse: nichts zu senden, der Marker wird gesetzt, damit es keine Wiederholung gibt. Ein Dokument, das nicht abo_ende-abgeschaltet
|
||||
* ist oder den Marker schon traegt, ist erledigt (true, nichts geschrieben). Wirft nie; das Log nennt weder Namen noch Adressen.
|
||||
* @param {object} doc portalFeatures-Dokument (frisch gelesen, disabled)
|
||||
* @param {{ art: string, now?: Date, onGesendet?: (() => void) | null }} options art 'hosting' (das Abo ist ein Hosting-Abo), sonst Abo beendet;
|
||||
* onGesendet wird nach dem versendeten K39 gerufen (Zaehler des Abgleichs)
|
||||
* @returns {Promise<boolean>} true = nichts mehr offen (gesendet, nichts zu senden oder Marker gesetzt), false = Versand oder Marker gescheitert
|
||||
* (Marker leer: der naechste Lauf wiederholt)
|
||||
*/
|
||||
export async function meldeBeendet(doc, { art, now = new Date(), onGesendet = null } = {}) {
|
||||
let gesendet = false
|
||||
try {
|
||||
if (doc?.state !== 'disabled' || doc.disabledReason !== 'abo_ende' || doc.aboEndeMailAt) return true
|
||||
const zeitpunkt = now instanceof Date ? now : new Date(now)
|
||||
const setzeMarker = () => updateDocument(config.collections.portalFeatures, doc.$id, { aboEndeMailAt: zeitpunkt.toISOString() })
|
||||
const customer = await customerOf(doc.customerId)
|
||||
const to = String(customer?.email ?? '').trim()
|
||||
if (!to) {
|
||||
console.warn(`[funktionen-mail] K39 (${doc.featureKey}) entfällt: Kunde nicht mehr vorhanden oder ohne E-Mail-Adresse, Marker wird gesetzt`)
|
||||
await setzeMarker()
|
||||
return true
|
||||
}
|
||||
const projekt = (await projectName(doc.projectId)) || 'Dein Projekt'
|
||||
const beginn = Number.isFinite(Date.parse(doc.disabledAt)) ? Date.parse(doc.disabledAt) : zeitpunkt.getTime() // disabledAt fehlt nie, ausser bei Altdaten
|
||||
const loeschdatum = new Date(beginn + loeschFristTage(doc.featureKey) * TAG_MS)
|
||||
await sendCustomerMail(to, k39Mail({ kunde: customer, projekt, key: doc.featureKey, loeschdatum, art }))
|
||||
gesendet = true
|
||||
onGesendet?.()
|
||||
await setzeMarker()
|
||||
return true
|
||||
} catch (err) {
|
||||
console.error(`[funktionen-mail] K39 (${doc?.featureKey}) ${gesendet ? 'Marker nicht gesetzt' : 'nicht gesendet'}, der nächste Lauf wiederholt: ${fehlerArt(err)}`)
|
||||
return false
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user