40 lines
2.3 KiB
PL/PgSQL
40 lines
2.3 KiB
PL/PgSQL
CREATE OR REPLACE PROCEDURE public."Prc_P_PurchaseOrderImportRequest"(p_id uuid)
|
||
LANGUAGE plpgsql AS $$
|
||
DECLARE v_req uuid; v_tenant uuid; v_supplier uuid; v_agr uuid; v_status varchar(16); v_cnt int;
|
||
BEGIN
|
||
SELECT "MaterialRequestId", "TenantId", "SupplierId", "AgreementId", "Status"
|
||
INTO v_req, v_tenant, v_supplier, v_agr, v_status
|
||
FROM "Prc_T_PurchaseOrder" WHERE "Id" = p_id;
|
||
IF v_req IS NULL THEN RETURN; END IF;
|
||
IF v_status = 'Cancelled' THEN
|
||
RAISE EXCEPTION 'İptal edilmiş belgeye talepten aktarım yapılamaz.';
|
||
END IF;
|
||
|
||
INSERT INTO "Prc_T_PurchaseOrderLine" ("Id", "TenantId", "PurchaseOrderId", "ProductId", "Description", "Quantity", "UomId",
|
||
"UnitPrice", "TaxRate", "Amount", "MaterialRequestItemId", "CreationTime", "IsDeleted")
|
||
SELECT gen_random_uuid(), v_tenant, p_id, i."ProductId", i."RequestReason", i."Quantity", i."UomId",
|
||
COALESCE((SELECT al."UnitPrice" FROM "Prc_T_PurchaseAgreementLine" al
|
||
WHERE al."AgreementId" = v_agr AND al."ProductId" = i."ProductId" AND al."IsDeleted" = false LIMIT 1),
|
||
(SELECT ps."Price" FROM "Inv_T_ProductSupplier" ps
|
||
WHERE ps."ProductId" = i."ProductId" AND ps."ContactId" = v_supplier AND ps."IsDeleted" = false
|
||
ORDER BY ps."MinQuantity" LIMIT 1), 0),
|
||
COALESCE(p."PurchaseTaxRate", 0), 0, i."Id", CURRENT_TIMESTAMP, false
|
||
FROM "Prc_T_MaterialRequestItem" i
|
||
INNER JOIN "Prc_T_MaterialRequest" r ON r."Id" = i."MaterialRequestId"
|
||
LEFT JOIN "Inv_T_Product" p ON p."Id" = i."ProductId"
|
||
WHERE i."MaterialRequestId" = v_req AND i."IsDeleted" = false
|
||
AND r."ApprovalStatus" = 'Onaylandı'
|
||
AND i."FulfillmentMethod" = 'Purchase' AND i."LineStatus" = 'Waiting'
|
||
AND NOT EXISTS (SELECT 1 FROM "Prc_T_PurchaseOrderLine" ol
|
||
INNER JOIN "Prc_T_PurchaseOrder" o ON o."Id" = ol."PurchaseOrderId"
|
||
WHERE ol."MaterialRequestItemId" = i."Id" AND ol."IsDeleted" = false
|
||
AND o."IsDeleted" = false AND o."Status" <> 'Cancelled');
|
||
GET DIAGNOSTICS v_cnt = ROW_COUNT;
|
||
|
||
UPDATE "Prc_T_PurchaseOrder" SET "MaterialRequestId" = NULL WHERE "Id" = p_id;
|
||
|
||
IF v_cnt = 0 THEN
|
||
RAISE EXCEPTION 'Seçilen talepte aktarılacak kalem yok (onaylı, Satınalma ile karşılanacak, bekleyen ve başka belgede olmayan kalem bulunamadı).';
|
||
END IF;
|
||
END;
|
||
$$;
|