diff --git a/src/components/KundenartAuswahl.jsx b/src/components/KundenartAuswahl.jsx new file mode 100644 index 0000000..16e0f60 --- /dev/null +++ b/src/components/KundenartAuswahl.jsx @@ -0,0 +1,21 @@ +import { KUNDENART_AUSWAHL } from '../lib/kundenFelder' + +/** Segment-Schalter für die Kundenart (V9): zwei Werte, nie eine Vorauswahl; der Aufrufer prüft mit kundenartPruefen. */ +export default function KundenartAuswahl({ value, onChange, disabled = false }) { + return ( +
+ {KUNDENART_AUSWAHL.map((o) => ( + + ))} +
+ ) +} diff --git a/src/lib/kundenFelder.js b/src/lib/kundenFelder.js index acaca55..c503ec9 100644 --- a/src/lib/kundenFelder.js +++ b/src/lib/kundenFelder.js @@ -12,6 +12,27 @@ export const KUNDENART_OPTIONEN = [ export const KUNDENART_HINWEIS = 'Für Auftragsbestätigungen: Privatpersonen bekommen die Widerrufsbelehrung.' +/** Auswahl für neue Eingaben (V9): ohne den Leer-Eintrag, es gibt nie eine Vorauswahl. */ +export const KUNDENART_AUSWAHL = KUNDENART_OPTIONEN.filter((o) => o.value !== '') + +export const KUNDENART_FEHLT_FEHLER = 'Bitte die Kundenart wählen.' + +export const KUNDENART_AUSWAHL_HINWEIS = + 'Unternehmen bestellt als Betrieb, Privatperson als Verbraucher mit Widerrufsrecht. Das Portal fragt den Kunden nicht danach.' + +export const KUNDENART_HOCHSTUFEN_HINWEIS = + 'Bitte zuerst die Kundenart festlegen (unter „Rechnungsdaten“), dann „Zum festen Kunden machen“.' + +/** Gesetzt heisst genau 'unternehmen' oder 'privat'; Gross-/Kleinschreibung, Leerzeichen, null und Zahlen gelten nicht. */ +export function kundenartGesetzt(value) { + return typeof value === 'string' && KUNDENARTEN.includes(value) +} + +/** Pflichtpruefung fuer neue Eingaben: null = in Ordnung, sonst der Fehlertext. */ +export function kundenartPruefen(value) { + return kundenartGesetzt(value) ? null : KUNDENART_FEHLT_FEHLER +} + const text = (v) => (typeof v === 'string' ? v : '') /** Beschriftung der Kundenart; alles Unbekannte heisst „Nicht festgelegt“. */ diff --git a/src/styles/global.css b/src/styles/global.css index 53813f8..535f31b 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -411,6 +411,7 @@ a.list-row:hover .cell-title { color: var(--accent-ink); } .seg { display: inline-flex; padding: 2px; border-radius: var(--radius); background: var(--bg-hover); gap: 2px; } .seg button { height: 28px; padding: 0 12px; border-radius: 5px; color: var(--text-2); font-weight: 500; } .seg button.on, .seg button[aria-pressed="true"] { background: var(--bg); color: var(--text); box-shadow: 0 1px 2px rgba(26,31,54,.12), 0 0 0 1px rgba(26,31,54,.04); } +.field > .seg { align-self: flex-start; } .toast { position: fixed; diff --git a/tests/unit/kundenFelder.test.mjs b/tests/unit/kundenFelder.test.mjs index 2904c3f..450c61d 100644 --- a/tests/unit/kundenFelder.test.mjs +++ b/tests/unit/kundenFelder.test.mjs @@ -4,6 +4,8 @@ import { loadModule } from './load.mjs' const { KUNDENARTEN, KUNDENART_OPTIONEN, KUNDENART_HINWEIS, kundenartLabel, kundenartAenderung, + KUNDENART_AUSWAHL, KUNDENART_FEHLT_FEHLER, KUNDENART_AUSWAHL_HINWEIS, KUNDENART_HOCHSTUFEN_HINWEIS, + kundenartGesetzt, kundenartPruefen, STEUERNUMMER_MAX, STEUERNUMMER_HINWEIS, steuernummerAenderung, STEUERNUMMER_FEHLT_HINWEIS, steuernummerFehlt, } = await loadModule('src/lib/kundenFelder.js') @@ -77,3 +79,20 @@ test('steuernummerFehlt: Hinweis nur, wenn die Einstellungen da sind und die Ste // noch nicht geladen oder nicht ladbar: es wird nichts behauptet for (const unbekannt of [undefined, null, 'x', 5, []]) assert.equal(steuernummerFehlt(unbekannt), false, String(unbekannt)) }) + +test('KUNDENART_AUSWAHL: zwei Einträge ohne den Leer-Eintrag', () => { + assert.deepEqual(KUNDENART_AUSWAHL, [{ value: 'unternehmen', label: 'Unternehmen' }, { value: 'privat', label: 'Privatperson' }]) +}) + +test('kundenartGesetzt und kundenartPruefen: nur exakt unternehmen oder privat', () => { + for (const ok of ['unternehmen', 'privat']) { assert.equal(kundenartGesetzt(ok), true); assert.equal(kundenartPruefen(ok), null) } + for (const bad of ['', ' ', 'Unternehmen', 'unternehmen ', ' privat', 'firma', null, undefined, 5, {}]) { + assert.equal(kundenartGesetzt(bad), false, String(bad)) + assert.equal(kundenartPruefen(bad), 'Bitte die Kundenart wählen.', String(bad)) + } +}) + +test('Texte der Kundenart sind festgelegt', () => { + assert.equal(KUNDENART_AUSWAHL_HINWEIS, 'Unternehmen bestellt als Betrieb, Privatperson als Verbraucher mit Widerrufsrecht. Das Portal fragt den Kunden nicht danach.') + assert.equal(KUNDENART_HOCHSTUFEN_HINWEIS, 'Bitte zuerst die Kundenart festlegen (unter „Rechnungsdaten“), dann „Zum festen Kunden machen“.') +})