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

46 lines
2.5 KiB
PL/PgSQL
Raw Permalink 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.

-- Lot/Seri Oluştur: stoğa giren satırın lot dağılımı olmayan kısmı için numaratörden lot (Stk.LotNumber, tek lot) ya da
-- seri (Stk.SerialNumber, birim başına bir seri) numarası üretir. Stoktan çıkan satırda lot stoktan seçilir (Otomatik Ata).
CREATE OR REPLACE PROCEDURE public."Stk_P_TransferLineLotGenerate"(p_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_tenant uuid; v_method varchar(16); v_quantity numeric(18, 4); v_remain numeric(18, 4); v_src_internal boolean; v_no varchar(128);
BEGIN
SELECT l."TenantId", CASE WHEN p."TrackInventory" THEN p."TrackingMethod" END,
CASE WHEN l."Quantity" > 0 THEN l."Quantity" ELSE l."DemandQuantity" END,
COALESCE(src."LocationType" = 'Internal', false)
INTO v_tenant, v_method, v_quantity, v_src_internal
FROM "Stk_T_TransferLine" l
INNER JOIN "Stk_T_Transfer" t ON t."Id" = l."TransferId"
INNER JOIN "Stk_T_Product" p ON p."Id" = l."ProductId"
LEFT JOIN "Stk_T_Location" src ON src."Id" = t."SourceLocationId"
WHERE l."Id" = p_id;
IF COALESCE(v_method, '') NOT IN ('Lot', 'Serial') THEN
RAISE EXCEPTION 'Ürün lot/seri numarasıyla takip edilmiyor.' USING ERRCODE = 'P0001', DETAIL = '50314';
END IF;
IF v_src_internal THEN
RAISE EXCEPTION 'Stoktan çıkan satırda lot oluşturulmaz; Otomatik Ata ile stoktaki lotlar seçilir.' USING ERRCODE = 'P0001', DETAIL = '50315';
END IF;
v_remain := v_quantity - COALESCE((SELECT SUM("Quantity") FROM "Stk_T_TransferLineLot" WHERE "TransferLineId" = p_id AND "IsDeleted" = false), 0);
IF v_remain <= 0 THEN
RETURN;
END IF;
IF v_method = 'Lot' THEN
CALL public."Adm_P_SequenceNext"('Stk.LotNumber', v_tenant, v_no);
INSERT INTO "Stk_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
VALUES (gen_random_uuid(), v_tenant, p_id, left(v_no, 64), v_remain, NOW() AT TIME ZONE 'UTC', p_user_id, false);
RETURN;
END IF;
IF v_remain <> floor(v_remain) THEN
RAISE EXCEPTION 'Seri numaralı üründe miktar tam sayı olmalıdır.' USING ERRCODE = 'P0001', DETAIL = '50316';
END IF;
WHILE v_remain > 0 LOOP
CALL public."Adm_P_SequenceNext"('Stk.SerialNumber', v_tenant, v_no);
INSERT INTO "Stk_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
VALUES (gen_random_uuid(), v_tenant, p_id, left(v_no, 64), 1, NOW() AT TIME ZONE 'UTC', p_user_id, false);
v_remain := v_remain - 1;
END LOOP;
END;
$$;