diff --git a/server/services/customerInvoices.js b/server/services/customerInvoices.js index d5ff638..d910594 100644 --- a/server/services/customerInvoices.js +++ b/server/services/customerInvoices.js @@ -59,7 +59,8 @@ const visibleToCustomer = (raw) => ISSUED.has(raw.status) && (raw.total ?? 0) > /** * Stripe-Rechnung in der Form des Kunden-Tabs (wie sanitizeInvoice fuer InvoiceNinja, Betraege in Euro). Offen sind * "open" und "uncollectible" (Stripe nimmt die Zahlung weiter an); ueberfaellig, wenn die Faelligkeit vor dem - * Berliner Tag today (YYYY-MM-DD) liegt. + * Berliner Tag today (YYYY-MM-DD) liegt. `projekt` ist der Projektname aus den Stripe-Metadaten (Projektrechnungen aus dem + * WOMS), sonst leer. */ export function customerStripeInvoice(raw, { today = berlinDate() } = {}) { const outstanding = raw.status === 'open' || raw.status === 'uncollectible' @@ -83,6 +84,7 @@ export function customerStripeInvoice(raw, { today = berlinDate() } = {}) { overdue, portalUrl: raw.hosted_invoice_url || '', hasPdf: Boolean(raw.invoice_pdf), + projekt: raw.metadata?.projektName || '', } } diff --git a/test/auftraegeKundenportalRechnungen.test.js b/test/auftraegeKundenportalRechnungen.test.js new file mode 100644 index 0000000..295fae1 --- /dev/null +++ b/test/auftraegeKundenportalRechnungen.test.js @@ -0,0 +1,28 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { useTestEnv } from './support/testEnv.js' + +// Reiner Test von customerStripeInvoice: config.js liest die Umgebung beim ersten Import, die Adressen werden nie angefragt. +useTestEnv({ appwriteUrl: 'http://127.0.0.1:9', stripeUrl: 'http://127.0.0.1:9' }) +const { customerStripeInvoice } = await import('../server/services/customerInvoices.js') + +const roh = (over = {}) => ({ + id: 'in_1', number: 'WEBKLAR-0009', status: 'open', effective_at: 1_791_000_000, due_date: 1_792_000_000, + total: 50000, amount_remaining: 50000, hosted_invoice_url: 'https://invoice.stripe.com/i/in_1', + invoice_pdf: 'https://pay.stripe.com/invoice/in_1/pdf', metadata: {}, ...over, +}) + +test('Rechnung der Kunden-Liste: projekt kommt aus metadata.projektName, sonst leer', () => { + assert.equal(customerStripeInvoice(roh({ metadata: { projektName: 'Website Anelia Wolf' } })).projekt, 'Website Anelia Wolf') + assert.equal(customerStripeInvoice(roh()).projekt, '') + assert.equal(customerStripeInvoice(roh({ metadata: { webklarCustomerId: 'c1', art: 'abo' } })).projekt, '') + const ohneMetadaten = roh() + delete ohneMetadaten.metadata + assert.equal(customerStripeInvoice(ohneMetadaten).projekt, '') +}) + +test('Rechnung der Kunden-Liste: die bisherigen Felder bleiben, projekt kommt dazu', () => { + assert.deepEqual(Object.keys(customerStripeInvoice(roh())).sort(), [ + 'amount', 'balance', 'cancelled', 'date', 'dueDate', 'hasPdf', 'id', 'number', 'overdue', 'paid', 'portalUrl', 'projekt', 'source', 'status', + ]) +}) diff --git a/test/customerInvoices.test.js b/test/customerInvoices.test.js index baae83e..af171dd 100644 --- a/test/customerInvoices.test.js +++ b/test/customerInvoices.test.js @@ -184,6 +184,7 @@ test('Liste: Felder einer bezahlten Abo-Rechnung (Betraege in Euro, Link zur Rec overdue: false, portalUrl: 'https://invoice.stripe.com/i/in_c1_abo', hasPdf: true, + projekt: '', }) })