1. Overview
The Purchasing module supports procure-to-pay on the expense side: purchase order → purchase invoice → Finance accounts payable. Suppliers and vendor payments are managed in Finance. Purchase requisitions exist as a lightweight register today.
| Area | Capability |
|---|---|
| Requisitions | Numbered request register with free-text status |
| Orders | Draft, confirm, convert to invoice, cancel |
| Invoices | Create standalone or from order; post/unpost to Finance |
| Suppliers | Finance partner sub-ledgers (Vendor type) |
| Payments | Finance payment vouchers with allocations |
Compared with Sales: same order/invoice status pattern, but partners are vendors, posting hits AP/expense/input VAT, and Purchasing adds a requisition entity.
Not in this module today: goods receipt, Inventory stock receipt, automatic warehouse posting, or automated requisition approval/convert-to-PO workflow.
2. Getting started
2.1 Prerequisites
- Finance chart of accounts ready (typical posting defaults include AP, expense, and input VAT accounts).
- Open fiscal year/periods.
- Currencies configured.
- Vendors created under Finance subsidiary vendors.
- Users granted Purchasing permissions (and Finance journal post for invoice posting).
2.2 Main navigation
| Menu | Path | Behavior |
|---|---|---|
| Overview | /purchasing/overview |
Overview presentation (prototype metrics) |
| Suppliers | /purchasing/suppliers |
Redirects to Finance subsidiary vendors |
| Purchase orders | /purchasing/purchase-orders |
Live purchase orders |
| Incoming invoices | /purchasing/incoming-invoices |
Live purchase invoices |
| Supplier payments | /purchasing/supplier-payments |
Redirects to Finance payment vouchers |
| Purchase requisitions | /purchasing/requisitions |
Live requisition register |
3. Suppliers
Suppliers are not owned by Purchasing. They are Finance partner sub-ledgers with partner type Vendor.
| Field (Finance) | Use in Purchasing |
|---|---|
| Code / name | Shown in order and invoice partner pickers |
| Contact info | Master data in Finance |
| GL account | Optional AP control account override when posting |
| Active | Prefer active vendors only |
How to maintain: open Suppliers from the Purchasing menu (goes to Finance) or Finance → Subsidiary ledger — vendors.
When creating a purchase order or invoice, select the vendor from the partner list filtered to Vendor type.
4. Purchase requisitions
The requisition screen is a lightweight register.
| Field | Meaning |
|---|---|
| Requisition number | Unique per tenant |
| Status | Free-text string (default Draft) |
Current limits:
- No line items, vendor, dates, or amounts on the entity
- No submit / approve / reject workflow methods
- No convert-to-purchase-order action in the API
Use requisitions as an organizational checklist if needed, then create the formal purchase order under Purchase orders.
5. Purchase orders
5.1 Header fields
| Field | Meaning |
|---|---|
| Order number | Unique per tenant |
| Partner | Vendor sub-ledger |
| Order date | Document date |
| Fiscal period | Accounting period |
| Currency / exchange rate | Document currency |
| Status | Lifecycle state |
| Subtotal / tax / total | Amounts |
| Notes | Free text |
| Purchase invoice id | Set after conversion |
There is no formal foreign key from order to requisition in the current model.
5.2 Lines
Line number, description, quantity, unit price, line total (quantity × price), optional expense account.
5.3 Statuses
| Status | Meaning |
|---|---|
| Draft | Editable / deletable |
| Confirmed | Ready to convert to invoice |
| Invoiced | Converted; cannot cancel |
| Cancelled | Abandoned |
5.4 Actions
| Action | From | Rules |
|---|---|---|
| Create | — | Starts as Draft |
| Update / Delete | Draft only | Not after confirm |
| Confirm | Draft | Requires lines and total greater than zero |
| Convert to invoice | Confirmed | Creates Draft invoice; order becomes Invoiced |
| Cancel | Draft or Confirmed | Blocked if Invoiced |
Convert defaults: invoice number often PI-{OrderNumber} if not supplied; due date typically invoice date + 30 days; copies vendor, period, currency, rate, notes, lines, and tax.
6. Purchase invoices
6.1 Header fields
| Field | Meaning |
|---|---|
| Invoice number | Unique |
| Partner | Vendor |
| Purchase order / requisition | Optional links |
| Invoice date / due date | Billing and payment due |
| Fiscal period / currency / rate | Accounting context |
| Status | Lifecycle |
| Subtotal / tax / total | Amounts |
| Paid amount / open amount | Open = Total − Paid |
| Journal entry | Set after post |
| Notes | Free text |
6.2 Lines
Same shape as order lines. Optional expense account per line overrides the default expense account when posting.
6.3 Statuses
| Status | Meaning |
|---|---|
| Draft | Editable / deletable / cancellable |
| Posted | Posted to Finance; open AP |
| Partially paid | Some payments allocated |
| Paid | Fully allocated |
| Cancelled | Abandoned (from Draft) |
6.4 Create paths
- From order — Convert confirmed purchase order.
- Standalone — Create invoice directly (optional order/requisition ids on the DTO).
6.5 Actions
| Action | Rules |
|---|---|
| Create / Update / Delete | Draft only for update/delete |
| Post | Draft with total greater than zero → Finance JE + AP open item → Posted |
| Unpost | Reverse Finance posting → Draft; blocked if payments exist |
| Cancel | Draft only |
6.6 Tax and amounts
Tax amount is maintained on the invoice header. On post, if tax is greater than zero, Finance debits the input VAT account. Total should equal subtotal + tax. Finance validates amount consistency within a small tolerance.
7. Supplier payments
Payments are not entered in Purchasing. Use Finance payment vouchers:
- Open Supplier payments from Purchasing (redirects to Finance payment vouchers) or Finance directly.
- Create a Payment for the vendor and treasury account.
- Allocate to the posted purchase invoice open item.
- Invoice paid/open amounts and status update via Finance allocation.
Unposting a payment allocation reverts the invoice payment amounts.
8. Overview screen
/purchasing/overview provides a purchasing overview for navigation and summary presentation. Treat operational truth as the live Purchase orders, Incoming invoices, and Requisitions lists plus Finance vendor/payment screens.
9. Permissions summary
Permission group: Purchasing.
| Permission | Typical use |
|---|---|
| Requisitions | List/create/update/delete requisition register |
| Orders | List and view purchase orders |
| Orders.Create | Create orders |
| Orders.Update | Confirm, cancel, convert to invoice |
| Orders.Delete | Delete draft orders |
| Invoices | List and view invoices |
| Invoices.Create | Create invoices / convert |
| Invoices.Update | Update, unpost, cancel |
| Invoices.Delete | Delete draft invoices |
| Invoices.Post | Post invoice to Finance |
Posting also requires Finance ability to post journal entries. Convert needs both order update and invoice create rights. Ensure roles that use Incoming invoices have Invoices permissions, not only Requisitions/Orders.
10. Integration with Finance
| Event | Finance effect |
|---|---|
| Invoice Post | Debit expense (and input VAT if tax), credit AP; create vendor sub-ledger invoice open item; store journal entry id |
| Invoice Unpost | Reverse posting if no payments applied |
| Payment allocation | Increases PaidAmount; may set PartiallyPaid / Paid |
| Vendor master | Maintained only in Finance |
Default posting accounts are configured in Finance posting services (AP, expense, input VAT), with optional overrides from vendor GL account or invoice line expense account.
Appendix A — Quick procedures
A.1 Order to pay
- Ensure vendor exists in Finance.
- Create purchase order → Confirm.
- Convert to invoice.
- Post the invoice.
- Create Finance payment and allocate to the invoice until Paid.
A.2 Standalone vendor invoice
- Create Draft purchase invoice with lines, tax, and totals.
- Post.
- Pay via Finance payment allocations.
A.3 Correct a posted invoice before payment
- Ensure PaidAmount is still zero.
- Unpost → Draft.
- Edit and post again, or cancel the draft if abandoning.
A.4 Use a requisition as a tracker
- Create a requisition with a clear number.
- Update status text per your internal process.
- Create the purchase order separately when ready to buy.
Appendix B — Operating notes
| Topic | Guidance |
|---|---|
| Inventory / GRN | No goods receipt or stock posting from Purchasing in the current module |
| Requisitions | Register only; no automated convert to PO |
| Multi-line UI | Create dialogs may focus on simple line entry; use capabilities exposed in your build |
| Invoice cancel | Available in API for Draft; confirm UI button availability in your build |
| Menu vs route policy | Incoming invoices route requires Purchasing.Invoices |
| Overview | Use for orientation; rely on Orders/Invoices/Finance for transactions |
Appendix C — Document control
| Item | Value |
|---|---|
| Title | Purchasing Module User Guide |
| Source of truth | modules/purchasing and frontend/src/app/modules/purchasing |
| Format | Markdown + Mermaid (PDF edition embeds rendered figures) |
| Screenshots | Not included (by design) |
This guide describes functional capabilities of the Purchasing module as implemented in the Vertex ERP codebase. UI labels may appear in English or Arabic depending on language settings.