A build-to-order Odoo module that turns your loan book into a first-class ERP object — loan products, amortisation schedules, disbursement approvals, collections buckets, provisioning and portfolio reporting. ECOSIRE builds, installs and supports it on your Odoo 17, 18 or 19 database. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $499.00 USD; request a quote for a scoped proposal.
示意预览A build-to-order Odoo module that turns your loan book into a first-class ERP object
— loan products, amortisation schedules, disbursement approvals, collections buckets, provisioning and portfolio reporting.
ECOSIRE builds, installs and supports it on your Odoo 17, 18 or 19 database.
无需自行搭建——由 ECOSIRE 构建、安装并提供支持的可用应用。
以一次性构建价格开始。我们在启动时与您共同确定范围。
ECOSIRE 在您的 Odoo 上构建、配置并安装。
约 2–4 周内上线,并提供上线后的支持期。
Most microfinance institutions end up running the loan book twice: once in a spreadsheet that holds the real schedules, arrears buckets and provisioning, and once in Odoo, where somebody re-keys the disbursement as a vendor payment and the repayment as a customer receipt. Odoo core has no concept of a loan. account.move models an invoice, not an amortising principal balance; there is no field that knows what portion of a repayment is principal versus interest versus a late fee, no object that ages an instalment into a 30/60/90 bucket, and no report that will tell a board or a regulator what PAR 30 looks like this morning. The Enterprise accounting apps do not close that gap either — deferred revenue and asset models solve a different problem. The moment you need a rescheduled loan, a partial write-off, or a portfolio-at-risk figure that ties back to the general ledger, the spreadsheet becomes the source of truth and Odoo becomes a filing cabinet.
We build a proper lending domain inside your database. The core is a loan.product model carrying the terms your institution actually sells — flat or declining-balance interest, tenor, repayment frequency, grace period, processing and insurance fees, penalty rate and the accounting configuration (receivable, interest income, fee income, penalty and provision accounts). A loan.contract record inherits mail.thread and mail.activity.mixin so every approval, restructure and field-officer note is threaded on the chatter, and moves through a real state machine — draft → submitted → approved → disbursed → closed, with rejected, restructured and written_off branches. Generating the schedule writes loan.schedule.line records with principal, interest, fee and balance columns; the outstanding balance, days past due and bucket are compute fields with explicit @api.depends, and the aggregate ones are store=True so they can be grouped, filtered and pivoted rather than recalculated per row in a list view.
Money movement is posted, not described. Disbursement generates the account.move entries against the configured journal and can be routed to the payment provider or bank file you already use; repayment allocation applies your waterfall — penalty, then fees, then interest, then principal, or whatever your policy says — and each allocation is written to the schedule lines so a partial payment leaves an auditable trail rather than a lump credit. Collections get their own workspace: overdue contracts land in aged buckets (current, 1–30, 31–60, 61–90, 90+) with kanban and list views for field officers, follow-up activities raised by ir.cron and base.automation rules, and a loan.collection.action log of every promise-to-pay and site visit. Provisioning runs off a configurable matrix — a percentage per bucket per product — producing a monthly provision journal entry and a provisioning view that reconciles to the GL. Portfolio reporting ships as QWeb PDF statements and repayment schedules for the customer, plus stored read-group models behind pivot and graph views for PAR 30/60/90, collection efficiency, disbursement volume by branch and officer, and ageing by product. Access is governed by ir.model.access.csv groups (Loan Officer, Branch Manager, Credit Committee, Portfolio Accountant) with ir.rule record rules scoping officers to their own portfolio and branches to their own book, so a multi-branch MFI can share one database safely. Everything is reachable over XML-RPC and JSON-RPC, so a mobile collections app, a USSD gateway or a credit bureau feed can read and write contracts without a bespoke integration layer.
This is a build-to-order product, not a download. After a short scoping call we agree your interest method, repayment waterfall, bucket definitions, provisioning matrix, approval hierarchy and chart-of-accounts mapping, then write the module against your exact Odoo version — 17.0, 18.0 or 19.0, Community or Enterprise — with the __manifest__.py depends list limited to what your database actually has. Typical delivery is 2 to 4 weeks from confirmed scope. You get the installable source, a staging deployment for UAT with a documented rollback, a training session for the loan and finance teams, and a post-go-live support window. The git repository is handed over at the end, so the code is yours and no future change is gated behind us.
Runs a multi-branch loan book and needs disbursements, collections and arrears in one place instead of a spreadsheet per branch. Cares most that the aged buckets, officer portfolios and daily collections list are trustworthy without anyone re-keying figures.
Answerable for provisioning, interest accrual and the trial balance. Needs every disbursement, repayment allocation and provision to post to the correct account automatically, and needs the provisioning view to reconcile to the GL line by line at month end.
Approves loans above threshold and reports PAR 30/60/90 to a board or funder. Wants an approval trail on the record itself and pivot-level portfolio reporting they can slice by product, branch, officer and cohort without asking IT for a report.
Owns the Odoo database and does not want a black-box add-on. Cares about clean model design, proper `ir.model.access.csv` and record rules, a minimal `depends` list, and an RPC surface their mobile or bureau integration can call.
| 标准 | 伊科西尔 | 定制建造 | 竞争对手 | Odoo 原生 |
|---|---|---|---|---|
| Loan schedule and interest engine | Built to your product terms — flat or declining balance, grace periods, step-ups — with schedule lines regenerated on restructure | Achievable, but the amortisation and restructure edge cases are where in-house builds usually run out of budget | Usually one or two hard-coded interest methods; anything else needs a fork | No loan concept at all; `account.move` models invoices, not an amortising balance |
| Repayment allocation waterfall | Your policy order applied at posting and written back to individual schedule lines | Depends entirely on whether the original developer modelled partial payments | Often a fixed order with no line-level allocation trail | A payment is reconciled against an invoice; no principal/interest/penalty split exists |
| Arrears buckets and PAR reporting | Stored computed bucket and DPD fields feeding pivot and graph views for PAR 30/60/90 by product, branch and officer | Typically delivered as a handful of fixed reports that get re-quoted every time the board asks a new question | Commonly a static list view; genuine pivot-ready stored fields are rare | Aged receivable reports exist but age invoices, not instalments — no PAR figure |
| Provisioning | Configurable percentage-per-bucket matrix producing a monthly provision entry that reconciles to the GL | Frequently deferred to phase two and never built | Rarely included; usually left to the finance team's spreadsheet | Not modelled; provisioning is a manual journal entry |
| Access control across branches | `ir.model.access.csv` groups plus `ir.rule` record rules scoping officers to their portfolio and branches to their own book, enforced over RPC too | Often implemented as view-level hiding, which RPC bypasses | Typically a single user group; multi-branch separation not addressed | Generic multi-company rules only; no portfolio-level concept |
| Odoo version support | Built and tested against your exact 17.0, 18.0 or 19.0 database, Community or Enterprise | Whatever version it was written for; porting is a fresh project each time | Listed versions vary in maturity; the newest release is often a mechanical port | Core moves with your version but never gains lending features |
| Integration surface | Documented XML-RPC and JSON-RPC access to lending models for mobile collections, USSD or bureau feeds | Possible, but the API contract is rarely documented for the next developer | Models exist over RPC but field semantics are usually undocumented | Full RPC access to core models — none of which represent a loan |
| Ownership and lead time | Build-to-order, typically 2–4 weeks from confirmed scope, with git repository handover so the code is yours | Months of in-house discovery and build before anything runs in production | Instant install, but the code is licensed and forking ends vendor support | Available today, at the cost of running the loan book outside Odoo |
This is a build-to-order module, so it is written for your database rather than downloaded. Typical delivery is 2 to 4 weeks from confirmed scope — the clock starts once we have agreed the interest method, repayment waterfall, bucket definitions, provisioning matrix, approval hierarchy and account mapping in writing. A larger book with data migration or a bureau integration sits at the longer end; a single-branch lender on standard declining-balance terms is usually at the shorter end. We give you a date at the end of the scoping call, not a range.
Delivery includes a post-go-live support window for defect fixes and configuration adjustments within the delivered scope. Because you receive the git repository, nothing is locked to us — your own team or another partner can maintain it. Odoo major-version upgrades (for example 18.0 to 19.0) are a separate, quoted piece of work, since the core APIs change between versions and the module has to be ported and retested rather than simply reinstalled. We are happy to hold a support and upgrade retainer if you would rather not carry that internally.
It works on both. The lending models, schedules, collections, provisioning and QWeb reports depend only on `base`, `mail` and `account`, all of which are Community. If your database is Enterprise we can additionally wire the loan pipeline into Enterprise-only surfaces such as the accounting dashboard and studio-based customisations. We confirm your edition during scoping and keep the `__manifest__.py` depends list to what your database actually has, so the module installs cleanly rather than pulling in apps you do not use.
Yes — that is precisely what scoping is for. Flat and declining-balance are built in as configuration on the loan product; if you use a reducing-balance-with-fixed-instalment method, a step-up schedule, a bullet repayment with periodic interest, or a locally mandated penalty formula, we implement it as the schedule generator for your product. The same applies to the repayment waterfall: the default order is penalty, fees, interest, principal, but the order is yours to define and it is applied consistently at posting time, not by manual allocation.
No. Every money movement posts a real `account.move`: disbursement, repayment allocation split across principal, interest, fee and penalty accounts, monthly provisioning, write-off and recovery. Nothing is stored only on the loan record. Repayment allocations are written back to individual `loan.schedule.line` records, so a partial payment leaves a line-level trail rather than a lump credit, and the provisioning view reconciles to the GL. Approvals and restructures are logged on the contract's chatter with the acting user and timestamp.
The lending models expose the full XML-RPC and JSON-RPC surface, so a mobile app, a USSD gateway or a third-party collections tool can read portfolios and write collection actions and receipts without a bespoke middleware layer. Record rules mean an officer authenticating over RPC sees only their own portfolio, exactly as in the web client. Building the mobile client itself is a separate project — we can quote it, or hand your existing developer the API documentation included in the technical docs.
Yes, and it is usually the right thing to do — reporting is only useful once the whole book is in one place. Migration is scoped separately because it depends on the quality of your data: we map each existing loan to a product, load its outstanding principal, accrued interest, arrears position and remaining schedule, then produce a reconciliation report proving the migrated opening balances tie to your existing totals before you go live. Loans with irregular or reconstructed histories are flagged for your team to confirm rather than silently guessed at.
A build-to-order Odoo module that turns your loan book into a first-class ERP object — loan products, amortisation schedules, disbursement approvals, collections buckets, provisioning and portfolio reporting. ECOSIRE builds, installs and supports it on your Odoo 17, 18 or 19 database.