At a Glance
Persona: Purchaser / Procurement Officer (+ Department Manager subset) · Module: good-receive-note · Workflow stages: Notified onsaved/committedagainst own PO — read-only review of receipt vs PO, lot data, packing slips, variance comments; vendor-side follow-up (chase / credit-note / substitution / re-negotiation) · Key permissions: read-only on GRN document; SoD (PO_AUTH_010) forbids posting GRN against own PO
What this persona does: Reviews own-PO GRNs for receiving variances and drives vendor-side resolution; does not alter GRN document state.
The Purchaser persona covers the Purchaser / Procurement Officer who raised the upstream PO and, as a subset, the Department Manager who owns the cost-centre that the GRN posts against. Within the GRN module the Purchaser is a review-only participant — they do not create the GRN at the dock, do not save line entries, and do not post the commit. Segregation of duties (PO_AUTH_010, carried over from the upstream PO persona) explicitly forbids the user who created or transmitted the PO from posting the GRN against it; the saved → committed transition is reserved for the Inventory Manager on the Receiver path. The Purchaser is notified when a GRN goes saved or committed against one of their POs, opens the document in read mode to review receiving information against the PO they own (received_qty vs order_qty, accepted_qty vs received_qty, lot / expiry data on the linked tb_inventory_transaction_detail, attached packing slips and quality evidence, and any variance comment written by the Receiver), and owns the vendor-side follow-up for every variance flagged on the GRN — short-ship chase, return / credit-note negotiation for damaged goods, substitution for wrong items, and renegotiation when the GRN unit price drifts from the active vendor pricelist. The Department Manager subset reviews GRNs hitting their department's cost-centre, validates that what was received matches what was ordered for the department, and monitors price variance against [vendor-pricelist](/en/inventory/vendor-pricelist) for budget control. Neither sub-persona alters the GRN document state — their resolution lives on the vendor's response document (credit note, replacement GRN) or on the upstream PO via amendment.
The Purchaser is a review-only participant in the GRN module. Segregation of duties (GRN_AUTH_010, mirroring PO_AUTH_010) explicitly forbids the user who created or transmitted the upstream PO from committing the GRN against it. The Purchaser observes all non-voided states and owns vendor-side resolution; they do not alter the document state.
| Action | draft | saved | committed | voided |
|---|---|---|---|---|
| View GRN (read) | ❌ (not yet visible to Purchaser) | ✅ | ✅ | ✅ (audit only) |
| Receive notification (GRN saved / committed) | ❌ | ✅ | ✅ | ❌ |
Review received_qty vs order_qty |
❌ | ✅ | ✅ | ❌ |
Review accepted_qty vs received_qty |
❌ | ✅ | ✅ | ❌ |
| Review lot / expiry data (read-only) | ❌ | ✅ | ✅ | ❌ |
| Review attached packing slips / evidence | ❌ | ✅ | ✅ | ❌ |
| Check vendor pricelist deviation | ❌ | ✅ | ✅ | ❌ |
| Add comment / log vendor resolution | ❌ | ✅ | ✅ | ❌ |
| Edit header (vendor, currency, lines) | ❌ | ❌ | ❌ | ❌ |
| Save GRN / save for review | ❌ | ❌ | ❌ | ❌ |
Commit GRN (saved → committed) |
❌ | ❌ (GRN_AUTH_010) |
❌ | ❌ |
| Void GRN | ❌ | ❌ | ❌ | ❌ |
| Raise PO amendment / cancel line | ❌ | ❌ (own PO, not GRN) | ✅ (own PO, not GRN) | ❌ |
| Handoff credit note reference to Finance | ❌ | ❌ | ✅ | ❌ |
⚠️ Discrepancy — standalone GRN (no PO reference):
Test_case/System_Process/tx-01-grn.mdBR-01 documents that a GRN can be created independently by the Receiver without a PO reference (doc_type = manual). For manual GRNs there is no upstream Purchaser — the "My POs filter" and "Receiving History tab" entry points do not surface manual GRNs, and the Purchaser has no notification entitlement. Testers should verify that manual GRNs are not routed to Purchaser notification queues. Source:Test_case/System_Process/tx-01-grn.md(capture date 2026-04-27).
Entry point: Three equivalent paths into the read-only review screen — no path opens the GRN in editable mode for this persona.
draft → saved transition (when a variance comment is written on any line) and the Inventory Manager's saved → committed transition both fire a notification to the PO owner; clicking the notification deep-links into the GRN read view scoped to the lines that belong to the Purchaser's PO.po_status ∈ {sent, partial, completed}; the Receiving History tab lists every GRN (saved and committed) referencing this PO via tb_good_received_note_detail.purchase_order_detail_id, with per-line received_qty / accepted_qty running totals; click a row to open the GRN read view.purchase_order_detail.created_by = current_user, surfacing every GRN (any state except voided) that the Purchaser owns the source PO for.Primary flow (review-and-resolve path, 7 steps):
saved (review-while-uncommitted, variance flagged) or committed (post-posting review, vendor follow-up required if any variance comment is present). The notification payload carries the GRN number, the source PO number, and a summary flag (clean / short / over / quality-reject / price-variance / wrong-item).doc_status, vendor_id, receipt_date, currency, and exchange rate; the lines show order_qty, received_qty, accepted_qty, the running pending balance on the source PO, and the variance comment written by the Receiver.received_qty to pending_qty (= order_qty − received_qty − cancelled_qty) at the moment the GRN was saved, compare accepted_qty to received_qty to read the quality-rejection variance, open the linked tb_inventory_transaction_detail to inspect lot numbers, expiry dates, and per-lot quantities, and open the attachment list to view packing slips and damage photos.[vendor-pricelist](/en/inventory/vendor-pricelist) price for the vendor / item / receipt-date window; the price-variance flag fires when the GRN price drifts by more than the tenant tolerance. (Department Manager subset reviews the same panel scoped to lines on the department's cost-centre.)received_qty = pending_qty, accepted_qty = received_qty, price within tolerance, no quality comment): close the review ticket and stop — no vendor contact needed. If any line is flagged: proceed to step 6.received_qty = pending_qty, accepted_qty = received_qty, GRN unit price within pricelist tolerance, no Receiver-written variance comment): close the Purchaser review ticket; no vendor contact, no Finance handoff. The PO line transitions naturally on commit (sent → partial → completed); the Purchaser's involvement ends here.received_qty < pending_qty): chase the vendor for the remainder. The source PO stays at po_status = partial with the unfulfilled balance open; no PO amendment is required — the next shipment will create a second committed GRN against the same PO and close the balance. If the vendor cannot fulfil the shortfall, raise a PO line cancellation (handled on the [purchase-order](/en/inventory/purchase-order) flow) to release the open commitment.accepted_qty < received_qty with quality comment): negotiate credit note or replacement with the vendor. Two sub-paths: (a) credit note — hand off to Finance with the credit-note reference for AP offset against the committed GRN; the rejected-quantity gap stays on the GRN as the vendor's liability and feeds vendor-performance metrics. (b) Replacement — raise a follow-up PO amendment (or new PO) for the replacement quantity; the replacement shipment generates its own GRN when received.[vendor-pricelist](/en/inventory/vendor-pricelist) so future POs price correctly; the current GRN price stands. Department Manager subset triggers the same branch when the variance hits their cost-centre.committed GRN posting to the department's cost-centre, review that the received goods match what was ordered for the department, confirm the inventory location / department-cost-centre allocation, and sign off on price-variance lines surfaced by the pricelist check. Disagreement on cost-centre allocation is escalated to Finance for re-allocation via journal adjustment; the GRN itself is not edited.The Purchaser's involvement on a given GRN ends at one of four boundaries:
committed with the variance recorded; the audit trail is closed by the replacement GRN.committed GRN hitting their department, with a comment on the GRN activity log recording the budget impact. Disagreement on cost-centre allocation handoffs to Finance for journal re-allocation; the GRN itself is not edited.draft / saved / committed / voided) on enum_good_received_note_status, the global state machine that this persona observes (without altering), and the cross-persona handoff table.PO_AUTH_010 segregation between PO owner and GRN commit) and Auditor (read-only review of variance-resolution activity logs).tb_good_received_note_detail.purchase_order_detail_id (the link the Purchaser's "My POs" filter and PO Receiving History tab follow), and the variance fields (received_qty, accepted_qty) reviewed in step 3.pending_qty, po_status, and the activity log that captures vendor-side resolution (chase, amendment, cancellation).../carmen/docs/good-recive-note-managment/GRN-User-Experience.md — carmen/docs source for the Procurement Manager persona (goals: monitor vendor performance, analyse procurement metrics, ensure policy compliance) and the variance-handling user flow.../carmen/docs/good-recive-note-managment/GRN-Overview.md — carmen/docs module overview: PO reconciliation as the GRN's purpose, vendor performance tracking on receipt outcomes, and the integration points between the GRN module and the Purchase Order / Vendor Management modules.