Purchasing

The full procurement cycle: internal requisition, purchase order, goods receipt, purchase invoice and returns — plus supplier management and balances.

ℹ️ Cycle sequence: Requisition → Purchase order → Goods receipt → Purchase invoice → (Payment voucher). Each document imports from its predecessor, and you can start anywhere (a direct purchase invoice both stocks the goods and records the liability).

Concepts shared by all purchasing documents

Every purchasing document uses the same editor pattern. Learn it once and every screen below behaves the same way.

Document lifecycle and statuses

StatusMeaningWhat you can do
DraftThe document is saved but has no effect on stock or accounting.Edit freely, save again, delete, or approve/post it.
Approved (requisition, order, goods receipt)The document is locked and becomes eligible as a source for the next document in the cycle.Print / download it, convert it forward. It can no longer be edited or deleted.
Posted (purchase invoice, purchase return)The stock movement and the automatic journal entry have been booked.Print / download, view the journal entry, raise a return; the invoice can be un-posted from the list.

Automatic document numbers

Numbers are assigned by the system on first save and are never typed by hand:

DocumentPrefixExample
Purchase requisitionPREQ-PREQ-00012
Purchase orderPORD-PORD-00025
Goods receiptGRN-GRN-00108
Purchase invoicePINV-PINV-00341
Purchase returnPRET-PRET-00007

The document toolbar

ButtonShown whenWhat it does
NewAlwaysClears the editor and starts a fresh document (the next number is assigned when you save).
SaveDraftSaves the draft and returns to the list. No stock or accounting effect.
Approve / PostDraftSaves first, then locks the document (Approve) or books stock + journal entry (Post).
Print / DownloadApproved / PostedOpens the shared bilingual A4 print sheet; Download saves it as a file.
Convert to …Approved / PostedOpens the next document in the cycle with everything prefilled (see each screen).
View Journal EntryPosted (invoice, return); also on the goods receiptShows the automatic Dr/Cr entry the document generated. A goods receipt itself generates no entry — the entry appears on the purchase invoice.
BackAlwaysReturns to the list without further changes.

The line grid — entry mechanics

  • Enter key navigation: Enter moves cell → cell; on the last cell of the last row it adds a new row automatically, so a whole document can be typed without the mouse.
  • Item select: a searchable dropdown. Choosing an item fills its base unit and its purchase price from the item card (an already-typed price is kept).
  • Unit select: the item's base unit plus its alternative units. Choosing an alternative unit applies that unit's own purchase price and its conversion factor — stock always moves in base units (quantity × factor).
  • Discount cell: one box with a %/currency toggle button. Enter either a percentage or an amount; the other representation is derived and kept in sync. A percentage stays “sticky” when you later change quantity or price.
  • VAT cell: a toggle button showing the VAT amount and rate (default 15%). Clicking it turns VAT off (rate 0) for that line; clicking again restores the previous rate.
  • Prices include VAT: when this header checkbox is on, typed prices are treated as VAT-inclusive and the tax is extracted out of them instead of added on top.

The totals strip

RowHow it is computed
Extra discountA header-level discount (%, or amount via the toggle) distributed proportionally across the lines; the last line absorbs the rounding remainder so the totals always match the server.
Total discountSum of all line discounts + the resolved extra discount.
SubtotalNet value excluding VAT, after all discounts.
VAT totalSum of line VAT (extracted when prices include VAT, added when net).
TotalSubtotal + VAT total.
ℹ️ Document footer: every editor ends with a footer panel showing the document's activity log and free-form notes, so the full history stays attached to the document.

Suppliers

Route: Purchasing › Suppliers/commercial/suppliers

Suppliers
Supplier list

Purpose: the master file of everyone you buy from. Every purchase order, goods receipt, invoice and return points at a supplier from this list, and the supplier's balance builds up from posted invoices, returns and payment vouchers.

When to use it: before recording the first purchase from a new vendor, or whenever contact/tax data changes.

Supplier card fields

FieldRequiredNotes
CodeAutoAssigned from the supplier code sequence when the card opens; read-only — it cannot be changed later.
Name (Arabic)YesThe primary display name used across documents and lists.
Name (English)NoIf left empty it is saved as a copy of the Arabic name.
VAT NumberNoThe supplier's tax registration; printed on documents.
Phone / Email / AddressNoContact data.
ActiveShown only when editing. An inactive supplier stays in history but should not be used for new documents.

Actions

  • Save / Save & New / Back — the standard edit actions; “Save & New” saves and opens a fresh empty card for rapid entry.
  • Account Statement (edit mode only) — jumps to the report center with this supplier preselected and the supplier statement already run.
  • List row actions: edit (pencil) and delete (trash, with confirmation).

List columns

Code, Name (Arabic), Name (English), Phone, VAT Number, Balance (built from posted transactions), Active.

Validation & common mistakes

  • Saving without the Arabic name shows a “required fields” notification listing what is missing.
  • Deleting a supplier that already has documents is blocked by referential integrity — deactivate the supplier instead.

FAQ

  • Where do I set an opening balance? Not on the card — record it through the accounting module (opening/journal entry on the supplier's account) so it appears in the balance and statement.
  • Why is the code read-only? Codes come from a central sequence to guarantee uniqueness; they identify the supplier in reports and can never collide.
  • How is the Balance column computed? From posted purchase invoices minus posted returns and payment-voucher allocations; use the Account Statement for the detailed movement.

Purchase requisitions

Route: Purchasing › Purchase Requisitions/commercial/purchase-requisitions

Requisitions
Requisition list

Purpose: an internal request from departments or warehouses for needed items — deliberately without supplier or prices. Once approved it converts into a purchase order for a chosen supplier.

When to use it: when the person who knows what is needed is not the person who chooses where to buy it. Small companies can skip it and start at the purchase order.

Fields

FieldRequiredNotes
DateYes (defaults to today)The request date.
WarehouseNoThe destination warehouse; your default warehouse is prefilled automatically on a new document.
NotesNoFree text.
Lines: Item + Quantity≥ 1 lineOnly item and quantity — no unit price, discount or VAT on a requisition.

Workflow

  1. Fill the date and (optionally) the warehouse, then list the items and quantities. Add Line or the Enter key adds rows.
  2. Save keeps it as a Draft that can still be changed, or press Approve directly — it saves and locks in one step.
  3. Open the approved requisition and press Convert to Purchase Order — a new order opens with the warehouse and the lines prefilled.

Statuses

Draft → editable/deletable. Approved → locked; shows Print, Download and Convert to Purchase Order. There is no stock or accounting effect at any stage of a requisition.

Validation & common mistakes

  • At least one line with an item and quantity > 0 is required; empty rows are ignored on save.
  • An approved requisition cannot be edited — if it was approved by mistake, create a corrected requisition (there is no un-approve).

FAQ

  • Why can't I enter prices? By design: the requester states needs, the buyer negotiates prices at the purchase-order stage.
  • What does converting actually copy? The warehouse and the item lines with their quantities; the order then suggests each item's purchase price (editable) and 15% VAT.
  • Can one requisition feed several orders? The Convert button prefills a new order each time it is pressed, so yes — trim the lines in each order to split the request among suppliers.

Purchase orders

Route: Purchasing › Purchase Orders/commercial/purchase-orders

Purchase orders
Purchase order list
New purchase order
New purchase order

Purpose: the formal commitment to the supplier for agreed items, quantities and prices. A purchase order has no accounting or stock effect — effects start at the purchase invoice.

Header fields

FieldRequiredNotes
DateYes (defaults to today)Order date.
SupplierYesSearchable dropdown of the supplier file.
WarehouseYesDestination warehouse; your default warehouse is prefilled.
NotesNoFree text, printed on the order.
Prices include VATCheckbox — see the shared concepts section.

Line grid columns

#, Item, Unit, Quantity, Unit Price, Discount (%/amount toggle), VAT (toggle), Line Total, delete. Choosing an item suggests its purchase price from the item card; choosing an alternative unit applies that unit's own price and conversion factor.

Steps

  1. Pick the supplier and warehouse, or arrive here via Convert to Purchase Order on an approved requisition (warehouse + lines prefilled).
  2. Enter items, quantities and the agreed prices/discounts; watch the live totals strip.
  3. Save to keep a Draft, or Approve to lock it. Print/Download the approved order and send it to the supplier.
  4. When goods arrive: Convert to Goods Receipt. When the supplier's invoice arrives: Convert to Purchase Invoice (either can come first).

Statuses

Only two: Draft (editable) and Approved (locked, convertible). Receipt/invoice progress is tracked on the receipt and invoice documents themselves.

Worked example — order header math

Order PORD-00025 for supplier “Alpha Supplies”, prices exclusive of VAT:

#ItemQtyUnit priceDiscountNetVAT 15%Line total
1Steel bracket5013.00650.0097.50747.50
2Wooden panel2040.005% = 40.00760.00114.00874.00

Totals strip: Total discount 40.00 · Subtotal 1,410.00 · VAT total 211.50 · Total 1,621.50. This order is continued through receipt and invoicing in the full worked example below.

Validation & common mistakes

  • Supplier, warehouse and at least one valid line (item + qty > 0) are required — a notification lists whatever is missing.
  • An approved order cannot be edited or deleted; only drafts can.
  • Forgetting to press the discount toggle: the same box is % or amount — check the small toggle button before typing “40” meaning currency while the mode is %.

FAQ

  • Why did stock not change after approving the order? By design — an order is a commitment only. Stock and accounting move when the purchase invoice is posted.
  • Where does the suggested price come from? From the purchase price stored on the item card (per unit). Overtype it with the agreed price; the item card is not changed by the order.
  • Can I invoice without a goods receipt? Yes — “Convert to Purchase Invoice” directly on the order; the receipt step is optional.

Goods receipts

Route: Purchasing › Goods Receipts/commercial/goods-receipts

Goods receipts
Goods receipt list

Purpose: document what physically arrived at the warehouse — usually before the supplier's invoice. It records the received quantities and values as a fulfillment paper against the order, and it becomes the source the purchase invoice is imported from.

⚠️ Important: approving a goods receipt locks the document only — it does not move stock and does not create a journal entry. Stock enters the warehouse and the Dr/Cr entry is booked when the purchase invoice is posted. This keeps quantities and values booked together at the invoiced amounts.

Fields

FieldRequiredNotes
Receipt dateYes (defaults to today)The day the goods arrived.
SupplierYesPrefilled when raised from an order.
WarehouseYesPrefilled from the order or from your default warehouse.
NotesNoFree text.
Prices include VAT + full priced gridSame grid as the order: Item, Unit, Quantity, Unit Price, Discount, VAT, Line Total, plus the extra-discount totals strip.

Partial receipt — step by step

  1. Open the approved purchase order and press Convert to Goods Receipt — supplier, warehouse and all lines arrive prefilled with the ordered quantities.
  2. Reduce each quantity to what actually arrived. Example: ordered 50 + 20, arrived 60% → set 30 and 12. Line discounts recompute automatically (a 5% discount stays 5%).
  3. Delete lines that did not arrive at all, then Approve.
  4. When the rest arrives, press Convert to Goods Receipt on the order again and keep only the remaining quantities (20 and 8) on the second receipt.

Actions

Draft: New, Save, Approve, Back. Approved: Print, Download, Convert to Purchase Invoice, View Journal Entry (empty until the invoice posts), Back. List rows: edit, delete (draft only), print/download (approved only).

Validation & common mistakes

  • Supplier, warehouse and at least one valid line are required.
  • “An approved goods receipt cannot be deleted” — deletion is only possible while it is a draft.
  • Do not receive the full ordered quantity when only part arrived — the invoice imported from the receipt would then overstate the delivery.

FAQ

  • Why is there no stock movement after approval? See the warning above — the invoice posting books quantity and value together.
  • Can I create a receipt without an order? Yes — open a new goods receipt and fill everything manually; the order link is optional.
  • The order shows prices — can I change them on the receipt? Yes, the receipt grid is fully editable while draft; the invoice will import whatever the receipt says.

Purchase invoices

Route: Purchasing › Purchase Invoices/commercial/purchase-invoices

Purchase invoices
Purchase invoice list
New purchase invoice
New purchase invoice

Purpose: the document that makes everything real: posting it receives the goods into stock at weighted-average cost and books the automatic journal entry (purchase + input VAT + supplier payable).

Header fields

FieldRequiredNotes
DateYes (defaults to today)Posting date of the stock movement and journal entry.
BranchAutoPrefilled with your default branch; locked when your permission scope allows exactly one branch.
SupplierYesSearchable dropdown.
WarehouseYesWhere the goods stock in.
Supplier Invoice No.NoThe number printed on the supplier's own invoice — your matching reference.
Payment MethodYes (Cash/Credit)Informational classification; actual settlement is recorded through supplier payment vouchers (see FAQ).
Currency + Exchange rateNoForeign-currency invoices post the journal entry at the entered rate; leave empty for base currency.
NotesNoFree text.
Prices include VATSee the shared concepts section.

Line grid — including traceability

Same priced grid as the order plus a Trace column. For items flagged with expiry tracking or serial numbers, a tags button appears: red = data missing, green = complete. It opens an overlay where you enter:

  • Expiry date — required at receipt for expiry-tracked items.
  • Serial numbers — one per line; the count must equal quantity × unit factor (a live counter shows entered/required).

Creating and posting

  1. Pick the supplier and enter the supplier's invoice number and date.
  2. Import the lines: use Convert to Purchase Invoice on an approved order or goods receipt (supplier, warehouse and priced lines prefilled), use Copy on an existing invoice, or type the lines directly.
  3. Adjust quantities/prices to match the supplier's paper invoice; complete trace data on flagged items.
  4. Choose the payment method and (if needed) the currency and rate.
  5. Post. If an approval rule is active and the total exceeds its limit, an approval request is created instead and the invoice posts after it is approved.

Posting effect — journal entry

Account (from Purchasing settings)DebitCredit
InventorySubtotal (net of all discounts)
Input VATVAT total
Accounts Payable (supplier)Invoice total

Stock: every inventory-tracked line enters the warehouse in base units (quantity × unit factor) at a unit cost of line net value ÷ base quantity — so line discounts, the extra discount and VAT-inclusive pricing all flow correctly into the weighted-average cost. Serialized items are registered in the serial registry at this moment. Non-stocked (service) items post the entry without a stock movement.

ℹ️ If no Input-VAT account is configured, the VAT amount is folded into the Inventory debit so the entry still balances. Configure the Inventory, Payable and Input-VAT accounts in the module settings before go-live.

After posting — settlement

The editor shows Paid / Remaining chips. The list adds Paid and a Settlement status per invoice: Unpaid, Partial, Paid (drafts show “—”). Amounts come from posted supplier payment vouchers allocated to this invoice — posting a cash invoice does not create a payment voucher automatically; record it on the Payment Vouchers screen and allocate it.

Unpost (undo posting)

  • Available from the list on posted invoices (undo icon). It reverses the journal entry, takes the received stock back out at its ledger cost, deletes the received serials, and returns the invoice to Draft.
  • Blocked when the invoice has posted payments allocated (remove them first), when a received serial was already sold, or when removing the stock would drive the item negative (it was already consumed/sold).

Validation & common errors

Message / symptomCauseFix
Required-fields notificationSupplier, warehouse or lines missing.Complete the highlighted fields.
“Only a draft purchase invoice can be edited.”Trying to change a posted invoice.Unpost it first (if allowed), edit, then re-post.
Trace button stays red / posting rejectedMissing expiry date, or serial count ≠ quantity × factor.Open the Trace overlay and complete the data.
“…has posted payments — remove them first.”Unposting an invoice with allocated payments.Unpost/delete the payment voucher allocation, then unpost the invoice.
Invoice does not post, an approval request appearsThe amount exceeds an active approval rule limit.Wait for the approver; the document posts after approval.

FAQ

  • What exactly does “Cash” do? It classifies the invoice and prints on the document; the ledger still credits Accounts Payable. Record the actual cash payment as a supplier payment voucher and allocate it to the invoice — the settlement status then becomes Paid.
  • I received the goods on two receipts — how do I invoice? Either one invoice per receipt (Convert on each), or a single manual invoice matching the supplier's combined bill.
  • Why did the item cost change after posting? Weighted average: see the full worked example below for the exact arithmetic.
  • Can I copy last month's invoice? Yes — the Copy row action opens a new draft with the same supplier, warehouse and lines; only the number and date are new.

Full worked example — order → 60% receipt → invoices → cost

One continuous example with real numbers, following order PORD-00025 from the purchase-orders section. Starting stock: Steel bracket 100 pcs @ 10.00 (value 1,000.00); Wooden panel 28 pcs @ 35.00 (value 980.00).

Step 1 — the approved order

50 × Steel bracket @ 13.00, and 20 × Wooden panel @ 40.00 with 5% discount. Total 1,621.50 (see the order section). No stock, no journal entry.

Step 2 — goods receipt for 60%

Only 60% arrives. Convert the order to a goods receipt and cut the quantities to 30 and 12:

ItemQtyPriceDiscountNetVAT 15%Line total
Steel bracket3013.00390.0058.50448.50
Wooden panel1240.005% = 24.00456.0068.40524.40
Totals846.00126.90972.90

Approve GRN-00108 — the document locks; stock is still unchanged.

Step 3 — purchase invoice for the received 60%

On the receipt press Convert to Purchase Invoice → PINV-00341 arrives prefilled with the same figures (subtotal 846.00, VAT 126.90, total 972.90, Credit). Post it:

AccountDebitCredit
Inventory846.00
Input VAT126.90
Accounts Payable — Alpha Supplies972.90

Weighted-average recalculation (unit cost = line net ÷ base qty: bracket 390÷30 = 13.00; panel 456÷12 = 38.00):

ItemOld stock+ ReceivedNew value ÷ new qtyNew cost
Steel bracket100 @ 10.00 = 1,000.0030 @ 13.00 = 390.001,390.00 ÷ 13010.6923
Wooden panel28 @ 35.00 = 980.0012 @ 38.00 = 456.001,436.00 ÷ 4035.90

Step 4 — the remaining 40% arrives and is invoiced

Second receipt then second invoice for 20 brackets and 8 panels: subtotal 564.00 (260.00 + 304.00), VAT 84.60, total 648.60. After posting, the bracket cost becomes:

(130 × 10.6923 + 20 × 13.00) ÷ 150 = (1,390.00 + 260.00) ÷ 150 = 1,650.00 ÷ 150 = 11.00

which is exactly the classic check: old stock 100 @ 10 plus total purchase 50 @ 13 → new cost 11.00. This 11.00 is the cost deducted on the next sale for accurate gross profit.

Step 5 — supplier balance

Alpha Supplies now owes-side balance: 972.90 + 648.60 = 1,621.50 credit, visible in the supplier list Balance column and the statement, until payment vouchers settle it.

Purchase returns

Route: Purchasing › Purchase Returns/commercial/purchase-returns

Purchase returns
Purchase return list

Purpose: return goods to a supplier (damaged, off-spec, over-delivered…). A return is always raised against a posted purchase invoice — the supplier and warehouse are inherited from it and cannot be changed.

Fields

FieldRequiredNotes
DateYes (defaults to today)Return date.
BranchAutoDefault branch; locked for single-branch scopes.
Original InvoiceYesSearchable list of posted purchase invoices; read-only after the first save.
SupplierRead-onlyShown automatically from the chosen invoice.
ReasonNoWhy the goods go back (printed on the return).
Payment MethodYes (Cash/Credit)Inherited from the invoice; adjustable.
Notes / Prices include VATNoAs on the invoice.

Partial return — step by step

  1. Create the return from the posted invoice (pick it in Original Invoice, or press the return button on the posted invoice itself) — all its lines load with full quantities and prices.
  2. Trim: delete the lines that stay, and reduce the quantity on the returned lines. Example: return 2 damaged panels of the 12 invoiced — 2 × 40.00 − 5% = 76.00 net, VAT 11.40, total 87.40.
  3. Enter the reason, then Post.

Posting effect

AccountDebitCredit
Accounts Payable (supplier)Return total (87.40)
InventorySubtotal (76.00)
Input VATVAT (11.40)

Stock leaves the warehouse (base units × factor) at the line's net unit value; serialized units are retired from the serial registry; the supplier balance drops by the return total.

Validation & common mistakes

  • “A purchase return can only be raised against a posted purchase invoice” — draft invoices cannot be returned; post the invoice first.
  • Original invoice + at least one valid line are required.
  • Posting is blocked if the warehouse no longer holds the returned quantity (already sold/transferred) — the stock cannot go negative.
  • A posted return cannot be edited or deleted.

FAQ

  • Does the return refund cash? No money moves by itself — it reduces the supplier's payable balance. Any cash refund is recorded as a separate voucher in payments.
  • Can I return more than was invoiced? The lines load with the invoiced quantities as a ceiling in practice — returning more than remains in stock is blocked, and returning more than invoiced misstates the payable; keep quantities within the original invoice.
  • Which serials do I enter? Exactly the serial numbers of the units going back — they are retired so they can no longer be sold.
  • What is the effect on item cost? The goods leave at the return's net unit value; the remaining stock keeps its weighted-average cost.

Frequently asked questions

How do I record a purchase invoice?

Open Purchasing › Purchase Invoices › New, select the supplier, add received items with cost, taxes and discounts, then Save and Post to update payables and inventory.

Do purchases update stock automatically?

Yes. Posting a purchase invoice for stocked items increases on-hand quantity and recalculates the item's average cost.

How do I pay a supplier?

Create a payment voucher against the supplier and allocate it to open purchase invoices to reduce the outstanding payable balance.

Can I track purchase returns?

Yes, issue a purchase return to reverse received quantities and the related payable, keeping stock and accounting in sync.