At a Glance
Persona: Finance (Officer / Cost Controller / Finance Manager) · Module: costing · Workflow stages: Valuation policy · Sub-ledger ↔ GL reconciliation · Credit-note revaluation approval · Period-end valuation · Period lock (closed → locked) · Key permissions: configure method (COST_AUTH_001), approve credit-note revaluation (COST_AUTH_005), advance period status (COST_AUTH_006)
What this persona does: Owns valuation policy, approves credit-note-amount revaluations, reconciles inventory sub-ledger to GL, and signs off period-end valuation through to lock.
The Finance persona is the valuation authority on the costing module. Within this module Finance's work spans five threads. (1) Own the valuation policy — choose tb_business_unit.calculation_method (FIFO vs average per business unit per COST_AUTH_001), pick the count-variance valuation source via enum_physical_count_costing_method (standard / last / average / last_receiving per COST_AUTH_002), set the standard cost on tb_product.standard_cost for recipes and for count-variance under the standard method per COST_AUTH_003, configure the reconciliation tolerance and the period-end cadence. The Finance Officer / Cost Controller drives the policy day-to-day; the Finance Manager is the elevated gate at the boundary (method change with non-zero on-hand requires drain — see Decision Branches). (2) Reconcile the inventory sub-ledger to the GL — periodic (typically weekly or monthly) reconciliation of Σ tb_inventory_transaction_cost_layer.total_cost + Σ diff_amount against the GL Inventory control account net change, per INV_XMOD_008 / COST_XMOD_009. Costing-side variances surface here as e.g. a credit-note-amount adjustment that didn't replicate to GL, an outlier cost-pick that produced unexpected COGS, an FX revaluation gap. (3) Approve credit-note-amount adjustments — vendor concessions on a posted GRN's lot cost. Finance approves the tb_credit_note document; the inventory module fires the cost-layer revaluation (COST_POST_003 / COST_CALC_005) which adjusts the originating lot's cost_per_unit and routes the diff_amount to GL via Dr AP / Cr Inventory. (4) Run period-end valuation — orchestrate the close-of-period after Inventory Controller variance sign-off; verify the cost-layer-to-snapshot rollup math, sign off the locked closing_cost_per_unit / closing_total_cost; this is the moment the period's COGS and ending inventory become the audit-anchored balance-sheet figures. (5) Period-lock progression at the Finance Manager level — advance tb_period.status = closed → locked per COST_AUTH_006 / INV_AUTH_006 after the audit window. Critically, Finance does not edit cost_per_unit or average_cost_per_unit directly per COST_AUTH_010; cost revaluation always flows through credit-note-amount, compensating stock-in / stock-out, or the period-end rollforward.
Costing has no per-document state machine. Finance's costing work is anchored to the cost-layer lifecycle and the period valuation lifecycle — Finance operates at the valuation-policy, credit-note-revaluation, and period-close nodes, not on a document status progression.
Finance is the valuation authority in the costing module. Costing has no doc-status enum; there is no GRN-style draft → saved → committed lifecycle to gate. Instead, Finance operates across five costing touchpoints described in Sections 2.1–2.5. Rule citations refer to costing/02-business-rules §§ 4, 5.
| Action | Valuation policy | Sub-ledger reconciliation | Credit-note revaluation | Period-end orchestration | Period-lock (Finance Manager) |
|---|---|---|---|---|---|
Read cost-layer ledger (tb_inventory_transaction_cost_layer) |
✅ (COST_AUTH_004) |
✅ (COST_AUTH_004) |
✅ (COST_AUTH_004) |
✅ (COST_AUTH_004) |
✅ (COST_AUTH_004) |
Read period snapshots (tb_period_snapshot) |
✅ (COST_AUTH_004) |
✅ (COST_AUTH_004) |
✅ (COST_AUTH_004) |
✅ (COST_AUTH_004) |
✅ (COST_AUTH_004) |
Configure tb_business_unit.calculation_method (AVCO ↔ FIFO) |
✅ (as requester / co-approver; Sysadmin executes — COST_AUTH_001) |
❌ | ❌ | ❌ | ❌ |
Configure enum_physical_count_costing_method |
✅ (as requester; Sysadmin executes — COST_AUTH_002) |
❌ | ❌ | ❌ | ❌ |
Update tb_product.standard_cost |
✅ (as requester; Sysadmin executes — COST_AUTH_003) |
❌ | ❌ | ❌ | ❌ |
| Post compensating GL journal (sub-ledger variance) | ❌ | ✅ (COST_XMOD_009) |
❌ | ❌ | ❌ |
| Route cost-layer variance to Inventory Controller | ❌ | ✅ (COST_AUTH_004) |
❌ | ❌ | ❌ |
Approve tb_credit_note (vendor cost revaluation) |
❌ | ❌ | ✅ (COST_AUTH_005) |
❌ | ❌ |
| Fire period-end valuation run (close period) | ❌ | ❌ | ❌ | ✅ (COST_POST_007 / COST_POST_008) |
❌ |
Advance tb_period.status = closed → locked |
❌ | ❌ | ❌ | ❌ | ✅ (COST_AUTH_006) |
Re-open a closed period (exceptional) |
❌ | ❌ | ❌ | ❌ | ✅ (Finance Manager; audit-logged) |
Edit cost_per_unit or average_cost_per_unit directly on a posted row |
❌ (COST_AUTH_010) |
❌ (COST_AUTH_010) |
❌ (COST_AUTH_010) |
❌ (COST_AUTH_010) |
❌ (COST_AUTH_010) |
Re-open a locked period |
❌ | ❌ | ❌ | ❌ | ❌ (no role can re-open a locked period) |
ℹ️ No doc-status transitions by Finance: Costing has no
doc_statusenum. Finance does not transition any document status. Cost corrections flow through (a) credit-note-amount approval, (b) compensating stock-in / stock-out, or (c) the period-end rollforward — never by direct cost-layer edit.
Entry points: Five paths, each anchored to a different Finance activity.
tb_business_unit.calculation_method, enum_physical_count_costing_method value (via business-unit config), reconciliation tolerance, and the tb_product.standard_cost cadence (typically a monthly cost-update batch). Drives Section 2.1.transaction_type, which product, which lot produced the variance). Drives Section 2.2.tb_credit_note documents at pending awaiting Finance approval, with the inventory-side cost effect previewed (the revaluation diff_amount, the affected lot, the post-revaluation cost_per_unit). Drives Section 2.3.closed periods past the audit window awaiting closed → locked advance, with the locked valuation summary per business unit / location.calculation_method per business unit, the current physical_count_costing_method, the reconciliation tolerance, and the standard-cost-update cadence. Read-only for Finance Officer; editable for Sysadmin under COST_AUTH_001–COST_AUTH_003 with Finance Officer as the requester / co-approver.last to last_receiving to better track current vendor pricing), a tolerance adjustment after persistent above-tolerance reconciliation patterns, a standard-cost batch refresh (monthly).calculation_method change, Finance also verifies the drain pre-condition per COST_VAL_009: no product at the business unit can have non-zero on-hand. Finance coordinates with Inventory Controller and Store Keepers to drain stock (transfer-out, write-off, or run a one-time elevated migration script).inventory-type location and transaction_type: Σ in_qty × cost_per_unit + Σ diff_amount (inbound net), Σ out_qty × cost_per_unit (outbound), broken down by good_received_note, issue, adjustment_in / adjustment_out, credit_note_amount / credit_note_quantity, transfer_in / transfer_out. The right side renders the GL Inventory control account's net change for the same period and cost-centre / location.sub_ledger_net_change − GL_net_change. Below tolerance — clean. Above tolerance — investigate.diff_amount that posted to the cost layer but whose GL journal Dr AP / Cr Inventory missed; an outbound cost-pick that produced a cost_per_unit outside the expected band (e.g. FIFO consuming an unusually old high-cost lot when a more-recent lot was expected); a count-variance post whose count-costing-method resolution differed from the GL-account expectation.physical_count_costing_method change wasn't propagated).open.tb_credit_note documents at pending with their originating GRN reference, affected lot(s), proposed diff_amount (signed — negative for vendor concession reducing cost), and the post-revaluation cost_per_unit preview computed by the engine.cost_per_unit, the credit-note diff_amount, the recalculated lot cost, and the impact on any remaining lot balance (already-consumed portions are not retroactively adjusted per COST_CALC_005). Cross-checks: does the credit-note evidence support the concession? Does the cost reduction match the vendor's documented agreement? Is the affected GRN still committed (not voided)?doc_status = approved; inventory module fires INV_POST_007 which invokes the costing engine's COST_POST_003 writing a new cost-layer row with in_qty = 0, out_qty = 0, diff_amount = signed_amount; the originating lot's cost_per_unit is recalculated; subsequent FIFO consumption from the lot picks up the new cost. GL: Dr AP / Cr Inventory at the diff_amount magnitude.cost_per_unit is unchanged.tb_credit_note / tb_stock_in / tb_stock_out / tb_count_stock / GRN / SR documents in the period are at terminal state. Any open credit-note in particular blocks because its revaluation effect on cost-layer cost should land in the closing period not the next.(period, location, product, lot) cost-layer rollup: opening from prior period's closing, period inbound / outbound / adjustment / diff_amount aggregates, computed closing per COST_CALC_006. Finance cross-checks: closing valuation matches the inventory-side closing-on-hand × closing_cost_per_unit arithmetic; no nulls in closing_cost_per_unit (would fail COST_VAL_008).INV_POST_009 + INV_POST_010 chained, which invoke COST_POST_007 (write tb_period_snapshot rows with closing_cost_per_unit / closing_total_cost; write close_period cost-layer rows tying closing cost to the period anchor) and COST_POST_008 (write open_period cost-layer rows opening the next period at the closing cost; lot_seq_no preserved for FIFO continuity).cost_per_unit; WA products show running average. Finance cross-checks against the inventory side's closing_qty × closing_cost_per_unit = closing_total_cost arithmetic.tb_period_snapshot.closing_total_cost is the audit-anchored ending-inventory balance-sheet figure for the closed period. The next period is open with cost-layer continuity (FIFO lot sequence preserved; WA running average carried forward).closing_cost_per_unit ties back to the cost-layer ledger; the FIFO-vs-WA-shadow consistency check (i.e. the average_cost_per_unit shadow at period-end matches an independent recompute); the credit-note-revaluation rollup matches the GL.tb_period.status = closed → locked; the costing snapshot's closing_cost_per_unit / closing_total_cost are permanently immutable. No further re-open by any role; cost corrections post into the current open period as restatement (current-period write-down / write-up).(location, product) outweighs the loss of per-lot detail. Mixed methods at the same business unit are not supported per COST_VAL_009; split into separate business units if required.standard / last / average / last_receiving). standard for tenants whose standard-cost cadence is robust and reflects market reality (recipe-driven tenants prefer this). last for tenants who want count variance valued at current market cost regardless of direction (rare). average for WA-configured business units (consistent with the cost-pick on regular outbound). last_receiving for FIFO-configured business units that want count variance to reflect the most recent inbound price (consistent with FIFO's bias toward newer cost in residual inventory).closing_total_cost was materially overstated). Re-open is audit-logged; the period must be re-closed (which re-runs COST_POST_007 / COST_POST_008) before the next regular close.COST_VAL_009. Resolution: drain stock (rare — requires Inventory Controller and Store Keeper coordination to transfer or write off all on-hand), or run an elevated migration script under Finance Manager + Sysadmin co-authorisation that rebases the cost-layer history under the new method. The migration is typically scheduled at a fiscal-year boundary.Finance's involvement on a given costing thread ends at one of five boundaries:
cost_per_unit updates; downstream consumption picks up the new cost. Finance's involvement on this credit-note is done.tb_period_snapshot.closing_cost_per_unit / closing_total_cost written; close_period / open_period cost-layer rows written; next period at open with cost continuity. Handoff to Inventory Controller + Store Keeper for the new period's day-to-day cost-pick consumption; handoff to Finance Manager for the close-to-lock progression.tb_period.status = locked; valuation permanently immutable for that period. Handoff to Auditor for the long-term audit-trail review; no further costing-side action on this period.tb_inventory_transaction_cost_layer, tb_period_snapshot, tb_business_unit.calculation_method (the policy Finance owns), tb_product.standard_cost (the reference cost Finance maintains), enum_calculation_method / enum_physical_count_costing_method (the policy values).COST_AUTH_001 (Sysadmin config — Finance is requester), COST_AUTH_004 (Finance read cost-impact reports), COST_AUTH_005 (Finance approves credit-note revaluation), COST_AUTH_006 (Finance Manager period-valuation lock), COST_AUTH_010 (no direct cost-edit); calculation rules COST_CALC_005 (credit-note-amount revaluation), COST_CALC_006 (period snapshot closing cost), COST_CALC_007 (period rollforward opening cost); posting rules COST_POST_003 (credit-note-amount), COST_POST_007 / COST_POST_008 (period close / open); cross-module rules COST_XMOD_009 (Finance / GL period-end), COST_XMOD_006 (credit-note revaluation chain).03-user-flow-finance.md covers the three-way-match path.credit_note_amount for revaluation, credit_note_quantity for return-from-lot) is part of the reconciliation surface for the period the credit-note posts in.