55 lines
2.5 KiB
PL/PgSQL
55 lines
2.5 KiB
PL/PgSQL
-- 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;
|
||
$$;
|