From 919d96f7a0da37a7555381aac4600e2e0bb98dd4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Oct 2026 09:10:45 +0000 Subject: [PATCH] =?UTF-8?q?=C3=96ffnungszeiten:=20Status=20"Leisten=20live?= =?UTF-8?q?=20=E2=80=93=20Einbau=20l=C3=A4uft"=20nur=20bei=20einbau=20ange?= =?UTF-8?q?stossen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/lib/zeitenView.js | 9 ++++++--- tests/unit/zeitenView.test.mjs | 30 +++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/lib/zeitenView.js b/src/lib/zeitenView.js index 11ef908..24feb95 100644 --- a/src/lib/zeitenView.js +++ b/src/lib/zeitenView.js @@ -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(' · ') } diff --git a/tests/unit/zeitenView.test.mjs b/tests/unit/zeitenView.test.mjs index e8ca4e9..25dcb10 100644 --- a/tests/unit/zeitenView.test.mjs +++ b/tests/unit/zeitenView.test.mjs @@ -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' },