Factorizer/Cluster ERP WikiCluster ERP Türkçe
Home / API reference

API

Procurement API: Purchase orders endpoints (purchase_orders)

HTTP endpoints of the purchase_orders sub-module of procurement: 18 routes with permissions, schemas, status codes, and error codes.

This page lists the 18 endpoints of the purchase_orders sub-module of the procurement module, under /api/v1/procurement. Scope: Order records, creation from a purchase request, receivable lines, send, acknowledge, in transit, receive per item, close, cancel, and order items. The module entry page is Procurement API.

Group facts

Item Value Source
Base path /api/v1/procurement src/cluster_erp/core/module_base.py:37-38, src/cluster_erp/modules/procurement/module.py:70
Routers 1 router objects in 1 files; listed in the section Endpoints src/cluster_erp/modules/procurement/module.py:35
Endpoints 18, counted from the route decorators and add_api_route calls of the routers that register_routes mounts src/cluster_erp/modules/procurement/purchase_orders/routes.py
Authentication Bearer header or session cookie, resolved by get_current_user; see Authentication and headers src/cluster_erp/modules/auth/guards.py:85-167
Permission guard 18 of 18 routes declare require_permission src/cluster_erp/modules/auth/guards.py:205-240
App entitlement gate require_app("procurement") on every mounted router src/cluster_erp/modules/procurement/module.py:82
Error format JSON body {"error": {...}}; see Errors src/cluster_erp/server/error_handler.py:33-46

Endpoints

Method Path Handler Permission Request Query Response Status Source
GET /api/v1/procurement/purchase-orders/ list_purchase_orders purchase_order.read none status, vendor_id, search, product_ids, project_id, limit, offset dict 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:58
POST /api/v1/procurement/purchase-orders/ create_purchase_order purchase_order.create PurchaseOrderCreate none PurchaseOrderRead 201 src/cluster_erp/modules/procurement/purchase_orders/routes.py:98
POST /api/v1/procurement/purchase-orders/from-pr/{pr_id} create_from_pr purchase_order.create CreateFromPrRequest none PurchaseOrderRead 201 src/cluster_erp/modules/procurement/purchase_orders/routes.py:110
GET /api/v1/procurement/purchase-orders/receivable-lines receivable_lines purchase_order.read none po_id, vendor_id list[dict[str, Any]] 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:129
GET /api/v1/procurement/purchase-orders/{po_id} get_purchase_order purchase_order.read none none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:147
PUT /api/v1/procurement/purchase-orders/{po_id} update_purchase_order purchase_order.update PurchaseOrderUpdate none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:161
DELETE /api/v1/procurement/purchase-orders/{po_id} delete_purchase_order purchase_order.delete none none none 204 src/cluster_erp/modules/procurement/purchase_orders/routes.py:174
POST /api/v1/procurement/purchase-orders/bulk-delete bulk_delete_purchase_orders purchase_order.bulk_delete BulkDeleteRequest none BulkDeleteResponse 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:186
POST /api/v1/procurement/purchase-orders/{po_id}/send send_purchase_order purchase_order.send none none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:201
POST /api/v1/procurement/purchase-orders/{po_id}/acknowledge acknowledge_purchase_order purchase_order.update none none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:213
POST /api/v1/procurement/purchase-orders/{po_id}/in-transit mark_in_transit purchase_order.update none none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:225
POST /api/v1/procurement/purchase-orders/{po_id}/items/{item_id}/receive receive_item purchase_order.receive ReceiveItemRequest none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:237
POST /api/v1/procurement/purchase-orders/items/{item_id}/receive receive_item_by_line purchase_order.receive ReceiveItemRequest none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:254
POST /api/v1/procurement/purchase-orders/{po_id}/close close_purchase_order purchase_order.update none none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:269
POST /api/v1/procurement/purchase-orders/{po_id}/cancel cancel_purchase_order purchase_order.update PoCancelRequest none PurchaseOrderRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:281
POST /api/v1/procurement/purchase-orders/{po_id}/items add_item purchase_order.update PurchaseOrderItemCreate none PurchaseOrderItemRead 201 src/cluster_erp/modules/procurement/purchase_orders/routes.py:297
PUT /api/v1/procurement/purchase-orders/{po_id}/items/{item_id} update_item purchase_order.update PurchaseOrderItemUpdate none PurchaseOrderItemRead 200 (default) src/cluster_erp/modules/procurement/purchase_orders/routes.py:314
DELETE /api/v1/procurement/purchase-orders/{po_id}/items/{item_id} remove_item purchase_order.update none none none 204 src/cluster_erp/modules/procurement/purchase_orders/routes.py:331

Error codes

The table lists the error codes that code under src/cluster_erp/modules/procurement/purchase_orders/ raises, found by a syntax-tree scan for AppError(...), the factories in src/cluster_erp/core/errors.py (not_found, conflict, protected, permission_denied, privilege_escalation, check_version), and HTTPException(...). A status of 400 is the AppError default (src/cluster_erp/core/errors.py:23). Guard errors (401, 403), the entitlement codes, and validation errors (422) apply to every route and are listed on Errors.

Code HTTP status Raised in First site
CONCURRENCY_VERSION_CONFLICT 409 services src/cluster_erp/modules/procurement/purchase_orders/services.py:429
PO_GOODS_RECEIPT_FAILED 400 services src/cluster_erp/modules/procurement/purchase_orders/services.py:821
PO_INVALID_STATUS 400, 409 services src/cluster_erp/modules/procurement/purchase_orders/services.py:86
PO_ITEM_ALREADY_RECEIVED 400 services src/cluster_erp/modules/procurement/purchase_orders/services.py:735
PO_NO_ORDER_DATE 400 services src/cluster_erp/modules/procurement/purchase_orders/services.py:630
PO_NO_TECHNICAL_ATTACHMENT 400 services src/cluster_erp/modules/procurement/purchase_orders/services.py:637
PO_RECEIVE_QTY_EXCEEDS 400 services src/cluster_erp/modules/procurement/purchase_orders/services.py:743
PO_VENDOR_BLACKLISTED 400 services src/cluster_erp/modules/procurement/purchase_orders/services.py:233
RESOURCE_NOT_FOUND 404 routes, services src/cluster_erp/modules/procurement/purchase_orders/routes.py:157

Verified against commit 92f8051 on 2026-11-13.

Verified against commit 92f8051 · 2026-11-13