56 lines
2.5 KiB
MySQL
56 lines
2.5 KiB
MySQL
|
|
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
|