Issue GİB-compliant e-Fatura and e-Arşiv documents straight from Odoo, with automatic scenario routing for registered and non-registered buyers, correction workflows, and a durable audit archive. Built to order by ECOSIRE for your Odoo 17.0, 18.0 or 19.0 database. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $499.00 USD; request a quote for a scoped proposal.
Illustrative previewIssue GİB-compliant e-Fatura and e-Arşiv documents straight from Odoo,
with automatic scenario routing for registered and non-registered buyers, correction workflows, and a durable audit archive. Built to order by ECOSIRE for your Odoo 17.0, 18.0 or 19.0 database.
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.
Invoicing in Türkiye is not a printing problem, it is a routing problem. Every customer invoice has to be classified before it is sent: a buyer registered in the GİB e-Fatura user list must receive a structured e-Fatura through the interoperability network, while everyone else must receive an e-Arşiv document delivered by other means and reported to the administration. Get the classification wrong and the document is rejected downstream, the receivable is disputed, and the finance team is re-keying invoices at month end. Odoo core stops well short of this. account.move gives you a posting, a QWeb PDF and a fiscal position, but it has no concept of a buyer's e-invoice registration status, no scenario field, no structured payload generation, no rejection state and no dedicated legal archive — the Enterprise localisation covers chart of accounts and tax basics, not the end-to-end document lifecycle.
What ECOSIRE builds is a compliance layer that lives inside the invoicing flow rather than beside it. We extend account.move with the fields the process actually needs — document scenario, profile, document UUID, GİB status, response code, dispatch timestamps — and add a res.partner extension holding the buyer's e-invoice registration state with a dated check, so the scenario is decided from evidence rather than habit. Scenario selection is a stored compute (@api.depends on the partner registration flag, the partner's tax identifiers and the invoice type) so it recalculates when master data changes but stays queryable for reporting. Tax lines are mapped from your existing Odoo tax records through a configurable mapping model, so KDV rates, exemption reasons and withholding cases resolve from data you already maintain instead of from hardcoded logic — and an unmapped tax raises a blocking ValidationError at posting rather than producing a silently wrong document.
One posting produces both the machine format and the human-readable rendering. The structured payload is generated from the invoice and its mapping, validated for required fields before dispatch, and stored as an ir.attachment alongside a QWeb report designed for the layout your customers expect, including the document reference and code block where applicable. Dispatch runs through a configurable connector layer so we integrate with the special integrator or private service provider you already contract with; transport is isolated behind a service model, which means changing provider later is a configuration and adapter change rather than a rewrite. Status polling runs as a scheduled ir.cron job that updates the document state and writes to the chatter, so accountants see acceptance, rejection or pending status on the invoice itself.
Rejections are treated as a first-class workflow. When a document comes back refused, the invoice moves to a rejection state carrying the response code and reason, and the correction path — credit note plus corrected reissue, with the original document referenced — is driven from a button rather than from tribal knowledge. Archiving is equally deliberate: payloads, responses and rendered documents are retained with immutable references and an append-only log model, visible through views and filters that let auditors pull a period without asking IT. Access is controlled through ir.model.access.csv plus record rules so only the finance roles you nominate can dispatch, cancel or reissue, and multi-company setups keep their documents separated. Everything is exposed over the standard XML-RPC and JSON-RPC API, so a portal or treasury tool can read document status without a second integration.
This is a build-to-order product, not a download. After a short scoping call we confirm your Odoo version (17.0, 18.0 or 19.0), Community or Enterprise, your service provider or integrator, your KDV and exemption cases, and any sector-specific document requirements. We then build the module against your configuration, deliver it to a staging database for UAT with your own invoice samples, and go live with a documented rollback plan. Typical delivery is two to four weeks from confirmed scope. You receive the full source, a git repository handover, and a post-go-live support window — the code is yours, and nothing is locked behind a runtime key.
Owns invoice issuance and month-end close for a Türkiye-registered entity. Needs every outbound invoice to leave Odoo correctly classified the first time, with rejections visible and correctable in the same screen instead of tracked on a spreadsheet.
Runs a multi-country group where Türkiye is one of several entities on one Odoo database. Needs local compliance handled inside the group chart of accounts and multi-company record rules, without a separate system or a parallel invoicing process.
Responsible for the Odoo instance and its upgrade path. Wants maintainable model extensions, a provider-isolated connector, real access control and full source in a git repo — not an opaque package that blocks the next major-version upgrade.
Signs off on the records. Needs a durable archive of payloads, responses and rendered documents with an append-only trail, retrievable by period and document type without asking developers to run queries.
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo Native |
|---|---|---|---|---|
| Scenario routing (e-Fatura vs e-Arşiv) | Stored compute driven by partner registration status, tax IDs and invoice type; recomputes on master-data change | Achievable, but edge cases (status changes mid-period, mixed buyer base) are usually discovered in production | Often a manual selection field the user is expected to set correctly on every invoice | No concept of buyer e-invoice registration or document scenario exists in core |
| Tax and exemption mapping | Configurable mapping from your existing `account.tax` records, with a blocking validation on unmapped taxes | Frequently hardcoded to the rates known on build day, then quietly wrong after a rate change | Fixed mapping table; sector-specific exemption and withholding cases usually need vendor changes | Taxes and fiscal positions exist, but nothing maps them to compliance document codes |
| Rejection and correction workflow | Dedicated rejection state with response code, plus a button-driven credit note and reissue referencing the original | Commonly out of scope on the first build and added after the first rejected batch | Status is shown; correction is usually left as a manual process for the accountant | Credit notes exist; the compliance rejection lifecycle does not |
| Archiving and audit trail | Payloads, responses and renders retained as attachments with an append-only log and period filters | Depends on the developer's discipline; log models are the first thing cut for budget | Attachments usually stored; queryable, filterable audit extraction varies widely | Standard attachments and chatter only — no compliance archive or extraction |
| Provider / integrator flexibility | Transport isolated behind a service model, so changing provider is an adapter swap | Typically written against one provider's API and coupled through the business logic | Frequently tied to the vendor's own provider relationship or preferred integrator | No dispatch layer at all |
| Access control and multi-company | `ir.model.access.csv` plus record rules separating dispatch, cancel and reissue rights, with company isolation | Usually inherits generic accounting rights; company isolation depends on the build | Basic group split; fine-grained dispatch-versus-invoicing rights are uncommon | Standard accounting groups only — no compliance-action-level rights |
| Source code ownership | Full source and git repository handover, no runtime licence key | You own it, and you also own every future fix and version port alone | Often licence-key gated per database, with redistribution restricted | Core is open source, but there is nothing here to own |
| Version coverage and upgrade path | Built to your target 17.0, 18.0 or 19.0, Community or Enterprise; ports quoted from your existing code | Upgrade cost re-litigated with whoever is available at the time | Version support follows the vendor's release cadence, which you do not control | Upgrades are clean, because the functionality is absent |
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 once we have agreed your Odoo version and edition, your service provider or integrator, your KDV and exemption cases, and any sector-specific document requirements. Complex multi-company or high-volume setups can extend that, and we tell you before you commit rather than after.
You get a post-go-live support window covering defect fixes and configuration adjustments on the delivered scope. Because you receive the full source in your own git repository, your team can also maintain it directly. Changes driven by new GİB requirements, or a port to a newer Odoo major version, are scoped as follow-on work — quoted from your existing codebase rather than starting over — and there is no runtime key that can switch the module off.
Yes. The module handles classification, document generation, dispatch orchestration, status tracking and archiving inside Odoo. Actual transmission to the network runs through the special integrator or private service provider you contract with. Our connector layer is provider-agnostic and isolated behind a service model, so we integrate with the provider you already use, and switching later is an adapter change rather than a rebuild.
Both are supported. The module builds on core `account` models, so Community works. On Enterprise we respect the existing Türkiye localisation — chart of accounts and tax records stay where they are and our tax mapping reads them rather than duplicating them. Tell us your edition at the scoping call, because it changes which base records we map against.
A rejection is a state on the invoice, not an email someone has to notice. The scheduled polling job writes the response code and reason to the document and to the chatter, moves it into a rejection state, and exposes a correction action that issues the credit note and the corrected reissue with the original document referenced. The append-only log keeps the whole chain, so the audit trail shows what was sent, what came back, and what replaced it.
Yes. All status fields sit on standard Odoo models and are exposed over the normal XML-RPC and JSON-RPC API, so a customer portal, a treasury tool or a BI extract can read scenario, dispatch state, response code and archive references without a second integration or a private endpoint.
Tell us at scoping and we build against the target version instead of the current one, or against both if you need a parallel run. Because the module extends core models cleanly and keeps transport behind an adapter, version ports are ordinary maintenance work rather than a rewrite — and you hold the source to do it yourself if you prefer.

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.
Issue GİB-compliant e-Fatura and e-Arşiv documents straight from Odoo, with automatic scenario routing for registered and non-registered buyers, correction workflows, and a durable audit archive. Built to order by ECOSIRE for your Odoo 17.0, 18.0 or 19.0 database.