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