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:
1 parent
73811e0300
commit
f0b57ebe41
5 files changed
+377
-26
No files matched your search
@@ -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,
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user