-- Planla diyaloğunun Öner'i (App.Prc.MaterialRequestPlanLine › InsertCommand): -- kalemin taslak planını sıfırlayıp planlanacak kalanı dağıtır. Önce stok: teslim konumu (stoktan karşılama), sonra serbest stoğu en çok -- olan konum (Prc_V_MaterialRequestPlanSource); 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_qty numeric(18, 4); v_key varchar(80); 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", "FreeQuantity" FROM public."Prc_V_MaterialRequestPlanSource" WHERE "BaseId" = p_id AND "FreeQuantity" > 0 ORDER BY "IsDestination" DESC, "FreeQuantity" DESC LOOP EXIT WHEN v_left <= 0; v_qty := LEAST(s."FreeQuantity", v_left); CALL public."Prc_P_MaterialRequestPlanLineSave"(s."Id", 'Transfer', v_qty, p_tenant_id, p_last_modifier_id); v_left := v_left - v_qty; 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; $$;