Purchase Reports
Purchase Reports is a 7-report workbench for the buying side of the business — overall purchase summary, supplier and item breakdowns, pending order chasing, returns tracking, and supplier ledgers/payment status.
Overview
Purchase Reports uses the same left-nav pattern as Sales/Stock Reports: 7 report types listed on the left, loaded on the right, with the active one stored in the URL as ?r=.
The 7 reports are: Purchase Summary, Supplier-wise Purchase, Item-wise Purchase, Pending Purchase Orders, Purchase Return Report, Supplier Ledger and Supplier Payment Report.
This page requires the purchase_orders feature (rather than the generic reports feature that gates the other report pages) at the Advanced plan tier or above.
Before You Start
- Requires a role with Reports permission and the
purchase_ordersfeature at the Advanced plan tier or above. - Export buttons only appear for roles with Export permission.
- Supplier Ledger and Supplier Payment Report need suppliers to have Credit Limit and Credit Days set for their utilisation figures to be meaningful.
- Item-wise Purchase only analyses the most recent 30 purchase orders inside your selected date range — narrow the range if you have many POs.
Step-by-Step Guide
1 Review overall purchase activity
- Open Purchase Summary, set a date range, and read Total Orders, Total Spend, Received and Pending cards.
- Check the Status Breakdown bars (Draft/Ordered/Partial/Received/Cancelled) and the Daily Trend table side by side, then scroll the full Purchase Orders table (PO number, supplier, date, items, subtotal, tax, total, status) with its totals footer.
2 See which suppliers you buy the most from
- Open Supplier-wise Purchase, set a date range, and read Suppliers Active, Total Spend and Top Supplier cards.
- Review the ranked table (rank, supplier, orders, total spend, average per order) with a share-of-total bar per supplier.
3 Drill into specific items purchased
- Open Item-wise Purchase, set a date range and search by product name/SKU; note the report is based on your most recent 30 purchase orders in that range.
- Read the table of quantity ordered vs quantity received (pending shown highlighted) and total cost with a cost-share bar per product.
4 Chase pending purchase orders
- Open Pending Purchase Orders; by default it shows only Draft/Ordered/Partial orders, or pick a specific status from the dropdown to see Received/Cancelled too.
- Check the Urgency column — orders more than 30 days old are flagged Overdue (row highlighted), 14–30 days old are flagged Late.
5 Track purchase returns and supplier accounts
- Open Purchase Return Report, set a date range, and review return entries (tracked as RETURN-type stock movements) with total quantity returned and products affected.
- Open Supplier Ledger, pick a supplier from the dropdown, and review their summary card (credit limit, outstanding, credit days, total POs) plus either a full debit/credit ledger or, if no ledger entries exist yet, a fallback list of their recent purchase orders.
- Open Supplier Payment Report, filter by All/Has Outstanding/Clear, and review each supplier's credit limit utilisation bar — suppliers over their credit limit are highlighted and flagged "Over Limit".
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Left-hand report menu | Lists all 7 purchase report types; the active one is stored in the URL as ?r= |
Purchase Summary | Orders/spend/tax/discount cards, status breakdown, daily trend and the full purchase-order list. |
Supplier-wise Purchase | Suppliers ranked by total spend with orders count, average per order and a share-of-total bar. |
Item-wise Purchase | Products ranked by purchase cost, based on the most recent 30 purchase orders in the date range, with ordered vs received quantities. |
Pending Purchase Orders | Draft/Ordered/Partial orders by default, with an Urgency column flagging Overdue (30+ days) and Late (14–30 days) orders. |
Purchase Return Report | RETURN-type stock movements in the date range with total quantity returned and products affected. |
Supplier Ledger | Supplier dropdown selector; shows debit/credit ledger entries if available, otherwise falls back to a recent-purchase-orders list. |
Supplier Payment Report | All/Has Outstanding/Clear filter with credit-limit utilisation bar and an Over Limit flag per supplier. |
Date range picker | Shared From/To filter used by most of the 7 reports. |
Status dropdown (Pending POs) | Switches between the default pending-only view and a specific status (Draft/Ordered/Partial/Received/Cancelled). |
Export button | Downloads the currently loaded report's rows as a spreadsheet where Export permission is granted. |
Tips & Best Practices
- Item-wise Purchase only scans your most recent 30 purchase orders inside the selected date range — narrow the date range if you have many POs and are not seeing an item you expect.
- Set Credit Limit and Credit Days on every supplier — the Supplier Payment Report's utilisation bar and "Over Limit" flag are only meaningful once those values exist.
- Use Pending Purchase Orders' Urgency column as a daily follow-up list — anything marked Overdue needs a call to the supplier.
- If Supplier Ledger shows a purchase-order list instead of debit/credit entries, that just means no ledger postings exist yet for that supplier — it is a fallback view, not an error.
Troubleshooting & FAQ
Item-wise Purchase is missing an item I definitely purchased.
Pending Purchase Orders looks empty even though I have open POs.
Supplier Ledger shows purchase orders instead of a debit/credit ledger.
A supplier never shows "Over Limit" even though they clearly owe a lot.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/PurchaseReportsPage.jsx
Backend endpoints used:
GET /reports/purchases (params: from, to) — Purchase Summary, Supplier-wise PurchaseGET /purchase-orders (params: page, limit, status) — Item-wise Purchase (list), Pending Purchase OrdersGET /purchase-orders/:id — Item-wise Purchase (batch-fetches full detail for up to 30 POs)GET /inventory/movements (params: type=RETURN, from, to) — Purchase Return ReportGET /suppliers (params: page, limit, search, isActive) — Supplier Ledger (list), Supplier Payment ReportGET /suppliers/:id — Supplier Ledger (selected supplier detail)GET /ledger/suppliers/:id — Supplier Ledger (debit/credit entries, falls back to PO list on failure)
Related tables (db-core repositories):
PurchaseOrderPurchaseOrderItemSupplierInventoryMovement
Redux slices:
scope (selectCurrentScope / getScopeQueryParams)
Feature flag key: purchase_orders (requires advanced plan tier or above)
Item-wise Purchase is computed client-side: it lists purchase orders, filters to the date range, then calls the single-PO detail endpoint for up to 30 of them in parallel and aggregates line items by product — there is no dedicated backend aggregation route for this one. Supplier Ledger treats a failed/empty /ledger/suppliers/:id call as "no ledger yet" rather than an error, falling back to the supplier's purchase-order history.