-- ============================================= -- Description: Invoice backdating (ADR 0032). Returns the date an invoice may be backdated to -- (the last working day Mon-Fri of the previous month, Europe/Berlin), or NULL when -- backdating is not allowed: -- * @authuser needs fds_inv > 2, and -- * no invoice may have been finalized after that date yet (invoice numbers are -- issued in date order; DateFinalized is stored in UTC, hence the 2h margin). -- Single source for fds__setInvoiceFinal (@backdate = 1) and the preview dialog. -- The check is only race-free inside fds__setInvoiceFinal, which serializes all -- finalizations with a transaction-owned app lock; the preview call is advisory. -- ============================================= CREATE FUNCTION [dbo].[fds__fn_invoiceBackdate] ( @authuser varchar(25) ) RETURNS date AS BEGIN IF [dbo].[fis_getModuleAuth]('fds_inv', @authuser) <= 2 RETURN NULL; DECLARE @today date = CAST(SYSDATETIMEOFFSET() AT TIME ZONE 'W. Europe Standard Time' AS date); DECLARE @eom date = EOMONTH(@today, -1); -- DATEFIRST-independent weekday: 0 = Monday ... 5 = Saturday, 6 = Sunday DECLARE @bd date = DATEADD(day, CASE DATEDIFF(day, '19000101', @eom) % 7 WHEN 5 THEN -1 WHEN 6 THEN -2 ELSE 0 END, @eom); IF EXISTS (SELECT 0 FROM [dbo].[fds__invoices] WHERE [DateFinalized] IS NOT NULL AND [DateFinalized] >= DATEADD(HOUR, -2, CAST(DATEADD(DAY, 1, @bd) AS datetime))) RETURN NULL; RETURN @bd; END