Kundenansicht neu E-Fix F5: Fassung 6 ohne PDF behauptet keinen Anhang, das Team bekommt den Hinweis
Die PDFs der Fassung 6 entstehen erst nach der Freigabe. Bis dahin gingen K01, K12 und K13 ohne Anhang raus, sagten aber "im Anhang" bzw. "beigefügt", und das Team erfuhr es nicht (nur K38/T24 hatten dafür den Block anhang_fehlt). - Neuer Helfer vertragsAnhang.js: lädt das PDF der zugestimmten Fassung und meldet fehlt nur bei Fassung 6 ohne lesbare Datei. - K01, K12, K13: Block anhang (Anhangsaussagen) und ohne_anhang (Satz, dass die Unterlagen gesondert kommen). - T02, T12, T13: Block anhang_fehlt "Unterlagen von Hand nachsenden" (T12 auch beim späteren Wirksamwerden, T13 auch ohne Aufgabe). - Alte Fassungen unverändert: Hash-Pins auf die Wiedergabe der Vorlagen vor der Änderung, Anhang und Texte wie bisher. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9c04f806eb
commit
72b5ac5265
12 files changed
+362
-66
No files matched your search
@@ -1,9 +1,9 @@
|
||||
import { readFile } from 'node:fs/promises'
|
||||
import { config } from '../config.js'
|
||||
import { getDocument } from './appwriteAdmin.js'
|
||||
import { eventIdFor, getContractEvent, listContractEvents, recordContractEvent, updateContractEvent } from './contractEvents.js'
|
||||
import { sendAdminNotice, sendCustomerMail } from './mailer.js'
|
||||
import { contractAttachmentFor, describeItems } from './products.js'
|
||||
import { describeItems } from './products.js'
|
||||
import { anhangFehlt, ladeVertragsAnhang } from './vertragsAnhang.js'
|
||||
import { getFeatureDoc } from './siteFeatures.js'
|
||||
import {
|
||||
addMonths,
|
||||
@@ -276,23 +276,17 @@ async function previewFor(ctx, prorationDate) {
|
||||
}
|
||||
}
|
||||
|
||||
/** Vertragsunterlagen (PDF) in der zugestimmten Fassung; ohne Datei geht K12 ohne Anhang raus (Fehler im Log). */
|
||||
async function contractPdfAttachment(termsVersion) {
|
||||
const { filename, path } = contractAttachmentFor(termsVersion)
|
||||
const content = await readFile(path).catch((err) => {
|
||||
console.error(`[wechsel] Vertragsunterlagen ${filename} nicht lesbar:`, err.message)
|
||||
return null
|
||||
})
|
||||
return content ? [{ filename, content, contentType: 'application/pdf' }] : []
|
||||
}
|
||||
|
||||
/** K12 an den Kunden: Vertragsbestaetigung mit PDF. Ein Mailfehler bricht den Wechsel nicht ab. */
|
||||
/**
|
||||
* K12 an den Kunden: Vertragsbestaetigung mit PDF der zugestimmten Fassung. Ein Mailfehler bricht den Wechsel nicht ab.
|
||||
* Fehlt das PDF der Fassung 6, geht K12 ohne Anhang und ohne die Behauptung "im Anhang" raus (Block ohne_anhang, F5); die Rueckgabe
|
||||
* { anhangFehlt } sagt es dem Aufrufer fuer T12 (Block anhang_fehlt). Ohne Datei der alten Fassungen bleibt es beim bisherigen Verhalten.
|
||||
*/
|
||||
async function sendSwitchConfirmation(contact, consent, facts, blocks) {
|
||||
if (!contact.email) {
|
||||
console.error('[wechsel] K12 nicht verschickt: keine E-Mail-Adresse zum Kunden')
|
||||
return
|
||||
return { anhangFehlt: false }
|
||||
}
|
||||
const attachments = await contractPdfAttachment(consent.termsVersion)
|
||||
const { attachments, fehlt } = await ladeVertragsAnhang(consent.termsVersion, 'wechsel')
|
||||
await sendCustomerMail(contact.email, {
|
||||
template: 'K12',
|
||||
values: {
|
||||
@@ -304,9 +298,10 @@ async function sendSwitchConfirmation(contact, consent, facts, blocks) {
|
||||
bedingungen_version: consent.termsVersion,
|
||||
zustimmung_zeitpunkt: fmtDateTime(consent.consentAt),
|
||||
},
|
||||
blocks,
|
||||
blocks: { ...blocks, anhang: !fehlt, ohne_anhang: fehlt },
|
||||
attachments,
|
||||
}).catch((err) => console.error(`[wechsel] K12 an ${contact.email} fehlgeschlagen:`, err.message))
|
||||
return { anhangFehlt: fehlt }
|
||||
}
|
||||
|
||||
/** T12 ans Team (sendAdminNotice protokolliert Fehler selbst und wirft nie). */
|
||||
@@ -468,10 +463,10 @@ async function performSwitch(customerId, current, consent, prorationDate, expect
|
||||
const facts = { switchedAt, amountDueCents, monthlyCents }
|
||||
const lastschrift = sepa && effective && !paid
|
||||
// K12 sofort; zahlung_offen nur bei zurueckgehaltener Aenderung (Karte), lastschrift bei SEPA (F37); sofortverlangen nur mit Zeitstempel (kein Betrieb in Fassung 6)
|
||||
await sendSwitchConfirmation(contact, consent, facts, { zahlung_offen: pending, lastschrift, zusatzspeicher: ctx.storageUnits > 0, sofortverlangen: Boolean(consent.earlyStartConsentAt) })
|
||||
const { anhangFehlt: ohneAnhang } = await sendSwitchConfirmation(contact, consent, facts, { zahlung_offen: pending, lastschrift, zusatzspeicher: ctx.storageUnits > 0, sofortverlangen: Boolean(consent.earlyStartConsentAt) })
|
||||
// T12 erst, wenn der Wechsel wirksam ist - ohne Nachweis sofort, damit das Team ihn von Hand verfolgt
|
||||
if (effective || !event) {
|
||||
await sendSwitchNotice(contact, doc.$id, facts, { wirksam: effective, lastschrift, nachweis_fehlt: !event })
|
||||
await sendSwitchNotice(contact, doc.$id, facts, { wirksam: effective, lastschrift, nachweis_fehlt: !event, anhang_fehlt: ohneAnhang })
|
||||
}
|
||||
return { subscription, paymentUrl, event }
|
||||
}
|
||||
@@ -544,7 +539,8 @@ async function completeSwitch(eventId, contact, doneBy = 'stripe') {
|
||||
doneBy,
|
||||
details: { ...(wasEffective ? {} : { effectiveAt: now }), paidAt: now },
|
||||
})
|
||||
if (!wasEffective) await sendSwitchNotice(contact, event.subscriptionId, factsOf(event), { wirksam: true })
|
||||
// Das T12 "wirksam" kommt hier erst nach K12: fehlen die PDFs der Fassung 6 noch, sagt es auch dieses T12 dem Team (F5)
|
||||
if (!wasEffective) await sendSwitchNotice(contact, event.subscriptionId, factsOf(event), { wirksam: true, anhang_fehlt: await anhangFehlt(event.termsVersion) })
|
||||
return { completed: true, eventId }
|
||||
})
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user