import { kuerze, minimaleTicketDetails, TICKET_DETAILS_MAX, TICKET_GEKUERZT } from '../featureRegistry.js' import { ladeZeiten } from './speicher.js' /** * Details des Einbau-Tickets von Oeffnungszeiten live (Spec 4.6, config.features.zeiten.ticket.details). * Kopfzeilen und Verweis auf das Kundenpanel im WOMS (Notfall-Details des Registers), darunter die Einbau-Zeile mit * siteKey, das Ergebnis des Neubau-Anstosses (doc.einbau), Beispiele der Platzhalter mit den Kurznamen der Plaene, * der Hinweis auf das Ersatz-HTML und die Pruefliste. ctx = { feature, doc, project, customer }. * Wirft nie wegen der gespeicherten Zeiten: ohne Dokument-ID, ohne Zeiten oder bei einem Lesefehler heisst es * "Plaene folgen". Der Text bleibt hoechstens TICKET_DETAILS_MAX Zeichen lang. */ const EMBED_URL = 'https://project.webklar.com/embed/zeiten.js' const PLATZHALTER_MODI = Object.freeze(['tabelle', 'status', 'badge']) const EINBAU_ERGEBNIS = Object.freeze({ angestossen: 'automatisch eingesetzt (nach dem nächsten Veröffentlichen prüfen)', manuell: 'bitte von Hand einsetzen', }) const PRUEFLISTE = Object.freeze([ 'Feste Zeiten im Repo suchen und ersetzen (grep -ril "öffnungszeit" u. Ä.), auch Footer, Kontaktseite und eigene Status-Skripte.', 'Header: Überlappt die Hinweis-Leiste den Kopf der Seite? Sonst im WOMS den navSelektor setzen.', 'Hat die Seite schon eine eigene Anruf-Leiste? Dann nicht doppelt.', 'Vorhandenes JSON-LD (Öffnungszeiten der Seite) prüfen, damit nichts doppelt oder widersprüchlich steht.', 'Datenschutz-Absatz zu Öffnungszeiten live auf der Website ergänzt?', ]) /** Kurznamen der gespeicherten Plaene, Hauptplan zuerst: [{ kurz, haupt }]; leer ohne Zeiten oder bei jedem Fehler. */ async function planKurznamen(doc) { if (typeof doc?.$id !== 'string' || doc.$id === '') return [] try { const gespeichert = await ladeZeiten(doc.$id) const plaene = Array.isArray(gespeichert?.daten?.plaene) ? gespeichert.daten.plaene : [] const liste = plaene .filter((p) => p && typeof p.kurz === 'string' && p.kurz !== '') .map((p) => ({ kurz: p.kurz, haupt: p.haupt === true })) return [...liste.filter((p) => p.haupt), ...liste.filter((p) => !p.haupt)] } catch (err) { console.warn(`[zeiten] Pläne für das Ticket von ${doc.$id} nicht lesbar: ${err?.message}`) return [] } } export async function zeitenTicketDetails(ctx) { const doc = ctx?.doc || {} const siteKey = typeof doc.siteKey === 'string' ? doc.siteKey : '' const plaene = await planKurznamen(doc) const beispielKurz = plaene[0]?.kurz ?? '' // einbau fehlt oder ist unbekannt: nichts wurde automatisch eingesetzt const ergebnis = EINBAU_ERGEBNIS[doc.einbau] ?? EINBAU_ERGEBNIS.manuell const text = [ minimaleTicketDetails(ctx), '', 'Einbau-Zeile (im jeder HTML-Seite):', ``, `Einbau: ${ergebnis}`, '', 'Platzhalter (dort, wo die Zeiten stehen sollen; innen bleibt die statische Ersatz-Tabelle):', ...PLATZHALTER_MODI.map((modus) => `
Ersatz-HTML
`), plaene.length > 0 ? `Pläne (Kurznamen für data-plan): ${plaene.map((p) => (p.haupt ? `${p.kurz} (Hauptplan)` : p.kurz)).join(', ')}` : 'Pläne folgen, sobald der Kunde gespeichert hat', 'Ersatz-HTML: WOMS → Funktionen → Ersatz-HTML kopieren (erst nach dem ersten Speichern des Kunden)', '', 'Prüfliste:', ...PRUEFLISTE.map((punkt) => `- ${punkt}`), ].join('\n') return kuerze(text, TICKET_DETAILS_MAX, { anZeile: true, endzeile: TICKET_GEKUERZT }) }