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

45 lines
2.4 KiB
MySQL
Raw Permalink Normal View History

2026-10-19 14:35:08 +00:00
-- Planla diyaloğunun Öner'i (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,
2026-10-14 09:07:11 +00:00
-- 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;
2026-10-14 09:07:11 +00:00
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"
2026-10-14 09:07:11 +00:00
FROM public."Prc_V_MaterialRequestPlanSource"
WHERE "BaseId" = p_id AND "FreeQuantity" > 0
ORDER BY "RemovalRank"
2026-10-14 09:07:11 +00:00
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;
2026-10-14 09:07:11 +00:00
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;
$$;