At a Glance
Module purpose: Records physical receipt of goods against a PO, posts stock-IN movements, updates costing, and creates AP entries (
Received→Committed→Voided) · Audience: Store Keeper / Receiver, Inventory Manager, Purchaser, Finance / AP · Key entities/tables:tb_good_receive_note,tb_good_receive_note_detail,InventoryStatus,JournalEntry, FIFO lot layers · Sub-pages: 12


A Good Receive Note (GRN) is the document that formally records the physical receipt of goods from a vendor and writes them into inventory. Each GRN has a header — reference number, receipt date, vendor, delivery point, invoice number and date, currency and exchange rate, optional consignment/cash flags, and an extra-cost indicator — and one or more item lines. Each line carries the product, store location, ordered quantity (when sourced from a PO), received quantity, free-of-charge (FOC) quantity, unit price, discount, tax, lot information for traceable items, and a computed line total; the header rolls these into subtotal, discount, tax, extra costs, and grand-total figures in both transaction and base currencies.
GRNs follow a tightly bounded lifecycle: Received (also called Draft — editable, no stock or GL impact) → Committed (immutable, inventory and journal entries posted) → Voided (only available from the Received state; reverses the draft). Committing a GRN is the single event that mutates the world: it generates stock-IN movements per line, updates on-hand quantities and last cost on InventoryStatus, creates new FIFO cost layers or recomputes the weighted-average per the item's costing method, writes journal entries against accounts payable and inventory, and updates the source purchase order's remaining quantities. Once committed, the document is locked — corrections require a void of the source artefact or a compensating adjustment.
The GRN is the receiving end of the three-way match (PO ↔ GRN ↔ vendor invoice). It can be created from one or more open purchase orders (multi-PO consolidation is supported when vendor, currency, and terms agree) or manually for receipts that have no upstream PO. Partial receipts are first-class — the GRN tracks received vs. ordered per line and feeds remaining quantities back to the source PO, which moves to Partial until everything is received or cancelled, then to Closed. Vendor cancellations are recorded on the GRN, push a cancelled quantity back to the PO, and prevent further receiving once the PO is closed.
The GRN is the control point where physical reality meets the books. Until receiving acknowledges the goods, a PO is only a commitment; once a GRN is committed, stock value is on the balance sheet, an accounts-payable liability is recognised, and the vendor invoice can be matched and paid. Hospitality operations run on tight food-cost margins and rely on this checkpoint to catch under-deliveries, over-deliveries, short-shipped lines, and price variances before they become inventory errors or overpayments. Mandatory invoice number + vendor uniqueness, required cost allocation before commit, role-segregated review, posting-only stock impact, and an immutable post-state exist to make every receipt explainable and to support clean three-way match against the eventual invoice.
The financial side mirrors this. Each committed GRN writes journal entries that debit inventory (or expense, for non-inventory items) for the received value plus any allocated extra costs (freight, duties, handling), credit accounts payable for the vendor obligation, and account for tax separately based on the line's tax-inclusive or tax-exclusive treatment. Multi-currency receipts dual-post in transaction and base currencies using a configurable exchange rate. Consignment receipts are tracked as Consignment In movements that don't affect owned-stock value, and non-inventory items skip stock impact entirely while still creating the AP entry.
Food-safety and quality control sit on top of all this. Perishable goods carry lot numbers (auto-generated or manually overridden) and expiry dates that travel with the stock layer, so subsequent FIFO consumption, expiry-driven write-offs, and recall events are all traceable to the original GRN. The receiving workflow can flag a delivery for quality inspection — accept, reject, or partially accept — with the reject quantities feeding back to vendor performance metrics. Variance on price between the PO and the receipt is surfaced for review against the vendor pricelist before commit.
Partial status with the remaining open quantity available for future GRNs. Multiple GRNs can be raised against the same PO until the PO is fully received or Closed.Partial; over-receipt (received more than ordered) is constrained by validation (Received quantity cannot exceed ordered minus already-received minus cancelled) and requires either a PO amendment upstream or rejection of the excess. Vendor cancellations are recorded as cancelled quantities that close out the remaining open balance.InventoryStatus.QuantityOnHand, LastUnitCost, and TotalCost, (3) creates new FIFO cost layers or recomputes AverageCostTracking per the item's costing method, (4) generates journal entries (debit inventory, credit AP, with separate tax and extra-cost treatment), (5) updates the source PO's remaining quantities, and (6) locks the GRN against further edits. Individual, batch, and end-of-period auto-commit modes are supported.Last Cost = (Net Amount + Extra Costs) / (Received Quantity + FOC Quantity) — so inventory valuation reflects the true delivered cost rather than just the unit price.Subtotal and Last Price but included in Last Cost denominator and in lot quantities, so the average unit cost dilutes correctly without overstating receipt value.Stock In (regular owned inventory, full impact on on-hand and valuation), Consignment In (vendor-owned stock held at the location, tracked separately, no owned-inventory or AP impact until consumed), or Non-Inventory (immediately expensed, no stock impact but full AP and tax treatment).| Role | Responsibility |
|---|---|
| Store Keeper / Receiving Clerk | Receives the physical delivery at the dock, counts and inspects goods against the PO and the vendor delivery note, creates the GRN in Received (Draft) status, attaches packing slips and quality evidence, records lot numbers and expiry dates, and documents any discrepancies, short shipments, or rejected lines. |
| Store Manager / Inventory Manager | Reconciles the GRN against the actual stock received, oversees lot/batch tracking and storage-location assignment, monitors receipt patterns and variances, and commits individual GRNs or processes batch commits at end of shift or end of period. |
| Purchaser / Procurement Officer | Owns the upstream PO that the GRN is matched against, reviews receiving information for the POs they raised, investigates vendor performance issues (late, short, damaged, wrong item), and coordinates resolution with the vendor for variances. |
| Finance Team / AP Clerk | Verifies the GRN against the vendor invoice (three-way match), validates extra-cost allocation and tax treatment, adjusts and finalises GRN entries before AP posting, reconciles the inventory sub-ledger against the GL, and signs off on receipt activity at period close. |
| Department Manager | Reviews GRNs hitting the department's cost-centre, validates that received goods match what was ordered for the department, and monitors price variance against the vendor pricelist. |
| System Administrator | Maintains the lot-number generation format, configures user permissions and approval thresholds, manages tax codes, currency rates, and reason codes for cancellations and rejections, and oversees integration with PO, Inventory, Finance, and Vendor modules. |
Cross-module flow:
purchase-order — GRN is created against a PO; matched on receipt
inventory — receiving a GRN posts a stock IN movement
costing — GRN unit costs feed FIFO lot records or update Weighted Average
vendor-pricelist — GRN price variance is checked against the vendor pricelist
Master configuration:
master-data/vendor — vendor master referenced by GRN header
master-data/currency — transaction currency and exchange rate for dual-posted receipts
master-data/tax-profile — tax codes applied to GRN lines
master-data/credit-term — payment terms copied from vendor master onto the GRN
master-data/extra-cost-type — landed-cost components (freight, duties, handling) allocated across lines
master-data/delivery-point — receiving location where goods are physically accepted
master-data/unit — unit of measure for received quantities
master-data/location — store location each line writes its stock-IN movement against
system-config/workflow — approval / commit workflow for GRN authorization
system-config/period — accounting period gate for GRN posting
system-config/running-code — GRN document number sequencing
reporting-audit/activity — GRN status-transition and amendment log for audit
reporting-audit/attachment — packing slips, delivery notes, and quality evidence attached to each GRN
../carmen/docs/good-recive-note-managment/../carmen-inventory-frontend/../carmen-turborepo-backend-v2/../carmen-turborepo-backend-bruno/../carmen-inventory-frontend-e2e/enum_comment_type user/system tagging.