72 lines
3.4 KiB
Transact-SQL
72 lines
3.4 KiB
Transact-SQL
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
|