Projektkonto: Abzeichen abgerechnet je Ticket (Rechnungsnummer oder Entwurf)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
7cec85f888
commit
32726fa1c2
2 files changed
+49
No files matched your search
@@ -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
|
||||
}
|
||||
@@ -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'), {})
|
||||
})
|
||||
Reference in new issue
Block a user