sozsoft-platform/configs/seeds/sql/object/Prc_P_PurchaseRfqAward.sql

68 lines
3.8 KiB
MySQL
Raw Normal View History

2026-10-11 19:57:23 +00:00
-- İ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'PurchaseOrder1', @Tenant, @No OUTPUT;
INSERT INTO Prc_T_PurchaseOrder (Id, TenantId, OrderNo, PurchaseRfqId, SupplierId, SupplierReference, AgreementId, CurrencyId,
ExpectedArrival, OperationTypeId, ConfirmDate, BuyerUserId, ProjectId, IncotermId, IncotermLocation, PaymentTermId, Terms,
Status, CreationTime, CreatorId, IsDeleted)
SELECT @Po, TenantId, @No, Id, SupplierId, SupplierReference, AgreementId, CurrencyId,
ExpectedArrival, OperationTypeId, 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;
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