73 lines
3.6 KiB
JavaScript
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 })
|
|
}
|