Files
Fuchs_Intranet/Fuchs/Docs/Decisions/0035-invoice-date-is-datefinalized-everywhere.md
Stefan c741535aec
Playwright Tests / test (push) Canceled after 0s
feat: Implement mfr truncation fix and enhance invoice handling
- Added a new SQL script to address the "String or binary data would be truncated" error in mfr sync by widening the Note fields in service objects and companies to NVARCHAR(MAX).
- Updated the table types and associated stored procedures to accommodate the changes, ensuring compatibility with existing data.
- Queued a re-sync for previously rejected rows due to truncation issues.
- Created application logins for fuchs_fds and fuchs_web with placeholder passwords for initial setup.
- Introduced functions for invoice backdating and invoice date retrieval to streamline invoice processing.
- Developed a password generation function with customizable parameters for length and character types.
- Added a random number generation function to support password creation.
2026-09-30 16:56:08 +02:00

3.7 KiB

status, date, applyTo, supersededBy
status date applyTo supersededBy
Accepted 2026-09-30
Fuchs_Database/dbo/Functions/fds__fn_invoiceDate.sql
Fuchs_Database/dbo/Functions/fds__r_getBalanceThisMonth.sql
Fuchs_Database/dbo/Stored Procedures/fds__getDatevExports.sql
Fuchs_Database/dbo/Stored Procedures/fds__getInvoices_list*.sql
Fuchs_Database/dbo/Stored Procedures/fds__getFDSDocument.sql
Fuchs_Database/dbo/Stored Procedures/fds__getReportDocument.sql
Fuchs_Database/dbo/Stored Procedures/fds__getRequest_details.sql
Fuchs_Database/dbo/Stored Procedures/fds__r_*.sql
Fuchs_Database/dbo/Stored Procedures/fds__*Reminder*.sql
Fuchs/code/InvoiceDates.cs
Fuchs/Services/ReminderService.cs
Fuchs/Services/*DraftEditService.cs

0035 — The invoice date is DateFinalized everywhere

Context

ADR 0032 made DateFinalized the invoice date for the PDF, the e-invoice (BT-2) and the number sequence, and introduced backdating (which only moves DateFinalized). Everything else — invoice lists, revenue reports and charts, the DATEV export, document lookups, the request details — still dated and grouped invoices by DateCreated, the moment the draft was created. A backdated invoice therefore showed September on the document and October in every list, report and in DATEV, and any invoice drafted in one month and finalised in the next had the same split.

Decision

  • One invoice date, everywhere: the German calendar day of DateFinalized, falling back to DateCreated only for drafts. Both columns are stored in UTC.
  • One implementation per side: [dbo].[fds__fn_invoiceDate](DateFinalized, DateCreated) in SQL and InvoiceDates.IssueDate in C#. No proc converts or picks the date itself.
  • Applies to: the DATEV export (period filter, Belegdatum, Belegfeld 2), the invoice lists (fds__getInvoices_list, list2, list_vario: period filter, Belegdatum, DateOfCreation, ordering, overdue fallback), the revenue reports (fds__r_*: year/month filters and grouping, fds__r_getBalanceThisMonth), document lookups (fds__getFDSDocument, fds__getReportDocument), fds__getRequest_details (new column InvoiceDate, shown in the request's invoice list), and the invoice date shown in reminders (fds__prepReminder, fds__createReminder, fds__getReminder).
  • Reminders use the same rule for their own date: the reminder PDF's date is the reminder's DateFinalized (German day), draft: DateCreated.
  • No transition safeguard. The switch applies to all periods, past and future; already exported DATEV periods are not reconciled (confirmed by the business owner, 2026-09-30).
  • DateCreated keeps its meaning — the creation timestamp of the row — and is still returned where callers read it as such. Draft previews stamp it with DateTime.UtcNow to match the stored column.

Consequences

  • Reports and exports for a past period can differ from what they showed before this change: an invoice drafted in month M and finalised in M+1 now counts in M+1.
  • Filters on the invoice date are not SARGable (they were not before either: CAST(DateCreated as date)). Acceptable at the current table size; an indexed computed column is the follow-up if it matters.
  • Any new list, report or export that shows or groups invoices by date must use fds__fn_invoiceDate — never DateCreated or a raw DateFinalized.

Alternatives considered

  • Keep DateCreated in lists/reports, DateFinalized only on documents — rejected: the same invoice would carry two dates, and backdating would never reach the books.
  • Transition safeguard for already exported DATEV periods — rejected by the business owner.