Öffnungszeiten: Status "Leisten live – Einbau läuft" nur bei einbau angestossen

In der Einrichtung nennt der Statustext "Leisten live – Einbau läuft" nur noch, wenn der Neubau angestossen ist.
Bei einbau manuell oder leer steht "Einbau läuft (Team setzt die Skript-Zeile von Hand)"; "wartet auf die Zeiten des Kunden" geht weiter vor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-05 09:10:45 +00:00
1 parent 3d67aa88cf
commit 919d96f7a0
2 files changed
+29 -10

No files matched your search

+6 -3
View File
@@ -4,6 +4,8 @@
import { berlinYmd, fmtYmd } from './format'
const TEXT_EINBAU = 'Leisten live – Einbau läuft'
/** einbau 'manuell' oder leer: der Neubau ist nicht angestossen, die Skript-Zeile kommt nicht von selbst auf die Seite. */
const TEXT_VON_HAND = 'Einbau läuft (Team setzt die Skript-Zeile von Hand)'
const TEXT_WARTET = 'wartet auf die Zeiten des Kunden'
/** Tage zwischen dem erkannten Abo-Ende (aboEndeAt) und dem Abschalten (Portal: zeiten/aboAbgleich.js, FRIST_TAGE). */
const FRIST_TAGE = 30
@@ -25,8 +27,9 @@ function aboEndeText(aboEndeAt) {
}
/**
* Statustext unter dem Abzeichen (Portal: project.features.zeiten): in der Einrichtung "Leisten live – Einbau läuft" bzw. bei
* hindernis 'zeiten_fehlen' "wartet auf die Zeiten des Kunden"; in Einrichtung und aktiv zusaetzlich der Abo-Ende-Hinweis mit Frist
* Statustext unter dem Abzeichen (Portal: project.features.zeiten): in der Einrichtung bei hindernis 'zeiten_fehlen' "wartet auf die
* Zeiten des Kunden" (geht vor), sonst "Leisten live – Einbau läuft" nur bei einbau 'angestossen', bei 'manuell' oder leer "Einbau
* läuft (Team setzt die Skript-Zeile von Hand)"; in Einrichtung und aktiv zusaetzlich der Abo-Ende-Hinweis mit Frist
* (feature.aboEndeAt), durch " · " getrennt. In allen anderen Zustaenden '': Grund und Loeschdatum einer Abschaltung nennt
* abgeschaltetText (funktionenView). Ohne Anrede, nie "24 Uhr".
*/
@@ -34,7 +37,7 @@ export function zeitenStatusText(feature) {
const state = feature?.state
if (state !== 'setup' && state !== 'active') return ''
const teile = []
if (state === 'setup') teile.push(feature.hindernis === 'zeiten_fehlen' ? TEXT_WARTET : TEXT_EINBAU)
if (state === 'setup') teile.push(feature.hindernis === 'zeiten_fehlen' ? TEXT_WARTET : feature.einbau === 'angestossen' ? TEXT_EINBAU : TEXT_VON_HAND)
if (feature.aboEndeAt) teile.push(aboEndeText(feature.aboEndeAt))
return teile.join(' · ')
}
+23 -7
View File
@@ -10,20 +10,33 @@ const {
} = await loadModule('src/lib/zeitenView.js')
const EINBAU = 'Leisten live – Einbau läuft'
const VON_HAND = 'Einbau läuft (Team setzt die Skript-Zeile von Hand)'
const WARTET = 'wartet auf die Zeiten des Kunden'
test('zeitenStatusText: Einrichtung ohne Hindernis – Leisten sind live, der Einbau läuft', () => {
assert.equal(zeitenStatusText({ state: 'setup', hindernis: null }), EINBAU)
assert.equal(zeitenStatusText({ state: 'setup' }), EINBAU, 'ohne Feld hindernis')
assert.equal(zeitenStatusText({ state: 'setup', hindernis: '' }), EINBAU)
test('zeitenStatusText: Einrichtung ohne Hindernis, Einbau angestossen – Leisten sind live, der Einbau läuft', () => {
assert.equal(zeitenStatusText({ state: 'setup', hindernis: null, einbau: 'angestossen' }), EINBAU)
assert.equal(zeitenStatusText({ state: 'setup', einbau: 'angestossen' }), EINBAU, 'ohne Feld hindernis')
assert.equal(zeitenStatusText({ state: 'setup', hindernis: '', einbau: 'angestossen' }), EINBAU)
})
test('zeitenStatusText: Einrichtung mit hindernis "zeiten_fehlen" – wartet auf die Zeiten des Kunden', () => {
test('zeitenStatusText: Einrichtung mit einbau manuell oder leer – nie "Leisten live", das Team setzt die Zeile von Hand', () => {
for (const einbau of ['manuell', '', null, undefined, 'irgendwas_neues']) {
assert.equal(zeitenStatusText({ state: 'setup', hindernis: null, einbau }), VON_HAND, JSON.stringify(einbau))
}
assert.equal(zeitenStatusText({ state: 'setup' }), VON_HAND, 'ohne Feld einbau')
assert.doesNotMatch(VON_HAND, /Leisten live/)
})
test('zeitenStatusText: Einrichtung mit hindernis "zeiten_fehlen" – wartet auf die Zeiten des Kunden (geht jedem Einbau-Text vor)', () => {
assert.equal(zeitenStatusText({ state: 'setup', hindernis: 'zeiten_fehlen' }), WARTET)
for (const einbau of ['angestossen', 'manuell', '', null]) {
assert.equal(zeitenStatusText({ state: 'setup', hindernis: 'zeiten_fehlen', einbau }), WARTET, JSON.stringify(einbau))
}
})
test('zeitenStatusText: unbekanntes Hindernis zeigt nichts Erfundenes, sondern den Einbau-Text', () => {
assert.equal(zeitenStatusText({ state: 'setup', hindernis: 'irgendwas_neues' }), EINBAU)
assert.equal(zeitenStatusText({ state: 'setup', hindernis: 'irgendwas_neues', einbau: 'angestossen' }), EINBAU)
assert.equal(zeitenStatusText({ state: 'setup', hindernis: 'irgendwas_neues', einbau: 'manuell' }), VON_HAND)
})
test('zeitenStatusText: Abo-Ende nennt die Frist (Berliner Tag des Abo-Endes plus 30 Tage)', () => {
@@ -42,7 +55,8 @@ test('zeitenStatusText: Abo-Ende nennt die Frist (Berliner Tag des Abo-Endes plu
test('zeitenStatusText: Abo-Ende in der Einrichtung steht zusätzlich zum Einbau- bzw. Warte-Text', () => {
const aboEndeAt = '2026-10-04T10:00:00.000Z'
const frist = 'Abo beendet – Abschaltung am 03.11.2026, falls der Kunde die Funktion nicht behält'
assert.equal(zeitenStatusText({ state: 'setup', hindernis: null, aboEndeAt }), `${EINBAU} · ${frist}`)
assert.equal(zeitenStatusText({ state: 'setup', hindernis: null, einbau: 'angestossen', aboEndeAt }), `${EINBAU} · ${frist}`)
assert.equal(zeitenStatusText({ state: 'setup', hindernis: null, einbau: 'manuell', aboEndeAt }), `${VON_HAND} · ${frist}`)
assert.equal(zeitenStatusText({ state: 'setup', hindernis: 'zeiten_fehlen', aboEndeAt }), `${WARTET} · ${frist}`)
})
@@ -66,6 +80,8 @@ test('zeitenStatusText: aktiv ohne Abo-Ende, aus, bestellt, abgeschaltet, ohne A
test('zeitenStatusText: kein Text nennt "24 Uhr"', () => {
for (const feature of [
{ state: 'setup' },
{ state: 'setup', einbau: 'angestossen' },
{ state: 'setup', einbau: 'manuell' },
{ state: 'setup', hindernis: 'zeiten_fehlen' },
{ state: 'active', aboEndeAt: '2026-10-04T10:00:00.000Z' },
{ state: 'setup', hindernis: 'zeiten_fehlen', aboEndeAt: '2026-10-04T22:30:00.000Z' },