sozsoft-platform/configs/seeds/host/sql/object/Hr_S_TimesheetNightly.sql
2026-10-05 00:18:13 +03:00

72 lines
3.4 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

CREATE OR ALTER PROCEDURE [dbo].[Hr_S_TimesheetNightly]
AS
BEGIN
SET NOCOUNT ON;
-- Zamanlanmış iş (Timesheet Nightly, her gece 02:00). Hareketi olmayan günleri (devamsız, hafta
-- tatili, resmî tatil, izinli, raporlu) kurar ve geriye dönük onaylanan izin/rapor, takvim ya da
-- vardiya değişikliğini yansıtır: dünün ayı ve kapanmamışsa bir önceki ay, işlenmemiş ve kartı sonradan
-- tanımlanan hareketler.
-- İş host ve her kiracı için çağrılır, prosedür parametre almaz; bu yüzden veritabanındaki bütün
-- kiracıları işler ve aynı gün işlenmiş kiracıyı (dönemin NightlyAt değeri) atlar.
DECLARE @Today date = CAST(GETDATE() AS date);
DECLARE @Yesterday date = DATEADD(day, -1, @Today);
DECLARE @MonthStart date = DATEFROMPARTS(YEAR(@Yesterday), MONTH(@Yesterday), 1);
DECLARE @PrevStart date = DATEADD(month, -1, @MonthStart);
-- Kart numarası kullanıcı kartına sonradan girilen okutmalar yeniden işlenir.
UPDATE l
SET IsProcessed = 0, ProcessError = NULL
FROM Hr_T_AttendanceLog l
WHERE l.IsDeleted = 0 AND l.ProcessError = N'UnknownCard'
AND EXISTS (SELECT 1 FROM AbpUsers u
WHERE (u.PdksCardNo = l.CardNo OR u.RegistrationNo = l.CardNo) AND u.IsDeleted = 0
AND (u.TenantId = l.TenantId OR (u.TenantId IS NULL AND l.TenantId IS NULL)));
EXEC dbo.Hr_S_AttendanceProcess 0;
DECLARE @Tenants TABLE (TenantId uniqueidentifier NULL);
INSERT INTO @Tenants (TenantId)
SELECT DISTINCT TenantId FROM AbpUsers WHERE IsDeleted = 0 AND HireDate IS NOT NULL;
DECLARE @TenantId uniqueidentifier, @PeriodId uniqueidentifier, @From date;
DECLARE tenant_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT TenantId FROM @Tenants;
OPEN tenant_cursor;
FETCH NEXT FROM tenant_cursor INTO @TenantId;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @PeriodId = (SELECT TOP 1 Id FROM Hr_T_TimesheetPeriod
WHERE IsDeleted = 0 AND PeriodYear = YEAR(@Yesterday) AND PeriodMonth = MONTH(@Yesterday)
AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL)));
-- Ay dönemi gece işinde kendiliğinden açılır.
IF @PeriodId IS NULL
BEGIN
SET @PeriodId = NEWID();
INSERT INTO Hr_T_TimesheetPeriod (Id, TenantId, PeriodYear, PeriodMonth, [Status], CreationTime, IsDeleted)
VALUES (@PeriodId, @TenantId, YEAR(@Yesterday), MONTH(@Yesterday), N'Open', GETUTCDATE(), 0);
END
IF NOT EXISTS (SELECT 1 FROM Hr_T_TimesheetPeriod WHERE Id = @PeriodId AND NightlyAt >= CAST(@Today AS datetime2))
BEGIN
SET @From = CASE WHEN EXISTS (
SELECT 1 FROM Hr_T_TimesheetPeriod
WHERE IsDeleted = 0 AND [Status] = N'Closed'
AND PeriodYear = YEAR(@PrevStart) AND PeriodMonth = MONTH(@PrevStart)
AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL)))
THEN @MonthStart ELSE @PrevStart END;
EXEC dbo.Hr_S_TimesheetCalculate @TenantId, NULL, @From, @Yesterday, NULL;
UPDATE Hr_T_TimesheetPeriod
SET NightlyAt = GETDATE(), CalculatedAt = GETUTCDATE()
WHERE Id = @PeriodId;
END
FETCH NEXT FROM tenant_cursor INTO @TenantId;
END
CLOSE tenant_cursor;
DEALLOCATE tenant_cursor;
END
GO