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

55 lines
2.9 KiB
MySQL
Raw Permalink Normal View History

2026-10-12 21:43:05 +00:00
-- Yapılacak miktarı doldurur ve belgeyi Hazır ya da Bekleyen yapar. Rezervasyon yoktur; Tamamla stoğu yeniden kontrol eder.
-- Kaynak konum stok tutmuyorsa (dış konum) yapılacak miktar talep kadardır. İç konumdan çıkışta satırlar ürün bazında sırayla
-- karşılanır; tümü karşılanırsa Hazır olur. Teslimatta "Mümkün olduğunca kısa sürede" politikası kısmi karşılamada da Hazır yapar.
2026-10-19 14:35:08 +00:00
CREATE OR ALTER PROCEDURE [dbo].[Stk_P_TransferCheckAvailability]
2026-10-12 21:43:05 +00:00
@Id uniqueidentifier
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Src uniqueidentifier, @Kind nvarchar(32), @Policy nvarchar(16), @Tenant uniqueidentifier, @All bit, @Any bit;
SELECT @Src = t.SourceLocationId, @Kind = t.OperationKind, @Policy = t.DeliveryPolicy, @Tenant = t.TenantId
2026-10-19 14:35:08 +00:00
FROM Stk_T_Transfer t WHERE t.Id = @Id;
2026-10-12 21:43:05 +00:00
2026-10-19 14:35:08 +00:00
IF NOT EXISTS (SELECT 1 FROM Stk_T_Location WHERE Id = @Src AND LocationType = 'Internal')
2026-10-12 21:43:05 +00:00
BEGIN
2026-10-19 14:35:08 +00:00
UPDATE Stk_T_TransferLine SET Quantity = DemandQuantity WHERE TransferId = @Id AND IsDeleted = 0 AND Quantity = 0;
UPDATE Stk_T_Transfer SET Status = 'Ready' WHERE Id = @Id;
2026-10-12 21:43:05 +00:00
RETURN;
END
DECLARE @Fill TABLE (Id uniqueidentifier PRIMARY KEY, Fill decimal(18, 4) NOT NULL, Demand decimal(18, 4) NOT NULL);
WITH d AS (
SELECT l.Id, l.ProductId, l.UomId, p.UomId AS ProductUomId, p.TrackInventory, l.DemandQuantity,
2026-10-19 14:35:08 +00:00
dbo.Stk_F_UomConvert(l.DemandQuantity, l.UomId, p.UomId) AS DemandBase,
SUM(dbo.Stk_F_UomConvert(l.DemandQuantity, l.UomId, p.UomId))
2026-10-12 21:43:05 +00:00
OVER (PARTITION BY l.ProductId ORDER BY l.CreationTime, l.Id ROWS UNBOUNDED PRECEDING) AS CumBase
2026-10-19 14:35:08 +00:00
FROM Stk_T_TransferLine l
INNER JOIN Stk_T_Product p ON p.Id = l.ProductId
2026-10-12 21:43:05 +00:00
WHERE l.TransferId = @Id AND l.IsDeleted = 0),
s AS (
SELECT ProductId, SUM(Quantity) AS OnHand
2026-10-19 14:35:08 +00:00
FROM Stk_T_Stock
2026-10-12 21:43:05 +00:00
WHERE LocationId = @Src AND (TenantId = @Tenant OR (TenantId IS NULL AND @Tenant IS NULL))
GROUP BY ProductId)
INSERT INTO @Fill (Id, Fill, Demand)
SELECT d.Id,
CASE WHEN d.TrackInventory = 0 OR ISNULL(s.OnHand, 0) >= d.CumBase THEN d.DemandQuantity
WHEN ISNULL(s.OnHand, 0) > d.CumBase - d.DemandBase
2026-10-19 14:35:08 +00:00
THEN dbo.Stk_F_UomConvert(ISNULL(s.OnHand, 0) - (d.CumBase - d.DemandBase), d.ProductUomId, d.UomId)
2026-10-12 21:43:05 +00:00
ELSE 0 END,
d.DemandQuantity
FROM d
LEFT JOIN s ON s.ProductId = d.ProductId;
2026-10-19 14:35:08 +00:00
UPDATE l SET Quantity = f.Fill FROM Stk_T_TransferLine l INNER JOIN @Fill f ON f.Id = l.Id;
2026-10-12 21:43:05 +00:00
SET @All = CASE WHEN EXISTS (SELECT 1 FROM @Fill WHERE Fill < Demand) THEN 0 ELSE 1 END;
SET @Any = CASE WHEN EXISTS (SELECT 1 FROM @Fill WHERE Fill > 0) THEN 1 ELSE 0 END;
2026-10-19 14:35:08 +00:00
UPDATE Stk_T_Transfer
2026-10-12 21:43:05 +00:00
SET Status = CASE WHEN @All = 1 OR (@Kind = 'Delivery' AND ISNULL(@Policy, 'Direct') = 'Direct' AND @Any = 1) THEN 'Ready' ELSE 'Waiting' END
WHERE Id = @Id;
END