2026-10-04 19:17:16 +00:00
|
|
|
|
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;
|
|
|
|
|
|
|
2026-10-04 21:18:13 +00:00
|
|
|
|
-- 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;
|
2026-10-04 19:17:16 +00:00
|
|
|
|
|
|
|
|
|
|
IF @IsDeleted = 1
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
UPDATE Hr_T_LeaveRequest
|
|
|
|
|
|
SET IsDeleted = 1, DeletionTime = GETUTCDATE(), DeleterId = @ActorId
|
|
|
|
|
|
WHERE SickLeaveId = @SickLeaveId AND IsDeleted = 0;
|
2026-10-04 21:18:13 +00:00
|
|
|
|
GOTO Recalc;
|
2026-10-04 19:17:16 +00:00
|
|
|
|
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;
|
2026-10-04 21:18:13 +00:00
|
|
|
|
GOTO Recalc;
|
2026-10-04 19:17:16 +00:00
|
|
|
|
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
|
2026-10-04 21:18:13 +00:00
|
|
|
|
GOTO Recalc;
|
2026-10-04 19:17:16 +00:00
|
|
|
|
|
|
|
|
|
|
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;
|
2026-10-04 21:18:13 +00:00
|
|
|
|
|
|
|
|
|
|
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;
|
2026-10-04 19:17:16 +00:00
|
|
|
|
END
|
|
|
|
|
|
GO
|