2026-10-14 09:07:11 +00:00
-- Planlama kararı : talep kaleminin planlanacak kalanı ndan @PlanQuantity kadarı nı satı nalmaya ya da iç transfere ayı rı r; kalanı n geri kalanı
-- listede kalı r. Planla diyaloğunun onayı (Prc_P_MaterialRequestPlanConfirm) her taslak plan satı rı için çağı rı r.
-- Purchase: tedarikçinin talebin şubesi ve deposu için taslak teklif talebi varsa kalem ona eklenir (kalem zaten oradaysa miktarı artar), yoksa
-- talebin deposunun alı m operasyon türüyle yeni taslak teklif talebi açı lı r (para birimi ve koşullar kontak kartı ndan; alı cı — satı nalma sorumlusu —
-- planlayan). Fiyat tedarikçinin fiyat listesinden gelir; teklif → sipariş → alı m akı şı oradan sürer.
2026-10-14 19:26:03 +00:00
-- Transfer: kaynak konumun (lot/seri takipli üründe @PlanLotNo lotunun) serbest stoğu (Prc_V_MaterialRequestPlanSource) yetmelidir; aynı
-- kaynak → talebin konumu için taslak iç transfer varsa satı r ona, yoksa kaynak deponun iç transfer operasyon türüyle yeni
-- taslak açı lı r. Depoda aynı türden birkaç operasyon türü olabilir (Bakı m Sarf Tüketimi, Departman Sarf Çı kı şı …); türün kendi
-- numaratörünü taşı yanı (SequenceName '….InternalTransfer' / '….Receipt' ile biter) seçilir, taslak da yalnı z o türde aranı r. Lot planlandı ysa transfer satı rı nı n lot dağı lı mı na (Inv_T_TransferLineLot, satı rı n biriminde) eklenir; depo Detaylar ya da
-- Otomatik Ata ile değiştirebilir. Kalanı n tamamı transferle
2026-10-14 09:07:11 +00:00
-- planlanan, satı nalma payı olmayan kalem transfer belgesinin yeniden hesabı nda kapanı r (Prc_P_MaterialRequestItemSync).
2026-10-14 19:26:03 +00:00
-- Stock: stok talebin teslim konumundadı r; Transfer gibi iç transfer açı lı r, kaynak ve hedef teslim konumudur (Doğrula stoğa dokunmaz,
-- teslimi kaydeder: kalemin teslim edilen miktarı artar). Belge numarası ve durumu Plan Takibi'ne transferden yansı r.
2026-10-14 09:07:11 +00:00
CREATE OR ALTER PROCEDURE [ dbo ] . [ Prc_P_MaterialRequestPlan ]
@ Id uniqueidentifier ,
@ PlanMethod nvarchar ( 16 ) ,
@ PlanQuantity decimal ( 18 , 4 ) ,
@ PlanSupplierId uniqueidentifier ,
@ PlanSourceLocationId uniqueidentifier ,
2026-10-14 19:26:03 +00:00
@ PlanLotNo nvarchar ( 64 ) ,
2026-10-14 09:07:11 +00:00
@ TenantId uniqueidentifier ,
@ LastModifierId uniqueidentifier
AS
BEGIN
SET NOCOUNT ON ;
SET XACT_ABORT ON ;
DECLARE @ ProductId uniqueidentifier , @ UomId nvarchar ( 64 ) , @ DueDate datetime , @ Reason nvarchar ( 256 ) , @ Branch uniqueidentifier ,
@ Warehouse uniqueidentifier , @ Location uniqueidentifier , @ RequestNo nvarchar ( 32 ) , @ Remaining decimal ( 18 , 4 ) ,
@ Doc uniqueidentifier , @ Line uniqueidentifier , @ OpType uniqueidentifier , @ SrcWarehouse uniqueidentifier ,
@ Free decimal ( 18 , 4 ) , @ No nvarchar ( 128 ) , @ Msg nvarchar ( 400 ) ;
BEGIN TRANSACTION ;
-- Kalem kilitlenir: aynı kalemin eşzamanlı iki planı kalanı iki kez dağı tamaz.
SELECT @ ProductId = i . ProductId , @ UomId = i . UomId , @ DueDate = i . DueDate , @ Reason = i . RequestReason , @ Branch = r . BranchId ,
@ Warehouse = r . WarehouseId , @ Location = r . LocationId , @ RequestNo = r . RequestNo
FROM Prc_T_MaterialRequestItem i WITH ( UPDLOCK , HOLDLOCK )
INNER JOIN Prc_T_MaterialRequest r ON r . Id = i . MaterialRequestId
WHERE i . Id = @ Id 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 @ ProductId IS NULL
THROW 50191 , N ' Kalem planlanamaz: talep onaylı değil ya da kalem kapalı . ' , 1 ;
SELECT @ Remaining = RemainingQuantity FROM Prc_V_MaterialRequestItemPlan WHERE Id = @ Id ;
IF ISNULL ( @ PlanQuantity , 0 ) < = 0
THROW 50192 , N ' Plan miktarı sı fı rdan büyük olmalı dı r. ' , 1 ;
IF @ PlanQuantity > @ Remaining
BEGIN
SET @ Msg = CONCAT ( N ' Plan miktarı planlanacak kalanı aşamaz (kalan: ' , FORMAT ( @ Remaining , ' 0.#### ' ) , N ' ' , @ UomId , N ' ). ' ) ;
THROW 50193 , @ Msg , 1 ;
END
IF @ PlanMethod = ' Purchase '
BEGIN
IF @ PlanSupplierId IS NULL
THROW 50194 , N ' Satı nalma kararı nda tedarikçi seçilmelidir. ' , 1 ;
SELECT TOP 1 @ Doc = Id
FROM Prc_T_PurchaseRfq
WHERE IsDeleted = 0 AND Status = ' Draft ' AND SupplierId = @ PlanSupplierId AND BranchId = @ Branch AND WarehouseId = @ Warehouse
AND ( TenantId = @ TenantId OR ( TenantId IS NULL AND @ TenantId IS NULL ) )
ORDER BY CreationTime DESC ;
IF @ Doc IS NULL
BEGIN
SELECT TOP 1 @ OpType = Id
FROM Inv_T_OperationType
WHERE IsDeleted = 0 AND IsActive = 1 AND OperationKind = ' Receipt ' AND WarehouseId = @ Warehouse
2026-10-14 19:26:03 +00:00
AND ( TenantId = @ TenantId OR ( TenantId IS NULL AND @ TenantId IS NULL ) )
ORDER BY CASE WHEN SequenceName LIKE CONCAT ( ' %. ' , OperationKind ) THEN 0 ELSE 1 END , Name ;
2026-10-14 09:07:11 +00:00
IF @ OpType IS NULL
THROW 50195 , N ' Talebin deposu için aktif bir alı m operasyon türü tanı mlı değil. ' , 1 ;
SET @ Doc = NEWID ( ) ;
EXEC Adm_P_SequenceNext N ' Prc.PurchaseRfq ' , @ TenantId , @ No OUTPUT ;
INSERT INTO Prc_T_PurchaseRfq ( Id , TenantId , RfqNo , TenderGroupId , SupplierId , BranchId , OperationTypeId , WarehouseId , CurrencyId ,
BuyerUserId , IncotermId , IncotermLocation , PaymentTermId , CreationTime , CreatorId , IsDeleted )
SELECT @ Doc , @ TenantId , LEFT ( @ No , 32 ) , @ Doc , c . Id , @ Branch , @ OpType , @ Warehouse , COALESCE ( c . SupplierCurrency , ' TRY ' ) ,
@ LastModifierId , c . PurchaseIncotermId , c . PurchaseIncotermLocation , c . PurchasePaymentTermId ,
GETUTCDATE ( ) , @ LastModifierId , 0
FROM Adm_T_Contact c
WHERE c . Id = @ PlanSupplierId AND c . IsDeleted = 0 ;
IF @ @ ROWCOUNT = 0
THROW 50194 , N ' Satı nalma kararı nda tedarikçi seçilmelidir. ' , 1 ;
END
SELECT @ Line = Id FROM Prc_T_PurchaseRfqLine WHERE PurchaseRfqId = @ Doc AND MaterialRequestItemId = @ Id AND IsDeleted = 0 ;
IF @ Line IS NOT NULL
UPDATE Prc_T_PurchaseRfqLine
SET Quantity = Quantity + dbo . Inv_F_UomConvert ( @ PlanQuantity , @ UomId , UomId ) , LastModificationTime = GETUTCDATE ( ) , LastModifierId = @ LastModifierId
WHERE Id = @ Line ;
ELSE
INSERT INTO Prc_T_PurchaseRfqLine ( Id , TenantId , PurchaseRfqId , ProductId , Description , Quantity , UomId , UnitPrice , TaxRate , Amount ,
DeliveryDate , MaterialRequestItemId , CreationTime , CreatorId , IsDeleted )
SELECT NEWID ( ) , @ TenantId , @ Doc , @ ProductId , @ Reason , @ PlanQuantity , @ UomId ,
ISNULL ( ( SELECT TOP 1 ps . Price FROM Inv_T_ProductSupplier ps
WHERE ps . ProductId = @ ProductId AND ps . ContactId = @ PlanSupplierId AND ps . IsDeleted = 0
ORDER BY ps . MinQuantity ) , 0 ) ,
ISNULL ( p . PurchaseTaxRate , 0 ) , 0 , @ DueDate , @ Id , GETUTCDATE ( ) , @ LastModifierId , 0
FROM Inv_T_Product p
WHERE p . Id = @ ProductId ;
EXEC Prc_P_PurchaseRfqRecalc @ Doc ;
END
2026-10-14 19:26:03 +00:00
ELSE IF @ PlanMethod IN ( ' Transfer ' , ' Stock ' )
2026-10-14 09:07:11 +00:00
BEGIN
2026-10-14 19:26:03 +00:00
IF @ PlanMethod = ' Stock '
SET @ PlanSourceLocationId = @ Location ;
2026-10-14 09:07:11 +00:00
IF @ PlanSourceLocationId IS NULL
THROW 50196 , N ' İç transfer kararı nda kaynak konum seçilmelidir. ' , 1 ;
-- Konum ve serbest stok kuralı diyaloğun İç Transfer ı zgarası yla aynı dı r.
SELECT @ SrcWarehouse = WarehouseId , @ Free = FreeQuantity
FROM Prc_V_MaterialRequestPlanSource
2026-10-14 19:26:03 +00:00
WHERE BaseId = @ Id AND LocationId = @ PlanSourceLocationId AND ISNULL ( LotNo , ' ' ) = ISNULL ( @ PlanLotNo , ' ' ) ;
IF @ SrcWarehouse IS NULL OR ( @ PlanMethod = ' Transfer ' AND @ PlanSourceLocationId = @ Location )
THROW 50197 , N ' Kaynak konum, talebin teslim konumundan farklı ve ürünün (lot/seri takipli üründe lotun) stoğu olan bir iç konum olmalı dı r. ' , 1 ;
2026-10-14 09:07:11 +00:00
IF @ PlanQuantity > @ Free
BEGIN
SET @ Msg = CONCAT ( N ' Kaynak konumda yeterli serbest stok yok (serbest: ' , FORMAT ( CASE WHEN @ Free > 0 THEN @ Free ELSE 0 END , ' 0.#### ' ) , N ' ' , @ UomId , N ' ). ' ) ;
THROW 50198 , @ Msg , 1 ;
END
2026-10-14 19:26:03 +00:00
SELECT TOP 1 @ OpType = Id
FROM Inv_T_OperationType
WHERE IsDeleted = 0 AND IsActive = 1 AND OperationKind = ' InternalTransfer ' AND WarehouseId = @ SrcWarehouse
AND ( TenantId = @ TenantId OR ( TenantId IS NULL AND @ TenantId IS NULL ) )
ORDER BY CASE WHEN SequenceName LIKE CONCAT ( ' %. ' , OperationKind ) THEN 0 ELSE 1 END , Name ;
IF @ OpType IS NULL
THROW 50199 , N ' Kaynak depo için aktif bir iç transfer operasyon türü tanı mlı değil. ' , 1 ;
2026-10-14 09:07:11 +00:00
SELECT TOP 1 @ Doc = Id
FROM Inv_T_Transfer
2026-10-14 19:26:03 +00:00
WHERE IsDeleted = 0 AND OperationTypeId = @ OpType AND Status = ' Draft ' AND ReturnOfId IS NULL AND BackorderOfId IS NULL
2026-10-14 09:07:11 +00:00
AND SourceLocationId = @ PlanSourceLocationId AND DestinationLocationId = @ Location
AND ( TenantId = @ TenantId OR ( TenantId IS NULL AND @ TenantId IS NULL ) )
ORDER BY CreationTime DESC ;
IF @ Doc IS NULL
BEGIN
SET @ Doc = NEWID ( ) ;
INSERT INTO Inv_T_Transfer ( Id , TenantId , BranchId , WarehouseId , OperationTypeId , OperationKind , SourceLocationId , DestinationLocationId ,
SourceDocument , ResponsibleUserId , Status , CreationTime , CreatorId , IsDeleted )
SELECT @ Doc , @ TenantId , ot . BranchId , ot . WarehouseId , ot . Id , ' InternalTransfer ' , @ PlanSourceLocationId , @ Location ,
@ RequestNo , @ LastModifierId , ' Draft ' , GETUTCDATE ( ) , @ LastModifierId , 0
FROM Inv_T_OperationType ot
WHERE ot . Id = @ OpType ;
END
ELSE
UPDATE Inv_T_Transfer
SET SourceDocument = LEFT ( CONCAT ( SourceDocument , CASE WHEN ISNULL ( SourceDocument , ' ' ) = ' ' THEN ' ' ELSE N ' , ' END , @ RequestNo ) , 128 )
WHERE Id = @ Doc AND CHARINDEX ( @ RequestNo , ISNULL ( SourceDocument , ' ' ) ) = 0 ;
2026-10-14 19:26:03 +00:00
-- Planlanan miktar yapı lacak miktardı r: lotsuz satı rda doğrudan yazı lı r, lotlu satı rda lot dağı lı mı ndan (Inv_P_TransferRecalc) gelir.
2026-10-14 09:07:11 +00:00
SELECT @ Line = Id FROM Inv_T_TransferLine WHERE TransferId = @ Doc AND MaterialRequestItemId = @ Id AND IsDeleted = 0 ;
IF @ Line IS NOT NULL
UPDATE Inv_T_TransferLine
2026-10-14 19:26:03 +00:00
SET DemandQuantity = DemandQuantity + dbo . Inv_F_UomConvert ( @ PlanQuantity , @ UomId , UomId ) ,
Quantity = Quantity + CASE WHEN ISNULL ( @ PlanLotNo , ' ' ) = ' ' THEN dbo . Inv_F_UomConvert ( @ PlanQuantity , @ UomId , UomId ) ELSE 0 END ,
LastModificationTime = GETUTCDATE ( ) , LastModifierId = @ LastModifierId
2026-10-14 09:07:11 +00:00
WHERE Id = @ Line ;
ELSE
2026-10-14 19:26:03 +00:00
BEGIN
SET @ Line = NEWID ( ) ;
2026-10-14 09:07:11 +00:00
INSERT INTO Inv_T_TransferLine ( Id , TenantId , TransferId , ProductId , Description , DemandQuantity , Quantity , UomId , MaterialRequestItemId ,
CreationTime , CreatorId , IsDeleted )
2026-10-14 19:26:03 +00:00
VALUES ( @ Line , @ TenantId , @ Doc , @ ProductId , @ Reason , @ PlanQuantity , CASE WHEN ISNULL ( @ PlanLotNo , ' ' ) = ' ' THEN @ PlanQuantity ELSE 0 END , @ UomId , @ Id ,
GETUTCDATE ( ) , @ LastModifierId , 0 ) ;
END
2026-10-14 09:07:11 +00:00
2026-10-14 19:26:03 +00:00
IF ISNULL ( @ PlanLotNo , ' ' ) < > ' '
2026-10-14 09:07:11 +00:00
BEGIN
2026-10-14 19:26:03 +00:00
UPDATE ll
SET Quantity = ll . Quantity + dbo . Inv_F_UomConvert ( @ PlanQuantity , @ UomId , tl . UomId ) , LastModificationTime = GETUTCDATE ( ) ,
LastModifierId = @ LastModifierId
FROM Inv_T_TransferLineLot ll
INNER JOIN Inv_T_TransferLine tl ON tl . Id = ll . TransferLineId
WHERE ll . TransferLineId = @ Line AND ll . LotNo = @ PlanLotNo AND ll . IsDeleted = 0 ;
IF @ @ ROWCOUNT = 0
INSERT INTO Inv_T_TransferLineLot ( Id , TenantId , TransferLineId , LotNo , Quantity , CreationTime , CreatorId , IsDeleted )
SELECT NEWID ( ) , @ TenantId , tl . Id , @ PlanLotNo , dbo . Inv_F_UomConvert ( @ PlanQuantity , @ UomId , tl . UomId ) , GETUTCDATE ( ) , @ LastModifierId , 0
FROM Inv_T_TransferLine tl
WHERE tl . Id = @ Line ;
2026-10-14 09:07:11 +00:00
END
2026-10-14 19:26:03 +00:00
-- Numara ve yeniden hesap (kalemin kapanması dahil) belge kaydı sonrası yla aynı dı r.
EXEC Inv_P_TransferAfterSave @ Doc , @ LastModifierId ;
2026-10-14 09:07:11 +00:00
END
ELSE
THROW 50192 , N ' Karar Satı nalma, İç Transfer ya da Stoktan olmalı dı r. ' , 1 ;
COMMIT TRANSACTION ;
END