-- Planla diyaloğunun Öner'i (Prc.MaterialRequestPlanLine › InsertCommand): -- kalemin taslak planını sıfırlayıp planlanacak kalanı dağıtır. Önce stok, Prc_V_MaterialRequestPlanSource'un RemovalRank sırasıyla: teslim -- konumu (stoktan karşılama), sonra ürün kategorisinin çıkış stratejisi (FIFO/LIFO); lot/seri takipli üründe lotlar da bu sırayla seçilir. -- Her satır alabileceği en fazla miktarı alır (eksi miktar, kullanılabilir stok kuralı kayıt yordamındadır). Kalan kısım satınalma: Prc_V_MaterialRequestPlanVendor'ın SuggestRank'ı ilk olan, -- fiyat listesinde ya da alım geçmişinde bulunan tedarikçi (hiç bilinmeyen kontak seçilmez, kalan planlanmadan kalır). Satırlar -- Prc_P_MaterialRequestPlanLineSave ile yazılır; kalem, stok ve kalan kuralları oradadır. CREATE OR ALTER PROCEDURE [dbo].[Prc_P_MaterialRequestPlanSuggest] @Id uniqueidentifier, @TenantId uniqueidentifier, @LastModifierId uniqueidentifier AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; DECLARE @Left decimal(18, 4), @Key nvarchar(160); BEGIN TRANSACTION; DELETE FROM Prc_T_MaterialRequestPlanLine WHERE MaterialRequestItemId = @Id AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL)); SELECT @Left = ISNULL(RemainingQuantity, 0) FROM Prc_V_MaterialRequestItemPlan WHERE Id = @Id; DECLARE sources CURSOR LOCAL STATIC FOR SELECT Id FROM Prc_V_MaterialRequestPlanSource WHERE BaseId = @Id AND FreeQuantity > 0 ORDER BY RemovalRank; OPEN sources; FETCH NEXT FROM sources INTO @Key; WHILE @@FETCH_STATUS = 0 AND @Left > 0 BEGIN EXEC Prc_P_MaterialRequestPlanLineSave @Key, 'Transfer', -1, @TenantId, @LastModifierId; SELECT @Left = ISNULL(ip.RemainingQuantity, 0) - ISNULL((SELECT SUM(x.Quantity) FROM Prc_T_MaterialRequestPlanLine x WHERE x.MaterialRequestItemId = @Id AND x.IsDeleted = 0), 0) FROM Prc_V_MaterialRequestItemPlan ip WHERE ip.Id = @Id; FETCH NEXT FROM sources INTO @Key; END CLOSE sources; DEALLOCATE sources; IF @Left > 0 BEGIN SET @Key = NULL; SELECT TOP 1 @Key = Id FROM Prc_V_MaterialRequestPlanVendor WHERE BaseId = @Id AND (Price IS NOT NULL OR LastPurchaseDate IS NOT NULL) ORDER BY SuggestRank; IF @Key IS NOT NULL EXEC Prc_P_MaterialRequestPlanLineSave @Key, 'Purchase', @Left, @TenantId, @LastModifierId; END COMMIT TRANSACTION; END GO