47 lines
2.5 KiB
MySQL
47 lines
2.5 KiB
MySQL
|
|
-- Lot/Seri Oluştur: stoğa giren satırın lot dağılımı olmayan kısmı için numaratörden lot (Inventory.LotNumber, tek lot) ya da
|
|||
|
|
-- seri (Inventory.SerialNumber, birim başına bir seri) numarası üretir. Stoktan çıkan satırda lot stoktan seçilir (Otomatik Ata).
|
|||
|
|
CREATE OR REPLACE PROCEDURE public."Inv_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 "Inv_T_TransferLine" l
|
|||
|
|
INNER JOIN "Inv_T_Transfer" t ON t."Id" = l."TransferId"
|
|||
|
|
INNER JOIN "Inv_T_Product" p ON p."Id" = l."ProductId"
|
|||
|
|
LEFT JOIN "Inv_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 "Inv_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"('Inventory.LotNumber', v_tenant, v_no);
|
|||
|
|
INSERT INTO "Inv_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"('Inventory.SerialNumber', v_tenant, v_no);
|
|||
|
|
INSERT INTO "Inv_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;
|
|||
|
|
$$;
|