-- Fiyat Girişi (App.Prc.PurchaseRfqComparison) satır kaydı. Batch kaydı her satırı ayrı ve eşzamanlı istekle gönderir; -- satır güncellemesi ile teklifin yeniden hesabı aynı işlemde, önce ihalenin kök teklifi kilitlenerek yapılır. Grid ihalenin -- bütün tedarikçi tekliflerinin satırlarını taşır; kilit ihale düzeyinde olduğu için bu satırlar sırayla işlenir ve satırı -- kilitleyip diğer isteğin satırını bekleyen iki istek kilitlenmez (deadlock). CREATE OR REPLACE PROCEDURE public."Prc_P_PurchaseRfqComparisonSave"( p_id uuid, p_unit_price numeric(18, 4), p_delivery_date timestamp, p_is_selected boolean, p_tenant_id uuid, p_last_modification_time timestamp, p_last_modifier_id uuid ) LANGUAGE plpgsql AS $$ DECLARE v_rfq uuid; v_group uuid; v_status varchar(16); BEGIN SELECT "PurchaseRfqId" INTO v_rfq FROM "Prc_T_PurchaseRfqLine" WHERE "Id" = p_id; SELECT COALESCE("TenderGroupId", "Id") INTO v_group FROM "Prc_T_PurchaseRfq" WHERE "Id" = v_rfq; PERFORM 1 FROM "Prc_T_PurchaseRfq" WHERE "Id" = v_group FOR UPDATE; SELECT "Status" INTO v_status FROM "Prc_T_PurchaseRfq" WHERE "Id" = v_rfq; IF v_status IN ('Purchase', 'Cancelled') THEN RAISE EXCEPTION 'Siparişe dönüştürülmüş ya da iptal edilmiş teklifin kalemi değiştirilemez.' USING ERRCODE = 'P0001', DETAIL = '50142'; END IF; UPDATE "Prc_T_PurchaseRfqLine" SET "UnitPrice" = p_unit_price, "DeliveryDate" = p_delivery_date, "IsSelected" = p_is_selected, "LastModificationTime" = p_last_modification_time, "LastModifierId" = p_last_modifier_id WHERE "Id" = p_id AND "TenantId" IS NOT DISTINCT FROM p_tenant_id; -- Fiyatı girilen teklif yanıtlanmış sayılır; geçerlilik verilmemişse sipariş son tarihine kadar geçerlidir. IF p_unit_price > 0 THEN UPDATE "Prc_T_PurchaseRfq" SET "SupplierResponse" = 'Quoted', "QuoteDate" = COALESCE("QuoteDate", NOW() AT TIME ZONE 'UTC'), "QuoteValidUntil" = COALESCE("QuoteValidUntil", CAST("OrderDeadline" AS date)) WHERE "Id" = v_rfq AND "SupplierResponse" = 'Waiting'; END IF; CALL public."Prc_P_PurchaseRfqRecalc"(v_rfq); END; $$;