Buchungskalender: Mail-Nummern K36, K37, T23 (K31/K32/T22 gehören den Aufträgen)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-07 15:47:29 +00:00
1 parent fd971309a8
commit 3526909d61
17 files changed
+51 -47

No files matched your search

@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<!--
K31 · Neue Buchungsanfrage (an den Vermieter)
K36 · Neue Buchungsanfrage (an den Vermieter)
Betreff: Neue Buchungsanfrage {{nummer}} für {{unterkunft}}
Absender: „WEBklar“ <Portal-Postfach>
Empfänger: Kunde (E-Mail des Kundenkontos) · OHNE BCC (enthält Angaben des Gastes)
@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<!--
K32 · Neue Buchung (an den Vermieter)
K37 · Neue Buchung (an den Vermieter)
Betreff: Neue Buchung {{nummer}} für {{unterkunft}}
Absender: „WEBklar“ <Portal-Postfach>
Empfänger: Kunde (E-Mail des Kundenkontos) · OHNE BCC (enthält Angaben des Gastes)
@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<!--
T22 · Neue Anfrage Buchungskalender
T23 · Neue Anfrage Buchungskalender
Betreff: [Buchungskalender] Neue Anfrage: {{kunde_name}}
Absender: „WEBklar Kundenportal“ <Portal-Postfach>
Empfänger: kenso@webklar.com, andrej@webklar.com
+2 -2
View File
@@ -114,7 +114,7 @@ export async function legeAnfrageAn(ctx, eingabe, { now = new Date(), ipHash = '
})
})
await sende(() => mails.anGast('G16', ctx, anfrage))
await sende(() => mails.anVermieter('K31', ctx, { anfrage }))
await sende(() => mails.anVermieter('K36', ctx, { anfrage }))
return anfrage
}
@@ -229,7 +229,7 @@ export async function bucheVerbindlich(ctx, anfrageId, token, { rechnungsadresse
})
if (r.neu) {
await sende(() => mails.anGast('G19', ctx, r.anfrage, { rechnung: r.rechnung }))
await sende(() => mails.anVermieter('K32', ctx, { anfrage: r.anfrage }))
await sende(() => mails.anVermieter('K37', ctx, { anfrage: r.anfrage }))
}
return { anfrage: r.anfrage, rechnung: r.rechnung }
}
@@ -12,7 +12,7 @@ import { ladeEinstellungen, speichereEinstellungen } from './speicher.js'
* portalFeatures-Dokuments): anfrage (JSON), anfrageStatus ('' | offen | angenommen | abgelehnt | zurueckgezogen), anfrageAt,
* anfrageEntschiedenAt, anfrageEntschiedenVon, anfrageBegruendung. Sperre je Projekt: uk-anfrage:<projectId>.
* Fehler an den Kunden tragen status (4xx) und einen deutschen Text (Du-Form), optional err.body.code und err.fehler (je Feld).
* Mails: T22 ans Team (Anfrage eingegangen), K34 an den Kunden (Entscheidung).
* Mails: T23 ans Team (Anfrage eingegangen), K34 an den Kunden (Entscheidung).
*/
export const ANFRAGE_OFFEN_TEXT = 'Deine Anfrage für den Buchungskalender ist noch nicht freigegeben.'
@@ -153,7 +153,7 @@ async function pruefeZugang({ customerId, projectId, person, neu }) {
/**
* Anfrage stellen. Reihenfolge: Projekt (403/409 archiviert), Schalter (409), Eingabe (400 mit `fehler`), dann unter Sperre je
* Projekt: Funktion muss `off` sein (409), Status '' | abgelehnt | zurueckgezogen (409 sonst). Speichert, loescht eine fruehere
* Entscheidung und schickt T22 ans Team (ein Fehler dabei wird nur geloggt).
* Entscheidung und schickt T23 ans Team (ein Fehler dabei wird nur geloggt).
* @returns {Promise<object>} anfrageAnsicht des neuen Standes
*/
export async function stelleAnfrage({ customerId, projectId, eingabe, person = {}, now = new Date() }) {
@@ -182,18 +182,18 @@ export async function stelleAnfrage({ customerId, projectId, eingabe, person = {
return anfrageAnsicht(gespeichert)
}
/** T22 "Neue Anfrage Buchungskalender" ans Team; sendAdminNotice wirft nie, ein Fehlschlag steht nur im Log. */
/** T23 "Neue Anfrage Buchungskalender" ans Team; sendAdminNotice wirft nie, ein Fehlschlag steht nur im Log. */
async function meldeTeam({ customerId, projectId, project, anfrage, person }) {
try {
let kundeName = String(person?.name || '').trim()
if (!kundeName) kundeName = String((await customerOf(customerId))?.name || '').trim()
const result = await _versand.admin({
template: 'T22',
template: 'T23',
values: {
kunde_name: kundeName || 'Kunde',
email: person?.email || '',
projekt: project?.projectName || projectId,
// die Vorlage T22 kennt nur kunde_name, email, projekt, nachricht, woms_url: die Angaben stehen zusammen in der Nachricht
// die Vorlage T23 kennt nur kunde_name, email, projekt, nachricht, woms_url: die Angaben stehen zusammen in der Nachricht
nachricht: [
`Art: ${ART_NAMEN[anfrage.art]}`,
`Einheiten: ${anfrage.einheiten}`,
@@ -203,9 +203,9 @@ async function meldeTeam({ customerId, projectId, project, anfrage, person }) {
woms_url: `${config.womsBaseUrl}/customers/${encodeURIComponent(customerId)}?tab=funktionen`,
},
})
if (!result?.sent) console.warn(`[unterkunft] Team-Mail T22 nicht gesendet: ${result?.reason || 'unbekannt'}`)
if (!result?.sent) console.warn(`[unterkunft] Team-Mail T23 nicht gesendet: ${result?.reason || 'unbekannt'}`)
} catch (err) {
console.warn(`[unterkunft] Team-Mail T22 nicht gesendet: ${err?.message}`)
console.warn(`[unterkunft] Team-Mail T23 nicht gesendet: ${err?.message}`)
}
}
+4 -4
View File
@@ -9,7 +9,7 @@ import { ladeEinstellungen, ladePreise, ladeUnterkunft } from './speicher.js'
/**
* Mails des Buchungskalenders: G16-G22 an Gaeste (ueber die Mail-Warteschlange termineOutbox, Absendername = Firma des Vermieters,
* Antworten an dessen E-Mail), K31-K34 an den Vermieter (Kunde des Portals, ohne BCC bei Gastdaten) und T22 ans Team.
* Antworten an dessen E-Mail), K33, K34, K36 und K37 an den Vermieter (Kunde des Portals, ohne BCC bei Gastdaten) und T23 ans Team.
* `_aufrufe` protokolliert jeden Aufruf fuer Tests (die Mail geht trotzdem raus). Fehler werden geworfen; der Aufrufer
* (ablauf.js) faengt sie ab, weil der gespeicherte Schritt nicht rueckgaengig gemacht wird.
*
@@ -147,8 +147,8 @@ export async function anGast(art, ctx, anfrage, extra = {}) {
const portalUrl = (ctx) => `${config.publicBaseUrl}/dashboard.html#buchungen?projekt=${encodeURIComponent(ctx?.projectId ?? '')}`
/**
* Mail an den Vermieter (K31-K34, Kunde des Portals) bzw. ans Team (T22). K31/K32: values.anfrage; die Werte lassen sich ueberschreiben,
* values.an ersetzt die Adresse (Standard ctx.besitzerEmail). T22 geht an die Team-Adressen und wirft nie.
* Mail an den Vermieter (K33, K34, K36 und K37, Kunde des Portals) bzw. ans Team (T23). K36/K37: values.anfrage; die Werte lassen sich ueberschreiben,
* values.an ersetzt die Adresse (Standard ctx.besitzerEmail). T23 geht an die Team-Adressen und wirft nie.
*/
export async function anVermieter(template, ctx, values = {}) {
if (testProtokoll()) _aufrufe.push({ an: 'vermieter', template, anfrageId: values?.anfrage?.$id })
@@ -166,7 +166,7 @@ export async function anVermieter(template, ctx, values = {}) {
}
if (!anfrage) vorgabe.kunde_name = text(ctx?.kundeName) || (await kundenName(ctx))
const alle = { portal_url: portalUrl(ctx), ...vorgabe, ...eigene }
if (template === 'T22') {
if (template === 'T23') {
const r = await sendAdminNotice({ template, values: nurPlatzhalter(template, alle) })
if (!r?.sent) console.warn(`[unterkunft] Team-Mail ${template} nicht gesendet: ${r?.reason || 'unbekannt'}`)
return r