Files

73 lines
3.6 KiB
JavaScript

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 ?? '<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 <head> jeder HTML-Seite):',
`<script data-wk-zeiten src="${EMBED_URL}" data-site="${siteKey}" defer></script>`,
`Einbau: ${ergebnis}`,
'',
'Platzhalter (dort, wo die Zeiten stehen sollen; innen bleibt die statische Ersatz-Tabelle):',
...PLATZHALTER_MODI.map((modus) => `<div data-webklar-zeiten data-modus="${modus}" data-plan="${beispielKurz}">Ersatz-HTML</div>`),
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 })
}