sozsoft-platform/configs/seeds/sql/object/Hr_S_TimesheetPeriodAfterSave.sql
2026-10-05 15:58:59 +03:00

55 lines
2.5 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_TimesheetPeriodAfterSave]
@PeriodId uniqueidentifier,
@ActorId uniqueidentifier
AS
BEGIN
SET NOCOUNT ON;
-- Puantaj Dönemleri kaydı: açık dönemin her kaydı ayı bütün çalışanlar için yeniden hesaplar;
-- kapatma son kez hesaplayıp ayı kilitler. Kapalı ayın hareketleri ve günleri değiştirilemez.
DECLARE @TenantId uniqueidentifier, @Year int, @Month int, @Status nvarchar(16), @ClosedAt datetime2;
SELECT @TenantId = TenantId, @Year = PeriodYear, @Month = PeriodMonth, @Status = [Status], @ClosedAt = ClosedAt
FROM Hr_T_TimesheetPeriod
WHERE Id = @PeriodId AND IsDeleted = 0;
IF @Year IS NULL
RETURN;
IF @Month NOT BETWEEN 1 AND 12 OR @Year NOT BETWEEN 2000 AND 2100
THROW 51220, N'Dönem yılı 2000–2100, ayı 1–12 arasında olmalıdır.', 1;
IF EXISTS (SELECT 1 FROM Hr_T_TimesheetPeriod
WHERE Id <> @PeriodId AND IsDeleted = 0 AND PeriodYear = @Year AND PeriodMonth = @Month
AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL)))
THROW 51221, N'Bu yıl ve ay için puantaj dönemi zaten var.', 1;
DECLARE @From date = DATEFROMPARTS(@Year, @Month, 1);
DECLARE @To date = EOMONTH(@From);
IF @Status = N'Closed' AND @ClosedAt IS NOT NULL
RETURN;
-- Kapalı aya izin yazılamadığı için ayda onay bekleyen talep varken dönem kapanmaz; aksi hâlde
-- sonradan onaylanan izin puantaja hiç yansımazdı.
IF @Status = N'Closed' AND EXISTS (
SELECT 1 FROM Hr_T_LeaveRequest q
WHERE q.IsDeleted = 0
AND (q.TenantId = @TenantId OR (q.TenantId IS NULL AND @TenantId IS NULL))
AND (q.ApprovalStatus IS NULL OR q.ApprovalStatus IN (N'Onaya Gönderildi', N'Müdür Onayı', N'İK Onayı'))
AND CAST(q.StartDate AS date) <= @To AND CAST(q.EndDate AS date) >= @From)
THROW 51223, N'Bu ayda onay bekleyen izin talebi var. Talepler sonuçlanmadan dönem kapatılamaz.', 1;
-- Kapatma anında da son hesap yapılır; hesap kapalı ayı yazmadığı için önce açık sayılır.
UPDATE Hr_T_TimesheetPeriod SET [Status] = N'Open' WHERE Id = @PeriodId;
EXEC dbo.Hr_S_TimesheetCalculate @TenantId, NULL, @From, @To, @ActorId;
UPDATE Hr_T_TimesheetPeriod
SET [Status] = COALESCE(@Status, N'Open'),
CalculatedAt = GETUTCDATE(),
ClosedAt = CASE WHEN @Status = N'Closed' THEN GETUTCDATE() END,
ClosedById = CASE WHEN @Status = N'Closed' THEN @ActorId END
WHERE Id = @PeriodId;
END
GO