sozsoft-platform/configs/seeds/host/sql/object/Hr_S_TimesheetNightly.sql

73 lines
3.4 KiB
MySQL
Raw Normal View History

2026-10-04 21:18:13 +00:00
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