-- 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; $$;