Öffnungszeiten: Einbau-Ticket und Ersatz-HTML für das Team

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-05 01:48:20 +00:00
1 parent 302b58cf72
commit 8d670ca5dc
4 files changed
+355 -7

No files matched your search

+32
View File
@@ -12,6 +12,9 @@ import {
listCustomerFeatureDocs,
listCustomerFeatures,
} from '../../services/siteFeatures.js'
import { ersatzHtml } from '../../services/zeiten/ersatz.js'
import { ladeZeiten } from '../../services/zeiten/speicher.js'
import { hauptplan, planNachKurz } from '../../services/zeiten/zeitlogik.js'
/**
* Funktionen (News-Pinnwand, Terminplaner) je Kundenprojekt im Ticketsystem (Kunden-Reiter "Funktionen").
@@ -69,6 +72,35 @@ funktionenAdminRouter.get('/:customerId', async (req, res) => {
}
})
/**
* Ersatz-HTML (statische Wochentabelle) eines Plans von Oeffnungszeiten live fuer den Einbau (Spec 4.5): { html }.
* Ohne Parameter plan gilt der Hauptplan; ist plan angegeben (auch leer), muss es diesen Kurznamen geben, sonst 404 und
* kein Rueckfall auf den Hauptplan (Ruling R9). Noch keine gespeicherten Zeiten -> 409. Nur lesend, ohne Sperre.
*/
funktionenAdminRouter.get('/:customerId/zeiten/ersatz', async (req, res) => {
try {
const { customerId } = req.params
const { projectId, plan } = req.query
if (typeof projectId !== 'string' || !projectId) return res.status(400).json({ error: 'Projekt fehlt' })
await assertOwnProject(customerId, projectId)
const doc = await getFeatureDoc(customerId, projectId, 'zeiten')
if (!doc) return res.status(404).json({ error: `Für dieses Projekt gibt es noch ${FEATURE_LABELS.zeiten.keine}` })
const daten = (await ladeZeiten(doc.$id))?.daten
const keineZeiten = () => res.status(409).json({ error: 'Der Kunde hat noch keine Zeiten eingetragen.' })
if (!Array.isArray(daten?.plaene) || daten.plaene.length === 0) return keineZeiten()
if (plan !== undefined) {
const gewaehlt = planNachKurz(daten, plan)
if (!gewaehlt) return res.status(404).json({ error: 'Plan nicht gefunden' })
return res.json({ html: ersatzHtml(daten, gewaehlt) })
}
const haupt = hauptplan(daten)
if (!haupt) return keineZeiten()
res.json({ html: ersatzHtml(daten, haupt) })
} catch (err) {
sendError(res, err)
}
})
// Aktivieren (ohne Zahlung) und Abschalten je Funktion: /news wie bisher, /termine neu; jeder andere Schluessel -> 404
funktionenAdminRouter.post('/:customerId/:key', async (req, res) => {
try {