-- Onaylanan talebin durumu satınalmada ilerledikçe iş akışının durum alanında devam eder: iptal olmayan bütün kalemleri -- teslim edildiyse (teslim edilen ≥ istenen: iç transfer, Stoktan ya da alım Doğrula'sıyla) Tamamlandı; değilse kalemlerinden biri -- iptal olmayan bir siparişteyse Satınalma Siparişi, gönderilmiş teklif talebindeyse Teklif Talebi Gönderildi, -- taslak teklif talebindeyse Teklif Talebi; hiçbirinde değilse Onaylandı'ya döner (iade teslimi geri alırsa Tamamlandı da geri döner). -- Akış "Onaylandı"da bittiği için bu değerler hiçbir onay düğümüyle eşleşmez ve akış butonları kapalı kalır. @DocId verilirse yalnız o -- belgenin (teklifte bütün ihalenin; transferde satırlarının) kalemlerine bağlı talepler; boşsa onaylanmış bütün talepler yeniden hesaplanır. CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestSyncStatus] @DocId uniqueidentifier = NULL AS BEGIN SET NOCOUNT ON; DECLARE @Group uniqueidentifier = (SELECT ISNULL(TenderGroupId, Id) FROM Prc_T_PurchaseRfq WHERE Id = @DocId); IF @Group IS NULL SELECT @Group = ISNULL(q.TenderGroupId, q.Id) FROM Prc_T_PurchaseOrder o INNER JOIN Prc_T_PurchaseRfq q ON q.Id = o.PurchaseRfqId WHERE o.Id = @DocId; UPDATE m SET ApprovalStatus = s.Stage FROM Prc_T_MaterialRequest m CROSS APPLY (SELECT CASE WHEN NOT EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0 AND i.LineStatus <> 'Cancelled' AND i.DeliveredQuantity < i.Quantity) AND EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0 AND i.LineStatus <> 'Cancelled') THEN N'Tamamlandı' WHEN EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i INNER JOIN Prc_T_PurchaseOrderLine ol ON ol.MaterialRequestItemId = i.Id AND ol.IsDeleted = 0 INNER JOIN Prc_T_PurchaseOrder o ON o.Id = ol.PurchaseOrderId AND o.IsDeleted = 0 AND o.Status <> 'Cancelled' WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0) THEN N'Satınalma Siparişi' WHEN EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i INNER JOIN Prc_T_PurchaseRfqLine rl ON rl.MaterialRequestItemId = i.Id AND rl.IsDeleted = 0 INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId AND q.IsDeleted = 0 AND q.Status IN ('Sent', 'Purchase') WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0) THEN N'Teklif Talebi Gönderildi' WHEN EXISTS (SELECT 1 FROM Prc_T_MaterialRequestItem i INNER JOIN Prc_T_PurchaseRfqLine rl ON rl.MaterialRequestItemId = i.Id AND rl.IsDeleted = 0 INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId AND q.IsDeleted = 0 AND q.Status = 'Draft' WHERE i.MaterialRequestId = m.Id AND i.IsDeleted = 0) THEN N'Teklif Talebi' ELSE N'Onaylandı' END AS Stage) s WHERE m.IsDeleted = 0 AND m.ApprovalStatus IN (N'Onaylandı', N'Teklif Talebi', N'Teklif Talebi Gönderildi', N'Satınalma Siparişi', N'Tamamlandı') AND m.ApprovalStatus <> s.Stage -- Silinen satır da kapsamda kalır: kalemi belgeden çıkarılan talep geri dönmelidir. AND (@DocId IS NULL OR EXISTS ( SELECT 1 FROM Prc_T_MaterialRequestItem i WHERE i.MaterialRequestId = m.Id AND (EXISTS (SELECT 1 FROM Prc_T_PurchaseRfqLine rl INNER JOIN Prc_T_PurchaseRfq q ON q.Id = rl.PurchaseRfqId WHERE rl.MaterialRequestItemId = i.Id AND ISNULL(q.TenderGroupId, q.Id) = @Group) OR EXISTS (SELECT 1 FROM Prc_T_PurchaseOrderLine ol WHERE ol.MaterialRequestItemId = i.Id AND ol.PurchaseOrderId = @DocId) OR EXISTS (SELECT 1 FROM Inv_T_TransferLine tl WHERE tl.MaterialRequestItemId = i.Id AND tl.TransferId = @DocId)))); END