Regulatory Pack
The Regulatory Pack is a layered set of country modules (mfi_reg_

Pack philosophy
Microfinance regulation in Africa is a patchwork: every supervisor publishes its own taxonomy, file format, frequency, and signing rules. Rather than hard-code these into mfi_loan and mfi_savings, MFI Suite isolates jurisdictional logic in thin overlay modules. The core books loans and savings in IFRS terms; the country pack maps those values to the local return.
Each pack ships three things: data extensions (extra fields on partners, loans, accounts that the regulator requires but IFRS does not), report builders (Python/QWeb that produce the exact XLSX/XML/CSV the supervisor accepts), and a portal connector (REST/SFTP/email gateway to lodge the return). You install only the packs for jurisdictions where you hold a licence.
A pan-African group with a Kenyan parent and Tanzanian subsidiary installs mfi_reg_kenya on the parent tenant and mfi_reg_tanzania on the subsidiary tenant. The two tenants share no data; consolidated reporting is handled at group level via mfi_treasury rollups.
Country coverage matrix
All eight packs are production-deployed at one or more BridgeERP tenants. The table below summarises supervisor, return frequency, and the highest-stakes filing in each jurisdiction.
| Pack | Supervisor | Top return | Frequency | Channel |
|---|---|---|---|---|
| Kenya | CBK / SASRA / ODPC / FRC | MFB 1 prudential return | Monthly | SFTP + portal |
| Uganda | UMRA + BoU | Quarterly statistical return | Quarterly | Portal upload |
| Tanzania | BoT Microfinance Department | MFI-2 prudential return | Monthly | Email + portal |
| Ethiopia | National Bank of Ethiopia | NBE-MFI quarterly | Quarterly | Manual + courier |
| Zambia | BoZ Non-Bank Financial Institutions | BoZ-NBFI monthly | Monthly | Portal API |
| Nigeria | CBN OFISD | Monthly e-FASS return | Monthly | e-FASS portal |
| Rwanda | BNR Microfinance Department | Quarterly prudential | Quarterly | BNR portal |
| WAEMU | BCEAO via national finance ministry | FINREP equivalent | Quarterly | Local SFTP |
Shared engine
Every pack reuses the same primitives. Understanding these helps when troubleshooting a country pack: 90% of bugs are in the mapping layer, not the engine.
- mfi.regulatory.return — record per return per period (open, draft, ready, lodged, accepted, rejected)
- mfi.regulatory.template — XML/XLSX/CSV scaffold with mako-style placeholders
- mfi.regulatory.mapping — field-level rule (source domain + aggregation + sign convention)
- mfi.regulatory.lodgement — audit record of every submission attempt (channel, payload hash, response)
- mfi.regulatory.exception — failed validation captured for analyst review before lodgement
Filing lifecycle
- Cron opens a return record at period close (last day of month / quarter)
- Engine populates draft values from posted ledger + loan + savings positions
- Compliance officer reviews exceptions queue (negative balances, missing KYC, untagged products)
- Reviewer signs the return digitally (qualified e-sig if jurisdiction requires)
- Lodgement channel transmits the file and captures the reference number
- Acceptance webhook (or manual confirmation) closes the return record
Installing a pack
Packs are listed under Apps with the prefix MFI Regulatory. Install order matters: install mfi_reg_common first if not auto-installed, then the country pack. Restart workers after install so the new cron jobs register.
Watching this on a SaaS tenant: open the run/job's own log tab inside the suite. For deeper inspection, raise a support case from iBANK → Get help.
Reference
Return states (all packs)
| State | Meaning | Editable | Next |
|---|---|---|---|
| open | Period detected, return scaffolded, values not yet pulled | Yes (delete) | draft |
| draft | Values pulled, exceptions visible, awaiting officer review | Yes | ready |
| ready | Officer signed off, awaiting reviewer counter-signature | No (only reviewer can reject) | signed |
| signed | Counter-signed, awaiting lodgement window | No | lodged |
| lodged | Transmitted to supervisor, awaiting acceptance | No | accepted/rejected |
| accepted | Supervisor confirmed receipt and validation | No (read-only forever) | (terminal) |
| rejected | Supervisor returned the file with errors | Reopen to draft, fix, re-lodge | draft |
| amendment | Subsequent correction filed against an accepted return | Yes | lodged |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| No return record opened on the 1st of the month. | Cron job mfi_reg_ | Check Settings > Technical > Scheduled Actions, find the cron, click Run Manually, then re-enable. |
| Exception queue shows 'untagged product' for several loans. | Loan product missing the regulatory classification field (e.g. SASRA loan category code). | Open each loan product, set the regulatory code, then click Recompute on the return. |
| Lodgement fails with HTTP 401. | Portal credentials in ir.config_parameter expired. | Refresh the API token in the supervisor portal, paste into mfi_reg. |

