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