2026-10-14 19:26:03 +00:00
-- Otomatik Ata: stoktan çı kan satı rı n lot dağı lı mı nı kaynak konumun stoğundan ürün kategorisinin çı kı ş stratejisiyle yeniden kurar
-- (FIFO: ilk giren ilk çı kar, LIFO: son giren ilk çı kar — InDate, aynı anda girenlerde lot/seri no; kategorisiz ürün FIFO). Planlama'nı n Öner'i aynı kuralı izler.
2026-10-12 21:43:05 +00:00
-- 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 ,
2026-10-14 19:26:03 +00:00
@ LineUom nvarchar ( 64 ) , @ ProductUom nvarchar ( 64 ) , @ Need decimal ( 18 , 4 ) , @ Strategy nvarchar ( 16 ) ;
2026-10-12 21:43:05 +00:00
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 ,
2026-10-14 19:26:03 +00:00
@ LineUom = l . UomId , @ ProductUom = p . UomId , @ Strategy = ISNULL ( pc . RemovalStrategy , ' FIFO ' ) ,
2026-10-12 21:43:05 +00:00
@ 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
2026-10-14 19:26:03 +00:00
LEFT JOIN Inv_T_ProductCategory pc ON pc . Id = p . CategoryId
2026-10-12 21:43:05 +00:00
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 ,
2026-10-14 19:26:03 +00:00
SUM ( Quantity ) OVER ( ORDER BY CASE WHEN @ Strategy = ' LIFO ' THEN NULL ELSE ISNULL ( InDate , ' 9999-12-31 ' ) END ,
CASE WHEN @ Strategy = ' LIFO ' THEN ISNULL ( InDate , ' 1900-01-01 ' ) END DESC ,
CASE WHEN @ Strategy = ' LIFO ' THEN NULL ELSE LotNo END ,
CASE WHEN @ Strategy = ' LIFO ' THEN LotNo END DESC
ROWS UNBOUNDED PRECEDING ) - Quantity AS Before
2026-10-12 21:43:05 +00:00
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