sozsoft-platform/configs/seeds/host/sql/object/Hr_S_LeaveSickLeaveSync.sql
2026-10-05 00:18:13 +03:00

93 lines
4.4 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_LeaveSickLeaveSync]
@SickLeaveId uniqueidentifier,
@ActorId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
-- Sağlık Kartı › İstirahatler'den (ya da kullanıcı detayındaki istirahat listesinden) girilen
-- rapor, İzin Yönetimi'nde onaylanmış "Sick" türünde talep olarak görünür (tek kayıt). Talep
-- tarafı istirahati kendisi yazar; bu prosedür yalnızca istirahat ekranından gelen değişikliği taşır.
IF @SickLeaveId IS NULL
RETURN;
DECLARE @TenantId uniqueidentifier, @UserId uniqueidentifier, @StartDate date, @EndDate date,
@Reason nvarchar(1024), @IsDeleted bit;
SELECT @TenantId = TenantId, @UserId = UserId, @StartDate = CAST(StartDate AS date),
@EndDate = CAST(EndDate AS date), @Reason = SickLeaveReason, @IsDeleted = IsDeleted
FROM Adm_T_UserSickLeave
WHERE Id = @SickLeaveId;
IF @UserId IS NULL
RETURN;
-- Eşlenen talep istirahatin önceki tarihlerini taşır; kapalı aya düşen eski ya da yeni gün varsa
-- kayıt geri alınır (puantaj ve bordro kapanmış aydır).
DECLARE @RequestId uniqueidentifier, @OldStart date, @OldEnd date;
SELECT TOP 1 @RequestId = Id, @OldStart = CAST(StartDate AS date), @OldEnd = CAST(EndDate AS date)
FROM Hr_T_LeaveRequest WHERE SickLeaveId = @SickLeaveId ORDER BY IsDeleted, CreationTime;
IF dbo.Hr_F_TimesheetPeriodClosed(@TenantId, @StartDate, @EndDate) = 1
OR dbo.Hr_F_TimesheetPeriodClosed(@TenantId, @OldStart, @OldEnd) = 1
THROW 51120, N'Rapor kapalı bir puantaj dönemine düşüyor. Önce İnsan Kaynakları dönemi açmalıdır.', 1;
IF @IsDeleted = 1
BEGIN
UPDATE Hr_T_LeaveRequest
SET IsDeleted = 1, DeletionTime = GETUTCDATE(), DeleterId = @ActorId
WHERE SickLeaveId = @SickLeaveId AND IsDeleted = 0;
GOTO Recalc;
END
DECLARE @Days decimal(9, 1) = dbo.Hr_F_LeaveWorkDays(@TenantId, @StartDate, @EndDate);
IF @RequestId IS NOT NULL
BEGIN
UPDATE Hr_T_LeaveRequest
SET StartDate = @StartDate, EndDate = @EndDate, Days = @Days,
IsDeleted = 0, DeletionTime = NULL, DeleterId = NULL,
LastModificationTime = GETUTCDATE(), LastModifierId = @ActorId
WHERE Id = @RequestId;
GOTO Recalc;
END
-- Kiracıda rapor türü tanımlı değilse eşlenecek talep yoktur.
DECLARE @LeaveTypeId uniqueidentifier =
(SELECT TOP 1 Id FROM Hr_T_LeaveType
WHERE Code = N'Sick' AND IsDeleted = 0
AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL)));
IF @LeaveTypeId IS NULL
GOTO Recalc;
DECLARE @ActorName nvarchar(256) = (SELECT UserName FROM AbpUsers WHERE Id = @ActorId);
DECLARE @Year nvarchar(4) = CAST(YEAR(GETUTCDATE()) AS nvarchar(4));
-- İstirahat sağlık birimince girilmiş bir belgedir; onay akışına girmeden onaylı yazılır.
INSERT INTO Hr_T_LeaveRequest
(Id, TenantId, RequestNo, EmployeeId, EmployeeName, DepartmentId, JobPositionId, LeaveTypeId,
StartDate, EndDate, IsHalfDay, Days, [Description], SickLeaveId,
ApprovalStatus, ApprovalUser, ApprovalDate, LastNotifiedStatus, IsActive, CreationTime, CreatorId, IsDeleted)
SELECT NEWID(), @TenantId,
N'IZN-' + @Year + N'-' + RIGHT(N'00000' + CAST(
(SELECT COALESCE(MAX(TRY_CAST(RIGHT(x.RequestNo, 5) AS int)), 0) + 1
FROM Hr_T_LeaveRequest x
WHERE (x.TenantId = @TenantId OR (x.TenantId IS NULL AND @TenantId IS NULL))
AND x.RequestNo LIKE N'IZN-' + @Year + N'-%') AS nvarchar(10)), 5),
u.Id, CONCAT(u.Name, N' ', u.Surname), u.DepartmentId, u.JobPositionId, @LeaveTypeId,
@StartDate, @EndDate, 0, @Days, LEFT(@Reason, 1024), @SickLeaveId,
N'Onaylandı', @ActorName, GETUTCDATE(), N'Onaylandı', 1, GETUTCDATE(), @ActorId, 0
FROM AbpUsers u
WHERE u.Id = @UserId;
Recalc:
-- Rapora denk gelen izin günleri bakiyeye döner; puantajda raporlu günler (ve tarihi değiştiyse
-- eski günler) yeniden hesaplanır.
EXEC dbo.Hr_S_LeaveDaysRefresh @TenantId, @UserId;
IF @OldStart IS NOT NULL AND @OldStart < @StartDate SET @StartDate = @OldStart;
IF @OldEnd IS NOT NULL AND @OldEnd > @EndDate SET @EndDate = @OldEnd;
EXEC dbo.Hr_S_TimesheetCalculate @TenantId, @UserId, @StartDate, @EndDate, @ActorId;
END
GO