A build-to-order Odoo module that turns your existing billing flow into Japan Qualified Invoice System output — registration numbers, per-rate tax breakdowns, correction invoices and retained archives. ECOSIRE scopes, builds, installs and supports it on your Odoo 17, 18 or 19. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $499.00 USD; request a quote for a scoped proposal.
Illustrative previewA build-to-order Odoo module that turns your existing billing flow into Japan Qualified Invoice System output
— registration numbers, per-rate tax breakdowns, correction invoices and retained archives.
ECOSIRE scopes, builds, installs and supports it on your Odoo 17, 18 or 19.
No DIY setup — a working app, built, installed and supported by ECOSIRE.
Start with a one-time build price. We scope it with you at kickoff.
ECOSIRE builds, configures and installs it on your Odoo.
You go live in about 2–4 weeks, with a post-launch support window.
Japan's Qualified Invoice System changed what a valid invoice actually is. A buyer can only claim input consumption tax when the seller's document carries the seller's registration number, states the taxable amounts separated by rate (10% standard and 8% reduced), and shows the consumption tax per rate — with rounding applied once per rate per invoice, not per line. Finance teams discover the gap the same way every time: a customer's AP department rejects an invoice because the registration number is missing or the 8% items were folded into the 10% subtotal, and the ERP has no clean way to reissue a compliant correction that references the original document. Odoo core gives you account.move, tax groups and a QWeb invoice report, but it has no concept of a qualified-invoice registration number on a partner or company, no per-rate rounding policy, no rejection-and-correction lifecycle, and no retention rules tied to Japanese record-keeping expectations.
We build a dedicated addon that installs alongside your existing chart of accounts and does not fork core accounting. On the data side we extend res.company and res.partner with a validated registration number field (format-checked through @api.constrains, so a malformed number can never reach a posted document), and we extend account.move with computed fields — declared with _inherit on models.Model, not new tables — that group the move's line_ids by tax rate and produce a per-rate taxable base, per-rate tax amount and a single rounding decision per rate. Those computes are @api.depends on the invoice lines and their taxes, so the breakdown recalculates deterministically and stores on the move for reporting. Tax mapping comes from your existing master data: it is driven off account.tax records and fiscal positions rather than hardcoded rates, so a future rate change is a configuration change, not a code change.
Output is generated once and rendered twice. A single posted move produces the human-readable qualified invoice as a QWeb PDF (a proper report_action with its own restylable template showing the registration number, the per-rate blocks and the retained document identifier), and the same computed values feed a machine-readable payload — CSV, JSON or a structured XML shape agreed during scoping — exposed on the model so downstream systems, a portal or an integration can pull it over XML-RPC/JSON-RPC without re-deriving the numbers. That single-source rule is what keeps the paper and the data from drifting apart, which is the failure mode that turns a routine audit into a reconciliation project.
Rejections get a real workflow instead of a spreadsheet. When a customer's AP rejects a document, an authorised user records the rejection with a reason on the invoice; the module drives a correction path that issues either a credit note plus a replacement or an amended qualified invoice, always carrying a reference back to the original document number so the chain is reconstructable. Every state change is stamped into the chatter through the standard mail.thread mixin, and the archive side keeps the issued PDF and its payload as protected ir.attachment records with a retention marker, so a routine attachment cleanup cannot quietly remove evidence. Access is governed properly — ir.model.access.csv entries plus record rules, so an invoicing clerk can issue and correct while only a finance manager can override a registration number or release an archived document — and scheduled ir.cron actions flag posted moves missing a counterparty registration number before month-end close.
This is build-to-order, so nothing here is a download you install this afternoon. We start with a scoping call to look at your actual chart of accounts, tax configuration, invoice templates, customer requirements and Odoo version, then quote a fixed scope. Typical delivery is two to four weeks from confirmed scope. You get the module built against your exact version — Odoo 17.0, 18.0 or 19.0, Community or Enterprise (the Enterprise build can hook into the accounting reporting engine and follow-up flows where you use them; the Community build ships the same compliance logic through standard views and QWeb) — installed on a staging database first, run through UAT with your own invoices, then deployed to production with a rollback plan and a support window while your first real billing cycle goes out the door.
Owns whether input tax is claimable and whether the ledger survives an audit. Needs every issued document to carry the registration number and per-rate breakdown by construction, rejections handled without off-system spreadsheets, and a retained archive that is still defensible years later.
Sends the invoices and absorbs the rejections. Wants a correction to be a few clicks inside Odoo with the original document reference attached automatically, instead of a manual credit note plus a re-keyed replacement plus an email chain.
Has to live with the addon after go-live. Cares that it uses `_inherit` rather than forking core accounting, that access is enforced through `ir.model.access.csv` and record rules, that the next series upgrade stays tractable, and that the git repository is handed over.
Runs Japan as one company among several in a single Odoo database. Needs registration numbers, sequences, archives and reports scoped per company so Japanese compliance logic never leaks into another entity's invoicing.
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo Native |
|---|---|---|---|---|
| Fit to your tax configuration | Built against your actual chart of accounts, `account.tax` records and fiscal positions during scoping | Same fit is achievable, but your team spends the discovery time learning qualified-invoice rules first | Assumes a generic tax setup; usually needs your configuration bent to match the module | Tax groups exist, but no concept of a qualified invoice or its per-rate presentation rules |
| Registration number handling | Validated field on company and partner with a posting-time constraint, plus a cron sweep for missing counterparty numbers | Straightforward to add, but validation and the pre-close sweep are usually skipped until an invoice is rejected | Often a free-text field printed on the PDF with no format validation | No such field; teams put it in a partner note or hardcode it into the report template |
| Per-rate breakdown and rounding | Computed on the move with `@api.depends`, rounded once per rate under a configurable policy | Doable, but per-rate rather than per-line rounding is the detail most in-house builds get wrong first time | Typically prints subtotals without enforcing single-rounding-per-rate | Rounds through standard per-line tax computation; no qualified-invoice rate block |
| Rejection and correction workflow | Rejection capture with reasons driving credit-note-plus-replacement or amendment, always referencing the original | Frequently descoped to save budget, then handled manually in spreadsheets | Rarely included; usually stops at generating the document | Credit notes exist, but nothing links a correction to a rejected qualified invoice as a chain |
| Archiving and audit trail | Issued PDF and payload retained as protected attachments, with all state changes in the chatter | Depends entirely on whether retention was written into the spec | Attachments stored, but usually removable by routine cleanup | Standard attachments and chatter, with no retention protection or compliance meaning |
| Machine-readable output | Payload generated from the same computed values as the PDF and exposed over XML-RPC/JSON-RPC | Possible, though PDF and export logic often become two code paths that drift | Export usually available but derived separately from the printed document | Generic invoice export only; no qualified-invoice structure |
| Version and edition coverage | Built and tested for your exact target — 17.0, 18.0 or 19.0, Community or Enterprise | Single target by default; each additional version costs more of your team's time | Listed versions vary; the version you run may lag behind release | Ships with every version, but the capability is simply absent |
| Ownership and lock-in | Full git repository handover with commit history; no licence call-home in the delivered code | Fully owned, but the knowledge lives with whoever wrote it | Vendor-licensed; extending or forking it is usually restricted | Core code is open, but you own no solution because none exists |
This is a build-to-order module, not an existing download. Typical delivery is 2-4 weeks from confirmed scope. That clock starts after the scoping call and your sign-off on the quote and agreed feature list — not from the day you enquire. Complexity drives the range: a single Japanese entity on standard Odoo invoicing sits at the short end, while a multi-company group with custom invoice templates, an existing AP integration and historical data to bring into the archive sits at the long end. We tell you which end you are on before you commit.
Both. The compliance logic — registration numbers, per-rate breakdowns, rounding, corrections, archiving, security — is built on standard framework primitives (`models.Model`, QWeb reports, `ir.cron`, `ir.model.access.csv`) and runs identically on Community. On Enterprise we additionally hook into the accounting reporting engine and follow-up flows where you already use them. We build for the edition and version you actually run: 17.0, 18.0 or 19.0.
No. It is a separate addon that extends models via `_inherit` — no core files are patched and no chart of accounts is rewritten. Tax handling reads your existing `account.tax` records and fiscal positions rather than defining its own rates, so current postings, reports and reconciliations behave exactly as they do today. Everything is installed and proven on a staging copy of your database first, and we ship a rollback plan alongside the production deployment.
You record the rejection on the invoice with a reason, and the module drives the correction path — either a credit note plus a replacement qualified invoice, or an amended document, depending on the policy agreed at scoping. The correction always carries a reference back to the original document number, and the full sequence is stamped into the chatter with user and timestamp. The rejected original stays in the archive; nothing is deleted to make the ledger look tidy.
Yes. The per-rate breakdown and the machine-readable payload are model fields and methods, so anything that can speak Odoo's XML-RPC or JSON-RPC API can read them — a customer's AP system, a bank portal, a BI tool or a middleware layer. Because the payload is generated from the same computed values as the PDF, an integration and a printed invoice cannot disagree about the numbers.
Every build includes a post-go-live support window agreed at scoping (typically 30-90 days) covering defects, configuration questions and your first live billing cycle. After that you can maintain it yourself — you receive the full git repository, so you are never locked in — or take an ongoing ECOSIRE support and maintenance agreement. Upgrades to a newer Odoo series, and changes driven by future Japanese rule changes, are quoted separately as scoped work rather than assumed.
Yes. You get the complete source and the git repository with full commit history and a tagged release for your version. There is no obfuscation and no licence-server call-home in the delivered module. If you later move to another Odoo partner, they can read, extend and maintain what we built.

A build-to-order Odoo localization that loads Algeria's full wilaya and commune hierarchy with bilingual French and Arabic names, wired into partner addresses and reporting. ECOSIRE builds, installs, and supports it after your quotation.



A build-to-order Odoo module that lets you render any accounting report — P&L, Balance Sheet, aged reports, journals, trial balance — in a currency of your choice, with automatic conversion at the rate you define. ECOSIRE scopes, builds, installs and supports it for your Odoo 17/18/19 environment.
A build-to-order Odoo module that turns your existing billing flow into Japan Qualified Invoice System output — registration numbers, per-rate tax breakdowns, correction invoices and retained archives. ECOSIRE scopes, builds, installs and supports it on your Odoo 17, 18 or 19.