Z User
de6573b15e
feat: Invoice PDF + Beleg file upload with content-addressed storage
2 new features:
1. Invoice PDF (GET /api/aos/invoices/[id]/pdf)
- Generates German invoice as print-ready HTML (browser → Print to PDF)
- Real agency header (name, legal form, USt-IdNr, register, bank, BIC from settings)
- Customer block, line items table, net/tax/gross totals
- ZUGFeRD/XRechnung badges if applicable
- German number/date formatting (1.234,56 € / 27.10.2026)
- GoBD: no-store cache header
- 3.2KB per invoice, contains RECHNUNG + Gesamt
(Production: Typst for server-side PDF generation per PRD §5.2)
2. Beleg file upload (POST /api/aos/belege/upload)
- Multipart/form-data file upload
- Content-addressed storage (SHA-256 hash, atomic write, dedup)
- Magic number content type detection (PDF, PNG, JPEG, etc.)
- Duplicate detection (same hash → 409)
- GoBD retention (8 years for invoices, 6 for others)
- Audit-logged
- Tested: upload OK, duplicate → 409
0 TS errors, ESLint clean.
2026-10-28 01:24:48 +00:00
..
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00
2026-10-28 01:24:48 +00:00