2026-10-14 09:07:11 +00:00
-- Planla diyaloğunun İç Transfer (App.Prc.MaterialRequestPlanSource) ve Satı nalma (App.Prc.MaterialRequestPlanVendor) ı zgaraları nı n satı r kaydı :
-- girilen Plan Miktarı kalemin taslak planı na (Prc_T_MaterialRequestPlanLine) yazı lı r, 0 ya da boş satı rı plandan çı karı r. @Id ı zgara
2026-10-14 19:26:03 +00:00
-- satı rı nı n anahtarı dı r: kalem + ':' + hedef (Transfer'de kaynak konum + ':' + lot — takipsiz üründe lot boş —, Purchase'da tedarikçi).
-- Kaynak talebin teslim konumuysa karar Stock'tur (Stoktan: kaynağı ve hedefi aynı iç transfer açı lı r). Belge açı lmaz; onay
-- Prc_P_MaterialRequestPlanConfirm'dedir. Taslak toplamı planlanacak kalanı , satı r kullanı labilir stoğu (Prc_V_MaterialRequestPlanSource
-- .AvailableQuantity: lotun ve konumun serbest stoğu) aşamaz. Batch kaydı satı rları eşzamanlı gönderdiği için kalem kilitlenir. Eksi miktar
-- "alabileceği en fazla"dı r (Seçilenleri Planla, Öner): kalanı n diğer taslak satı rlardan arta kalanı , kullanı labilir stokla sı nı rlı ;
-- alı nacak bir şey yoksa satı r değişmez.
2026-10-14 09:07:11 +00:00
CREATE OR ALTER PROCEDURE [ dbo ] . [ Prc_P_MaterialRequestPlanLineSave ]
2026-10-14 19:26:03 +00:00
@ Id nvarchar ( 160 ) ,
2026-10-14 09:07:11 +00:00
@ PlanMethod nvarchar ( 16 ) ,
@ PlanQuantity decimal ( 18 , 4 ) ,
@ TenantId uniqueidentifier ,
@ LastModifierId uniqueidentifier
AS
BEGIN
SET NOCOUNT ON ;
SET XACT_ABORT ON ;
DECLARE @ ItemId uniqueidentifier = TRY_CAST ( LEFT ( @ Id , 36 ) AS uniqueidentifier ) ,
@ Target uniqueidentifier = TRY_CAST ( SUBSTRING ( @ Id , 38 , 36 ) AS uniqueidentifier ) ,
2026-10-14 19:26:03 +00:00
@ Lot nvarchar ( 64 ) = CASE WHEN @ PlanMethod = ' Purchase ' THEN ' ' ELSE ISNULL ( SUBSTRING ( @ Id , 75 , 64 ) , ' ' ) END ,
2026-10-14 09:07:11 +00:00
@ UomId nvarchar ( 64 ) , @ Location uniqueidentifier , @ Remaining decimal ( 18 , 4 ) , @ Other decimal ( 18 , 4 ) , @ Free decimal ( 18 , 4 ) , @ Line uniqueidentifier ,
@ Qty decimal ( 18 , 4 ) = ISNULL ( @ PlanQuantity , 0 ) , @ Msg nvarchar ( 400 ) ;
BEGIN TRANSACTION ;
SELECT @ UomId = i . UomId , @ Location = r . LocationId
FROM Prc_T_MaterialRequestItem i WITH ( UPDLOCK , HOLDLOCK )
INNER JOIN Prc_T_MaterialRequest r ON r . Id = i . MaterialRequestId
WHERE i . Id = @ ItemId AND i . IsDeleted = 0 AND i . LineStatus = ' Waiting ' AND r . IsDeleted = 0
AND ( i . TenantId = @ TenantId OR ( i . TenantId IS NULL AND @ TenantId IS NULL ) )
AND r . ApprovalStatus IN ( N ' Onaylandı ' , N ' Teklif Talebi ' , N ' Teklif Talebi Gönderildi ' , N ' Satı nalma Siparişi ' ) ;
IF @ UomId IS NULL
THROW 50191 , N ' Kalem planlanamaz: talep onaylı değil ya da kalem kapalı . ' , 1 ;
IF @ PlanMethod = ' Transfer ' AND @ Target = @ Location
SET @ PlanMethod = ' Stock ' ;
SELECT @ Line = Id
FROM Prc_T_MaterialRequestPlanLine
WHERE MaterialRequestItemId = @ ItemId AND PlanMethod = @ PlanMethod AND IsDeleted = 0
2026-10-14 19:26:03 +00:00
AND @ Target = CASE WHEN @ PlanMethod = ' Purchase ' THEN SupplierId ELSE SourceLocationId END AND LotNo = @ Lot ;
2026-10-14 09:07:11 +00:00
IF @ Qty = 0
BEGIN
DELETE FROM Prc_T_MaterialRequestPlanLine WHERE Id = @ Line ;
COMMIT TRANSACTION ;
RETURN ;
END
SELECT @ Remaining = RemainingQuantity FROM Prc_V_MaterialRequestItemPlan WHERE Id = @ ItemId ;
SELECT @ Other = ISNULL ( SUM ( Quantity ) , 0 )
FROM Prc_T_MaterialRequestPlanLine
WHERE MaterialRequestItemId = @ ItemId AND IsDeleted = 0 AND ( @ Line IS NULL OR Id < > @ Line ) ;
IF @ Qty < 0
BEGIN
SET @ Qty = @ Remaining - @ Other ;
IF @ PlanMethod IN ( ' Transfer ' , ' Stock ' )
BEGIN
2026-10-14 19:26:03 +00:00
SELECT @ Free = AvailableQuantity FROM Prc_V_MaterialRequestPlanSource WHERE BaseId = @ ItemId AND LocationId = @ Target AND ISNULL ( LotNo , ' ' ) = @ Lot ;
2026-10-14 09:07:11 +00:00
IF @ Free < @ Qty SET @ Qty = @ Free ;
END
IF ISNULL ( @ Qty , 0 ) < = 0
BEGIN
COMMIT TRANSACTION ;
RETURN ;
END
END
IF @ Other + @ Qty > @ Remaining
BEGIN
SET @ Msg = CONCAT ( N ' Taslak plan toplamı planlanacak kalanı aşamaz (kalan: ' , FORMAT ( @ Remaining - @ Other , ' 0.#### ' ) , N ' ' , @ UomId , N ' ). ' ) ;
THROW 50200 , @ Msg , 1 ;
END
IF @ PlanMethod IN ( ' Transfer ' , ' Stock ' )
BEGIN
2026-10-14 19:26:03 +00:00
SELECT @ Free = AvailableQuantity FROM Prc_V_MaterialRequestPlanSource WHERE BaseId = @ ItemId AND LocationId = @ Target AND ISNULL ( LotNo , ' ' ) = @ Lot ;
2026-10-14 09:07:11 +00:00
IF @ Free IS NULL
2026-10-14 19:26:03 +00:00
THROW 50197 , N ' Kaynak konum (lot/seri takipli üründe lot) ürünün stoğu olan bir iç konum olmalı dı r. ' , 1 ;
2026-10-14 09:07:11 +00:00
IF @ Qty > @ Free
BEGIN
2026-10-14 19:26:03 +00:00
SET @ Msg = CONCAT ( N ' Kaynak konumda (lotta) yeterli serbest stok yok (kullanı labilir: ' , FORMAT ( CASE WHEN @ Free > 0 THEN @ Free ELSE 0 END , ' 0.#### ' ) , N ' ' , @ UomId , N ' ). ' ) ;
2026-10-14 09:07:11 +00:00
THROW 50198 , @ Msg , 1 ;
END
END
ELSE IF @ PlanMethod = ' Purchase '
BEGIN
IF NOT EXISTS ( SELECT 1 FROM Prc_V_MaterialRequestPlanVendor WHERE BaseId = @ ItemId AND ContactId = @ Target )
THROW 50194 , N ' Satı nalma kararı nda aktif bir tedarikçi seçilmelidir. ' , 1 ;
END
ELSE
THROW 50192 , N ' Karar Satı nalma ya da İç Transfer olmalı dı r. ' , 1 ;
IF @ Line IS NOT NULL
UPDATE Prc_T_MaterialRequestPlanLine
SET Quantity = @ Qty , LastModificationTime = GETUTCDATE ( ) , LastModifierId = @ LastModifierId
WHERE Id = @ Line ;
ELSE
2026-10-14 19:26:03 +00:00
INSERT INTO Prc_T_MaterialRequestPlanLine ( Id , TenantId , MaterialRequestItemId , PlanMethod , SupplierId , SourceLocationId , LotNo , Quantity ,
2026-10-14 09:07:11 +00:00
CreationTime , CreatorId , IsDeleted )
VALUES ( NEWID ( ) , @ TenantId , @ ItemId , @ PlanMethod , CASE WHEN @ PlanMethod = ' Purchase ' THEN @ Target END ,
2026-10-14 19:26:03 +00:00
CASE WHEN @ PlanMethod < > ' Purchase ' THEN @ Target END , @ Lot , @ Qty , GETUTCDATE ( ) , @ LastModifierId , 0 ) ;
2026-10-14 09:07:11 +00:00
COMMIT TRANSACTION ;
END
GO