sozsoft-platform/configs/seeds/postgres/object/Stk_P_TransferLineLotGenerate.sql

47 lines
2.5 KiB
MySQL
Raw Normal View History

2026-10-19 14:35:08 +00:00
-- 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)
2026-10-12 21:43:05 +00:00
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
2026-10-19 14:35:08 +00:00
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"
2026-10-12 21:43:05 +00:00
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;
2026-10-19 14:35:08 +00:00
v_remain := v_quantity - COALESCE((SELECT SUM("Quantity") FROM "Stk_T_TransferLineLot" WHERE "TransferLineId" = p_id AND "IsDeleted" = false), 0);
2026-10-12 21:43:05 +00:00
IF v_remain <= 0 THEN
RETURN;
END IF;
IF v_method = 'Lot' THEN
2026-10-19 14:35:08 +00:00
CALL public."Adm_P_SequenceNext"('Stk.LotNumber', v_tenant, v_no);
INSERT INTO "Stk_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
2026-10-12 21:43:05 +00:00
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
2026-10-19 14:35:08 +00:00
CALL public."Adm_P_SequenceNext"('Stk.SerialNumber', v_tenant, v_no);
INSERT INTO "Stk_T_TransferLineLot" ("Id", "TenantId", "TransferLineId", "LotNo", "Quantity", "CreationTime", "CreatorId", "IsDeleted")
2026-10-12 21:43:05 +00:00
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;
$$;