68 lines
3.0 KiB
JavaScript
68 lines
3.0 KiB
JavaScript
// Reine Helfer fuer zwei Felder der Auftragsbestaetigung: die Kundenart am Kunden und die Steuernummer in den
|
||
// Finanz-Einstellungen; kein React, kein Appwrite, unter Node testbar. Texte deutsch, sachlich.
|
||
|
||
/** Werte der Kundenart (Vertrag V2); '' = nicht festgelegt. */
|
||
export const KUNDENARTEN = ['unternehmen', 'privat']
|
||
|
||
export const KUNDENART_OPTIONEN = [
|
||
{ value: '', label: 'Nicht festgelegt' },
|
||
{ value: 'unternehmen', label: 'Unternehmen' },
|
||
{ value: 'privat', label: 'Privatperson' },
|
||
]
|
||
|
||
export const KUNDENART_HINWEIS = 'Für Auftragsbestätigungen: Privatpersonen bekommen die Widerrufsbelehrung.'
|
||
|
||
const text = (v) => (typeof v === 'string' ? v : '')
|
||
|
||
/** Beschriftung der Kundenart; alles Unbekannte heisst „Nicht festgelegt“. */
|
||
export function kundenartLabel(value) {
|
||
const treffer = KUNDENART_OPTIONEN.find((o) => o.value !== '' && o.value === value)
|
||
return treffer ? treffer.label : KUNDENART_OPTIONEN[0].label
|
||
}
|
||
|
||
/**
|
||
* Was beim Speichern der Kundendaten zusaetzlich ins Dokument soll: nur eine geaenderte, bekannte Kundenart
|
||
* (so scheitert das Speichern der uebrigen Stammdaten nie an einem noch nicht angelegten Attribut).
|
||
*/
|
||
export function kundenartAenderung(neu, gespeichert) {
|
||
const n = text(neu)
|
||
const alt = text(gespeichert)
|
||
if (n !== '' && !KUNDENARTEN.includes(n)) return {}
|
||
if (n === alt) return {}
|
||
return { kundenart: n }
|
||
}
|
||
|
||
export const STEUERNUMMER_MAX = 40
|
||
|
||
export const STEUERNUMMER_HINWEIS = 'Steht auf jeder Auftragsbestätigung. Für Rechnungen bitte zusätzlich im Stripe-Dashboard hinterlegen.'
|
||
|
||
export const STEUERNUMMER_FEHLT_HINWEIS =
|
||
'Die Steuernummer fehlt noch – sie steht dann nicht auf der Auftragsbestätigung. Eintragen unter Finanzen → Einstellungen.'
|
||
|
||
const STEUERNUMMER_ZEICHEN = /^[A-Za-z0-9/ .-]*$/
|
||
|
||
/**
|
||
* Steuernummer fuer PATCH /einstellungen. Der Client prueft wie der Server (Vertrag V4): getrimmt hoechstens 40 Zeichen aus
|
||
* ASCII-Buchstaben, Ziffern, Leerzeichen, „/“, „-“ und „.“; leer loescht den Wert. Unveraendert wird nichts gesendet.
|
||
*/
|
||
export function steuernummerAenderung(eingabe, gespeichert) {
|
||
const neu = text(eingabe).trim()
|
||
const alt = text(gespeichert).trim()
|
||
if (neu === alt) return { ok: true, payload: {} }
|
||
if (neu.length > STEUERNUMMER_MAX) return { ok: false, fehler: `Die Steuernummer darf höchstens ${STEUERNUMMER_MAX} Zeichen lang sein.` }
|
||
if (!STEUERNUMMER_ZEICHEN.test(neu)) {
|
||
return { ok: false, fehler: 'Die Steuernummer darf nur Buchstaben (ohne Umlaute), Ziffern, Leerzeichen, „/“, „-“ und „.“ enthalten.' }
|
||
}
|
||
return { ok: true, payload: { steuernummer: neu } }
|
||
}
|
||
|
||
/**
|
||
* Fehlt die Steuernummer? Nur wahr, wenn die Einstellungen da sind (Objekt) und der Wert leer ist; „noch nicht geladen“
|
||
* (undefined) und „nicht ladbar“ (null) behaupten nichts.
|
||
*/
|
||
export function steuernummerFehlt(einstellungen) {
|
||
if (!einstellungen || typeof einstellungen !== 'object' || Array.isArray(einstellungen)) return false
|
||
const wert = einstellungen.steuernummer
|
||
return typeof wert !== 'string' || wert.trim() === ''
|
||
}
|