At a Glance
Persona: Finance · Module: inventory-adjustment · Workflow stages: Above-Controller-threshold queue — review atin_progress; approve tocompleted(ADJ_AUTH_005), reject todraft, send back to Controller; GL mapping verification; period-end sign-off · Key permissions: approve above Finance threshold (ADJ_AUTH_005); period-close gate
What this persona does: Reviews cost-impact of above-threshold adjustments, posts tocompleted, and signs off the period-end inventory-to-GL reconciliation for the module.
Finance operates across two distinct touchpoints: large-cost approval (above-Controller-threshold documents in the Finance queue) and period-end reconciliation (verifying the adjustment activity rolls up correctly into the inventory sub-ledger and GL). Finance has no authority over below-Controller-threshold documents. Rows are derived from Section 2 (Entry Point and Primary Flow) of this file; rule citations refer to inventory-adjustment/02-business-rules § 4 (Authorization Rules) and § 5 (Posting Rules).
| Action | Large-cost approval (Finance queue) | Period-end reconciliation |
|---|---|---|
View in_progress documents above Controller threshold |
✅ (ADJ_AUTH_005) |
✅ (historical view) |
Verify reason-code GL-account mapping (info.glAccount) |
✅ — confirms correct expense / loss account | ✅ (historical verification) |
| Verify FIFO / WA cost-per-unit pick defensibility | ✅ — cross-check against vendor pricelist | ✅ |
Verify department / cost-centre (dimension.department) |
✅ — confirms budget responsibility | ✅ |
Approve above-Controller-threshold adjustment (in_progress → completed) |
✅ (ADJ_AUTH_005) — fires posting per ADJ_POST_002 |
❌ |
Reject document (in_progress → draft) |
✅ (ADJ_AUTH_005) |
❌ |
| Send back to Controller for re-investigation | ✅ (comment only; document stays in_progress) |
❌ |
Void completed document (compensating reversal) |
✅ (ADJ_POST_004) — for prior-period cost-mapping errors |
✅ |
| Reconcile inventory sub-ledger vs GL Inventory control | ❌ | ✅ (ADJ_XMOD_007) |
| Period-end sign-off (pre-condition for Finance Manager close) | ❌ | ✅ (ADJ_CALC_010 period-impact aggregation) |
| Edit below-Controller-threshold documents | ❌ (Controller domain) | ❌ |
Configure tb_adjustment_type reason codes / thresholds |
❌ (System Administrator per ADJ_AUTH_008) |
❌ |
Edit completed document directly |
❌ (ADJ_VAL_013 — immutable) |
❌ |
ℹ️ Finance cannot initiate a void without a compensating reversal: The
completed → voidedtransition requires a compensatingtb_stock_in(if voiding a stock-out) ortb_stock_out(if voiding a stock-in) to post first perADJ_POST_004. Finance may initiate and approve the compensating document; only after that post does the original move tovoided.
The Finance persona owns cost-impact and GL-mapping verification for the adjustment module. Their authority focuses on the financial integrity of adjustment posts — verifying that the reason code resolves to the correct GL account, that the cost impact is reasonable against the vendor-pricelist / costing-engine baseline, that the inventory sub-ledger reconciles to the GL Inventory control account at period close, and that period-end adjustment activity is defensible to external auditors. Within the module Finance holds:
in_progress documents above the Inventory Controller threshold (typically ฿10,000 aggregate cost, tenant-configurable) per ADJ_AUTH_005 — large recall write-offs, large damage write-offs, large theft write-offs, large data-fix corrections.cost_per_unit (FIFO from the oldest layer, or current WA) is consistent with recent vendor-pricelist entries and with the costing engine's baseline. Outlier costs flagged for further investigation.info.glAccount from tb_adjustment_type must map to a valid, period-open GL account in the chart of accounts. Mis-mapped reason codes are flagged for Sysadmin re-configuration.tb_period.status per inventory INV_AUTH_006.completed documents when a prior period's adjustment proves wrong (typically a cost-mapping error or a duplicate-post identified post-fact) per ADJ_POST_004.Finance does not edit completed documents directly (immutable per ADJ_VAL_013), does not raise adjustments for non-financial reasons (Store Keeper / Controller domain), does not approve below-Controller-threshold documents (Controller's domain), and does not configure reason-code masters or thresholds (Sysadmin per ADJ_AUTH_008).
The Finance persona group also fronts the Period Close workflow in inventory — at period end, Finance reconciles the inventory adjustment activity to the GL Inventory control account and signs off the period as ready to close. The actual tb_period.status transitions (open → closed → locked) are owned by Finance Manager per inventory INV_AUTH_006; this page focuses on the adjustment-side review that feeds those transitions.
The Finance persona's adjustment-module ownership begins when an above-Controller-threshold document hits the Finance approval queue, or at scheduled period-end review, and ends at one of the boundaries enumerated in Section 4.
Entry points: Four doors into a Finance action on adjustments.
in_progress documents above the Controller threshold. Driven by Controller forward / direct create above-Controller-threshold. Primary daily entry during high-cost-impact periods.completed adjustments in the period by reason, location, department, with cost-impact totals and reconciliation against the GL Inventory control account.completed, but Finance investigates for follow-up (corrective entry, Sysadmin re-config, fraud investigation).Primary flow (review and approve an above-Controller-threshold stock-out, 10 steps):
tb_stock_out at doc_status = in_progress with reason RECALL_WRITE_OFF, total cost ฿85,000 (above Controller threshold), creator (Store Keeper), Controller (who forwarded), age in queue.workflow_history (Store Keeper submit → Controller forward at <timestamp> with comment).฿42.50 per unit from LOT-2023-Q4) — cross-check against the originating GRN's tb_good_received_note_detail_item.cost_per_unit and the vendor pricelist at the time of receipt. Outlier picks (cost differs substantially from receipt cost) suggest a cost-layer integrity issue — escalate to Sysadmin / Inventory Controller for investigation.RECALL_WRITE_OFF's info.glAccount resolves to a specific account (e.g. 6540 — Product Recall Loss). Verify:
dimension.department, confirm the department holds budget responsibility for the recall write-off. For multi-department-impact recalls, the document may need splitting into per-department adjustments (request to Controller / Store Keeper for re-submission).INV_XMOD_007) or insurance claim. Verify that a parallel recovery is in flight; if not, the write-off proceeds full-amount, but document the missing recovery in a comment for follow-up.in_progress → completed per ADJ_POST_002. Inventory transaction posts; cost-layer rows write; GL journal generates (Dr Product Recall Loss ฿85,000 / Cr Inventory ฿85,000). workflow_history records {stage: 'completed', action: 'finance_approved', by: <finance_id>}.draft for Store Keeper edit + Controller re-forward.in_progress; Controller re-investigates.INV_POST_002: tb_inventory_transaction, detail, cost-layer rows, GL journal. The detail's inventory_transaction_id is stamped.tb_credit_note (good-receive-note credit-note flow) against the originating GRN to recover the cost. This is a parallel financial workflow, not part of the adjustment document itself.Period-end review flow (5 steps, illustrative):
<YYMM>. The dashboard renders:
completed adjustments in the period, grouped by reason.ADJ_CALC_008.Σ adjustment_cost_impact vs the GL Inventory net adjustment debit / credit for the period.DATA_FIX or as a manual GL journal entry (outside the adjustment module).tb_period.status = open → closed transition per inventory INV_AUTH_006.closed → locked), the period's adjustment trail is the audit-grade record. Auditor reviews the trail per 03-user-flow-audit-config.md Auditor flow.info.glAccount is wrong for the specific transaction (e.g. a "BREAKAGE" event that's actually a theft suspected to be insurance-claimable), Finance does not directly override (Finance can't edit the document line). Instead, Finance rejects and asks for re-submission with the correct reason — or requests Sysadmin to add a more-specific reason code, then re-process.INV_AUTH_006 (closed period only, not locked) is reserved for exceptional cases. Audit-grade justification required; re-close must follow before the next regular period close.The Finance persona's involvement on a given adjustment / period ends at one of four boundaries:
doc_status = completed; inventory transaction posted; GL journal generated. No further persona handoff for that document.draft with rejection comment. Store Keeper edits and re-submits per 03-user-flow-store-keeper.md; Controller re-forwards if still above-Controller-threshold.in_progress with comment requesting Controller follow-up. Controller re-engages.tb_period.status = open → closed per inventory INV_AUTH_006. After close + audit-window, Finance Manager runs closed → locked. Adjustment work for the period is terminal; new period begins.info.glAccount mappings Finance verifies; Auditor who reviews the period-end adjustment trail Finance signs off.tb_adjustment_type.info.glAccount Finance verifies; tb_stock_in.info / tb_stock_out.info extension fields Finance reads (count source, void chain).ADJ_AUTH_005 (Finance approval), ADJ_POST_002 (post fan-out), ADJ_POST_004 (void via compensating reversal), ADJ_CALC_008 (variance %), ADJ_CALC_010 (period impact), ADJ_XMOD_007 (Finance / GL reconciliation).INV_AUTH_005 (Finance approval scope), INV_AUTH_006 (Finance Manager period transitions), INV_XMOD_008 (inventory-to-GL reconciliation at period close).