Kontrolle: Schlussrechnung setzt die AB aus dem Projektdatensatz auf abgerechnet
Nach dem Umhaengen gilt die neue AB, nicht die aus den Stripe-Metadaten. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1bb172ad91
commit
4177b76d82
2 files changed
+19
-2
No files matched your search
@@ -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. */
|
||||
|
||||
@@ -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')
|
||||
})
|
||||
Reference in new issue
Block a user