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

44 lines
2.4 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.

-- Planla diyaloğunun Öner'i (App.Prc.MaterialRequestPlanLine › InsertCommand):
-- kalemin taslak planını sıfırlayıp planlanacak kalanı dağıtır. Önce stok, Prc_V_MaterialRequestPlanSource'un RemovalRank sırasıyla: teslim
-- konumu (stoktan karşılama), sonra ürün kategorisinin çıkış stratejisi (FIFO/LIFO); lot/seri takipli üründe lotlar da bu sırayla seçilir.
-- Her satır alabileceği en fazla miktarı alır (eksi miktar, kullanılabilir stok kuralı kayıt yordamındadır). Kalan kısım satınalma: Prc_V_MaterialRequestPlanVendor'ın SuggestRank'ı ilk olan,
-- fiyat listesinde ya da alım geçmişinde bulunan tedarikçi (hiç bilinmeyen kontak seçilmez, kalan planlanmadan kalır). Satırlar
-- Prc_P_MaterialRequestPlanLineSave ile yazılır; kalem, stok ve kalan kuralları oradadır.
CREATE OR REPLACE PROCEDURE public."Prc_P_MaterialRequestPlanSuggest"(
p_id uuid,
p_tenant_id uuid,
p_last_modifier_id uuid
)
LANGUAGE plpgsql AS $$
DECLARE v_left numeric(18, 4); v_key varchar(160); s record;
BEGIN
DELETE FROM "Prc_T_MaterialRequestPlanLine" WHERE "MaterialRequestItemId" = p_id AND "TenantId" IS NOT DISTINCT FROM p_tenant_id;
SELECT COALESCE("RemainingQuantity", 0) INTO v_left FROM public."Prc_V_MaterialRequestItemPlan" WHERE "Id" = p_id;
v_left := COALESCE(v_left, 0);
FOR s IN SELECT "Id"
FROM public."Prc_V_MaterialRequestPlanSource"
WHERE "BaseId" = p_id AND "FreeQuantity" > 0
ORDER BY "RemovalRank"
LOOP
EXIT WHEN v_left <= 0;
CALL public."Prc_P_MaterialRequestPlanLineSave"(s."Id", 'Transfer', -1, p_tenant_id, p_last_modifier_id);
SELECT COALESCE(ip."RemainingQuantity", 0) - COALESCE((SELECT SUM(x."Quantity") FROM "Prc_T_MaterialRequestPlanLine" x
WHERE x."MaterialRequestItemId" = p_id AND x."IsDeleted" = false), 0)
INTO v_left
FROM public."Prc_V_MaterialRequestItemPlan" ip
WHERE ip."Id" = p_id;
END LOOP;
IF v_left > 0 THEN
SELECT "Id" INTO v_key
FROM public."Prc_V_MaterialRequestPlanVendor"
WHERE "BaseId" = p_id AND ("Price" IS NOT NULL OR "LastPurchaseDate" IS NOT NULL)
ORDER BY "SuggestRank"
LIMIT 1;
IF v_key IS NOT NULL THEN
CALL public."Prc_P_MaterialRequestPlanLineSave"(v_key, 'Purchase', v_left, p_tenant_id, p_last_modifier_id);
END IF;
END IF;
END;
$$;