diff --git a/server/services/auftraege/projektkonto.js b/server/services/auftraege/projektkonto.js index ea67e51..542048e 100644 --- a/server/services/auftraege/projektkonto.js +++ b/server/services/auftraege/projektkonto.js @@ -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 +} diff --git a/test/auftraegeProjektkonto.test.js b/test/auftraegeProjektkonto.test.js index 4914fc2..f80244d 100644 --- a/test/auftraegeProjektkonto.test.js +++ b/test/auftraegeProjektkonto.test.js @@ -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'), {}) +})