Kundenansicht P6: Zusage-Mails K42 und K43 für Webshop- und Buchungskalender-Anfrage ohne Preis
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
bb1efa5c9e
commit
9a3ce7c8bf
10 files changed
+205
-7
No files matched your search
@@ -9,7 +9,8 @@ import { datumKurz } from './termine/zeit.js'
|
||||
* K38 Deine Funktion wird eingerichtet (Einschalten aus dem Abo oder durch das Team; nicht für Öffnungszeiten live, dort bleibt K27)
|
||||
* K39 Deine Funktion wurde beendet (der Tagesabgleich beendet sie mit dem Abo)
|
||||
* T24 Team-Hinweis: Funktion eingeschaltet (Einrichtung geht aufs Stundenkonto, Block vorschuss)
|
||||
* (K42 und K43, die Zusage-Mails der Webshop- und der Buchungskalender-Anfrage, folgen in Task 15.)
|
||||
* K42, K43 Webshop- und Buchungskalender-Anfrage entschieden (Zusage oder Absage), Ersatz fuer K24 und K34 im Abo-Modell: ohne Preis und ohne
|
||||
* das Wort "bestellen" (anfrageEntschiedenMail)
|
||||
* Die Builder sind rein (kein Zugriff auf Appwrite, kein Versand) und liefern { template, values, blocks }, so wie
|
||||
* zeiten/mails.js: die Werte decken genau die Platzhalter der Vorlage ab. Keine Preise, kein Wort „bestellen“.
|
||||
*
|
||||
@@ -110,6 +111,27 @@ export function t24Mail({ kunde, email, projekt, key, customerId, projectId, woi
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* K42 (Webshop) oder K43 (Buchungskalender): die Anfrage wurde vom Team entschieden. Im Abo-Modell ohne Preiszeile und ohne "bestellen":
|
||||
* bei Zusage kann der Kunde die Funktion im Kundenportal einschalten. Werte und Adresse wie die alten Mails K24 und K34 (sendeEntscheidung).
|
||||
* @param {{ kunde: string | { name?: string }, projekt: string, key: 'shop' | 'unterkunft', projectId: string, angenommen: boolean, begruendung?: string }} p
|
||||
* kunde_name ist der getrimmte Name, leer 'Kunde'; ein anderer key ist ein TypeError.
|
||||
*/
|
||||
export function anfrageEntschiedenMail({ kunde, projekt, key, projectId, angenommen, begruendung = '' }) {
|
||||
if (key !== 'shop' && key !== 'unterkunft') throw new TypeError(`Keine Anfrage-Mail fuer die Funktion: ${String(key)}`)
|
||||
const eintrag = funktion(key)
|
||||
return {
|
||||
template: key === 'shop' ? 'K42' : 'K43',
|
||||
values: {
|
||||
kunde_name: kundenName(kunde) || 'Kunde',
|
||||
projekt,
|
||||
begruendung,
|
||||
portal_url: `${config.publicBaseUrl}/dashboard.html#${eintrag.returnHash}?projekt=${encodeURIComponent(projectId)}`,
|
||||
},
|
||||
blocks: { angenommen: Boolean(angenommen), abgelehnt: !angenommen },
|
||||
}
|
||||
}
|
||||
|
||||
/** Tage zwischen dem Abschalten und der Löschung der Eingaben: news 30, termine 30, shop und unterkunft aus der Konfiguration; sonst TypeError. */
|
||||
export function loeschFristTage(key) {
|
||||
if (key === 'news') return 30
|
||||
|
||||
@@ -3,6 +3,8 @@ import { createDocument, getDocument, updateDocument } from '../appwriteAdmin.js
|
||||
import { withLocks } from '../keyedLock.js'
|
||||
import { sendAdminNotice, sendCustomerMail } from '../mailer.js'
|
||||
import { assertOwnProject, customerOf, ensureFeatureDoc, getFeatureDoc } from '../siteFeatures.js'
|
||||
import { aboModellFuerKunde } from '../aboFunktionen.js'
|
||||
import { anfrageEntschiedenMail } from '../aboFunktionenMails.js'
|
||||
import { shopFuerKunde } from './schalter.js'
|
||||
import { NUR_BETRIEB_TEXT } from '../kundenart.js'
|
||||
|
||||
@@ -286,7 +288,11 @@ export async function entscheideAnfrage({ customerId, projectId, entscheidung, b
|
||||
return { anfrage: anfrageAnsicht(gespeichert), mailFehler }
|
||||
}
|
||||
|
||||
/** K24 an den Kunden; true = gesendet. Jeder Fehler wird nur geloggt (die Entscheidung ist gespeichert). */
|
||||
/**
|
||||
* K24 an den Kunden; true = gesendet. Jeder Fehler wird nur geloggt (die Entscheidung ist gespeichert). Fuer Kunden der neuen Ansicht
|
||||
* (aboModellFuerKunde, Kundenansicht P6) geht stattdessen K42 ohne Preis und ohne "bestellen"; ist das nicht lesbar, geht keine Mail raus
|
||||
* (lieber keine als eine mit Preis, die Antwort traegt mailFehler).
|
||||
*/
|
||||
async function sendeEntscheidung({ customerId, projectId, project, angenommen, begruendung }) {
|
||||
try {
|
||||
const kunde = await customerOf(customerId)
|
||||
@@ -294,6 +300,10 @@ async function sendeEntscheidung({ customerId, projectId, project, angenommen, b
|
||||
console.warn(`[shop] K24 nicht gesendet: Kunde ${customerId} ohne E-Mail-Adresse`)
|
||||
return false
|
||||
}
|
||||
if (await aboModellFuerKunde(customerId)) {
|
||||
await sendCustomerMail(kunde.email, anfrageEntschiedenMail({ kunde, projekt: project?.projectName || projectId, key: 'shop', projectId, angenommen, begruendung }))
|
||||
return true
|
||||
}
|
||||
await sendCustomerMail(kunde.email, {
|
||||
template: 'K24',
|
||||
values: {
|
||||
|
||||
@@ -2,6 +2,8 @@ import { config } from '../../config.js'
|
||||
import { withLocks } from '../keyedLock.js'
|
||||
import { sendAdminNotice, sendCustomerMail } from '../mailer.js'
|
||||
import { assertOwnProject, customerOf, ensureFeatureDoc, getFeatureDoc } from '../siteFeatures.js'
|
||||
import { aboModellFuerKunde } from '../aboFunktionen.js'
|
||||
import { anfrageEntschiedenMail } from '../aboFunktionenMails.js'
|
||||
import { unterkunftFuerKunde } from './schalter.js'
|
||||
import { ladeEinstellungen, speichereEinstellungen } from './speicher.js'
|
||||
|
||||
@@ -268,7 +270,11 @@ export async function entscheideAnfrage({ customerId, projectId, entscheidung, b
|
||||
return { anfrage: anfrageAnsicht(gespeichert), mailFehler }
|
||||
}
|
||||
|
||||
/** K34 an den Kunden; true = gesendet. Jeder Fehler wird nur geloggt (die Entscheidung ist gespeichert). */
|
||||
/**
|
||||
* K34 an den Kunden; true = gesendet. Jeder Fehler wird nur geloggt (die Entscheidung ist gespeichert). Fuer Kunden der neuen Ansicht
|
||||
* (aboModellFuerKunde, Kundenansicht P6) geht stattdessen K43 ohne Preis und ohne "bestellen"; ist das nicht lesbar, geht keine Mail raus
|
||||
* (lieber keine als eine mit Preis, die Antwort traegt mailFehler).
|
||||
*/
|
||||
async function sendeEntscheidung({ customerId, projectId, project, angenommen, begruendung }) {
|
||||
try {
|
||||
const kunde = await customerOf(customerId)
|
||||
@@ -276,6 +282,10 @@ async function sendeEntscheidung({ customerId, projectId, project, angenommen, b
|
||||
console.warn(`[unterkunft] K34 nicht gesendet: Kunde ${customerId} ohne E-Mail-Adresse`)
|
||||
return false
|
||||
}
|
||||
if (await aboModellFuerKunde(customerId)) {
|
||||
await _versand.kunde(kunde.email, anfrageEntschiedenMail({ kunde, projekt: project?.projectName || projectId, key: 'unterkunft', projectId, angenommen, begruendung }))
|
||||
return true
|
||||
}
|
||||
await _versand.kunde(kunde.email, {
|
||||
template: 'K34',
|
||||
values: {
|
||||
|
||||
Reference in new issue
Block a user