Finanzen: Stripe-Kunde vor der Rechnung auf die aktuellen Kundendaten bringen

Ein wiederverwendeter Stripe-Kunde (ueber das Abo oder die Metadaten gefunden) trug
noch die alte E-Mail und Anschrift, die Stripe auf die Rechnung schreibt
(Empfaengeranschrift, § 14 Abs. 4 Nr. 1 UStG). createProjectInvoice aktualisiert ihn
jetzt nach getOrCreateStripeCustomer und vor dem ersten Rechnungsaufruf mit E-Mail,
Name (Firma vor Name) und Anschrift (Land DE, wenn keine zweistellige Angabe).
Scheitert das, entsteht keine Rechnung: 502 "Kundendaten konnten nicht an Stripe
uebertragen werden." ohne invoiceId. Die Felder baut stripeCustomerFields fuer das
Anlegen und das Aktualisieren gemeinsam. Der Stripe-Nachbau kennt POST /v1/customers/:id.

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 5ed4fbd188
commit 73811e0300
4 files changed
+142 -12

No files matched your search

+23 -10
View File
@@ -431,6 +431,28 @@ export async function grantCreditForInvoice(invoice, { fresh = false } = {}) {
// Checkout / Kundenportal / Kuendigung
// ---------------------------------------------------------------------------
/**
* 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.
*/
export function stripeCustomerFields(customer) {
const t = (v) => (typeof v === 'string' ? v.trim() : '')
const country = t(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',
}
: undefined,
}
}
export async function getOrCreateStripeCustomer(customer) {
const stripe = getStripe()
const subs = await listSubscriptionsForCustomer(customer.$id)
@@ -443,17 +465,8 @@ export async function getOrCreateStripeCustomer(customer) {
if (found.data[0]) return found.data[0].id
const created = await stripe.customers.create({
email: customer.email || undefined,
name: customer.companyName || customer.name || undefined,
...stripeCustomerFields(customer),
preferred_locales: ['de'],
address: customer.street
? {
line1: customer.street,
postal_code: customer.postalCode || undefined,
city: customer.city || undefined,
country: customer.country && customer.country.length === 2 ? customer.country : 'DE',
}
: undefined,
invoice_settings: { footer: config.stripe.invoiceFooter },
metadata: { webklarCustomerId: customer.$id, kundennummer: customer.code || '' },
})