diff --git a/server/services/finance/stripeFinance.js b/server/services/finance/stripeFinance.js index 7dfb3ac..f1cd819 100644 --- a/server/services/finance/stripeFinance.js +++ b/server/services/finance/stripeFinance.js @@ -5,7 +5,7 @@ import { addDays, berlinDate, daysBetween } from './dates.js' import { RECHNUNGS_ARTEN, AB_RECHNUNGS_ARTEN, sperreRechnung } from '../auftraege/konstanten.js' import { withLocks } from '../keyedLock.js' import { baueRechnung, ladeFestenKunden, buche, gibProjektRechnungFrei, setzeAbAbgerechnet, pruefeVorSenden, hatSchlussEntwurf } from '../auftraege/rechnungsbau.js' -import { createProjektRechnung, updateProjektRechnung } from '../auftraege/projektRechnungenStore.js' +import { createProjektRechnung, getProjektRechnung, updateProjektRechnung } from '../auftraege/projektRechnungenStore.js' import { getSettings } from './settings.js' /** @@ -237,7 +237,12 @@ async function bucheNummer(invoiceId, number, art) { async function bucheFinalisiert(invoiceId, number, art, auftragId) { if (!PROJEKT_ARTEN.includes(art)) return await bucheNummer(invoiceId, number, art) - if (art === 'schluss' && auftragId) await buche('AB abrechnen', () => setzeAbAbgerechnet(auftragId)) + if (art !== 'schluss') return + // Massgebend ist die AB im Projektdatensatz (nach umhaengen die neue Fassung), nicht die in den Stripe-Metadaten + await buche('AB abrechnen', async () => { + const abId = (await getProjektRechnung(invoiceId))?.auftragId || auftragId + if (abId) await setzeAbAbgerechnet(abId) + }) } /** Storniert oder geloescht: Datensatz inaktiv (Blaetter frei); bei einer Schlussrechnung geht die AB zurueck. */ diff --git a/test/auftraegeKontrolleRechnung.test.js b/test/auftraegeKontrolleRechnung.test.js index ab43521..27d5082 100644 --- a/test/auftraegeKontrolleRechnung.test.js +++ b/test/auftraegeKontrolleRechnung.test.js @@ -120,3 +120,15 @@ test('Storno: eine Anzahlung ohne Schluss-Entwurf lässt sich stornieren', async const a = await anzahlung(ab, 50, { senden: true }) assert.equal((await voidInvoice(a.id)).status, 'storniert') }) + +test('Finalisieren einer Schlussrechnung setzt die AB aus dem Projektdatensatz auf abgerechnet (nach Umhängen die neue AB)', async () => { + const ab = await legeAuftragAn() + const s = await schluss(ab) + // wie beim Senden einer neuen Fassung: neue AB versendet, alte ersetzt, Projektrechnungen umgehängt + const neu = await legeAuftragAn({ ersetztId: ab.id }, { nummer: 'AB-2026-0003', laufnummer: 3 }) + await updateAuftrag(ab.id, { status: 'ersetzt', ersetztDurchId: neu.id }) + await umhaengen(ab.id, neu.id) + await sendInvoiceNow(s.id) + assert.equal((await getAuftrag(neu.id)).status, 'abgerechnet') + assert.equal((await getAuftrag(ab.id)).status, 'ersetzt') +})