Home / Help Center / pos-app / Reports / Purchase Reports
🚚 Reports

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.

📍 Menu path: Reports → Purchase Reports
👤 Who uses it: Roles with Reports permission (export buttons need Export permission)
🏷️ Plan tier: advanced+

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

Step-by-Step Guide

1 Review overall purchase activity

  1. Open Purchase Summary, set a date range, and read Total Orders, Total Spend, Received and Pending cards.
  2. 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

  1. Open Supplier-wise Purchase, set a date range, and read Suppliers Active, Total Spend and Top Supplier cards.
  2. 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

  1. 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.
  2. 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

  1. 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.
  2. 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

  1. 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.
  2. 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.
  3. 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 / ButtonWhat it does
Left-hand report menuLists all 7 purchase report types; the active one is stored in the URL as ?r=.
Purchase SummaryOrders/spend/tax/discount cards, status breakdown, daily trend and the full purchase-order list.
Supplier-wise PurchaseSuppliers ranked by total spend with orders count, average per order and a share-of-total bar.
Item-wise PurchaseProducts ranked by purchase cost, based on the most recent 30 purchase orders in the date range, with ordered vs received quantities.
Pending Purchase OrdersDraft/Ordered/Partial orders by default, with an Urgency column flagging Overdue (30+ days) and Late (14–30 days) orders.
Purchase Return ReportRETURN-type stock movements in the date range with total quantity returned and products affected.
Supplier LedgerSupplier dropdown selector; shows debit/credit ledger entries if available, otherwise falls back to a recent-purchase-orders list.
Supplier Payment ReportAll/Has Outstanding/Clear filter with credit-limit utilisation bar and an Over Limit flag per supplier.
Date range pickerShared 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 buttonDownloads the currently loaded report's rows as a spreadsheet where Export permission is granted.

Tips & Best Practices

Troubleshooting & FAQ

Item-wise Purchase is missing an item I definitely purchased.
This report only scans the 30 most recent purchase orders within your date range. Narrow the date range (or check if the PO is older than the 30 most recent) to bring it into view.
Pending Purchase Orders looks empty even though I have open POs.
The default filter only shows Draft/Ordered/Partial statuses. Use the status dropdown to explicitly select "Received" or "Cancelled" if you need to see those.
Supplier Ledger shows purchase orders instead of a debit/credit ledger.
That is the built-in fallback: if the ledger endpoint returns no entries for that supplier yet, the page shows their recent purchase orders instead so the tab is never fully empty.
A supplier never shows "Over Limit" even though they clearly owe a lot.
The Over Limit flag only triggers when the supplier has a Credit Limit greater than zero set on their profile. Suppliers with no credit limit set show "No limit set" instead.

🧑‍💻 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 Purchase
  • GET /purchase-orders (params: page, limit, status) — Item-wise Purchase (list), Pending Purchase Orders
  • GET /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 Report
  • GET /suppliers (params: page, limit, search, isActive) — Supplier Ledger (list), Supplier Payment Report
  • GET /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):

  • PurchaseOrder
  • PurchaseOrderItem
  • Supplier
  • InventoryMovement

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.