Generate e-Faktur compliant Indonesian tax invoices, serial numbers and export files directly from Odoo customer invoices. Built to order by ECOSIRE for Odoo 17.0, 18.0 or 19.0, Community or Enterprise. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $499.00 USD; request a quote for a scoped proposal.
Illustrative previewGenerate e-Faktur compliant Indonesian tax invoices,
serial numbers and export files directly from Odoo customer invoices. Built to order by ECOSIRE for Odoo 17.0, 18.0 or 19.0, Community or Enterprise.
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.
Indonesian finance teams running Odoo usually end up with two parallel invoicing processes. The customer invoice is posted in account.move, and then somebody re-keys the same transaction into a separate e-Faktur workflow — matching tax identity numbers, applying the correct serial number range, restating tax bases in rupiah, and producing the file the tax application expects. Odoo core has no concept of an Indonesian tax invoice serial number, no field for a counterparty NPWP or NIK at the level the regulator expects, and no export that matches the required record layout. The result is duplicated data entry at month end, mismatches between the general ledger and what was reported, and a correction process that lives in spreadsheets and email rather than in the ERP.
ECOSIRE builds a dedicated Odoo module that makes the e-Faktur obligation a property of the invoice itself. We extend account.move and account.move.line with the Indonesian tax fields — counterparty tax identity, transaction and additional codes, replacement/correction flags, the assigned serial number and the reported status — and add a new model for serial number ranges so a controller can register an allocated block, watch consumption, and be blocked by an @api.constrains guard before a range is over-drawn or a number is issued twice. Serial assignment happens inside an overridden _post(), so the number is bound to the same database transaction that creates the journal entry: an invoice can never be posted without a number, and a number can never be consumed by an invoice that failed to post. Tax treatment is driven from your existing master data — account.tax, fiscal positions and product categories carry the Indonesian classification, so the right answer falls out of the normal sales flow instead of being chosen by hand at export time.
One posting produces both outputs. The human-readable tax invoice is a QWeb report you can brand and then print or email through the standard mail.template and chatter flow, and the machine format is produced by a dedicated export model that assembles the header and detail records, validates them field by field, and writes the file for upload. Validation runs before the file is written, not after it is rejected: tax identity format, mandatory address and unit-of-measure data, base-versus-tax arithmetic to the rupiah, and period boundaries are all checked, with each failure reported against the specific invoice so a batch can be fixed in one pass. When the tax application rejects a document, the correction workflow creates a properly linked replacement — the new invoice records the original serial number and the correction sequence, the original is flagged, and both stay joined in Odoo so the trail still reads correctly months later. Every generated file, its checksum, its line count and the user who produced it are retained as ir.attachment records on the export, and access is governed by ir.model.access.csv plus record rules so only the tax role can allocate serials or regenerate a submitted batch.
The module is delivered for your exact Odoo version — 17.0, 18.0 or 19.0 — and runs on Community as well as Enterprise, because the __manifest__.py depends only on the account app rather than on any Enterprise-only accounting feature. Where you do run Enterprise we can wire the export into an automated action or a scheduled ir.cron job so a batch is assembled on a fixed day each month, and every method is reachable over XML-RPC and JSON-RPC if you want middleware or a portal to trigger generation externally. Multi-company groups get per-company serial ranges and per-company numbering that respect the standard company record rules.
This is a build-to-order product, not a download. After you request a quotation we hold a short scoping call to confirm your Odoo version and edition, your current tax configuration, whether you invoice from one company or a group, and how you want corrections handled. We come back with a fixed scope and a fixed quote, then build it, test it on a copy of your database, and hand it over. Typical delivery is two to four weeks from confirmed scope, and you receive the full source, a git repository, documentation, training and a post-go-live support window — not a black box.
Owns the monthly tax filing and signs off what gets reported. Needs serial numbers allocated and consumed without gaps or duplicates, an export that reconciles to the general ledger, and a defensible audit trail when the numbers are questioned later.
Issues customer invoices daily and currently re-keys them into a separate tax workflow. Wants one posting to produce both the printed tax invoice and the export record, with validation errors surfaced before submission rather than after rejection.
Responsible for the Odoo instance and its upgrade path. Wants a properly structured module with real `ir.model.access.csv` security, no patched core, source in a git repository, and a clear story for the next major version.
Runs several Indonesian companies in one Odoo database. Needs per-company serial ranges, numbering that respects record rules, and consistent tax reporting across every entity without a spreadsheet in the middle.
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo Native |
|---|---|---|---|---|
| Fit to your tax setup | Built against your actual chart of accounts, fiscal positions and tax codes after a scoping call | Fits exactly — if your team already knows both Odoo accounting and the Indonesian requirement | Generic configuration assuming a standard install; edge cases become workarounds | No Indonesian tax invoice concept at all |
| Serial number control | Range model with allocation tracking and constraints that block gaps, over-draw and reuse | Whatever your developer builds; the transaction-safety detail is easy to miss | Often a plain sequence with no range accounting or consumption view | Standard Odoo sequences only, with no notion of an allocated regulatory range |
| Odoo version coverage | Delivered and tested for your exact 17.0, 18.0 or 19.0, Community or Enterprise | One version, with the upgrade cost landing on you later | Usually one or two branches; the newest version often lags | Every version, with none of the required functionality |
| Correction handling | Linked replacement invoices carrying the original serial and correction sequence, visible in Odoo | Depends entirely on how deeply the requirement was understood | Frequently a manual re-issue with the link tracked outside the system | Credit notes only, with no regulatory correction linkage |
| Audit trail | Every generated file kept as an attachment with checksum, line count, user and timestamp | Buildable, but usually deprioritised until an audit demands it | Typically the latest export only, overwritten on regeneration | Standard chatter and journal audit, nothing tax-file specific |
| Ownership of the code | Full source and git repository handover — maintain or extend it in-house | You own it, along with the entire maintenance burden | Licensed per instance; obfuscated or abandoned branches are common | Odoo core, not modifiable without forking |
| Time and cost to live | Fixed scope and fixed quote, typically two to four weeks from the scoping call | Months of discovery, build and rework by a team learning the domain | Fast to install, then slow to reconcile once real invoices fail validation | Immediate, but the compliance gap stays open |
| Support after go-live | Defined support window plus documentation, a user guide and a training session | Whoever built it — a real risk the day that person leaves | Ticket queue with no context on your configuration | Odoo support does not cover a country requirement that is not implemented |
This is a build-to-order module, so there is no instant download. Typical delivery is two to four weeks from confirmed scope. The clock starts after the scoping call, once we have agreed your Odoo version and edition, your tax configuration, the correction handling you want and the export layout. Larger multi-company or integration scopes are quoted with their own timeline.
The quotation includes a post-go-live support window for defect fixes and configuration questions on the delivered scope. Because you receive the full source in a git repository, your own team can also maintain and extend it. Regulatory format changes and upgrades to a newer Odoo major version are handled as scoped follow-on work — we tell you upfront what that involves rather than leaving it open-ended.
It works on both. The `__manifest__.py` declares a dependency on the `account` app only, so nothing here requires an Enterprise-only accounting feature. On Enterprise we can additionally wire the export into an automated action or a scheduled job if that suits your month-end routine.
We build for 17.0, 18.0 and 19.0, and you get the module compiled and tested against your exact version — we do not ship one branch and hope it loads. If you are mid-upgrade, say so at scoping and we will discuss whether to deliver against your current version, the target version, or both.
No. The module reads your existing `account.tax` records, fiscal positions and product data and layers the Indonesian classification on top. We do not restructure your chart of accounts. If your current tax setup is inconsistent we will flag it during scoping so it can be cleaned up as separate, visible work.
The correction workflow creates a replacement invoice that records the original serial number and the correction sequence, flags the original, and keeps both linked in Odoo. The pre-export validation is designed to catch most rejections before submission — tax identity format, missing mandatory data and base-versus-tax rounding are each checked per invoice with the specific failure reported.
Yes. The export and validation methods are callable over XML-RPC and JSON-RPC, so middleware, a portal or a scheduled external job can generate a batch and read back the result. If you want a specific integration shape, raise it at scoping so it is inside the fixed quote.

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.
Generate e-Faktur compliant Indonesian tax invoices, serial numbers and export files directly from Odoo customer invoices. Built to order by ECOSIRE for Odoo 17.0, 18.0 or 19.0, Community or Enterprise.