sozsoft-platform/configs/seeds/sql/object/Prc_P_PurchaseRfqAward.sql
2026-10-19 17:35:08 +03:00

73 lines
4 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- İ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;
SET XACT_ABORT ON;
DECLARE @Group uniqueidentifier, @Tenant uniqueidentifier, @Rfq uniqueidentifier, @Po uniqueidentifier, @No nvarchar(128);
BEGIN TRANSACTION;
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 Stk_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';
COMMIT TRANSACTION;
END