import { describe, test, expect } from "vitest"; import { formatInvoiceNumber } from "./invoice-number"; describe("formatInvoiceNumber", () => { test("beginnt jedes Jahr bei 0001", () => { // Arrange & Act & Assert expect(formatInvoiceNumber(2026, 1)).toBe("RE-2026-0001"); expect(formatInvoiceNumber(2027, 1)).toBe("RE-2027-0001"); }); test("zaehlt fortlaufend weiter", () => { // Arrange & Act & Assert: genau darum geht es โ€” ยง 14 Abs. 4 Nr. 4 UStG // verlangt eine fortlaufende, nicht bloss eine eindeutige Nummer. expect(formatInvoiceNumber(2026, 2)).toBe("RE-2026-0002"); expect(formatInvoiceNumber(2026, 42)).toBe("RE-2026-0042"); }); test("haelt die Nummern gleich lang, damit sie sortierbar bleiben", () => { // Arrange const numbers = [1, 9, 10, 999].map((n) => formatInvoiceNumber(2026, n)); // Act & Assert: alphabetisch sortiert ergibt sich dieselbe Reihenfolge wie // numerisch โ€” bei ungepolsterten Nummern kaeme "RE-2026-10" vor // "RE-2026-9". expect([...numbers].sort()).toEqual(numbers); }); test("waechst ueber vier Stellen hinaus, statt abzuschneiden", () => { // Arrange & Act & Assert: eine abgeschnittene Nummer waere nicht mehr // eindeutig โ€” lieber eine Stelle mehr als eine doppelte Rechnungsnummer. expect(formatInvoiceNumber(2026, 9999)).toBe("RE-2026-9999"); expect(formatInvoiceNumber(2026, 10000)).toBe("RE-2026-10000"); }); });