sozsoft-platform/configs/seeds/postgres/object/Prc_P_MaterialRequestSyncStatus.sql

48 lines
3.6 KiB
MySQL
Raw Normal View History

2026-10-12 10:27:54 +00:00
-- Onaylanan talebin durumu satınalmada ilerledikçe iş akışının durum alanında devam eder: 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. 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) 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 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')
-- 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))))) s
WHERE m."Id" = s."Id" AND m."ApprovalStatus" <> s.stage;
END;
$$;