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

43 lines
2.3 KiB
Transact-SQL
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 ALTER PROCEDURE [dbo].[Stk_P_TransferLineLotGenerate]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Tenant uniqueidentifier, @Method nvarchar(16), @Quantity decimal(18, 4), @Remain decimal(18, 4), @SrcInternal bit, @No nvarchar(128);
SELECT @Tenant = l.TenantId, @Method = CASE WHEN p.TrackInventory = 1 THEN p.TrackingMethod END,
@Quantity = CASE WHEN l.Quantity > 0 THEN l.Quantity ELSE l.DemandQuantity END,
@SrcInternal = CASE WHEN src.LocationType = 'Internal' THEN 1 ELSE 0 END
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 = @Id;
IF ISNULL(@Method, '') NOT IN ('Lot', 'Serial') THROW 50314, N'Ürün lot/seri numarasıyla takip edilmiyor.', 1;
IF @SrcInternal = 1 THROW 50315, N'Stoktan çıkan satırda lot oluşturulmaz; Otomatik Ata ile stoktaki lotlar seçilir.', 1;
SET @Remain = @Quantity - ISNULL((SELECT SUM(Quantity) FROM Stk_T_TransferLineLot WHERE TransferLineId = @Id AND IsDeleted = 0), 0);
IF @Remain <= 0
RETURN;
IF @Method = 'Lot'
BEGIN
EXEC Adm_P_SequenceNext 'Stk.LotNumber', @Tenant, @No OUTPUT;
INSERT INTO Stk_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
VALUES (NEWID(), @Tenant, @Id, LEFT(@No, 64), @Remain, GETUTCDATE(), @UserId, 0);
RETURN;
END
IF @Remain <> FLOOR(@Remain) THROW 50316, N'Seri numaralı üründe miktar tam sayı olmalıdır.', 1;
WHILE @Remain > 0
BEGIN
EXEC Adm_P_SequenceNext 'Stk.SerialNumber', @Tenant, @No OUTPUT;
INSERT INTO Stk_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
VALUES (NEWID(), @Tenant, @Id, LEFT(@No, 64), 1, GETUTCDATE(), @UserId, 0);
SET @Remain = @Remain - 1;
END
END