Financial approval governance
Multi-tiered financial delegation of authority, spend limits, vendor bill approval gates, budget validation, maker-checker controls, and working-hour SLA escalations.
SmartERP Financial Approval Governance enforces enterprise internal controls, multi-level spend authorization limits, segregation of duties (SoD), and hard posting blocks across all monetary commitments.

Financial Delegation of Authority (DoA) Matrix#
Financial commitments are governed by a 4-tier delegation matrix configured in smarterp_approval:
| Authorization Tier | Spend Range (ETB) | Required Approvers | SLA Escalation Window | Governance Rules |
|---|---|---|---|---|
| Tier 1: Operational | $\le$ ETB 10,000.00 | Department Head / Unit Supervisor | 24 Working Hours | Fast-track approval for standard consumables. |
| Tier 2: Departmental | ETB 10,001.00 – ETB 100,000.00 | Department Head + Finance Controller | 48 Working Hours | Mandatory verification of budget line availability. |
| Tier 3: Executive | ETB 100,001.00 – ETB 500,000.00 | Finance Controller + Deputy CEO / CFO | 48 Working Hours | 3-way matching audit and cash flow allocation check. |
| Tier 4: Board / CEO | $>$ ETB 500,000.00 | CFO + Chief Executive Officer (CEO) | 72 Working Hours | Strategic Capex review; requires Board notification if $>$ ETB 2M. |
Vendor Bill Hard Gate Enforcement (GATE_CODE = 'BILL')#
SmartERP eliminates unapproved vendor bill commitments through an immutable gate implemented in addons/smarterp_approval_account and addons/account_bill_approval.
+----------------------------------------------------------------------------------------------------+
| VENDOR BILL APPROVAL GATE STATE MACHINE |
+----------------------------------------------------------------------------------------------------+
| |
| [Vendor Bill Created (Draft)] |
| | |
| v |
| [Step 1: Confirm Bill] ---------> Sets approval_state = 'confirmed' |
| | |
| v |
| [Step 2: Check Bill] -----------> Checked by AP Specialist / Reviewer |
| | Sets approval_state = 'checked', checked_by, checked_date |
| v |
| [Step 3: Request Gate Approval] -> Spawns smarterp.approval.request (Category: 'BILL') |
| | Routes through Tier 1-4 Signatories based on amount_total |
| v |
| [Step 4: Action Approve] -------> Sets approval_state = 'approved', approved_by, approved_date |
| | |
| v |
| [Step 5: Action Post] ----------> Calls account.move._post() |
| HARD GATE CHECK: Re-verifies approval_state == 'approved' |
| BLOCKS direct RPC, cron auto-post, and bulk wizards if unapproved|
+----------------------------------------------------------------------------------------------------+
The Architectural Interception in _post()#
Hiding the "Post" button in the XML view is insufficient for enterprise compliance. SmartERP overrides _post() at the ORM layer:
def _post(self, soft=True):
for move in self.filtered(lambda m: m.move_type in ('in_invoice', 'in_receipt') and m.state == 'draft'):
if move.approval_state != 'approved':
raise UserError(_(
"%s must complete Confirm / Check / Approve before it can be posted."
) % move.display_name)
return super()._post(soft=soft)
Any attempt to post an unapproved bill—whether via XML-RPC APIs, bulk posting wizards, or automated system crons—is intercepted and rejected with a descriptive error.

Payment Request Governance (payment_request)#
For ad-hoc disbursements, operational advances, and contractor milestones that do not originate from a standard PO, SmartERP provides the payment.req workflow:
- Submission (
draft): The requester specifies the Debit Expense GL account, Cash/Bank account, partner, and line item justifications. - Manager Approval (
approved): Direct department supervisor verifies operational necessity. - Executive Review (
dceo_approval/ceo_approval): High-value requests route to the Deputy CEO and CEO. - Finance Verification (
finance_approval): Treasury verifies cash runway and tax compliance. - Payment Registration & Settlement:
- Clicking Register Payment opens
payment.register.wizard. - Records Cheque Reference, Bank Transfer ID, and CPV Number.
- Automatically generates and posts the journal entry:
- Debit: Expense / Advance GL (
payment.req.account_id) - Credit: Bank / Cash Account (
payment.req.cash_account_id)
- Debit: Expense / Advance GL (
- Clicking Register Payment opens
- Settlement Smart Button: For employee travel or operational advances, clicking Create Settlement generates a pre-balanced offsetting entry crediting the advance GL and debiting actual documented expenses.
Budgetary Overrun Control & Real-Time Alerts#
SmartERP integrates with base_account_budget to enforce budget discipline prior to payment approvals:
- Headroom Calculation: Every purchase line checks available budget: $$ ext{Remaining Budget} = ext{Planned Budget} - \sum ext{Committed POs} - \sum ext{Posted Invoices}$$
- Three-Tier Warning Thresholds:
- Green (0% – 79%): Normal processing.
- Amber (80% – 99%): Warning banner displayed on bill form; requires Department Head written justification.
- Red ($\ge$ 100%): Hard overrun block. The system prevents bill confirmation unless an authorized Budget Override Request is approved by the CFO.
SLA Escalations and Working-Hour Timers#
To prevent operational bottlenecks:
- Every approval step is tracked by an active SLA timer that counts only official working hours (configured in
resource.calendar, e.g. Monday–Friday 8:30 AM to 5:30 PM, excluding statutory Ethiopian public holidays). - Auto-Reminder: If a request remains undecided at 50% of the SLA window, an automated email reminder is dispatched to the approver.
- Escalation Notification: If the SLA expires (100%), the request automatically escalates to the approver's hierarchical manager, and the compliance officer is flagged.