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

46 lines
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 ü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.
-- Stok yetmezse karşılanabilen kadar atanır; eksik Tamamla'da bildirilir.
CREATE OR ALTER PROCEDURE [dbo].[Stk_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), @Strategy nvarchar(16);
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, @Strategy = ISNULL(pc.RemovalStrategy, 'FIFO'),
@Need = dbo.Stk_F_UomConvert(CASE WHEN l.Quantity > 0 THEN l.Quantity ELSE l.DemandQuantity END, l.UomId, p.UomId)
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_ProductCategory pc ON pc.Id = p.CategoryId
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 ISNULL(@SrcInternal, 0) = 0 THROW 50317, N'Otomatik atama yalnız stoktan çıkan satırda yapılır.', 1;
UPDATE Stk_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 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
FROM Stk_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 Stk_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
SELECT NEWID(), @Tenant, @Id, s.LotNo,
dbo.Stk_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