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

56 lines
4.5 KiB
MySQL
Raw Normal View History

-- 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
2026-10-12 10:27:54 +00:00
-- 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.
2026-10-12 10:27:54 +00:00
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ı'
2026-10-12 10:27:54 +00:00
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ı')
2026-10-12 10:27:54 +00:00
-- 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)
2026-10-19 14:35:08 +00:00
OR EXISTS (SELECT 1 FROM "Stk_T_TransferLine" tl
WHERE tl."MaterialRequestItemId" = i."Id" AND tl."TransferId" = p_doc_id))))) s
2026-10-12 10:27:54 +00:00
WHERE m."Id" = s."Id" AND m."ApprovalStatus" <> s.stage;
END;
$$;