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 { RECHNUNGS_ARTEN, AB_RECHNUNGS_ARTEN, sperreRechnung } from '../auftraege/konstanten.js'
|
||||||
import { withLocks } from '../keyedLock.js'
|
import { withLocks } from '../keyedLock.js'
|
||||||
import { baueRechnung, ladeFestenKunden, buche, gibProjektRechnungFrei, setzeAbAbgerechnet, pruefeVorSenden, hatSchlussEntwurf } from '../auftraege/rechnungsbau.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'
|
import { getSettings } from './settings.js'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -237,7 +237,12 @@ async function bucheNummer(invoiceId, number, art) {
|
|||||||
async function bucheFinalisiert(invoiceId, number, art, auftragId) {
|
async function bucheFinalisiert(invoiceId, number, art, auftragId) {
|
||||||
if (!PROJEKT_ARTEN.includes(art)) return
|
if (!PROJEKT_ARTEN.includes(art)) return
|
||||||
await bucheNummer(invoiceId, number, art)
|
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. */
|
/** 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 })
|
const a = await anzahlung(ab, 50, { senden: true })
|
||||||
assert.equal((await voidInvoice(a.id)).status, 'storniert')
|
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