73 lines
3.4 KiB
MySQL
73 lines
3.4 KiB
MySQL
|
|
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
|