sozsoft-platform/configs/seeds/sql/object/Stk_P_TransferLineLotAssign.sql

47 lines
3 KiB
MySQL
Raw Permalink Normal View History

-- 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.
2026-10-19 14:35:08 +00:00
CREATE OR ALTER PROCEDURE [dbo].[Stk_P_TransferLineLotAssign]
2026-10-12 21:43:05 +00:00
@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);
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,
@LineUom = l.UomId, @ProductUom = p.UomId, @Strategy = ISNULL(pc.RemovalStrategy, 'FIFO'),
2026-10-19 14:35:08 +00:00
@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
2026-10-12 21:43:05 +00:00
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;
2026-10-19 14:35:08 +00:00
UPDATE Stk_T_TransferLineLot SET IsDeleted = 1, DeletionTime = GETUTCDATE(), DeleterId = @UserId
2026-10-12 21:43:05 +00:00
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
2026-10-19 14:35:08 +00:00
FROM Stk_T_Stock
2026-10-12 21:43:05 +00:00
WHERE LocationId = @Src AND ProductId = @ProductId AND LotNo <> '' AND Quantity > 0
AND (TenantId = @Tenant OR (TenantId IS NULL AND @Tenant IS NULL)))
2026-10-19 14:35:08 +00:00
INSERT INTO Stk_T_TransferLineLot (Id, TenantId, TransferLineId, LotNo, Quantity, CreationTime, CreatorId, IsDeleted)
2026-10-12 21:43:05 +00:00
SELECT NEWID(), @Tenant, @Id, s.LotNo,
2026-10-19 14:35:08 +00:00
dbo.Stk_F_UomConvert(CASE WHEN s.Quantity < @Need - s.Before THEN s.Quantity ELSE @Need - s.Before END, @ProductUom, @LineUom),
2026-10-12 21:43:05 +00:00
GETUTCDATE(), @UserId, 0
FROM s
WHERE s.Before < @Need;
END