Purchase Orders

From supplier agreement to warehouse receipt — every purchase tracked and costed.

View Pricing

Key Capabilities

Purchase orders that automatically update your stock, your costs, and your books.

Full PO Lifecycle

Draft → Confirmed → Received → Billed → Done. Each state change is logged with user, timestamp, and before/after details. Gap-free PO-YYYY-NNNNN numbering.

Blanket PO Agreements

Pre-negotiate prices and quantities with suppliers. Release individual POs against the blanket agreement. Track utilization, remaining quantities, and expiry dates.

Automatic Receiving

When a PO is confirmed, a stock picking is created automatically. Receive goods into your warehouse — AVCO cost updates instantly on every incoming move.

Vendor Bill Integration

Create vendor bills directly from received POs. The system maps quantities and prices, posts COGS and AP journal entries, and adjusts AVCO if bill price differs from PO price.

How It Works

1
Create & Confirm

Build the PO with product lines, prices, and quantities. Set supplier, currency, and tax rates. On confirmation, the PO number is assigned and an incoming stock picking is created automatically.

2
Receive Goods

When goods arrive, process the stock picking. Assign lots or serials if tracked. AVCO cost recalculates atomically on every received line. Partial receipts supported.

3
Bill & Close

Create the vendor bill from the PO. If the bill price differs from the PO price, the system adjusts inventory cost via StockQuant.adjust_cost_for_bill(). Journal entries post automatically.


Blanket PO detail screenshot

Blanket Purchase Orders

Negotiate pricing and committed quantities upfront with a Blanket PO (BPO-YYYY-NNNNN). Then release individual purchase orders against it over time. The system tracks how much has been released, what remains, and when the agreement expires.

  • Workflow: draft → active → completed / expired / cancelled
  • create_release() generates a linked PO with blanket pricing
  • Per-line tracking: committed_qty, released_qty, remaining_qty
  • Utilization percentage and days remaining calculated in real time
  • Discount percent per line carried to release POs

PO workflow diagram screenshot

PO → Inventory → Accounting Flow

Confirming a PO triggers a chain: stock picking is created for your warehouse, receiving updates inventory quantities and AVCO cost, and the vendor bill posts COGS and AP journal entries. The entire flow is automated — no manual journal entries needed.

  • Confirm → creates StockPicking (incoming) from supplier location to warehouse
  • Receive → StockMove.action_done() updates StockQuant with weighted average cost
  • Bill → creates vendor bill: DR Product Costs / CR Accounts Payable
  • Cost adjustment if bill price ≠ PO price via adjust_cost_for_bill()
  • Source linking: every JE traces back to the PO via source_type + source_id

Multi-currency PO screenshot

Multi-Currency Purchasing

Create purchase orders in the supplier's currency. Exchange rates are fetched automatically and applied at confirmation. All cost calculations convert to your home currency so inventory valuation stays consistent.

  • PO currency independent from company home currency
  • Exchange rate snapshot at confirmation time
  • Line prices stored in order currency; costs converted to home currency
  • Fiscal position mapping for intra-EU and export tax rules
  • Supplier email templates for sending POs via company SMTP
Works Seamlessly With
Inventory Accounting Invoicing Suppliers Purchasing Intelligence

Buy Smarter, Receive Faster

See how ToolHub connects your purchase orders to your warehouse, your costs, and your books — automatically.

See Pricing