Luca
06b4522dec
feat(billing): manual cadence + fix admin date inputs ignoring date-format setting
Manual billing cadence
Adds a "Manual (trigger only)" cadence alongside monthly/quarterly. It reuses
the monthly draft accumulator — invoices and billed hours pile onto one running
draft — but stores NULL monthly_period_start/end so the scheduler's auto-flush
never matches. The draft ships only when an admin clicks "Trigger invoice now".
No migration: billing_cadence is a free-form string column gated by validators.
- adminCustomers.js: allow 'manual' in billing_cadence validator
- invoiceService.js: route manual through accumulator; NULL periods + placeholder
issue/due date in getOrCreateMonthlyDraft
- customerHoursService.js: manual auto-appends hours to running draft;
billUnbilledEntries refuses manual (CADENCE_MISMATCH)
- CustomerDetailPage.tsx: dropdown option, cycle-day hidden for manual,
NULL-period-safe draft preview + trigger button, manual-specific copy
- customerAdmin.service.ts: cadence union + nullable periodStart/periodEnd
- en.json / de.json: manual, triggerConfirmManual, triggerHintManual,
draftPreview.titleManual
Date-format fixes
Replace raw <input type="date"> (browser-locale) with LocalizedDateInput so
these admin surfaces honor the general_date_format setting:
- ContractEditorPage.tsx (issue / valid-until / event dates)
- QuoteEditorPage.tsx (event / valid-until dates)
- EventDetailsPage.tsx (expiry date)
- HoursSection.tsx (entry date)
2026-06-02 09:27:10 +02:00
..
2026-05-29 22:49:01 +02:00
2026-05-26 18:18:51 +02:00
2026-06-02 09:00:05 +02:00
2026-04-28 10:06:36 +02:00
2026-06-02 09:27:10 +02:00
2026-05-26 18:18:51 +02:00
2026-05-09 15:55:09 +02:00
2026-05-17 22:29:29 +02:00
2026-05-07 22:31:51 +02:00
2026-05-26 18:18:51 +02:00
2026-05-31 21:10:15 +00:00
2026-05-27 15:18:29 +02:00
2026-05-17 22:29:29 +02:00