sozsoft-platform/configs/seeds/sql/object/Inv_P_TransferLineLotAssign.sql
2026-10-13 00:43:05 +03:00

40 lines
2.3 KiB
Transact-SQL
Raw 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.

-- Otomatik Ata: stoktan çıkan satırın lot dağılımını kaynak konumun stoğundan ilk giren ilk çıkar (InDate) sırasıyla yeniden kurar.
-- Stok yetmezse karşılanabilen kadar atanır; eksik Tamamla'da bildirilir.
CREATE OR ALTER PROCEDURE [dbo].[Inv_P_TransferLineLotAssign]
@Id uniqueidentifier,
@UserId uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Tenant uniqueidentifier, @Method nvarchar(16), @Src uniqueidentifier, @SrcInternal bit, @ProductId uniqueidentifier,
@LineUom nvarchar(64), @ProductUom nvarchar(64), @Need decimal(18, 4);
SELECT @Tenant = l.TenantId, @Method = CASE WHEN p.TrackInventory = 1 THEN p.TrackingMethod END, @Src = t.SourceLocationId,
@SrcInternal = CASE WHEN src.LocationType = 'Internal' THEN 1 ELSE 0 END, @ProductId = l.ProductId,
@LineUom = l.UomId, @ProductUom = p.UomId,
@Need = dbo.Inv_F_UomConvert(CASE WHEN l.Quantity > 0 THEN l.Quantity ELSE l.DemandQuantity END, l.UomId, p.UomId)
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 = @Id;
IF ISNULL(@Method, '') NOT IN ('Lot', 'Serial') THROW 50314, N'Ürün lot/seri numarasıyla takip edilmiyor.', 1;
IF ISNULL(@SrcInternal, 0) = 0 THROW 50317, N'Otomatik atama yalnız stoktan çıkan satırda yapılır.', 1;
UPDATE Inv_T_TransferLineLot SET IsDeleted = 1, DeletionTime = GETUTCDATE(), DeleterId = @UserId
WHERE TransferLineId = @Id AND IsDeleted = 0;
WITH s AS (
SELECT LotNo, Quantity,
SUM(Quantity) OVER (ORDER BY InDate, LotNo ROWS UNBOUNDED PRECEDING) - Quantity AS Before
FROM Inv_T_Stock
WHERE LocationId = @Src AND ProductId = @ProductId AND LotNo <> '' AND Quantity > 0
AND (TenantId = @Tenant OR (TenantId IS NULL AND @Tenant IS NULL)))
INSERT INTO Inv_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
SELECT NEWID(), @Tenant, @Id, s.LotNo,
dbo.Inv_F_UomConvert(CASE WHEN s.Quantity < @Need - s.Before THEN s.Quantity ELSE @Need - s.Before END, @ProductUom, @LineUom),
GETUTCDATE(), @UserId, 0
FROM s
WHERE s.Before < @Need;
END