Skip to main content
Uganda EFRIS Compliance for Odoo — A build-to-order Odoo module that registers your invoices and receipts with URA's EFRIS fr — 1/1Illustrative preview

A build-to-order Odoo module that registers your invoices and receipts with URA's EFRIS from inside Odoo,

returning the FDN, verification code and QR onto the customer-facing document.

ECOSIRE scopes, builds, installs and supports it for your exact Odoo version and chart of accounts.

What is Uganda EFRIS Compliance for Odoo?

A build-to-order Odoo module that registers your invoices and receipts with URA's EFRIS from inside Odoo, returning the FDN, verification code and QR onto the customer-facing document. ECOSIRE scopes, builds, installs and supports it for your exact Odoo version and chart of accounts. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.

Key Features

Dedicated `efris.transaction` model linked to `account.move`, storing request payload, URA response, FDN, verification code, QR payload and per-attempt timestamps
Asynchronous registration on invoice confirmation via queued job or automated action, so URA latency never blocks the accounting UI
EFRIS goods/services classification code, commodity category and UoM mapping added to `product.template` and `product.product`
TIN, buyer-type and legal-name fields on `res.partner`, validated before a document can be submitted
`account.tax` to EFRIS tax-category mapping so standard-rated, zero-rated and exempt lines are declared exactly as posted
Pre-submission Python constraints that block confirmation when a classification code, TIN or tax mapping is missing — errors surface in Odoo, not at URA
QWeb invoice and receipt report extensions rendering the fiscal block, FDN, verification code and generated QR image on the customer-facing document
Rejection handling that parks the transaction in a `rejected` state with URA's error code, raises a `mail.activity` on the owner, and permits correction and re-submission against the same move with no duplicate journal entry
Credit-note flow carrying the original FDN reference so EFRIS credit applications reconcile to the invoice they reverse
Idempotent submission keyed on the move, so a retry, a double click or a cron re-run cannot register the same document twice
Credential storage in `ir.config_parameter` scoped by company, with multi-company support for groups invoicing under more than one TIN
Security via `ir.model.access.csv` plus record rules — a dedicated EFRIS group controls who can view credentials, re-submit, or void
Immutable audit trail: every request and response persisted and mirrored to chatter, with a searchable list view filtered by state, date and error code
XML-RPC/JSON-RPC exposure of the registration methods so POS, e-commerce or an external billing system can drive the same code path
Support for Odoo 17.0, 18.0 and 19.0, Community or Enterprise, with the manifest and dependencies pinned to the edition you actually run

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your Odoo.

  3. 3

    Go live + support

    You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.

Technical Specifications

Odoo Compatibility
Odoo 17, Odoo 18, Odoo 19
Editions
Enterprise & Community
License
Licence confirmation required
Python Requirement
Python 3.10+
Database
PostgreSQL 12+

About this Product

Finance teams invoicing in Uganda live with a split process. The sale is recorded in Odoo, but the fiscal document is produced somewhere else — a URA EFRIS portal session, an offline client, or a spreadsheet someone re-keys at the end of the day. The result is predictable: FDNs that do not tie back to account.move records, credit notes issued in Odoo with no matching EFRIS credit application, VAT summaries that disagree between the ERP and the URA portal, and a month-end where the accountant reconciles two systems by hand. Odoo core does not know EFRIS exists. There is no Ugandan fiscal-device layer in Community or Enterprise, no FDN field on the invoice, no place to store a verification code, and the standard QWeb invoice report has no slot for a compliance QR. You can bolt on a tax group and call it VAT, but nothing in the stock product registers a document with a revenue authority or handles what comes back.

What we build is an EFRIS integration layer that lives inside your Odoo database and treats registration as part of posting, not as an afterthought. A dedicated model (typically efris.transaction) is linked one-to-one to each account.move and carries the full lifecycle: the payload we assembled, the signed request, URA's response, the FDN, verification code, QR payload, and the timestamp of each attempt. Confirming an invoice enqueues registration through a queued job or an automated action rather than blocking the user's click, so a slow or unreachable URA endpoint never freezes the accounting screen. Product and partner master data drive the payload: product.template gains the EFRIS goods/services classification code, unit-of-measure mapping and commodity category; res.partner carries TIN and buyer type; account.tax maps to the correct EFRIS tax category so exempt, zero-rated and standard-rated lines are declared exactly as they are posted. Computed fields with @api.depends keep mapped values in sync when master data changes, and a constraint blocks confirmation when a line's mapping is missing — the error surfaces at the desk, not at the revenue authority.

The response side is where most integrations fall down, so we build it explicitly. A successful registration writes the FDN, verification code and QR back onto the move and stamps a chatter message with the raw response for audit. The QWeb invoice and receipt reports are extended to render the human-readable fiscal block plus the QR image, so one posting produces both the document a customer can read and the machine record URA holds. Rejections are not swallowed: the transaction moves to a rejected state with URA's error code and message, an activity is raised on the responsible user, and a correction workflow lets finance fix the underlying data — a wrong classification code, a missing TIN, a tax mapping — and re-submit against the same move without creating a duplicate accounting entry. Credit notes route through the EFRIS credit-note flow with the reference to the original FDN carried automatically. Everything is reachable over Odoo's XML-RPC/JSON-RPC API so a POS front end, a webshop, or a third-party billing system can trigger the same code path, and access is controlled with ir.model.access.csv plus record rules so only the finance group can view credentials or re-submit a transaction.

This is a build-to-order product, not a download. EFRIS behaviour depends on your taxpayer configuration, the credentials URA issued you, the shape of your product catalogue, and whether you invoice from Sales, POS, Subscriptions or a custom flow. We start with a scoping call, confirm your Odoo version (17.0, 18.0 or 19.0), edition (Community or Enterprise — Enterprise-only dependencies are declared or avoided based on what you actually run), and your URA integration credentials and test environment. We then build against your data, deploy to a staging database for UAT with your own invoices, and only after your sign-off do we install on production with a rollback plan in hand.

Typical delivery is one working week from confirmed scope. You receive the full source of the module — __manifest__.py, models, views, security rules, QWeb reports and data files — in a git repository you own, so nothing about your compliance path is locked to us. Where URA changes a schema or a field, the fix is a change in code you already hold, applied by us during your support window or by your own team afterwards.

What you get

  • Installable module source for your exact Odoo version (17.0, 18.0 or 19.0) and edition, with a clean `__manifest__.py` and no undeclared dependencies
  • Installation and configuration on your environment, including URA credential setup, classification-code loading and tax mapping against your existing chart of accounts
  • Technical documentation covering the data model, submission flow, error codes, cron/queue configuration and the RPC entry points
  • End-user guide plus a live training session for your finance team covering issuance, rejection handling and the correction workflow
  • UAT on a staging database using your own invoices and URA's test environment, with a written rollback plan before any production install
  • Post go-live support window for defects, URA schema changes and configuration adjustments
  • Git repository handover — full source, branch history and tags — so your team can maintain or extend the module independently
  • Deployment notes for upgrading the module across future Odoo minor versions

Who this is for

Finance Manager / Chief Accountant

Owns the VAT return and the month-end close. Needs every posted invoice to carry an FDN that reconciles to the URA portal, and needs rejections visible and fixable the same day rather than discovered at filing time.

Head of IT / ERP Owner

Runs the Odoo instance and answers for uptime. Wants the integration to fail gracefully when URA is unreachable, to be auditable, to keep credentials out of user-visible fields, and to ship as source code in a repository the company owns.

Billing / Accounts Receivable Team Lead

Issues invoices and credit notes daily. Needs the compliance block and QR on the document the customer actually receives, and a correction path that fixes bad data and re-submits without voiding a legitimate accounting entry.

External Auditor or Tax Consultant

Reviews the compliance position. Needs a searchable, immutable record of every submission, response and correction, tied line-by-line to the accounting entries it represents.

How Uganda EFRIS Compliance for Odoo Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
Fit to your URA setup and catalogueBuilt against your actual TIN configuration, product classification codes and tax mappingFits perfectly if your team knows both EFRIS and Odoo internals wellGeneric mapping assumptions; classification and tax setup left to youNo EFRIS concept exists in Odoo core at all
Rejection and correction workflowRejected state with URA error code, activity to the owner, correct-and-resubmit on the same moveUsually deferred past v1 and built after the first bad filingOften logs the error only; correction becomes a manual portal taskNothing to reject — no submission takes place
Fiscal data on the customer documentQWeb reports extended with FDN, verification code and QR from the same postingAchievable, but QWeb report inheritance is where DIY builds commonly stallQR often present; layout rarely matches your existing report templateStandard invoice report has no fiscal block or QR slot
Behaviour when URA is slow or downAsynchronous queued submission with idempotent retry; posting is never blockedFrequently synchronous in v1, which freezes the invoice screenVaries by vendor and is rarely documented before purchaseNot applicable — nothing is submitted
Audit trailEvery request and response persisted, mirrored to chatter, searchable and filterableDepends entirely on how much logging the developer chose to buildTypically a status field plus a last-error stringStandard chatter only, with no fiscal record to trace
Source code ownershipFull source handed over in a git repository you ownYou own it outright — the main advantage of DIYOften obfuscated, licence-keyed or tied to the vendor's update channelOdoo core source, with no EFRIS functionality in it
Version and edition coverageBuilt and tested for your target 17.0, 18.0 or 19.0 on Community or EnterpriseOne version at a time, and upgrades are your team's problemVersion support depends on the vendor's backport appetiteAll versions, none of them EFRIS-aware
Time to a working, proven integrationone working week from confirmed scope, including UAT on stagingMonths once EFRIS specification study and testing are counted honestlyFast to install, then slow to configure and reconcileNever — the capability does not exist

Frequently Asked Questions about Uganda EFRIS Compliance

How long does delivery take?

This is a build-to-order module, so nothing ships until scope is confirmed. Typical delivery is one working week from a confirmed scope — that covers development against your Odoo version and data, deployment to staging, UAT with your own invoices on URA's test environment, and the production install. Complex cases (multiple TINs, POS issuance, a custom billing flow, or migration of historical documents) can extend that, and we tell you before you commit, not after.

What support and updates do I get after go-live?

Every engagement includes a post go-live support window covering defects, configuration adjustments and changes URA makes to the EFRIS schema during that period. You also receive the full source in a git repository you own, so your own developers can maintain or extend the module without us. After the support window you can either handle changes in-house or continue on an ECOSIRE support agreement — the choice stays yours because the code is already in your hands.

Which Odoo versions and editions does this work with?

We build for Odoo 17.0, 18.0 and 19.0, in either Community or Enterprise. The module is built for one target version per engagement so the manifest, dependencies and view inheritance are correct rather than defensively version-branched. If you run Enterprise we can use Enterprise-only features where they genuinely help; if you run Community we avoid them entirely so the module installs cleanly.

Do I need my own URA EFRIS credentials?

Yes. EFRIS credentials and taxpayer registration are issued to you by URA and cannot be supplied by a software vendor. We work with the credentials and test-environment access you hold and help you configure them correctly inside Odoo. Part of the scoping call is confirming what you already have, so the build is not blocked waiting on registration.

What happens when URA rejects a document, or the service is unreachable?

Registration runs asynchronously, so an unavailable URA endpoint does not block invoice confirmation — the transaction stays queued and retries. A rejection is stored with URA's error code and message, moves the transaction to a `rejected` state, and raises an activity on the responsible user. Finance corrects the underlying data — a missing classification code, TIN or tax mapping — and re-submits against the same accounting entry. Submission is idempotent, so retries cannot double-register a document.

Can our POS, webshop or external billing system trigger EFRIS registration?

Yes. The registration methods are exposed over Odoo's XML-RPC/JSON-RPC API, so anything that can create or confirm a move in Odoo can drive the same code path. If issuance from POS or a specific external system is in scope, tell us on the scoping call — it changes the payload assembly and the receipt report, and we build for it rather than retrofitting later.

Is this an existing module I can download from the Odoo App Store?

No. This is built to order for your environment. EFRIS behaviour depends on your taxpayer configuration, credentials, product catalogue and invoicing flows, and a generic download cannot know any of those. We scope first, build against your actual data, prove it on staging with your invoices, and install on production only after your sign-off.

Request a quote

Uganda EFRIS Compliance

A build-to-order Odoo module that registers your invoices and receipts with URA's EFRIS from inside Odoo, returning the FDN, verification code and QR onto the customer-facing document. ECOSIRE scopes, builds, installs and supports it for your exact Odoo version and chart of accounts.

  • Dedicated `efris.transaction` model linked to `account.move`, storing request payload, URA response, FDN, verification code, QR payload and per-attempt timestamps
  • Asynchronous registration on invoice confirmation via queued job or automated action, so URA latency never blocks the accounting UI
  • EFRIS goods/services classification code, commodity category and UoM mapping added to `product.template` and `product.product`
  • TIN, buyer-type and legal-name fields on `res.partner`, validated before a document can be submitted

Request a Quotation

Tell us about your Uganda EFRIS Compliance requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.