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:
1 parent
5ed4fbd188
commit
73811e0300
4 files changed
+142
-12
No files matched your search
@@ -27,6 +27,8 @@ import http from 'node:http'
|
||||
* DELETE /v1/invoices/:id (nur draft); jeder andere Zustand ist wie bei Stripe ein 400. Der Kunde einer neuen
|
||||
* Rechnung muss nicht in st.customers stehen (dann bleiben Name und E-Mail leer). Traegt ein Aufruf die Kopfzeile
|
||||
* Idempotency-Key, steht sie als idempotencyKey in calls; delayNext verzoegert eine Antwort (Zeitgrenzen testen).
|
||||
* Kunden: GET /v1/customers/search (Metadaten), POST /v1/customers (anlegen) und POST /v1/customers/:id (aendern:
|
||||
* email, name, address, metadata; unbekannte ID -> 404).
|
||||
*/
|
||||
|
||||
// Parameter, die Stripe bei ausstehenden Aktualisierungen annimmt (docs.stripe.com/billing/subscriptions/
|
||||
@@ -518,6 +520,23 @@ export async function startFakeStripe() {
|
||||
customers.set(obj.id, obj)
|
||||
return [200, obj]
|
||||
}
|
||||
// Kunde aendern (stripe.customers.update): email, name, address (ersetzt) und metadata (zusammengefuehrt) werden uebernommen
|
||||
if (method === 'POST' && (m = path.match(/^\/v1\/customers\/([^/]+)$/))) {
|
||||
const customer = customers.get(m[1])
|
||||
if (!customer) return noSuch('customer', m[1])
|
||||
const data = unflatten(body)
|
||||
const metadata = data.metadata ? mergeMetadata(customer.metadata, data.metadata) : customer.metadata
|
||||
if (Array.isArray(metadata)) return metadata
|
||||
const updated = {
|
||||
...customer,
|
||||
...(data.email !== undefined ? { email: data.email || null } : {}),
|
||||
...(data.name !== undefined ? { name: data.name || null } : {}),
|
||||
...(data.address !== undefined ? { address: data.address } : {}),
|
||||
metadata,
|
||||
}
|
||||
customers.set(customer.id, updated)
|
||||
return [200, updated]
|
||||
}
|
||||
if (method === 'POST' && path === '/v1/checkout/sessions') {
|
||||
const data = unflatten(body)
|
||||
const id = nextId('cs')
|
||||
|
||||
Reference in new issue
Block a user