-- 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. p_doc_id 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 REPLACE PROCEDURE public."Prc_P_MaterialRequestSyncStatus"(p_doc_id uuid DEFAULT NULL) LANGUAGE plpgsql AS $$ DECLARE v_group uuid; BEGIN SELECT COALESCE("TenderGroupId", "Id") INTO v_group FROM "Prc_T_PurchaseRfq" WHERE "Id" = p_doc_id; IF v_group IS NULL THEN SELECT COALESCE(q."TenderGroupId", q."Id") INTO v_group FROM "Prc_T_PurchaseOrder" o INNER JOIN "Prc_T_PurchaseRfq" q ON q."Id" = o."PurchaseRfqId" WHERE o."Id" = p_doc_id; END IF; UPDATE "Prc_T_MaterialRequest" m SET "ApprovalStatus" = s.stage FROM (SELECT r."Id", CASE WHEN NOT EXISTS (SELECT 1 FROM "Prc_T_MaterialRequestItem" i WHERE i."MaterialRequestId" = r."Id" AND i."IsDeleted" = false AND i."LineStatus" <> 'Cancelled' AND i."DeliveredQuantity" < i."Quantity") AND EXISTS (SELECT 1 FROM "Prc_T_MaterialRequestItem" i WHERE i."MaterialRequestId" = r."Id" AND i."IsDeleted" = false AND i."LineStatus" <> 'Cancelled') THEN 'Tamamlandı' WHEN EXISTS (SELECT 1 FROM "Prc_T_MaterialRequestItem" i INNER JOIN "Prc_T_PurchaseOrderLine" ol ON ol."MaterialRequestItemId" = i."Id" AND ol."IsDeleted" = false INNER JOIN "Prc_T_PurchaseOrder" o ON o."Id" = ol."PurchaseOrderId" AND o."IsDeleted" = false AND o."Status" <> 'Cancelled' WHERE i."MaterialRequestId" = r."Id" AND i."IsDeleted" = false) THEN '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" = false INNER JOIN "Prc_T_PurchaseRfq" q ON q."Id" = rl."PurchaseRfqId" AND q."IsDeleted" = false AND q."Status" IN ('Sent', 'Purchase') WHERE i."MaterialRequestId" = r."Id" AND i."IsDeleted" = false) THEN '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" = false INNER JOIN "Prc_T_PurchaseRfq" q ON q."Id" = rl."PurchaseRfqId" AND q."IsDeleted" = false AND q."Status" = 'Draft' WHERE i."MaterialRequestId" = r."Id" AND i."IsDeleted" = false) THEN 'Teklif Talebi' ELSE 'Onaylandı' END AS stage FROM "Prc_T_MaterialRequest" r WHERE r."IsDeleted" = false AND r."ApprovalStatus" IN ('Onaylandı', 'Teklif Talebi', 'Teklif Talebi Gönderildi', 'Satınalma Siparişi', 'Tamamlandı') -- Silinen satır da kapsamda kalır: kalemi belgeden çıkarılan talep geri dönmelidir. AND (p_doc_id IS NULL OR EXISTS ( SELECT 1 FROM "Prc_T_MaterialRequestItem" i WHERE i."MaterialRequestId" = r."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 COALESCE(q."TenderGroupId", q."Id") = v_group) OR EXISTS (SELECT 1 FROM "Prc_T_PurchaseOrderLine" ol WHERE ol."MaterialRequestItemId" = i."Id" AND ol."PurchaseOrderId" = p_doc_id) OR EXISTS (SELECT 1 FROM "Inv_T_TransferLine" tl WHERE tl."MaterialRequestItemId" = i."Id" AND tl."TransferId" = p_doc_id))))) s WHERE m."Id" = s."Id" AND m."ApprovalStatus" <> s.stage; END; $$;