sozsoft-platform/configs/seeds/sql/object/Hr_S_TimesheetPeriodAfterSave.sql

56 lines
2.5 KiB
MySQL
Raw Normal View History

2026-10-04 21:18:13 +00:00
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