Accounting¶
1. Purpose¶
Accounting is the financial backbone of NestERP. It records every sale, purchase, payment and adjustment as a double-entry journal entry, produces the customer invoices and vendor bills, calculates VAT, and holds the chart of accounts that every other module posts into.
Almost nothing else in NestERP is financially meaningful without it. Payroll posts salary journal entries here. Inventory posts stock valuation here. Purchase approvals, sales and customer invoicing all end as entries in this module.
We do not deploy the bare Invoicing app — read this before quoting a client
In Odoo Community, account on its own presents as Invoicing: invoices, vendor
bills, payments, taxes, journals and the chart of accounts. The full Accounting app
(account_accountant) is Enterprise. Community has no native Profit & Loss or
Balance Sheet, no bank-reconciliation widget, and no asset or deferred-revenue
management.
NestERP never ships the bare Invoicing app. Every deployment carries
base_accounting_kit (Cybrosys), which supplies the full Accounting menu and the
financial statements, plus dynamic_accounts_report (Heritage) for filterable,
drill-down reports. What the client sees and works in is that combination.
So the accounting product we sell is Tier 1 and Tier 2 together, never core alone. Any proposal that says "Odoo Accounting" without naming these third-party modules is describing something we do not deploy.
2. Features¶
- Customer invoices and credit notes, with sequential legal numbering that locks on posting
- Vendor bills and refunds, with three-way matching against purchase orders and receipts
- Double-entry journal entries for every posted document, with a full audit trail
- Chart of accounts, configurable per company and per country
- Journals for sales, purchases, cash, bank and miscellaneous entries
- VAT and other tax computation, including tax groups and price-included taxes
- Fiscal positions, to swap tax and account mappings per customer type or country
- Payment terms, including multi-instalment schedules
- Payment registration and partial payments, with outstanding-balance tracking
- Multi-currency invoicing with per-journal currency and exchange-difference handling
- Analytic accounting — cost centres and project/department cost allocation
- Period locking, so closed months cannot be silently altered
- Multi-company accounting with inter-company journal separation
- Cheque printing configuration via
account_check_printing
3. Where to find it¶
- Menu as deployed: Accounting → Customers / Vendors / Accounting / Reporting — the
Accounting root menu comes from
base_accounting_kit, not from coreaccount - Menu on bare core (not our deployment): Invoicing → …
- Technical names:
account,analytic,account_check_printing - Tier: Odoo core (Community Edition)
- Available in: Odoo 16, 17 and 18 — required by our stack on all three
4. Modules used¶
| Module | Tier | Why it is needed |
|---|---|---|
account |
Odoo core | Journal entries, invoices, bills, payments, taxes, chart of accounts |
analytic |
Odoo core | Analytic accounts and distributions — cost centres, departmental costing |
account_check_printing |
Odoo core | Cheque layout and numbering on payments |
base_accounting_kit |
Third-party (Cybrosys) | Supplies the Accounting app itself — root menu, financial statements, asset management. Always installed. |
dynamic_accounts_report |
Third-party (Heritage) | Filterable, drill-down financial reports. Always installed. |
base_account_budget |
Third-party (Cybrosys) | Budget definition and budget-vs-actual comparison |
stock_account |
Odoo core | Stock valuation entries — links Inventory to the general ledger |
NestERP custom modules that build on Accounting¶
| Module | Odoo version | What it adds |
|---|---|---|
payroll_custom_module |
17 · 18 | Posts payroll journal entries; Tanzanian statutory rules |
purchase_multi_approval |
17 · 18 | Multi-stage purchase approval before a bill is allowed |
thalia_invoice_reminders |
17 | Tiered overdue-invoice escalation across email, WhatsApp and SMS |
thalia_tra_reconciliation |
17 | Reconciliation of sales and purchases against TRA data — in development, do not quote as available |
partner_statement |
17 | Customer and vendor statements, exported to Excel |
direct_budget_management |
17 | Budget management against accounting data |
sales_dashboard, thalia_mgmt_dashboard_v17 |
17 | Management reporting drawn from accounting data |
5. Configuration¶
Order matters. Several of these cannot be changed cleanly once transactions exist.
- Prerequisite — set the company country first. Settings → Users & Companies → Companies. The country determines which chart-of-accounts template and tax set Odoo offers. Getting this wrong means redoing the chart.
- Install the fiscal localisation / chart of accounts template. Settings → Accounting → Fiscal Localization. For Tanzanian clients confirm the package selected and whether the default VAT rate is 18%.
- Set the fiscal year end — Settings → Accounting → Fiscal Periods.
- Review the chart of accounts. Accounting → Configuration → Chart of Accounts. Add the client's own accounts and set each one's type correctly; account type drives which financial report a balance lands in.
- Configure journals. Accounting → Configuration → Journals. Confirm the short code and the entry sequence of each journal. Bank and cash journals need their linked account set.
- Configure taxes. Accounting → Configuration → Taxes. Verify the VAT rate, whether it is price-included, and the tax grids each one posts to — the tax report is only as correct as these mappings.
- Set default payment terms — Accounting → Configuration → Payment Terms.
- Enable Analytic Accounting if cost centres are needed — Settings → Accounting → Analytics. Then create the analytic plans and accounts.
- Enable multi-currency if the client invoices in foreign currency, and set the rate update source.
- Set the lock dates once the first period is closed — Settings → Accounting → Fiscal Year lock date and Tax lock date.
Configuration traps
- Account type is not cosmetic. It decides whether a balance appears on the P&L or the Balance Sheet. A misfiled account produces reports that look plausible and are wrong.
- Anglo-Saxon vs Continental accounting changes when cost of goods sold is
recognised — on delivery versus on invoice. It is set once and must not be flipped
mid-year. Anglo-Saxon requires
stock_accountand a costing method on each product category. - Journal sequences are legal numbering. Changing a posted journal's sequence creates gaps that an auditor will ask about.
- Lock dates are the only real protection against back-dated edits. Without them, a user with accounting rights can alter a closed month.
6. How it's used¶
Customer invoicing¶
- Accountant — Accounting → Customers → Invoices → New. Select the customer; payment terms and fiscal position default from the customer record.
- Accountant — add invoice lines. Each line carries an account and a tax, defaulted from the product.
- Accountant — Confirm. This posts the journal entry and assigns the legal sequential number. Before this point the invoice is a draft and freely editable; after it, changes require a credit note.
- Accountant — Send & Print to deliver the invoice to the customer.
- Cashier / Accountant — Register Payment when money arrives. Partial payments leave a residual balance and the invoice stays Partially Paid.
Vendor bills¶
- Purchasing — raises the purchase order (see the Purchase page). On NestERP
deployments this passes through
purchase_multi_approvalfirst. - Accountant — Accounting → Vendors → Bills → New, or Create Bill from the confirmed purchase order so quantities and prices are inherited.
- Accountant — checks the bill against the receipt, then Confirm and register the outgoing payment.
Period close¶
- Accountant — reconciles bank and cash journals against statements.
- Accountant — reviews the tax report and files the VAT return.
- Accounting Administrator — sets the lock date so the period cannot be reopened.
Screenshots needed
Capture from the Thalia live instance and save to docs/assets/accounting/:
- Invoicing dashboard showing journal cards
- A posted customer invoice in form view
- Chart of Accounts list view
- Journals configuration list
- Taxes configuration, one tax open showing its grids
- Register Payment dialog
- Profit & Loss report as produced by
base_accounting_kit
7. Access rights¶
| Group | Can do |
|---|---|
| Billing | Create, edit and post invoices and bills; register payments. Cannot change the chart of accounts or configuration. |
| Billing Administrator | Everything above, plus manage the chart of accounts, journals, taxes, fiscal positions and lock dates. |
| Analytic Accounting | See and set analytic distributions on documents. |
Multi-company deployments restrict records by company through Odoo's standard company
record rules — a user only sees journals and entries of companies in their allowed set.
Branch-level restriction beyond company level requires multi_branch_base (Tier 2).
8. Version differences (16 / 17 / 18)¶
- The app is labelled Invoicing in Community.
- View definitions use
attrsandstatesfor conditional field behaviour. Any of our modules inheriting accounting views on 16 use this older syntax.
attrsandstatesare removed. Conditional behaviour moves to directinvisible,readonlyandrequiredattributes carrying Python expressions. This breaks any view inheritance carried over unchanged from 16 — it is the single most common cause of a module failing to load after a 16 → 17 upgrade.- Refreshed interface; menu structure largely unchanged from 16.
- This is the version of the Thalia reference instance.
<tree>view elements are superseded by<list>. Our modules were corrected for this during the v18 upgrades.- Mail-template rendering is stricter — a template referencing a field that does not resolve now raises instead of rendering empty. This bit us during the payroll v18 upgrade.
editable="0"is required in places where an empty attribute previously sufficed.
9. Known limitations¶
- No bank-statement reconciliation widget in Community. Reconciliation is manual through journal items. The guided reconciliation screen is Enterprise.
- No native financial reports in Community. Profit & Loss, Balance Sheet and Cash Flow
come from
base_accounting_kit(Cybrosys) anddynamic_accounts_report(Heritage), both Tier 2. If either lags an Odoo release, the client loses their financial reports on upgrade — and since the kit also supplies the Accounting root menu, they lose the app layout with it. This is the sharpest upgrade dependency in the whole stack. - No asset or deferred-revenue management in core Community — also backfilled by
base_accounting_kit. - No automated dunning in core. Overdue-invoice chasing is why
thalia_invoice_remindersexists. - No TRA / EFD fiscal-device integration anywhere in Odoo. Tanzanian fiscal compliance
is entirely custom work.
thalia_tra_reconciliationis being built to reconcile against TRA data — never to fiscalise at device level — and it is not finished, so today this is a gap, not a feature. - Budgets are third-party, via
base_account_budget.
Needs verification on the Thalia live instance
Written from the code and from Odoo behaviour, not yet confirmed against the running instance. Confirm each before this page is treated as final.
- Which fiscal localisation package is installed, and the default VAT rate on it
- Whether accounting is configured Anglo-Saxon or Continental, and the costing method set on product categories
- The actual journal list and their short codes
- Whether lock dates are set, and to what
- Whether
dynamic_accounts_reportis installed on the live instance or onlybase_accounting_kit - Exact reconciliation workflow in use — confirm what Community 17 offers versus what the team actually does
- Whether analytic accounting is enabled, and the analytic plan structure
- Multi-company setup: how many companies, and whether
multi_branch_baseis active