68 lines
3.9 KiB
Transact-SQL
68 lines
3.9 KiB
Transact-SQL
-- İ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
|