55 lines
4.5 KiB
PL/PgSQL
55 lines
4.5 KiB
PL/PgSQL
-- 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;
|
||
$$;
|