Projektkonto: Detail mit ABs, Rechnungen und offenen Arbeitsblättern
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
8032aa67c6
commit
7cec85f888
2 files changed
+118
No files matched your search
@@ -7,6 +7,7 @@ import { kindLabel } from '../projectKinds.js'
|
||||
import { KUNDENARTEN, STUNDENSATZ_STANDARD_CENTS, VEREINBARTE_STATUS } from './konstanten.js'
|
||||
import { AuftragError } from './fehler.js'
|
||||
import { auftraegeAktiv } from './schalter.js'
|
||||
import { auftragFuerTeam } from './auftragSicht.js'
|
||||
import { listAuftraege } from './auftragStore.js'
|
||||
import { listProjektRechnungen } from './projektRechnungenStore.js'
|
||||
import { abgerechneteArbeitsblaetter, abrechenbar, ladeArbeitsblaetter, zeitquelleFuerProjekt } from './arbeitsblaetter.js'
|
||||
@@ -257,3 +258,45 @@ export async function projektkontenFuerKunde(kundenId) {
|
||||
|
||||
return { auftraegeAktiv: aktiv, kunde: kundeAnsicht(kundeDoc), konten, ohneProjekt, stripeOk: stripeDaten.ok }
|
||||
}
|
||||
|
||||
const neuesteZuerst = (a, b) => (b.createdDate ?? '').localeCompare(a.createdDate ?? '') || b.number.localeCompare(a.number) || b.id.localeCompare(a.id)
|
||||
|
||||
/**
|
||||
* Ein Projektkonto mit seinen ABs, Rechnungen (aktive Projektrechnungen, soweit Stripe sie kennt) und den noch nicht
|
||||
* abgerechneten Arbeitsblaettern (V4 "L1"). Bei Stripe-Ausfall: keine Rechnungen, stripeOk false.
|
||||
*/
|
||||
export async function projektkontoDetail(projektId) {
|
||||
const projekt = await ladeDokument(config.collections.websiteProjects, projektId, 'Projekt')
|
||||
if (!projekt.customerId) throw new AuftragError(404, 'Projekt nicht gefunden.')
|
||||
const kundenId = projekt.customerId
|
||||
const kundeDoc = await ladeDokument(config.collections.customers, kundenId, 'Kunde')
|
||||
const aktiv = auftraegeAktiv(kundeDoc)
|
||||
const [abs, prs] = await Promise.all([
|
||||
aktiv ? listAuftraege({ kundenId, projektId }) : [],
|
||||
listProjektRechnungen({ kundenId, projektId }),
|
||||
])
|
||||
const stripeDaten = await ladeStripeRechnungen(prs)
|
||||
const zeitquelle = zeitquelleVon(projekt, abs)
|
||||
const zeit = await ladeZeitDaten(kundenId, zeitquelle)
|
||||
const { konto, rechnungen, blaetter } = baueKonto(projekt, { abs, zeitquelle, prs, stripeDaten, zeit })
|
||||
return {
|
||||
konto,
|
||||
auftraege: abs.map((auftrag) => auftragFuerTeam(auftrag)),
|
||||
rechnungen: rechnungen
|
||||
.map(({ art, auftragId, invoice }) => ({
|
||||
id: invoice.id,
|
||||
number: invoice.number,
|
||||
status: invoice.status,
|
||||
createdDate: invoice.createdDate,
|
||||
totalCents: invoice.totalCents,
|
||||
paidCents: invoice.paidCents,
|
||||
art,
|
||||
auftragId,
|
||||
}))
|
||||
.sort(neuesteZuerst),
|
||||
offeneArbeitsblaetter: blaetter
|
||||
.filter((blatt) => abrechenbar(blatt) && !zeit.abgerechnet.has(blatt.id))
|
||||
.sort((a, b) => a.datum.localeCompare(b.datum) || a.id.localeCompare(b.id)),
|
||||
stripeOk: stripeDaten.ok,
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user