Projektkonto: Abzeichen abgerechnet je Ticket (Rechnungsnummer oder Entwurf)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-07 14:12:25 +00:00
1 parent 7cec85f888
commit 32726fa1c2
2 files changed
+49

No files matched your search

+23
View File
@@ -300,3 +300,26 @@ export async function projektkontoDetail(projektId) {
stripeOk: stripeDaten.ok,
}
}
/**
* Abzeichen "abgerechnet" an den Arbeitsblaettern eines Tickets (alle Mitarbeiter, ohne Betraege): { Blatt-ID: Rechnungsnummer
* oder 'Entwurf' }. Die Blatt-IDs kommen aus dem Ticket, die Zuordnung aus den aktiven Projektrechnungen seines Kunden.
*/
export async function abgerechnetFuerTicket(ticketId) {
let ticket
try {
ticket = await getDocument(config.collections.workorders, ticketId)
} catch (err) {
if (err?.status === 404) return {}
throw err
}
if (!ticket.customerId) return {}
const abgerechnet = await abgerechneteArbeitsblaetter(ticket.customerId)
if (abgerechnet.size === 0) return {}
const ergebnis = {}
for (const blatt of await ladeArbeitsblaetter([ticketId])) {
const eintrag = abgerechnet.get(blatt.id)
if (eintrag) ergebnis[blatt.id] = eintrag.rechnungsnummer || 'Entwurf'
}
return ergebnis
}
+26
View File
@@ -659,3 +659,29 @@ test('Detail bei ausgeschaltetem Schalter: keine ABs, Vereinbart leer, ABs werde
assert.equal(detail.konto.vereinbart.festpreisCents, null)
assert.equal(aw.listCalls(config.collections.auftraege).length, 0)
})
// ---------- Abzeichen "abgerechnet" (Task 6) ----------
test('abgerechnetFuerTicket: Rechnungsnummer oder Entwurf, nur Blätter dieses Tickets, nur aktive Projektrechnungen des Kunden', async () => {
seedTicket('t1', '100001')
seedTicket('t2', '100002')
seedBlatt('w1', 't1', 60)
seedBlatt('w2', 't1', 30)
seedBlatt('w3', 't1', 15)
seedBlatt('w9', 't2', 45)
seedPr('in_1', { rechnungsnummer: 'WEBKLAR-0007', arbeitsblattIds: ['w1'] })
seedPr('in_2', { rechnungsnummer: '', arbeitsblattIds: ['w2', 'w9'] }) // Entwurf, ein Blatt gehört zu t2
seedPr('in_3', { rechnungsnummer: 'WEBKLAR-0003', arbeitsblattIds: ['w3'], aktiv: false }) // zurückgenommen
seedPr('in_4', { kundenId: 'c2', rechnungsnummer: 'WEBKLAR-0004', arbeitsblattIds: ['w1'] }) // anderer Kunde
assert.deepEqual(await abgerechnetFuerTicket('t1'), { w1: 'WEBKLAR-0007', w2: 'Entwurf' })
assert.deepEqual(await abgerechnetFuerTicket('t2'), { w9: 'Entwurf' })
})
test('abgerechnetFuerTicket: unbekanntes Ticket, Ticket ohne Kunde oder nichts abgerechnet -> leer', async () => {
seedTicket('t1', '100001')
seedTicket('t3', '100003', '')
seedBlatt('w1', 't1', 60)
assert.deepEqual(await abgerechnetFuerTicket('gibtsnicht'), {})
assert.deepEqual(await abgerechnetFuerTicket('t3'), {})
assert.deepEqual(await abgerechnetFuerTicket('t1'), {})
})