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