Finanzen: Laendersuche ohne Prototypschluessel, beim Anlegen des Stripe-Kunden keine leeren Adressfelder
- stripeCountry: Object.hasOwn statt Zugriff ueber die Prototypkette ('constructor', '__proto__' ergaben ein Objekt als Land)
- stripeCustomerFields(customer, { forCreate }): beim Anlegen (getOrCreateStripeCustomer) fehlen leere PLZ/Ort ganz;
das Loeschen per '' bleibt beim Abgleich (Aktualisieren)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f0b57ebe41
commit
c0c1a3d7a9
2 files changed
+37
-6
No files matched your search
@@ -456,7 +456,9 @@ 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
|
||||
// nur eigene Schluessel: 'constructor' oder '__proto__' duerfen nicht ueber die Prototypkette treffen
|
||||
const key = raw.toLowerCase()
|
||||
return Object.hasOwn(COUNTRY_CODES, key) ? COUNTRY_CODES[key] : null
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -464,19 +466,21 @@ function stripeCountry(value) {
|
||||
* 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.
|
||||
* Stripe-Kunden; forCreate: beim Anlegen gibt es nichts zu loeschen, leere PLZ/Ort fehlen dort ganz.
|
||||
*/
|
||||
export function stripeCustomerFields(customer) {
|
||||
export function stripeCustomerFields(customer, { forCreate = false } = {}) {
|
||||
const t = (v) => (typeof v === 'string' ? v.trim() : '')
|
||||
const country = stripeCountry(customer.country)
|
||||
const postalCode = t(customer.postalCode)
|
||||
const city = t(customer.city)
|
||||
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),
|
||||
city: t(customer.city),
|
||||
...(postalCode || !forCreate ? { postal_code: postalCode } : {}),
|
||||
...(city || !forCreate ? { city } : {}),
|
||||
...(country ? { country } : {}),
|
||||
}
|
||||
: undefined,
|
||||
@@ -495,7 +499,7 @@ export async function getOrCreateStripeCustomer(customer) {
|
||||
if (found.data[0]) return found.data[0].id
|
||||
|
||||
const created = await stripe.customers.create({
|
||||
...stripeCustomerFields(customer),
|
||||
...stripeCustomerFields(customer, { forCreate: true }),
|
||||
preferred_locales: ['de'],
|
||||
invoice_settings: { footer: config.stripe.invoiceFooter },
|
||||
metadata: { webklarCustomerId: customer.$id, kundennummer: customer.code || '' },
|
||||
|
||||
Reference in new issue
Block a user