# Close, controls & consolidation

> Close, controls & consolidation — specs for 24 React components: PeriodStatus, CutoffWarning, CloseStatus, AuditTrail and 20 more.

Source: https://lopifi.com/docs/catalog/12-close-controls-consolidation
Part of: Lopifi — US GAAP books on autopilot, reviewed by a CPA (https://lopifi.com)

---

# Close, controls & consolidation

Domain in [`domain/02-periods-and-close.md`](../domain/02-periods-and-close.md), [`domain/08-controls-and-audit.md`](../domain/08-controls-and-audit.md), [`domain/09-multi-entity-and-fx.md`](../domain/09-multi-entity-and-fx.md).

**See also:** `#70 CloseChecklist` and `#69 TrialBalance` in [statements](06-statements.md) — they belong to this family conceptually.

---

## The close

### 138. `PeriodStatus`
The state banner on every period-scoped surface. Three things, always: the state, the provenance, and **the next action**.

The provenance is a signed-off avatar — initials or a photo, with a tick — and not a sentence. "Closed 4 Oct 2026 by A. Rivera, Controller" is read once and then costs a line forever; the auditor who needs it presses the face and gets the name, the role and the timestamp. `InfoTip`, so it opens under a thumb.

```
🔒  September 2026 · Closed 4 Oct 2026 by A. Rivera
    Entries dated in this period will post to October and be flagged
    for cutoff review.                              [Request reopen]
```

A lock icon alone is a dead end. Reopening states its blast radius first: "Reopening September will mark 4 published statements as superseded."

### 139. `CutoffWarning`
Inline at the date field, never a toast. States the consequence **and both legitimate remedies**: "This is dated 29 Sep, in a closed period. It will post to October. If it belongs in September, request a reopen, or record it in October as an out-of-period adjustment."

### 140. `CloseStatus`
The seven-section pipeline with gating: cutoff → cash → subledgers → schedules → adjusting entries → BS tie-out → review. Downstream sections show as blocked **with the blocker named and owned**. Progress is by weighted check, not count — ten trivial checks and one bank rec is not 91% done.

---

## Controls

### 141. `AuditTrail`
A timeline on **every** financial object, not a hidden admin log. Field-level diffs ("Amount changed from $1,240.00 to $1,420.00"), server UTC timestamps with the zone displayed, actor with role, and `onBehalfOf` rendered explicitly so delegated and support access is visibly distinct.

Append-only. Filters narrow the view and say so: "Showing 12 of 148 events."

### 142. `EvidencePanel`
Documents rendered **inline**, never download-only. Content hash stored and displayed — a document that changed after attachment is a finding. Evidence is unlinked, never deleted, and the unlink is audited. Required on bills, expenses, adjusting entries, and reconciliations.

### 143. `IntegrityCheckPanel`
The eleven continuous assertions — entry balance, accounting equation, subledger ties, schedule ties, roll-forward continuity, cash tie, retained earnings, intercompany, numbering, period integrity, orphans.

**A failing check becomes the primary state of its surface**, not a badge in a corner. The screen's main content becomes the failure, the difference, and the investigation path.

### 144. `MaterialityPolicy`
Trivial floor, absolute threshold, relative threshold, per-account overrides. **Both thresholds must be exceeded** for a variance to flag. The threshold in force is displayed on every surface that flags variances, so a reviewer knows what they're *not* seeing.

### 145. `ApprovalPolicyEditor`
Thresholds by amount, role, and dimension. `requireSeparateApprover` is displayed as fixed, not as a toggle. Delegations require an expiry — permanent delegation is a control failure.

### 146. `RoleMatrix`
The seven roles against the actions. Renders the two structural separations explicitly: Controller ≠ Treasurer, and Admin cannot transact.

### 147. `SubsequentEventLog`
Events after period end, before issuance, typed as adjusting or non-adjusting with the treatment decision recorded. The same event handled the wrong way is a misstatement in one direction or an omitted disclosure in the other.

### 148. `RestatementBanner`
Marks a restated comparative wherever it appears, with the reason. A prior-year column that quietly changed between two reports destroys trust faster than the original error.

### 149. `AuditorMode`
Read-only enforced server-side, scoped to a period and entity set with the scope immutable during the session. Auditor activity is itself audited and visible to the client.

### 150. `SamplingTool`
Select N transactions by a stated method — random, monetary-unit, judgmental — **with the seed recorded** so the selection is reproducible.

### 151. `EvidenceBundle`
For any selection: entries, source documents, approvals, and audit trails exported as one package with a manifest. The alternative is emailing spreadsheets.

---

## Consolidation & FX

### 152. `EntitySelector`
Explicit scope, never inferred from a default. **Standalone and consolidated are visually distinct**, not just differently labeled — the consolidated view carries a persistent scope chip. Entity switching is a full context change: nothing animates, every cached figure invalidates.

### 153. `ConsolidationView`
Entity columns + elimination column + group total. Non-controlling interest on both statements. Flags subsidiaries with mismatched fiscal year-ends rather than silently summing them.

### 154. `IntercompanyMatrix`
Entity × entity balances. **Every cell must have an equal and opposite counterpart; non-zero cells are the exception queue** — the most common cause of a consolidation that doesn't tie. Break types are **named**, not shown as a bare difference: timing, FX, or one-sided.

### 155. `EliminationEntry`
`source: "elimination"`, consolidation-level only. Never appears in standalone statements, and the UI makes that boundary visible.

### 156. `NciPanel`
Non-controlling interest as an equity component and as a net income allocation. Omitting it overstates the parent's share.

### 157. `TranslationSummary`
Closing, average, and historical rates used, with sources and the averaging methodology stated. A translated number without its rate is unverifiable.

### 158. `CtaRollForward`
Opening CTA → movement → closing. Displayed as its own equity line, never buried — it's the arithmetic consequence of the translation method, and hiding it makes the balance sheet look inexplicable.

### 159. `FxRevaluation`
Period-end revaluation preview and posting. **Only monetary items** — derived from account classification, not a trustable flag. Reverses at the start of the next period.

### 160. `FxGainLossPanel`
**Realized and unrealized as separate lines, never combined.** Unrealized reverses; realized doesn't. One number destroys the reader's ability to tell what happened.

### 161. `RateTable`
By pair, date, and **type** — spot, closing, average, historical, budget. Rate type is not optional; the same pair on the same date has different closing and average rates. Manual overrides require a reason and an approver and are visibly distinguished. A missing rate is a **blocking error**, never a silent 1.0.
