CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestAfterSave] @Id uniqueidentifier, @UserId uniqueidentifier = NULL AS BEGIN SET NOCOUNT ON; IF @Id IS NULL RETURN; -- Satır planlanan miktarı boşsa talep miktarıyla doldur UPDATE l SET PlannedQuantity = l.Quantity FROM Prc_T_MaterialRequestItem l WHERE l.MaterialRequestId = @Id AND l.IsDeleted = 0 AND l.PlannedQuantity IS NULL; -- 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' WHEN s.Planned > 0 THEN 'InProgress' ELSE 'Approved' END ELSE 'Draft' END FROM Prc_T_MaterialRequest r CROSS APPLY ( SELECT COUNT(*) AS Total, ISNULL(SUM(CASE WHEN l.LineStatus IN ('Done', 'Cancelled') THEN 1 ELSE 0 END), 0) AS Closed, ISNULL(SUM(CASE WHEN l.LineStatus IN ('Planned', 'Done') THEN 1 ELSE 0 END), 0) AS Planned FROM Prc_T_MaterialRequestItem l WHERE l.MaterialRequestId = r.Id AND l.IsDeleted = 0 ) s WHERE r.Id = @Id; END GO