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

59 lines
3.9 KiB
PL/PgSQL
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 REPLACE PROCEDURE public."Prc_P_PurchaseRfqAward"(p_id uuid, p_user_id uuid DEFAULT NULL)
LANGUAGE plpgsql AS $$
DECLARE v_group uuid; v_tenant uuid; v_rfq uuid; v_po uuid; v_no varchar(128);
BEGIN
SELECT "TenderGroupId", "TenantId" INTO v_group, v_tenant FROM "Prc_T_PurchaseRfq" WHERE "Id" = p_id;
IF EXISTS (SELECT 1 FROM "Prc_T_PurchaseRfq" WHERE "TenderGroupId" = v_group AND "IsDeleted" = false AND "Status" = 'Purchase') THEN
RAISE EXCEPTION 'Bu ihale zaten siparişe dönüştürüldü.' USING ERRCODE = 'P0001', DETAIL = '50171';
END IF;
DROP TABLE IF EXISTS pg_temp.prc_award_win;
CREATE TEMP TABLE prc_award_win ON COMMIT DROP AS
SELECT c."Id" AS line_id, c."PurchaseRfqId" AS rfq_id
FROM "Prc_V_PurchaseRfqComparison" c
WHERE c."BaseId" = p_id AND c."Status" <> 'Cancelled'
AND (c."IsSelected"
OR (c."IsRecommended" AND NOT EXISTS (SELECT 1 FROM "Prc_V_PurchaseRfqComparison" s
WHERE s."BaseId" = p_id AND s."TenderLineId" = c."TenderLineId"
AND s."IsSelected" AND s."Status" <> 'Cancelled')));
IF NOT EXISTS (SELECT 1 FROM prc_award_win) THEN
RAISE EXCEPTION '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.'
USING ERRCODE = 'P0001', DETAIL = '50172';
END IF;
FOR v_rfq IN SELECT DISTINCT rfq_id FROM prc_award_win LOOP
v_po := gen_random_uuid();
CALL public."Adm_P_SequenceNext"('Prc.PurchaseOrder', v_tenant, v_no);
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 v_po, "TenantId", v_no, "Id", "SupplierId", "SupplierReference", "AgreementId", "BranchId", "OperationTypeId", "WarehouseId", "CurrencyId",
"ExpectedArrival", NOW() AT TIME ZONE 'UTC', "BuyerUserId", "ProjectId", "IncotermId", "IncotermLocation", "PaymentTermId", "Terms",
'Purchase', NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM "Prc_T_PurchaseRfq" WHERE "Id" = v_rfq;
INSERT INTO "Prc_T_PurchaseOrderLine" ("Id", "TenantId", "PurchaseOrderId", "ProductId", "Description", "Quantity", "UomId", "UnitPrice", "TaxRate",
"Amount", "DeliveryDate", "MaterialRequestItemId", "PurchaseRfqLineId", "CreationTime", "CreatorId", "IsDeleted")
SELECT gen_random_uuid(), l."TenantId", v_po, l."ProductId", l."Description", l."Quantity", l."UomId", l."UnitPrice", l."TaxRate",
0, l."DeliveryDate", l."MaterialRequestItemId", l."Id", NOW() AT TIME ZONE 'UTC', p_user_id, false
FROM "Prc_T_PurchaseRfqLine" l
INNER JOIN prc_award_win w ON w.line_id = l."Id"
WHERE w.rfq_id = v_rfq;
CALL public."Prc_P_PurchaseOrderRecalc"(v_po);
CALL public."Stk_P_TransferFromPurchaseOrder"(v_po, p_user_id);
END LOOP;
UPDATE "Prc_T_PurchaseRfqLine" l SET "IsSelected" = EXISTS (SELECT 1 FROM prc_award_win w WHERE w.line_id = l."Id")
FROM "Prc_T_PurchaseRfq" r
WHERE r."Id" = l."PurchaseRfqId" AND r."TenderGroupId" = v_group AND r."IsDeleted" = false AND r."Status" <> 'Cancelled';
UPDATE "Prc_T_PurchaseRfq" r
SET "Status" = CASE WHEN EXISTS (SELECT 1 FROM prc_award_win w WHERE w.rfq_id = r."Id") THEN 'Purchase' ELSE 'Cancelled' END
WHERE r."TenderGroupId" = v_group AND r."IsDeleted" = false AND r."Status" <> 'Cancelled';
END;
$$;