Finanzen: Nachtrag vor Livegang (Kundenabgleich beim Senden, Adress-Sperre, Land und Anschrift sauber an Stripe)

- sendInvoiceNow: Entwurf mit webklarCustomerId laedt den WOMS-Kunden und bringt den Stripe-Kunden vor dem
  Finalisieren auf die aktuellen Daten (Fehler: 502, nichts finalisiert); ohne Kennung kein Abgleich
- Adress-Sperre (§ 14 Abs. 4 Nr. 1 UStG): Senden ueber 250 € ohne Strasse/PLZ/Ort -> 409 vor jedem Stripe-Schreibzugriff
  (Anlegen mit senden=true und Entwurf senden; Text und Grenze wie im WOMS)
- stripeCustomerFields: Land aus deutschen Namen (unbekannt -> weglassen), PLZ/Ort mit Strasse immer mitsenden ('' loescht)
- Stripe-Nachbau: Kunden-Update fuehrt die Anschrift feldweise zusammen, '' loescht ein Feld

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-01 15:42:06 +00:00
1 parent 73811e0300
commit f0b57ebe41
5 files changed
+377 -26

No files matched your search

+36 -6
View File
@@ -431,23 +431,53 @@ export async function grantCreditForInvoice(invoice, { fresh = false } = {}) {
// Checkout / Kundenportal / Kuendigung
// ---------------------------------------------------------------------------
// Deutsche Laendernamen (klein geschrieben) -> ISO-Code fuer Stripe; die Liste deckt die ueblichen Faelle ab
const COUNTRY_CODES = {
deutschland: 'DE',
österreich: 'AT',
oesterreich: 'AT',
schweiz: 'CH',
niederlande: 'NL',
belgien: 'BE',
frankreich: 'FR',
italien: 'IT',
spanien: 'ES',
polen: 'PL',
dänemark: 'DK',
luxemburg: 'LU',
liechtenstein: 'LI',
}
/**
* ISO-Code fuer das Land eines WOMS-Kunden: zweistelliger Code -> gross; deutscher Name (ohne Gross-/Kleinschreibung) ->
* Code; leer -> DE; alles andere -> null (das Land bleibt dann bei Stripe unberuehrt, statt falsch auf DE zu springen).
*/
function stripeCountry(value) {
const raw = typeof value === 'string' ? value.normalize('NFC').trim() : ''
if (!raw) return 'DE'
if (/^[A-Za-z]{2}$/.test(raw)) return raw.toUpperCase()
return COUNTRY_CODES[raw.toLowerCase()] || null
}
/**
* Stripe-Kundendaten aus dem WOMS-Kunden (Appwrite-Dokument): E-Mail, Name (Firmenname vor Name) und, nur wenn eine
* Strasse eingetragen ist, die Anschrift (Land: zweistelliger Code, sonst DE). Leere Werte fehlen (undefined), damit
* Stripe sie nicht anfasst. Gemeinsam fuer das Anlegen und das Aktualisieren des Stripe-Kunden.
* Strasse eingetragen ist, die Anschrift. Mit Strasse gehen PLZ und Ort immer mit (fehlende als '': Stripe loescht dann
* einen alten Wert, statt ihn neben der neuen Strasse stehen zu lassen). Land: siehe stripeCountry (unbekannt -> fehlt).
* Leere Werte fehlen (undefined), damit Stripe sie nicht anfasst. Gemeinsam fuer das Anlegen und das Aktualisieren des
* Stripe-Kunden.
*/
export function stripeCustomerFields(customer) {
const t = (v) => (typeof v === 'string' ? v.trim() : '')
const country = t(customer.country)
const country = stripeCountry(customer.country)
return {
email: t(customer.email) || undefined,
name: t(customer.companyName) || t(customer.name) || undefined,
address: t(customer.street)
? {
line1: t(customer.street),
postal_code: t(customer.postalCode) || undefined,
city: t(customer.city) || undefined,
country: country.length === 2 ? country.toUpperCase() : 'DE',
postal_code: t(customer.postalCode),
city: t(customer.city),
...(country ? { country } : {}),
}
: undefined,
}