sozsoft-platform/configs/seeds/postgres/object/Prc_P_MaterialRequestSyncStatus.sql
2026-10-14 22:26:03 +03:00

55 lines
4.5 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 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;
$$;