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

69 lines
3 KiB
MySQL
Raw Normal View History

2026-10-09 17:02:27 +00:00
CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestAfterSave]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
IF @Id IS NULL RETURN;
-- Onaycılar (Adm_T_Approver): departman onayı = Purchase + talebin departmanı, satınalma onayı = PurchaseDesk
UPDATE r SET
DeptApproverUserNames = (
SELECT STRING_AGG(u.UserName, '|')
FROM Adm_T_Approver a
INNER JOIN AbpUsers u ON u.Id = a.ApproverUserId AND u.IsDeleted = 0
WHERE a.IsDeleted = 0 AND a.IsActive = 1 AND a.ApprovalArea = 'Purchase'
AND a.DepartmentId = r.DepartmentId
AND ((a.TenantId IS NULL AND r.TenantId IS NULL) OR a.TenantId = r.TenantId)),
PurchaseApproverUserNames = (
SELECT STRING_AGG(u.UserName, '|')
FROM Adm_T_Approver a
INNER JOIN AbpUsers u ON u.Id = a.ApproverUserId AND u.IsDeleted = 0
WHERE a.IsDeleted = 0 AND a.IsActive = 1 AND a.ApprovalArea = 'PurchaseDesk'
AND ((a.TenantId IS NULL AND r.TenantId IS NULL) OR a.TenantId = r.TenantId))
FROM Prc_T_MaterialRequest r
WHERE r.Id = @Id;
-- Satınalma kararı: departman adımı daha önce kaydedilmişse
UPDATE r SET
PurchaseApprovedBy = COALESCE(@UserId, r.LastModifierId),
PurchaseApprovalDate = COALESCE(r.ApprovalDate, GETDATE()),
PurchaseApprovalNote = r.ApprovalNote
FROM Prc_T_MaterialRequest r
WHERE r.Id = @Id AND r.PurchaseApprovedBy IS NULL AND r.DeptApprovedBy IS NOT NULL
AND r.ApprovalStatus IN (N'Onaylandı', N'Reddedildi');
-- Departman kararı (onaylanıp satınalmaya geçti ya da departmanda reddedildi)
UPDATE r SET
DeptApprovedBy = COALESCE(@UserId, r.LastModifierId),
DeptApprovalDate = COALESCE(r.ApprovalDate, GETDATE()),
DeptApprovalNote = r.ApprovalNote
FROM Prc_T_MaterialRequest r
WHERE r.Id = @Id AND r.DeptApprovedBy IS NULL
AND r.ApprovalStatus IN (N'Satınalma Onayı', N'Onaylandı', N'Reddedildi');
-- Durum: onay akışından ve satır durumlarından türetilir
UPDATE r SET Status =
CASE
WHEN r.ApprovalStatus = N'Departman Onayı' THEN 'DeptApproval'
WHEN r.ApprovalStatus = N'Satınalma Onayı' THEN 'PurchaseApproval'
WHEN r.ApprovalStatus = N'Reddedildi' THEN 'Rejected'
WHEN r.ApprovalStatus = N'Onaylandı' THEN
CASE
WHEN s.Total > 0 AND s.Closed = s.Total THEN 'Done'
WHEN s.Closed > 0 THEN 'PartiallyDone'
ELSE 'Approved'
END
ELSE 'Draft'
END
FROM Prc_T_MaterialRequest r
CROSS APPLY (
SELECT COUNT(*) AS Total,
2026-10-09 19:57:57 +00:00
ISNULL(SUM(CASE WHEN l.LineStatus IN ('Done', 'Cancelled') THEN 1 ELSE 0 END), 0) AS Closed
2026-10-09 17:02:27 +00:00
FROM Prc_T_MaterialRequestItem l
WHERE l.MaterialRequestId = r.Id AND l.IsDeleted = 0
) s
WHERE r.Id = @Id;
END
GO