import { TICKET_DETAILS_MAX, anleitungsLink, kuerze, minimaleTicketDetails } from '../featureRegistry.js' import { ART_NAMEN, PORTAL_NAMEN } from './anfrageFunktion.js' import { ladeEinstellungen } from './speicher.js' /** * Details des Einrichtungs-Tickets fuer den Buchungskalender (config.features.unterkunft.ticket.details, Spezifikation Abschnitt 9). * ctx = { feature, doc, project, customer } wie ihn markPaid uebergibt (doc = portalFeatures-Dokument). Deterministischer Text: * Kopfzeilen, Kurzfassung der Anfrage (best effort aus ukEinstellungen; Lesefehler => ohne), Snippet und Schritte. Wirft nie. */ /** Kurzfassung der Anfrage als Zeile, oder ''. */ async function anfrageZeile(doc) { try { const a = (await ladeEinstellungen(doc.$id))?.anfrage if (a === null || typeof a !== 'object' || Array.isArray(a)) return '' const teile = [] if (Object.hasOwn(ART_NAMEN, a.art)) teile.push(`Art: ${ART_NAMEN[a.art]}`) if (Number.isInteger(a.einheiten)) teile.push(`Einheiten: ${a.einheiten}`) const portale = (Array.isArray(a.portale) ? a.portale : []).filter((p) => Object.hasOwn(PORTAL_NAMEN, p)).map((p) => PORTAL_NAMEN[p]) teile.push(`Portale: ${portale.length ? portale.join(', ') : 'keine'}`) return `Anfrage: ${teile.join(', ')}` } catch { return '' } } export async function unterkunftTicketDetails(ctx) { try { const { doc } = ctx const siteKey = doc?.siteKey || '' const kopf = minimaleTicketDetails({ ...ctx, feature: { key: 'Buchungskalender' } }).split('\n').filter((zeile) => !zeile.startsWith('Verweis: ')) const anfrage = doc?.$id ? await anfrageZeile(doc) : '' const zeilen = [ ...kopf, ...(anfrage ? [anfrage] : []), '', 'Snippet (an der Stelle des Kalender-Bereichs einsetzen):', `
`, '', '', 'Schritte:', '1. Seite oder Bereich für den Kalender anlegen und Menüpunkt setzen, Snippet einsetzen.', '2. CSS-Variablen (--wku-akzent, --wku-akzent-text, --wku-hintergrund, --wku-text, --wku-rand, --wku-radius, --wku-schrift, --wku-schrift-titel) an die Seite anpassen.', '3. Datenschutz-Absatz Buchungskalender in die Datenschutzerklärung einfügen.', '4. Impressum prüfen.', '5. Testanfrage über den Kalender stellen und im Portal (Buchungen) prüfen.', '6. Ticket schließen: das schaltet die Funktion frei (sobald der Kunde Unterkunft, Preise, Stornobedingungen und Firmendaten hinterlegt hat).', '', // Abo-Modell (einrichtungAbrechnung abo oder projekt): die Abrechnung steht allein in der Schlusszeile des Tickets (createFeatureTicket) ...(doc?.einrichtungAbrechnung === 'abo' || doc?.einrichtungAbrechnung === 'projekt' ? [] : ['Zeit im Arbeitsblatt erfassen, nicht auf Abo-Stunden anrechnen.']), 'Einbauanleitung: docs/funktionen/unterkunft-einbau.md', `Verweis: ${anleitungsLink(doc?.customerId, doc?.projectId)}`, ] return kuerze(zeilen.join('\n').toWellFormed(), TICKET_DETAILS_MAX, { anZeile: true }) } catch (err) { console.error(`[unterkunft-ticket] Details nicht erzeugbar, Notfall-Details: ${err?.message}`) try { return kuerze(minimaleTicketDetails({ ...ctx, feature: { key: 'Buchungskalender' } }).toWellFormed(), TICKET_DETAILS_MAX) } catch { return 'Funktion: Buchungskalender\nDetails konnten nicht erzeugt werden, im WOMS öffnen (Kunden → Funktionen).' } } }