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:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 21:38:54 +00:00
1 parent 9c04f806eb
commit 72b5ac5265
12 files changed
+362 -66

No files matched your search

+13 -11
View File
@@ -1,4 +1,3 @@
import { readFile } from 'node:fs/promises'
import { Router } from 'express'
import { config } from '../config.js'
import { getSessionCustomerId, requireSession } from '../middleware/session.js'
@@ -29,8 +28,9 @@ import { neueAnsicht } from '../services/kundenansicht/schalter.js'
import { FEHLER_BEDINGUNGEN, FEHLER_NACHWEIS, FEHLER_UNVOLLSTAENDIG, WECHSEL_GESPERRT, bestelltexteFuerClient, bestellZeile, nachweisTexte } from '../services/bestelltexte.js'
import { kundenartWirksam } from '../services/kundenart.js'
import { fassungDerAnfrage, istNeueFassung, speichereNachweisFuerRoute } from '../services/vertragsNachweis.js'
import { ladeVertragsAnhang } from '../services/vertragsAnhang.js'
import { duFehlerAntworten } from '../services/duFehler.js'
import { PRODUCT_KEYS, contractAttachmentFor, describeItems, isTermsV4OrNewer, productLabel, productView, termsDocFor } from '../services/products.js'
import { PRODUCT_KEYS, describeItems, isTermsV4OrNewer, productLabel, productView, termsDocFor } from '../services/products.js'
import {
ACTIVE_STATUSES,
cancelAtPeriodEnd,
@@ -636,14 +636,12 @@ async function customerNameOf(sub, fallback = '') {
* v4 Archiv-PDF, v5 aktuelles PDF). Versionsangabe und Anhang kommen aus derselben Quelle (termsDocFor.version): ohne gespeicherte
* Fassung beides Fassung 3. Ohne lesbare Datei geht die Mail ohne Anhang raus.
*/
async function sendContractConfirmation(subDoc, fallbackName = '') {
async function sendContractConfirmation(subDoc, fallbackName = '', unterlagen = null) {
if (!subDoc || subDoc.confirmationSentAt || !subDoc.email) return
const terms = termsDocFor(subDoc.termsVersion)
const attachment = contractAttachmentFor(terms.version)
const pdf = await readFile(attachment.path).catch((err) => {
console.error(`[abo] Vertragsunterlagen ${attachment.filename} nicht lesbar:`, err.message)
return null
})
// Fassung 6 ohne PDF: keine Behauptung "im Anhang" (Block ohne_anhang), T02 sagt es dem Team (F5); ältere Fassungen wie bisher.
// Der Aufrufer (Webhook) hat die Unterlagen für T02 schon geladen und reicht sie durch.
const { attachments, fehlt: anhangFehlt } = unterlagen ?? (await ladeVertragsAnhang(terms.version, 'abo'))
const lateStart = subDoc.startChoice === 'nach_frist'
const productKey = productKeyOf(subDoc)
await sendCustomerMail(subDoc.email, {
@@ -668,8 +666,10 @@ async function sendContractConfirmation(subDoc, fallbackName = '') {
// Fassung 6: ein Betrieb (Sofortbeginn ohne Zeitstempel) hat nichts verlangt; die Mail behauptet es nicht
sofortbeginn: !lateStart && !(istNeueFassung(subDoc.termsVersion) && !subDoc.earlyStartConsentAt),
beginn_nach_widerrufsfrist: lateStart,
anhang: !anhangFehlt,
ohne_anhang: anhangFehlt,
},
attachments: pdf ? [{ filename: attachment.filename, content: pdf, contentType: 'application/pdf' }] : [],
attachments,
})
await updateDocument(config.collections.subscriptions, subDoc.$id, {
confirmationSentAt: new Date().toISOString(),
@@ -768,6 +768,8 @@ async function handleStripeEvent(event) {
return true
}
)
// Vertragsunterlagen der zugestimmten Fassung einmal laden: T02 meldet fehlende PDFs der Fassung 6 (anhang_fehlt), K01 hängt sie an
const unterlagen = sub ? await ladeVertragsAnhang(termsDocFor(sub.termsVersion).version, 'abo') : null
await sendAdminNotice({
template: 'T02',
values: {
@@ -778,9 +780,9 @@ async function handleStripeEvent(event) {
stripe_abo_id: obj.subscription,
angebot_text: obj.metadata?.offerText || '',
},
blocks: { angebot: Boolean(obj.metadata?.offerText), angebot_fehler: offerProblem, nachweis_fehlt: proofProblem },
blocks: { angebot: Boolean(obj.metadata?.offerText), angebot_fehler: offerProblem, nachweis_fehlt: proofProblem, anhang_fehlt: unterlagen?.fehlt === true },
})
await sendContractConfirmation(sub, obj.customer_details?.name).catch((e) =>
await sendContractConfirmation(sub, obj.customer_details?.name, unterlagen).catch((e) =>
console.error('[abo] Vertragsbestaetigung fehlgeschlagen:', e.message)
)
return