Kontrolle: Senden eines Anzahlungs- oder Schluss-Entwurfs prueft die AB unter der Kundensperre erneut
Unter sperreRechnung(kundenId): AB noch versendet oder bestaetigt, bei Schluss keine andere festgeschriebene Schlussrechnung, bei Anzahlung Summe aller festgeschriebenen Rechnungen plus diese nicht ueber der AB-Summe, sonst 409 und nichts wird finalisiert. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
57d1ab82c6
commit
e3ae152f12
3 files changed
+99
-4
No files matched your search
@@ -17,7 +17,7 @@ import {
|
||||
} from './positionen.js'
|
||||
import { auftraegeAktiv } from './schalter.js'
|
||||
import { getAuftrag, listAuftraege, updateAuftrag } from './auftragStore.js'
|
||||
import { listProjektRechnungen, updateProjektRechnung } from './projektRechnungenStore.js'
|
||||
import { getProjektRechnung, listProjektRechnungen, updateProjektRechnung } from './projektRechnungenStore.js'
|
||||
import {
|
||||
ladeArbeitsblaetter, ladeArbeitsblaetterNachIds, abrechenbar, abgerechneteArbeitsblaetter, offeneArbeitsblaetter, zeitquelleFuerProjekt,
|
||||
} from './arbeitsblaetter.js'
|
||||
@@ -380,3 +380,32 @@ async function baueAbRechnung(basis, eingabe) {
|
||||
}
|
||||
return schliesseAb({ ...basis, projekt, auftrag, positionen })
|
||||
}
|
||||
|
||||
const AB_UNGUELTIG = 'Die Auftragsbestätigung ist nicht mehr gültig (storniert, widerrufen, ersetzt oder schon abgerechnet). Der Entwurf wird nicht gesendet.'
|
||||
|
||||
/**
|
||||
* Letzte Pruefung vor dem Senden eines Anzahlungs- oder Schluss-Entwurfs (Aufrufer haelt sperreRechnung des Kunden):
|
||||
* die AB muss noch versendet oder bestaetigt sein, bei einer Schlussrechnung darf keine andere Schlussrechnung
|
||||
* festgeschrieben sein, und bei einer Anzahlung darf die Summe aller festgeschriebenen Rechnungen zur AB plus diese die
|
||||
* AB-Summe nicht uebersteigen (zwei Entwuerfe zaehlen beim Anlegen nicht mit). Sonst AuftragError 409; nichts wird
|
||||
* geschrieben ausser der Selbstheilung von ladeFruehere. Die AB kommt aus dem Projektdatensatz (nach umhaengen die neue),
|
||||
* ersatzweise aus den Stripe-Metadaten; ohne AB gibt es nichts zu pruefen.
|
||||
*/
|
||||
export async function pruefeVorSenden({ invoiceId, art, auftragIdMetadaten = '', totalCents }) {
|
||||
if (!AB_RECHNUNGS_ARTEN.includes(art)) return
|
||||
const auftragId = (await getProjektRechnung(invoiceId))?.auftragId || auftragIdMetadaten
|
||||
if (!auftragId) return
|
||||
const ab = await getAuftrag(auftragId)
|
||||
if (!ab || !['versendet', 'bestaetigt'].includes(ab.status)) throw new AuftragError(409, AB_UNGUELTIG)
|
||||
const andere = (await ladeFruehere(ab.id)).filter((f) => f.invoiceId !== invoiceId && FINALISIERT.includes(f.status))
|
||||
if (art === 'schluss' && andere.some((f) => f.art === 'schluss')) {
|
||||
throw new AuftragError(409, 'Zu dieser Auftragsbestätigung gibt es schon eine Schlussrechnung. Der Entwurf wird nicht gesendet.')
|
||||
}
|
||||
// Eine Schlussrechnung darf mit Nachtraegen ueber der AB-Summe liegen: die Obergrenze gilt nur fuer die Anzahlung
|
||||
if (art === 'anzahlung') {
|
||||
const berechnet = andere.reduce((summe, f) => summe + f.betragCents, 0)
|
||||
if (berechnet + totalCents > ab.summeCents) {
|
||||
throw new AuftragError(409, `Die Summe der Rechnungen würde die Auftragssumme von ${euroDe(ab.summeCents)} übersteigen (bereits berechnet ${euroDe(berechnet)}). Der Entwurf wird nicht gesendet.`)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user