-- İhaleyi kalem bazında siparişe çevirir: kalemin Seçili satırı varsa o, yoksa Önerilen satır kazanır. -- Kazanan her teklif talebi için bir satınalma siparişi açılır (Kaynak = teklif no); kazanan teklif -- Satınalma Siparişi, hiç kalem kazanamayan teklif İptal Edildi olur. CREATE OR ALTER PROCEDURE [dbo].[Prc_P_PurchaseRfqAward] @Id uniqueidentifier, @UserId uniqueidentifier = NULL AS BEGIN SET NOCOUNT ON; DECLARE @Group uniqueidentifier, @Tenant uniqueidentifier, @Rfq uniqueidentifier, @Po uniqueidentifier, @No nvarchar(128); DECLARE @Win TABLE (LineId uniqueidentifier PRIMARY KEY, RfqId uniqueidentifier NOT NULL); SELECT @Group = TenderGroupId, @Tenant = TenantId FROM Prc_T_PurchaseRfq WHERE Id = @Id; IF EXISTS (SELECT 1 FROM Prc_T_PurchaseRfq WHERE TenderGroupId = @Group AND IsDeleted = 0 AND Status = 'Purchase') THROW 50171, N'Bu ihale zaten siparişe dönüştürüldü.', 1; INSERT INTO @Win (LineId, RfqId) SELECT c.Id, c.PurchaseRfqId FROM Prc_V_PurchaseRfqComparison c WHERE c.BaseId = @Id AND c.Status <> 'Cancelled' AND (c.IsSelected = 1 OR (c.IsRecommended = 1 AND NOT EXISTS (SELECT 1 FROM Prc_V_PurchaseRfqComparison s WHERE s.BaseId = @Id AND s.TenderLineId = c.TenderLineId AND s.IsSelected = 1 AND s.Status <> 'Cancelled'))); IF NOT EXISTS (SELECT 1 FROM @Win) THROW 50172, N'Siparişe dönüştürülecek kalem yok: tedarikçi fiyat ve terminlerini girin ya da Fiyat Karşılaştırması sekmesinde kazananı seçin.', 1; DECLARE winners CURSOR LOCAL FAST_FORWARD FOR SELECT DISTINCT RfqId FROM @Win; OPEN winners; FETCH NEXT FROM winners INTO @Rfq; WHILE @@FETCH_STATUS = 0 BEGIN SET @Po = NEWID(); EXEC Adm_P_SequenceNext N'Prc.PurchaseOrder', @Tenant, @No OUTPUT; INSERT INTO Prc_T_PurchaseOrder (Id, TenantId, OrderNo, PurchaseRfqId, SupplierId, SupplierReference, AgreementId, BranchId, OperationTypeId, WarehouseId, CurrencyId, ExpectedArrival, ConfirmDate, BuyerUserId, ProjectId, IncotermId, IncotermLocation, PaymentTermId, Terms, Status, CreationTime, CreatorId, IsDeleted) SELECT @Po, TenantId, @No, Id, SupplierId, SupplierReference, AgreementId, BranchId, OperationTypeId, WarehouseId, CurrencyId, ExpectedArrival, GETUTCDATE(), BuyerUserId, ProjectId, IncotermId, IncotermLocation, PaymentTermId, Terms, 'Purchase', GETUTCDATE(), @UserId, 0 FROM Prc_T_PurchaseRfq WHERE Id = @Rfq; INSERT INTO Prc_T_PurchaseOrderLine (Id, TenantId, PurchaseOrderId, ProductId, Description, Quantity, UomId, UnitPrice, TaxRate, Amount, DeliveryDate, MaterialRequestItemId, PurchaseRfqLineId, CreationTime, CreatorId, IsDeleted) SELECT NEWID(), l.TenantId, @Po, l.ProductId, l.Description, l.Quantity, l.UomId, l.UnitPrice, l.TaxRate, 0, l.DeliveryDate, l.MaterialRequestItemId, l.Id, GETUTCDATE(), @UserId, 0 FROM Prc_T_PurchaseRfqLine l INNER JOIN @Win w ON w.LineId = l.Id WHERE w.RfqId = @Rfq; EXEC Prc_P_PurchaseOrderRecalc @Po; EXEC Inv_P_TransferFromPurchaseOrder @Po, @UserId; FETCH NEXT FROM winners INTO @Rfq; END CLOSE winners; DEALLOCATE winners; UPDATE l SET IsSelected = CASE WHEN w.LineId IS NULL THEN 0 ELSE 1 END FROM Prc_T_PurchaseRfqLine l INNER JOIN Prc_T_PurchaseRfq r ON r.Id = l.PurchaseRfqId LEFT JOIN @Win w ON w.LineId = l.Id WHERE r.TenderGroupId = @Group AND r.IsDeleted = 0 AND r.Status <> 'Cancelled'; UPDATE r SET Status = CASE WHEN EXISTS (SELECT 1 FROM @Win w WHERE w.RfqId = r.Id) THEN 'Purchase' ELSE 'Cancelled' END FROM Prc_T_PurchaseRfq r WHERE r.TenderGroupId = @Group AND r.IsDeleted = 0 AND r.Status <> 'Cancelled'; END