namespace AccountsDAL.Query.Warehouse { // SQL for TWAREHOUSECHANGEQUEUE — the delta posting queue populated by WarehouseChangeSubscriber // (Dapr pub/sub) and drained by PostWarehouseDelta endpoint / Quartz job. // Index IX_TWHCHANGEQUEUE_PENDING covers the GET_PENDING query (created by migration 20260827). public static class WarehouseChangeQueueQB { // Fetch all pending rows for a given fact, mark them as claimed (PROCESSEDON) in one // UPDATE+OUTPUT so concurrent callers don't double-process. OUTPUT returns the rows // that were actually claimed by THIS invocation. public const string CLAIM_AND_GET_PENDING = @" UPDATE TWAREHOUSECHANGEQUEUE SET PROCESSEDON = GETUTCDATE() OUTPUT INSERTED.QUEUEID AS QueueId, INSERTED.FACTID AS FactId, INSERTED.OUID AS OuId, INSERTED.ACTIVITYDATE AS ActivityDate, INSERTED.QUEUEDON AS QueuedOn, INSERTED.PROCESSEDON AS ProcessedOn, INSERTED.TENANTID AS TenantId WHERE FACTID = @FactId AND TENANTID = @TenantId AND PROCESSEDON IS NULL"; // Inserts one queue row only if no pending row already exists for this // FactId + OuId + ActivityDate + TenantId combination (idempotent enqueue). public const string ENQUEUE_IF_NOT_PENDING = @" INSERT INTO TWAREHOUSECHANGEQUEUE (FACTID, OUID, ACTIVITYDATE, TENANTID) SELECT @FactId, @OuId, @ActivityDate, @TenantId WHERE NOT EXISTS ( SELECT 1 FROM TWAREHOUSECHANGEQUEUE WHERE FACTID = @FactId AND OUID = @OuId AND ACTIVITYDATE = @ActivityDate AND TENANTID = @TenantId AND PROCESSEDON IS NULL )"; // All delta-enabled facts for a tenant — used by WarehouseChangeSubscriber to find // which facts to enqueue when a voucher event arrives. public const string GET_DELTA_ENABLED_FACTS = @" SELECT FACTID FROM MWAREHOUSEFACT WHERE POSTINGMODE = 1 AND STATUS <> 2"; } }