From f67192db521a03dd9db3af2ac283155cfff69965 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 6 Oct 2026 06:19:55 +0000 Subject: [PATCH] =?UTF-8?q?Funktionen:=20K16-Warnung=20nennt=20bei=20den?= =?UTF-8?q?=20=C3=96ffnungszeiten=20keinen=20AVV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Warnung "K16 ging nicht raus" sprach von Leistungsbeschreibung und AVV. Öffnungszeiten live hat keinen AVV und schickt keine Anhänge mit, die Warnung behauptet es dort jetzt nicht mehr: speicherStatus(antwort, key) liefert für zeiten den Text K16_WARNUNG_OHNE_UNTERLAGEN, für alle anderen Funktionen unverändert K16_WARNUNG. Test für beide Wege. Co-Authored-By: Claude Opus 5.5 --- src/components/customer/CustomerFunktionen.jsx | 2 +- src/lib/funktionenView.js | 16 ++++++++++++++-- tests/unit/funktionenView.test.mjs | 18 ++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/components/customer/CustomerFunktionen.jsx b/src/components/customer/CustomerFunktionen.jsx index 5387244..4fa8e44 100644 --- a/src/components/customer/CustomerFunktionen.jsx +++ b/src/components/customer/CustomerFunktionen.jsx @@ -278,7 +278,7 @@ export default function CustomerFunktionen({ customerId }) { setNote('') setTextform(LEERE_TEXTFORM) // Abschalten der Zeiten: das Portal meldet, ob das Ticket "Ersatz-Tabelle aktualisieren" angelegt wurde (bei 'fehler' warnen) - setStatus(key === 'zeiten' && action === 'disable' ? abschaltMeldung(antwort?.ersatzTicket) : speicherStatus(antwort)) + setStatus(key === 'zeiten' && action === 'disable' ? abschaltMeldung(antwort?.ersatzTicket) : speicherStatus(antwort, key)) } catch (err) { setConfirm(null) setStatus({ ok: false, text: err.message }) diff --git a/src/lib/funktionenView.js b/src/lib/funktionenView.js index cd7d006..2a6c58f 100644 --- a/src/lib/funktionenView.js +++ b/src/lib/funktionenView.js @@ -275,8 +275,20 @@ export function featureBody({ projectId, action, note, textformDate, textformCha /** K16 (Unterlagen an den Kunden) ging beim Aktivieren nicht raus: Antwort mit warnung: true (Portal, funktionenAdmin). */ export const K16_WARNUNG = 'Eingeschaltet, aber die E-Mail mit den Unterlagen (K16) ging nicht raus. Bitte die Leistungsbeschreibung und den AVV von Hand an den Kunden senden.' -/** Statuszeile nach dem Speichern einer Aktion: Warnung statt "Gespeichert.", wenn die Antwort warnung: true traegt. */ -export const speicherStatus = (antwort) => (antwort?.warnung === true ? { ok: false, text: K16_WARNUNG } : { ok: true, text: 'Gespeichert.' }) +/** Dieselbe Warnung fuer Funktionen ohne AVV und ohne Anhaenge (Oeffnungszeiten live): sie behauptet weder Unterlagen noch einen AVV. */ +export const K16_WARNUNG_OHNE_UNTERLAGEN = 'Eingeschaltet, aber die E-Mail „bereit“ (K16) ging nicht raus. Bitte den Kunden von Hand informieren.' + +/** Funktionen, deren K16 keine Unterlagen und keinen AVV mitschickt (Portal: features[key].avv null, keine Anhaenge). */ +const K16_OHNE_UNTERLAGEN = ['zeiten'] + +/** + * Statuszeile nach dem Speichern einer Aktion: Warnung statt "Gespeichert.", wenn die Antwort warnung: true traegt. Der Wortlaut der + * Warnung folgt der Funktion (key): Terminplaner und Webshop nennen Leistungsbeschreibung und AVV, Oeffnungszeiten live keinen AVV. + */ +export const speicherStatus = (antwort, key) => + antwort?.warnung === true + ? { ok: false, text: K16_OHNE_UNTERLAGEN.includes(key) ? K16_WARNUNG_OHNE_UNTERLAGEN : K16_WARNUNG } + : { ok: true, text: 'Gespeichert.' } // --- Webshop: Anfrage des Kunden und Stand des Shops (Portal: GET /shop/:customerId) --- diff --git a/tests/unit/funktionenView.test.mjs b/tests/unit/funktionenView.test.mjs index fa9a4a2..7916522 100644 --- a/tests/unit/funktionenView.test.mjs +++ b/tests/unit/funktionenView.test.mjs @@ -28,6 +28,7 @@ const { featureBody, speicherStatus, K16_WARNUNG, + K16_WARNUNG_OHNE_UNTERLAGEN, warenartLabel, artikelzahlLabel, anfrageStatus, @@ -622,6 +623,23 @@ test('speicherStatus: warnung true (K16 nicht gesendet) wird zur Warnung, sonst assert.match(K16_WARNUNG, /von Hand/) assert.deepEqual(speicherStatus({ projects: [] }), { ok: true, text: 'Gespeichert.' }) assert.deepEqual(speicherStatus(undefined), { ok: true, text: 'Gespeichert.' }) + // Terminplaner und Webshop: der Wortlaut nennt Unterlagen und AVV (mit und ohne Schluessel gleich) + for (const key of [undefined, 'news', 'termine', 'shop']) { + assert.deepEqual(speicherStatus({ warnung: true }, key), { ok: false, text: K16_WARNUNG }, String(key)) + } + assert.match(K16_WARNUNG, /AVV/) +}) + +test('speicherStatus: Öffnungszeiten live haben keinen AVV, die Warnung behauptet keinen', () => { + const antwort = speicherStatus({ projects: [], warnung: true }, 'zeiten') + assert.deepEqual(antwort, { ok: false, text: K16_WARNUNG_OHNE_UNTERLAGEN }) + assert.match(antwort.text, /K16/) + assert.match(antwort.text, /von Hand/) + assert.doesNotMatch(antwort.text, /AVV|Auftragsverarbeitung|Unterlagen/) + assert.notEqual(antwort.text, K16_WARNUNG) + // ohne Warnung bleibt es bei "Gespeichert." (auch bei zeiten) + assert.deepEqual(speicherStatus({ projects: [] }, 'zeiten'), { ok: true, text: 'Gespeichert.' }) + assert.deepEqual(speicherStatus(undefined, 'zeiten'), { ok: true, text: 'Gespeichert.' }) }) test('aktionen: Webshop verhält sich wie der Terminplaner (ticketbasiert)', () => {