sozsoft-platform/configs/seeds/postgres/object/Stk_P_TransferLineLotStockSave.sql
2026-10-19 17:35:08 +03:00

55 lines
2.5 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.

-- Stoktan Lot Seçimi (Stk.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."Stk_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 "Stk_T_TransferLine" l
WHERE l."Id" = v_line
FOR UPDATE;
SELECT t."Status", s."LotNo", public."Stk_F_UomConvert"(s."Quantity", s."UomId", l."UomId")
INTO v_status, v_lot, v_on_hand
FROM "Stk_T_TransferLine" l
INNER JOIN "Stk_T_Transfer" t ON t."Id" = l."TransferId"
INNER JOIN "Stk_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 "Stk_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 "Stk_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."Stk_P_TransferRecalc"(v_doc);
END;
$$;