Set up branches

Every transaction in the MFI Suite belongs to a branch. Set them up before you create users, products, or members — moving a transaction's branch after the fact requires GL re-mapping and breaks the SOC 2 audit chain.

Branches list
Branches — physical locations, each with a type, code, manager and zone.

The branch model

The MFI Suite models branches as res.branch, a child of res.company for a single-company tenant or as siblings for a holding-company tenant. Five levels are supported:

LevelCodeExampleCash limit
Head officeHOBridge MFI HOUnlimited
RegionRGNWestern RegionKES 50M
BranchBRKakamega BranchKES 5M
Sub-branchSBMumias Sub-branchKES 500K
AgentAGMumias Boda-Boda AgentKES 50K

Create a branch

Branch types
Branch types (Head Office, Branch, Sub-Branch, Agency) — used as security boundary.

From MFI → Configuration → Branches → New the wizard collects:

  • Name and code: code is uppercase, 3–6 chars, used in the member-number sequence (KAK-2026-00001).
  • Parent branch: drives the hierarchy and the consolidation roll-up.
  • Physical address: street, town, county, GPS coordinates (used for the CBK geographical distribution return).
  • Operating hours: feeds the dunning calendar and iBANK opening hours.
  • Cash policy: daily withdrawal limit, vault threshold, dual-control limit (paired with the two-person rule).
  • Bank accounts: at least one operational bank account per branch (KCB or Co-op Bank typically), one M-Pesa paybill if the branch collects via mobile money.

Branch-level chart of accounts

By default the chart of accounts is consolidated at the company level. To get a per-branch P&L you must enable analytic accounting and tag every journal line with the branch's analytic account.

# mfi_base/data/branch_default_accounts.xml — shipped
<record id="branch_analytic_plan" model="account.analytic.plan">
    <field name="name">Branches</field>
    <field name="applicability_ids" eval="[(0,0,{
        'account_prefix': '5,6,7',
        'business_domain': 'general',
        'applicability': 'mandatory'
    })]"/>
</record>
Note — All revenue accounts (5xxxx), expense accounts (6xxxx), and provision accounts (7xxxx) require a branch tag. Asset and liability accounts (1xxxx, 2xxxx) optional but recommended.

Cash tills and vault

Each branch carries one vault and one or more cash tills. The shipped mfi_cash_policy module enforces:

  • Vault opening balance + daily till loadings ≤ branch cash limit.
  • Single till withdrawal ≤ KES 100,000 — anything above requires two-person concurrence (handled by mfi_two_person).
  • End-of-day till closeout mandatory before 18:00 — branch unable to open the next day without it.
  • Vault reconciliation weekly, with internal audit sign-off recorded on mfi.cash.vault.reconciliation.

Branch bank accounts

Wire each branch to at least one bank journal. The shipped naming convention is BR-<branch-code>-<bank>-<currency> e.g. BR-KAK-KCB-KES.

BranchBankAccount #Journal codeUse
HOKCB1101234567HO-KCB-KESTreasury master
KakamegaKCB1102345678BR-KAK-KCB-KESOperational
KakamegaCo-op0114567890BR-KAK-COOP-KESDisbursement
MumiasCo-op0114567891BR-MUM-COOP-KESCollections
MumiasM-PesaPaybill 522522BR-MUM-MPESAC2B
Warning — Never share one bank account across branches. The mfi_treasury reconciliation engine assumes a 1:1 between branch and bank journal — a shared journal breaks the float-allocation report.

Branch-restricted users

Once branches exist, every user (loan officer, teller, supervisor) must be assigned a default branch and an allowed-branches set. The record rule on mfi.loan filters by branch_id in allowed_branch_ids — without this assignment, a user can read the system-wide loan list and the SOC 2 evidence collector flags it.

Note — The next page (Roles) walks the role-to-branch mapping in detail. For now just confirm each user has at least one default branch set.

Worked scenarios

Scenario — Opening the Mumias sub-branch

Setting: Wednesday morning, two weeks before public launch. Bridge MFI is opening a sub-branch under the Kakamega branch in Mumias town to serve sugarcane farmers.

CharacterRole
Kimani MwangiFinance manager
Florence AchiengSystem administrator
Peter OtienoNewly-hired Mumias sub-branch officer

Timeline

  1. Day 1, 09:00: Kimani sends Florence the board-approved sub-branch parameters: code MUM, parent KAK, daily limit KES 500,000, vault threshold KES 250,000. (Email)
  2. Day 1, 09:15: Florence opens MFI → Configuration → Branches → New and captures the basics. (res.branch draft)
  3. Day 1, 09:25: She picks Kakamega as parent and enters GPS coordinates -0.3372, 34.4878. (Hierarchy linked)
  4. Day 1, 09:35: She creates two bank journals: BR-MUM-COOP-KES for collections and BR-MUM-MPESA for paybill 522522. (account.journal x2)
  5. Day 1, 09:50: She sets the cash policy: daily limit 500K, vault threshold 250K, single till withdrawal limit KES 100,000. (mfi.cash.policy)
  6. Day 1, 10:00: Two-person rule auto-creates on save (vault open + close requires Peter + a supervisor). (mfi.two.person.rule auto)
  7. Day 1, 10:15: Peter logs in and confirms his default branch is MUM and his allowed-branches is just MUM. (res.users.x_default_branch_id = MUM)
  8. Day 14, 08:00: Public launch. First till opens at 08:00. (Branch live)

Outcome — Mumias opens cleanly with full SOC 2 audit chain from day 1; vault is reconciled weekly thereafter.

Reference

Fields on res.branch

FieldTypeRequiredNotes
nameCharYesDisplay name
codeCharYes3–6 uppercase chars, unique
parent_idMany2oneNoSelf-relation
levelSelectionYesHO / RGN / BR / SB / AG
company_idMany2oneYesres.company
streetCharYesPhysical address
county_idMany2oneYesres.country.state
gps_lat / gps_lngFloatNoFor CBK geo-dist return
analytic_account_idMany2oneYesaccount.analytic.account auto-created
cash_policy_idMany2oneYesmfi.cash.policy
bank_journal_idsOne2manyYesaccount.journal
operating_hoursCharYes08:00–17:00 Mon-Fri etc.

Default cash limits by branch level

LevelDaily till limitVault thresholdSingle withdrawal
HOUnlimitedKES 10MKES 5M
RegionKES 50MKES 5MKES 1M
BranchKES 5MKES 2.5MKES 250K
Sub-branchKES 500KKES 250KKES 100K
AgentKES 50KKES 25KKES 25K

Troubleshooting

SymptomLikely causeFix
Cannot save branch — 'analytic plan applicability missing'Default analytic plan not yet loadedRe-run -u mfi_base; the plan ships in the data file.
User sees loans from all branchesNo default branch set on res.usersSettings → Users → Edit → set default branch and allowed-branches set.
Cannot close till at 18:00 — 'cash variance not zero'Float or shortage not declaredOpen the till close wizard; capture the variance with the supervisor's two-person confirmation.
Branch P&L shows zero revenueRevenue accounts not tagged with branch analyticEdit the journal items missing the tag; or re-run the shipped mfi_treasury.tag_unallocated server action.
GPS coordinates missing on CBK geo-dist returnBranch saved without lat/lngEdit branch, capture coords from Google Maps, re-run report.

See also

Was this page helpful?