Files
Webklar-Kundenbereich/test/auftraegeNummern.test.js
2026-10-07 14:11:52 +00:00

55 lines
3.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { test, after, beforeEach } from 'node:test'
import assert from 'node:assert/strict'
import { starteUmgebung, entwurfsDaten } from './helpers/auftraegeAb.js'
const umg = await starteUmgebung()
after(() => umg.schliesse())
beforeEach(umg.zuruecksetzen)
const { createAuftrag, updateAuftrag } = await import('../server/services/auftraege/auftragStore.js')
const { formatNummer, vergibNummer } = await import('../server/services/auftraege/nummern.js')
/** Eine versendete AB mit Nummer anlegen (über den Speicher von L0). */
async function legeNummerierteAn(jahr, laufnummer, patch = {}) {
const entwurf = await createAuftrag(entwurfsDaten())
return updateAuftrag(entwurf.id, { status: 'versendet', nummer: formatNummer(jahr, laufnummer), jahr, laufnummer, ...patch })
}
test('formatNummer: AB-JJJJ-NNNN mit vier Ziffern; ungültige Werte werfen RangeError', () => {
assert.equal(formatNummer(2026, 1), 'AB-2026-0001')
assert.equal(formatNummer(2026, 42), 'AB-2026-0042')
assert.equal(formatNummer(2027, 9999), 'AB-2027-9999')
for (const [jahr, lauf] of [[2026, 0], [2026, 10000], [2026, 1.5], [2026, '1'], [1999, 1], ['2026', 1], [2026, -3]]) {
assert.throws(() => formatNummer(jahr, lauf), RangeError, `${jahr}/${lauf}`)
}
})
test('vergibNummer: die erste Nummer des Jahres ist 0001', async () => {
assert.deepEqual(await vergibNummer(new Date('2026-10-06T10:00:00Z')), { nummer: 'AB-2026-0001', jahr: 2026, laufnummer: 1 })
})
test('vergibNummer: größte Laufnummer des Jahres plus 1 – Lücken egal, andere Jahre und Entwürfe zählen nicht', async () => {
for (const nr of [1, 2, 7]) await legeNummerierteAn(2026, nr)
await legeNummerierteAn(2025, 40)
await createAuftrag(entwurfsDaten()) // Entwurf ohne Nummer
assert.deepEqual(await vergibNummer(new Date('2026-10-06T10:00:00Z')), { nummer: 'AB-2026-0008', jahr: 2026, laufnummer: 8 })
assert.deepEqual(await vergibNummer(new Date('2025-03-01T10:00:00Z')), { nummer: 'AB-2025-0041', jahr: 2025, laufnummer: 41 })
})
test('vergibNummer: Jahreswechsel nach Berliner Zeit (31.12. 23:00 UTC ist in Berlin schon der 01.01.)', async () => {
for (const nr of [1, 2, 3]) await legeNummerierteAn(2026, nr)
assert.equal((await vergibNummer(new Date('2026-12-31T22:59:59Z'))).nummer, 'AB-2026-0004')
assert.deepEqual(await vergibNummer(new Date('2026-12-31T23:00:00Z')), { nummer: 'AB-2027-0001', jahr: 2027, laufnummer: 1 })
assert.equal((await vergibNummer(new Date('2027-01-01T08:00:00Z'))).nummer, 'AB-2027-0001')
})
test('vergibNummer: zählt auch bei mehr als 25 ABs im Jahr richtig (Seitengröße 25 wie bei Appwrite ohne limit)', async () => {
for (let i = 1; i <= 30; i += 1) await legeNummerierteAn(2026, i)
assert.equal((await vergibNummer(new Date('2026-10-06T10:00:00Z'))).nummer, 'AB-2026-0031')
})
test('vergibNummer: überspringt eine Nummer, die es schon gibt (Dokument mit nummer, aber ohne laufnummer)', async () => {
const entwurf = await createAuftrag(entwurfsDaten())
await updateAuftrag(entwurf.id, { status: 'versendet', nummer: 'AB-2026-0001' })
assert.deepEqual(await vergibNummer(new Date('2026-10-06T10:00:00Z')), { nummer: 'AB-2026-0002', jahr: 2026, laufnummer: 2 })
})