-- Stoktan Lot Seçimi (App.Inventory.TransferLineLotStock) satır kaydı: yazılan miktar varsa o, yoksa Seç işaretliyse lotun -- eldeki miktarı atanır (ekranda Seç aynı değeri yazar); ikisi de yoksa lot satırdan çıkar. Batch kaydı her satırı ayrı ve -- eşzamanlı istekle gönderir; aynı satırın lotları üst üste yazılmasın diye hareket satırı kilitlenip istekler sırayla işlenir. CREATE OR REPLACE PROCEDURE public."Inv_P_TransferLineLotStockSave"( p_id varchar, p_is_selected boolean DEFAULT NULL, p_selected_quantity numeric(18, 4) DEFAULT NULL, p_last_modifier_id uuid DEFAULT NULL ) LANGUAGE plpgsql AS $$ DECLARE v_line uuid := CAST(left(p_id, 36) AS uuid); v_stock uuid := CAST(substr(p_id, 38, 36) AS uuid); v_tenant uuid; v_doc uuid; v_status varchar(16); v_lot varchar(64); v_on_hand numeric(18, 4); v_qty numeric(18, 4); BEGIN SELECT l."TenantId", l."TransferId" INTO v_tenant, v_doc FROM "Inv_T_TransferLine" l WHERE l."Id" = v_line FOR UPDATE; SELECT t."Status", s."LotNo", public."Inv_F_UomConvert"(s."Quantity", s."UomId", l."UomId") INTO v_status, v_lot, v_on_hand FROM "Inv_T_TransferLine" l INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId" INNER JOIN "Inv_T_Stock" s ON s."Id" = v_stock AND s."LocationId" = t."SourceLocationId" AND s."ProductId" = l."ProductId" WHERE l."Id" = v_line; IF v_lot IS NULL THEN RAISE EXCEPTION 'Lot, belgenin kaynak konumunda bulunamadı.' USING ERRCODE = 'P0001', DETAIL = '50322'; END IF; IF v_status IN ('Done', 'Cancelled') THEN RAISE EXCEPTION 'Tamamlanmış ya da iptal edilmiş belgenin satırı değiştirilemez.' USING ERRCODE = 'P0001', DETAIL = '50313'; END IF; IF COALESCE(p_selected_quantity, 0) > 0 THEN v_qty := p_selected_quantity; ELSIF p_is_selected THEN v_qty := v_on_hand; ELSE v_qty := 0; END IF; IF v_qty > v_on_hand THEN RAISE EXCEPTION 'Seçilen miktar lotun eldeki miktarını aşamaz.' USING ERRCODE = 'P0001', DETAIL = '50324'; END IF; UPDATE "Inv_T_TransferLineLot" SET "IsDeleted" = true, "DeletionTime" = NOW() AT TIME ZONE 'UTC', "DeleterId" = p_last_modifier_id WHERE "TransferLineId" = v_line AND "LotNo" = v_lot AND "IsDeleted" = false; IF v_qty > 0 THEN INSERT INTO "Inv_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted") VALUES (gen_random_uuid(), v_tenant, v_line, v_lot, v_qty, NOW() AT TIME ZONE 'UTC', p_last_modifier_id, false); END IF; CALL public."Inv_P_TransferRecalc"(v_doc); END; $$;