Builder's guide · Section 10
Controls and approvals belong to your console
An approval is about people: who asked, who approved, and that they were not the same person. GAAPcore authenticates applications, so it cannot hold that rule. Your console holds it.
Where GAAPcore helps
Some controls live in the ledger: price holds placed automatically when a bill disagrees with its receipt, bill approval, a refusal to pay a held or unapproved bill, customer credit holds, closed periods. Read these states back from GAAPcore and show them; don't keep a second copy. Your console decides who may approve or release, and writes the approver's name itself.
How to build an approval
- Enforce it on the server, at the one place every person's write passes through, not by hiding a button.
- Refuse the write that would commit without approval (for example, opening a purchase order above the threshold).
- Freeze and fingerprint the document while it waits, so the approver approves exactly what was submitted.
- Let the approval make the write, as your writer, recorded as the approver's.
- Cap later changes at what was approved.
- Put “not your own” in a table constraint as well as in code.
Actions that deserve a second person
| Action | Why |
|---|---|
| Credit memos, write-offs, customer refunds, escheats | This is how a receivable disappears, so it is where cash taken at the counter would be hidden. One person prepares; an administrator who did not prepare it posts. |
| Asset disposals, impairments, changes in estimate | They take value off the books. |
| Bill approval and hold release | Never the person who entered the bill. |
| Period close, issuing statements, editing notes | They change what the books report, not only what they record. Administrators only. |
| Reversing an intercompany sale or transfer | It changes two companies' books at once. |
Guard the side doors
Every control has a front door (the release button) and side doors: the setting that decides what gets held (a credit limit, the payables tolerance, the dunning level that holds orders), and other holds that do the same job. Give each side door the same rule as the front door. Then ask someone who did not write the guard to look for more. In the reference console, every review of these rules found at least one.
Another writer of the same books, such as an importer script, is not bound by your console's approval rules. Say so in your documentation, and give such writers the narrowest scope that works.