55 lines
2.5 KiB
Transact-SQL
55 lines
2.5 KiB
Transact-SQL
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
|