UAE E-Invoicing After 30 October: What Your Open Source ERP Still Has to Do
> Originally published at icterp.com
The UAE's deadline for large businesses to appoint an e-invoicing provider passed on 30 October 2026, and go-live is 1 January 2027. Appointing an Accredited Service Provider doesn't finish the job. Your ERP, open source or not, still has to send that provider clean, complete invoice data on every sale and credit note.
That's the part most readiness guides skip. They tell you to pick a provider and move on. But the provider only carries what your system gives it, and if your customer tax numbers are half filled in or your credit notes go out late, the provider can't fix that for you. So here's what changed in October, what the penalties really say, and what to check in your own system over the next eight weeks.
What changed in October
Two things happened close together. First, the date itself. The Ministry of Finance had already pushed the provider deadline for businesses with revenue of AED 50 million or more from 31 July to 30 October 2026, and it said in May that go-live on 1 January 2027 stays put. As of today that deadline is behind us. The Ministry's list of Accredited Service Providers, updated on 2 November, now names 84 companies.
Second, the rules underneath moved. Ministerial Decision No. 197 of 2026, in force from 1 October, amends the core e-invoicing decision in four ways that matter to anyone running finance software:
- Tax groups get a break. Sales between members of the same VAT tax group are excluded for 24 months starting 1 January 2027.
- The clock counts business days. An e-invoice or credit note must go through the system within 14 business days of the transaction, up from 14 calendar days. VAT-registered sellers still have to meet the VAT Law's own invoicing timeline, which the decision keeps in place.
- Data no longer has to sit in the UAE. The old rule said e-invoice data had to be stored inside the country. Now you keep it for the period the Tax Procedures Law sets and produce it when the Federal Tax Authority asks.
- The system-failure notice is gone. The duty to tell the FTA about a system failure within two business days was repealed.
The storage change is the one we'd underline for anyone hosting their ERP outside the Emirates. It takes one hard question out of any decision about hosting outside the country.
Your provider carries the invoice, your open source ERP writes it
The UAE runs a five-corner model. You're corner one, your Accredited Service Provider is corner two, your customer's provider is corner three, your customer is corner four, and the FTA is corner five. Under Ministerial Decision No. 243 of 2025, both the issuer and the recipient meet their exchange and reporting duties through their appointed providers. Your ERP never talks to the FTA directly.
The providers move and report the invoice. The ERP at each end is still responsible for what goes in and what comes out.
Notice the receiving side, too. Recipients have to process e-invoices through the system and appoint a provider as well. If you buy from UAE suppliers, your payables process needs to take in structured invoices, not just PDFs dropped into an inbox. Plenty of teams plan only for sending, and that's a mistake.
The penalties, read from the decision itself
The 2025 penalty table has been replaced. Cabinet Decision No. 173 of 2026 repeals Cabinet Decision No. 106 of 2025 and sets these amounts:
- Failing to implement the system, which the decision says includes failing to appoint an Accredited Service Provider: AED 5,000 for the first instance, then AED 5,000 for each month or part month it continues, capped at AED 50,000 in any 12 consecutive months.
- Failing to issue and send an e-invoice through the system: AED 100 per invoice, up to AED 5,000 a month. The same applies separately to credit notes.
- Failing to tell your provider about a change to your FTA-registered data: AED 250 per day of delay, up to AED 5,000 a month.
Two details are easy to miss. If you're both issuer and recipient for the same violation, you pay one penalty, not two. And businesses that join voluntarily are outside the penalty decision entirely, although every other e-invoicing rule applies to them in full.
Large businesses go live on 1 January 2027. Everyone else under AED 50 million appoints a provider by 31 March and goes live on 1 July 2027.
The fines aren't huge on their own. The real cost is a customer whose provider rejects your invoice, so it doesn't get paid until you fix it.
What to check in your ERP before 1 January
Most of the work is data hygiene, and you can start it before your provider's integration is ready. Here's the order we'd follow:
- Customer and supplier tax numbers. Every UAE business partner needs a correct TRN on its record. Run a report of partners with blank or malformed tax IDs and fix them now, while it's still cheap.
- Tax set-up per line. Each invoice line has to carry the right VAT treatment. Zero-rated and exempt lines that someone keyed in as "no tax" will fail validation.
- Credit notes, not edits. The decision lists when a credit note is required: a cancelled sale, a reduced price, a full or partial refund, or an administrative or numerical error. If staff quietly edit posted invoices, that habit has to stop.
- Tax group flags. If you're in a VAT tax group, mark intra-group partners so those sales can be kept apart during the 24-month exclusion, and so you can switch them on cleanly when it ends.
- The hand-off. Find out exactly what your provider accepts: an API, a file drop, or a connector it maintains for your ERP. Then test with real invoices, credit notes and a few odd cases before go-live, not after.
Smaller businesses have until 31 March 2027 to appoint a provider. Don't read that as a reason to wait. The data clean-up takes the same time whatever your revenue.
Where ICTERP stands today
We'd rather be straight about this. ICTERP is open source ERP built on Odoo Community 19, and its Invoicing app issues invoices and credit notes, keeps each partner's tax ID and records VAT per line. Odoo Community also ships a UAE accounting package with a chart of accounts, VAT taxes and a tax report.
What it doesn't do is send UAE e-invoices. When we checked the Odoo Community 19.0 code on 2 November 2026, its electronic invoice formats covered European, Australian, New Zealand and Singapore standards, with nothing listed for the UAE, and the Peppol module's country list doesn't include the UAE either. ICTERP doesn't add a UAE format or a connector to any Accredited Service Provider.
So if you run ICTERP for UAE customers, the link to your chosen provider is an integration project. Some providers publish APIs for exactly this. Where one fits, we can scope the link as a proper add-on through our custom solutions work, with tests and a fixed plan. We won't pretend it's already in the box. If you're comparing editions while you plan this, the editions and prices page shows what each one includes.
Frequently asked questions
Did the UAE extend the 30 October 2026 deadline again?
Not as far as the Ministry's published decisions show. The deadline was moved once, from 31 July to 30 October 2026, and the Ministry said go-live for businesses with revenue of AED 50 million or more stays at 1 January 2027.
Does UAE e-invoicing cover sales to consumers?
Not yet. Ministerial Decision No. 244 of 2025 keeps business-to-consumer transactions out until the Minister decides otherwise, and a business that sells only to consumers isn't in scope for now.
Can my ERP send e-invoices straight to the Federal Tax Authority?
No. Under the five-corner model, issuers and recipients meet their exchange and reporting duties through an Accredited Service Provider. Your ERP's job is to hand that provider complete, valid data.
Do I still have to store invoice data inside the UAE?
No. Decision 197 of 2026 replaced that rule. You now keep e-invoices, credit notes and related data for the period in the Tax Procedures Law and must be able to produce them to the FTA on request.
Is ICTERP ready for UAE e-invoicing?
Partly. It handles invoices, credit notes, tax IDs and VAT lines, and Odoo Community has a UAE accounting package. It doesn't produce the UAE e-invoice format or connect to an Accredited Service Provider, so that link needs integration work.
What happens to sales inside a VAT tax group?
They're excluded for 24 months from 1 January 2027. You can still choose to send them voluntarily, in which case the e-invoicing rules apply to those invoices but the penalty decision doesn't.
Sources
- Ministry of Finance, Ministerial Decision No. 197 of 2026 (in force 1 October 2026)
- UAE Cabinet, Cabinet Decision No. 173 of 2026 on violations and administrative penalties
- Ministry of Finance, Ministerial Decision No. 243 of 2025 and No. 244 of 2025
- Ministry of Finance, announcement of the deadline extension (10 May 2026)
- Ministry of Finance, list of Accredited Service Providers (page updated 2 November 2026)
- Odoo Community 19.0 source, electronic invoice formats by country (checked 2 November 2026)
How to Install Odoo 15 on Ubuntu 20.04
Odoo may be a popular open-source suite of business apps that facilitate firms to manage and run their business. It includes a large vary of applications like CRM, e-Commerce, website builder, billing, accounting, producing, warehouse, project management, inventory, and far additional, all seamlessly integrated.
Odoo is put in in several ways that, looking on the utilization case and accessible technologies. the best and fastest thanks to install Odoo is by using the official Odoo APT repositories.
Installing Odoo in a virtual setting, or deploying as a docker instrumentation, offers you additional management over the applying and permits you to run multiple Odoo instances on identical system.
This article goes through putting in and deploying Odoo 15 within a Python virtual setting on Ubuntu 20.04. We'll transfer Odoo from the official GitHub repository and use Nginx as a reverse proxy.
Installing Dependencies
The first step is to install git , Pip , Node.js , and development
sudo apt update
sudo apt install git python3-pip build-essential wget python3-dev python3-venv \
python3-wheel libfreetype6-dev libxml2-dev libzip-dev libldap2-dev libsasl2-dev \
python3-setuptools node-less libjpeg-dev zlib1g-dev libpq-dev \
libxslt1-dev libldap2-dev libtiff5-dev libjpeg8-dev libopenjp2-7-dev \
liblcms2-dev libwebp-dev libharfbuzz-dev libfribidi-dev libxcb1-dev
Creating a System User
Running Odoo beneath the basis user poses a good security risk. We'll produce a brand new system user and cluster with home directory /opt/odoo15 which will run the Odoo service. To do so, run the subsequent command:
sudo useradd -m -d /opt/odoo15 -U -r -s /bin/bash odoo15
You can name the user anything you want, as long you create a PostgreSQL user with the same name.
Installing and Configuring PostgreSQL
Odoo uses PostgreSQL as the database back-end. PostgreSQL is included in the standard Ubuntu repositories. The installation is straightforward:
sudo apt install postgresql
Once the service is installed, create a PostgreSQL user with the same name as the previously created system user. In this example, that is odoo15:
sudo su - postgres -c "createuser -s odoo15"
Installing wkhtmltopdf
wkhtmltopdf could be a set of open-source command-line tools for rendering markup language pages into PDF and varied image formats. To print PDF reports in Odoo, you'll got to install the wkhtmltox package.
The version of wkhtmltopdf that's enclosed in Ubuntu repositories doesn't support headers and footers. The suggested version for Odoo is version 0.12.5. We'll transfer and install the package from Github:
sudo wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.bionic_amd64.deb
sudo apt install ./wkhtmltox_0.12.5-1.bionic_amd64.deb
Installing and Configuring Odoo 15
We'll install Odoo from the source inside an isolated Python virtual environment .
First, change to user "odoo15":
sudo su - odoo15
Clone the Odoo 15 source code from GitHub:
git clone https://www.github.com/odoo/odoo --depth 1 --branch 15.0 /opt/odoo15/odoo
Create a new Python virtual environment for Odoo:
cd /opt/odoo15python3 -m venv odoo-venvCopyCopy
Activate the virtual environment:
source odoo-venv/bin/activate
Odoo dependencies are specified in the requirements.txt file. Install all required Python modules with pip3:
pip3 install wheelpip3 install -r odoo/requirements.txt
Once done, deactivate the environment by typing:
deactivate
We'll create a new directory a separate directory for the 3rd party addons:
mkdir /opt/odoo15/odoo-custom-addons
Later we'll add this directory to the addons_path parameter. This parameter defines a list of directories where Odoo searches for modules.
Switch back to your sudo user:
exit
Create a configuration file with the following content:
sudo nano /etc/odoo15.conf
/etc/odoo15.conf
[options]
; This is the password that allows database operations:
admin_passwd = my_admin_passwd
db_host = False
db_port = False
db_user = odoo15
db_password = False
addons_path = /opt/odoo15/odoo/addons,/opt/odoo15/odoo-custom-addons
CopyDo not forget to change the my_admin_passwd to something more secure.
Creating Systemd Unit File
A unit file is a configuration ini-style file that holds information about a service.
Open your text editor and create a file named odoo15.service with the following content:
sudo nano /etc/systemd/system/odoo15.service
/etc/systemd/system/odoo15.service
[Unit]
Description=Odoo15
Requires=postgresql.service
After=network.target postgresql.service
[Service]
Type=simple
SyslogIdentifier=odoo15
PermissionsStartOnly=true
User=odoo15
Group=odoo15
ExecStart=/opt/odoo15/odoo-venv/bin/python3 /opt/odoo15/odoo/odoo-bin -c /etc/odoo15.conf
StandardOutput=journal+console
[Install]
WantedBy=multi-user.target
Notify systemd that a new unit file exists:
sudo systemctl daemon-reload
Start the Odoo service and enable it to start on boot by running:
sudo systemctl enable --now odoo15
Verify that the service is up and running:
sudo systemctl status odoo15
The output should look something like below, showing that the Odoo service is active and running:
● odoo15.service - Odoo15
Loaded: loaded (/etc/systemd/system/odoo15.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-10-26 09:56:28 UTC; 28s ago
...
You can check the messages logged by the Odoo service using the command below:
sudo journalctl -u odoo15
Testing the Installation
Open your browser and type: http://<your_domain_or_IP_address>:8069
Assuming the installation is successful, a screen similar to the following will appear:
Share Article:
odoo 15, odoo 15 on ubuntu
ICTERP Is on GitHub: Eleven Open Source Modules That Fill the Gaps in Odoo 19 Community
> Originally published at ictinnovations.com
ICTERP Community is now public at ictinnovations/icterp. It's eleven open source ERP modules for Odoo 19 Community, released under the LGPL-3, the same licence as Odoo Community itself. They add the things most people expect from an ERP and don't get in the free edition: an app home page, payroll, your own branding, and a complete school, college and university suite.
We've been running these modules for customers for a while. Putting them on GitHub means you can read the code before you commit to it, run it on your own server for nothing, and hand it to any developer you like when you want something changed.
The gaps it fills
Odoo Community is a very good base. We build on it because the core is solid and the licence lets us. But if you've ever installed it for a school or a small business, you'll know where it stops. The tiled app home page is Enterprise only. So is payroll. Everything carries the Odoo name and links back to odoo.com. And there's nothing for education at all.
Here's how the eleven modules split up:
- Core (3): icterp_branding swaps the name, colours, icons and email wording. icterp_home gives you a home page with app tiles grouped into sections you set up in Settings. icterp_website keeps the branded sign-in page and drops the Odoo generator tag when you install the Website app.
- Education (7): students, admissions, timetable, attendance, exams, fees and library, plus a student and parent portal, course registration with GPA, CGPA and transcripts, bank fee challans with bank file import, exam date sheets with clash checks and seating plans, online admissions with entry tests and merit lists, and outcome based education (PEOs, PLOs and CLOs) with attainment reports for accreditation.
- HR (1): icterp_payroll for salary structures, payslips and payslip batches, built on OCA Payroll.
If you've been looking for a free school management system that also does accounting properly, this is our answer to that question. The education apps share one database with invoicing, so a fee challan and the invoice behind it are the same record, not two systems kept in step by hand.
How the repository is put together
We made one decision early that shapes everything else: the repository holds only our code. Odoo, OpenEduCat and OCA Payroll aren't copied into it. You pull them yourself, at the exact versions we test against.
In practice that means:
- Odoo 19 Community and PostgreSQL 16 come from the official Docker images. There's no Odoo Enterprise code anywhere in the stack, and you don't need an Enterprise subscription for any of it.
- OpenEduCat Community is fetched by tools/vendor-openeducat.sh at commit 46a5d7d (the 19.0 branch as of 13 October 2026).
- OCA Payroll is fetched by tools/fetch-oca-payroll.sh at commit 58f8a39 (19.0, 5 October 2026).
Pinning matters more than it sounds. Both upstream projects move every week, and an education install that worked on Monday can break on Friday because a field got renamed upstream. With a pin, what you install is what we tested. When we move the pin, it shows up as a one-line change in the repository history.
The OpenEduCat script does change a few things, and we'd rather tell you exactly what than have you find out. It replaces the app icons, renames the apps from "OpenEduCat X" to "Education: X", and removes the marketing pages from the app descriptions. It also blanks the endpoint OpenEduCat uses for its daily usage report, and it stops with an error if that edit doesn't take. Copyright headers, author lines and the licence file are left exactly as they are. That's what the LGPL asks of us, and it's the right thing to do anyway.
Getting it running
You'll need Docker, plus Python 3.10 or newer if you run Odoo outside it. The short version:
git clone https://github.com/ictinnovations/icterp.git && cd icterp
bash tools/vendor-openeducat.sh addons-vendor/openeducat
bash tools/fetch-oca-payroll.sh addons-vendor/payroll
cp .env.example .env
cp config/odoo.conf.example config/odoo.conf
docker compose up -d
Set the same database password in both copied files first. Skip either fetch script if you don't need education or payroll. Then open http://localhost:8069, create a database and install ICTERP Branding and ICTERP Home before anything else. Odoo listens on 127.0.0.1 only in the shipped compose file, so you'll need to put a reverse proxy in front if you want other people to reach it.
Every module has tests in its own tests/ folder, and the README shows how to run them against a throwaway database. If you send a pull request that changes behaviour, please add or update a test with it.
What isn't in the repository, and why
Calling from the CRM, campaigns and website chat history aren't here. Those come from our ICTContact and ICTDesk products, and the connectors that link them to ICTERP ship with ICTERP Enterprise alongside those products' own licences. It's the same split you'll see across our other open source projects: the platform is open, and the commercial products it talks to keep their own terms.
Enterprise also covers the parts that are really a service rather than code: setting ICTERP up under your brand, support, monitoring and the yearly move to the next Odoo version. If you'd rather not run servers yourself, the ICTERP packages page has the details. If you're happy running it yourself, the Community modules are free and stay free.
Credits
ICTERP wouldn't exist without three other open source projects, and we want to name them properly:
- Odoo Community by Odoo S.A., LGPL-3, the platform and its business apps.
- OpenEduCat Community by OpenEduCat Inc., LGPL-3, the base of the education apps.
- OCA Payroll by the Odoo Community Association, LGPL-3, the engine behind ICTERP Payroll.
Odoo is a trademark of Odoo S.A. ICTERP isn't affiliated with or endorsed by Odoo S.A.
FAQ
Is ICTERP Community free?
Yes. All eleven modules are LGPL-3. You can use them, change them and run them commercially. You only pay if you want us to set it up, support it, or add ICTContact and ICTDesk.
Which Odoo version does it need?
Odoo 19 Community with PostgreSQL 13 or newer. We test on the official odoo:19.0 image with PostgreSQL 16. We move ICTERP to each new Odoo Community version once a year.
Can I install just payroll, or just the home page?
Yes. Each module installs on its own, apart from its listed dependencies. Install ICTERP Branding and ICTERP Home, then add only what you need. The education modules need OpenEduCat; payroll needs OCA Payroll.
Does it include Odoo Enterprise code?
No. Nothing in the repository or the Docker stack comes from Odoo Enterprise. The home page and payroll are our own modules and OCA's, written for Community.
How do I contribute or report a bug?
Open an issue or a pull request on GitHub. The contributing guide is short: one change per pull request, a test when you change behaviour, and Odoo 19 conventions for file layout. Please report security problems privately through our ticket desk rather than in a public issue.
Where are the user guides?
On icterp.com, with screenshots for each app, including payroll, fee challans, date sheets and the student and parent portal.
The code is at ictinnovations/icterp. Stars help other people find it, and issues help us make it better.
15,000 e-invoices, 12 generators: 4 setups pass every validator and still bill the wrong amount
---
title: "15,000 e-invoices, 12 generators: 4 setups pass every validator and still bill the wrong amount"
published: true
tags: einvoicing, xrechnung, peppol, opensource
canonical_url: kobima6813.github.io
---
Finding first: in our October run, 4 generator configurations pass KoSIT (XRechnung 3.0.2), the CEN EN 16931 rules and Peppol BIS 3.0.20, yet on 472 of 600 invoices each the amount due (BT-115) differs from what the shop order actually charged.
No validator catches this, because no validator knows the original order total. It only checks that the invoice is consistent with itself.
What we ran
- 15,000 synthetic invoices from 12 open-source generators (25 configurations × 600 orders: 300 B2B + 300 B2C).
- Validators are pinned by SHA-256: KoSIT 1.6.3, CEN EN 16931 and Peppol BIS 3.0.20.
- The orders are deterministic, tax-inclusive shop carts with % discounts and shipping, i.e. what a WooCommerce or Odoo shop actually produces.
Full report: kobima6813.github.io
The "passes but wrong" cases
| Configuration | Validators | Amount due ≠ order total |
|---|---|---|
| Mustang 2.26.0 (library-computed totals) | all pass | 472 / 600 |
| speedata/einvoice 0.0.23, CII | all pass | 472 / 600 |
| speedata/einvoice 0.0.23, UBL | all pass | 472 / 600 |
| josemmo/einvoicing 0.3.1, 2-decimal rounding | all pass | 472 / 600 |
The cause is the same in all four. A gross (tax-inclusive) cart is converted into EN 16931 net arithmetic, and rounding lands in a different place than the shop rounded. The amounts are usually cents, but the invoice no longer matches what the customer paid, and that breaks automatic payment matching. Mustang already merged a fix (PR #1318). It isn't released yet.
Validator failures we reported upstream
- Odoo 18/19 Factur-X: PEPPOL-EN16931-R120 on 242/300 B2B invoices and BR-CO-10 / BR-S-08 with round_globally. We tested two fix PRs (#297750, #297752) against the corpus, and the errors go to 0. The maintainer confirmed the results.
- WooCommerce PDF Invoices & Packing Slips 5.16.4: ram:RoundingAmount is out of XSD order, so 238/600 Factur-X invoices are XSD-invalid (#1662). Another user reproduced it independently.
- horstoeko/zugferd: the VAT breakdown for exempt categories was wrong. It's fixed in v1.0.133.
- speedata/einvoice: UBL element order and a BT-27/BT-28 swap. Both are fixed in v0.0.23.
- josemmo/einvoicing 0.3.1: the default config gives 590/600 CEN failures (#93). It passes once a rounding preset is set.
- ZUGFeRD-csharp 18.0.1: CII without a delivery date is XSD-invalid. This was already known upstream (PR #981), so it's not our report.
France: 30 of 30 pass
France's receiving obligation started on 1 Sep 2026. We added 5 French scenarios: standard 20 % + 5.5 %, the VAT franchise (art. 293 B), domestic reverse charge, an intra-EU supply and all four French rates. Each one ran in 2 Factur-X profiles (EN16931, EXTENDED) on 3 generator versions (drafthorse + factur-x, horstoeko 1.0.132 and 1.0.133). All 30 pass.
Honest caveats:
- In our first run, horstoeko failed BR-IC-12. That was our driver's mistake: the ship-to address is dropped unless setDocumentShipTo() is called before setDocumentShipToAddress(). It was not a library bug.
- We have not tested the French platform-specific (PA/PPF) rule sets, because they aren't available as free, pinned validators.
Free self-check
You can check one of your own invoices here: kobima6813.github.io
It runs in your browser, and the file is not uploaded anywhere. It covers a subset of EN 16931 and tells you how many problems it found. It is not a replacement for KoSIT or a Peppol validator.
Limits
- The orders are synthetic. Real catalogs have edge cases we don't generate yet.
- Each configuration is one library version with one setting. Your integration code can add or hide bugs.
- Corrections are welcome. Every number links to a file in the repo, and you can reproduce it with scripts/run_matrix.sh.
Repo and home page: kobima6813.github.io
If you maintain one of these generators and think a result is wrong, open an issue and I'll re-run it.
odoo#65477
odoo#154301
odoo#181583
Triaged 2 issues and 1 more PR in @odoo repo.
1 like · 28 views
odoo#238707
odoo#162115
odoo#78791
Triaged 2 more PRs and 1 issue. @Odoo
1 like · 34 views
odoo#213925
odoo#204084
Helped in triaging both.
1 like · 16 views
Konteks:
Mencoba berkontribusi ke Open source sejuta umat ini 👇
Prometheus: prometheus#20048
Odoo: odoo#295861
1 like · 116 views
Odoo 19 fatal POS input issue
I'm experiencing weird issue in odoo 19 POS,
employee A login odoo > login POS > input item > make payment, but odoo says sales is made by employee B that logged in before A. Employee B already logged out both POS and odoo session.
The solution is to reload > full in POS but this is quite annoying especially since 18 didnt have this issue..
and my employees could miss this solution during POS input and mess the whole report.
Anyone else encounter this issue?
i'm trying to figure out whether this is odoo 19 cache bug in general, or is it because my install method where i'm using tteck's script to install odoo as lxc..
odoo#242728
this is the closest reported bug i could find but it seems to be different from my case
Wanted to upgrade to 20 but there are several custom modules that aren't ready for v20..
3 points · 9 comments
In case anyone finds it interesting, I'm maintaining my AI agent skill set for #Odoo here:
OdooEssentials/odoo-ai-skills
It supplements what already is in the official repo skills.
5 likes · 1 repost · 263 views
Mentions
UAE E-Invoicing After 30 October: What Your Open Source ERP Still Has to Do > Originally published at icterp.com The UAE's deadline for large businesses to appoint an e-invoicing provider passed on 30 October 2026, and go-live is 1 January 2027. Appointing an Accredited Service Provider doesn't finish the job. Your ERP, open source or not, still has to send that provider clean, complete invoice data on every sale and credit note. That's the part most readiness guides skip. They tell you to pick a provider and move on. But the provider only carries what your system gives it, and if your customer tax numbers are half filled in or your credit notes go out late, the provider can't fix that for you. So here's what changed in October, what the penalties really say, and what to check in your own system over the next eight weeks. What changed in October Two things happened close together. First, the date itself. The Ministry of Finance had already pushed the provider deadline for businesses with revenue of AED 50 million or more from 31 July to 30 October 2026, and it said in May that go-live on 1 January 2027 stays put. As of today that deadline is behind us. The Ministry's list of Accredited Service Providers, updated on 2 November, now names 84 companies. Second, the rules underneath moved. Ministerial Decision No. 197 of 2026, in force from 1 October, amends the core e-invoicing decision in four ways that matter to anyone running finance software: - Tax groups get a break. Sales between members of the same VAT tax group are excluded for 24 months starting 1 January 2027. - The clock counts business days. An e-invoice or credit note must go through the system within 14 business days of the transaction, up from 14 calendar days. VAT-registered sellers still have to meet the VAT Law's own invoicing timeline, which the decision keeps in place. - Data no longer has to sit in the UAE. The old rule said e-invoice data had to be stored inside the country. Now you keep it for the period the Tax Procedures Law sets and produce it when the Federal Tax Authority asks. - The system-failure notice is gone. The duty to tell the FTA about a system failure within two business days was repealed. The storage change is the one we'd underline for anyone hosting their ERP outside the Emirates. It takes one hard question out of any decision about hosting outside the country. Your provider carries the invoice, your open source ERP writes it The UAE runs a five-corner model. You're corner one, your Accredited Service Provider is corner two, your customer's provider is corner three, your customer is corner four, and the FTA is corner five. Under Ministerial Decision No. 243 of 2025, both the issuer and the recipient meet their exchange and reporting duties through their appointed providers. Your ERP never talks to the FTA directly. The providers move and report the invoice. The ERP at each end is still responsible for what goes in and what comes out. Notice the receiving side, too. Recipients have to process e-invoices through the system and appoint a provider as well. If you buy from UAE suppliers, your payables process needs to take in structured invoices, not just PDFs dropped into an inbox. Plenty of teams plan only for sending, and that's a mistake. The penalties, read from the decision itself The 2025 penalty table has been replaced. Cabinet Decision No. 173 of 2026 repeals Cabinet Decision No. 106 of 2025 and sets these amounts: - Failing to implement the system, which the decision says includes failing to appoint an Accredited Service Provider: AED 5,000 for the first instance, then AED 5,000 for each month or part month it continues, capped at AED 50,000 in any 12 consecutive months. - Failing to issue and send an e-invoice through the system: AED 100 per invoice, up to AED 5,000 a month. The same applies separately to credit notes. - Failing to tell your provider about a change to your FTA-registered data: AED 250 per day of delay, up to AED 5,000 a month. Two details are easy to miss. If you're both issuer and recipient for the same violation, you pay one penalty, not two. And businesses that join voluntarily are outside the penalty decision entirely, although every other e-invoicing rule applies to them in full. Large businesses go live on 1 January 2027. Everyone else under AED 50 million appoints a provider by 31 March and goes live on 1 July 2027. The fines aren't huge on their own. The real cost is a customer whose provider rejects your invoice, so it doesn't get paid until you fix it. What to check in your ERP before 1 January Most of the work is data hygiene, and you can start it before your provider's integration is ready. Here's the order we'd follow: - Customer and supplier tax numbers. Every UAE business partner needs a correct TRN on its record. Run a report of partners with blank or malformed tax IDs and fix them now, while it's still cheap. - Tax set-up per line. Each invoice line has to carry the right VAT treatment. Zero-rated and exempt lines that someone keyed in as "no tax" will fail validation. - Credit notes, not edits. The decision lists when a credit note is required: a cancelled sale, a reduced price, a full or partial refund, or an administrative or numerical error. If staff quietly edit posted invoices, that habit has to stop. - Tax group flags. If you're in a VAT tax group, mark intra-group partners so those sales can be kept apart during the 24-month exclusion, and so you can switch them on cleanly when it ends. - The hand-off. Find out exactly what your provider accepts: an API, a file drop, or a connector it maintains for your ERP. Then test with real invoices, credit notes and a few odd cases before go-live, not after. Smaller businesses have until 31 March 2027 to appoint a provider. Don't read that as a reason to wait. The data clean-up takes the same time whatever your revenue. Where ICTERP stands today We'd rather be straight about this. ICTERP is open source ERP built on Odoo Community 19, and its Invoicing app issues invoices and credit notes, keeps each partner's tax ID and records VAT per line. Odoo Community also ships a UAE accounting package with a chart of accounts, VAT taxes and a tax report. What it doesn't do is send UAE e-invoices. When we checked the Odoo Community 19.0 code on 2 November 2026, its electronic invoice formats covered European, Australian, New Zealand and Singapore standards, with nothing listed for the UAE, and the Peppol module's country list doesn't include the UAE either. ICTERP doesn't add a UAE format or a connector to any Accredited Service Provider. So if you run ICTERP for UAE customers, the link to your chosen provider is an integration project. Some providers publish APIs for exactly this. Where one fits, we can scope the link as a proper add-on through our custom solutions work, with tests and a fixed plan. We won't pretend it's already in the box. If you're comparing editions while you plan this, the editions and prices page shows what each one includes. Frequently asked questions Did the UAE extend the 30 October 2026 deadline again? Not as far as the Ministry's published decisions show. The deadline was moved once, from 31 July to 30 October 2026, and the Ministry said go-live for businesses with revenue of AED 50 million or more stays at 1 January 2027. Does UAE e-invoicing cover sales to consumers? Not yet. Ministerial Decision No. 244 of 2025 keeps business-to-consumer transactions out until the Minister decides otherwise, and a business that sells only to consumers isn't in scope for now. Can my ERP send e-invoices straight to the Federal Tax Authority? No. Under the five-corner model, issuers and recipients meet their exchange and reporting duties through an Accredited Service Provider. Your ERP's job is to hand that provider complete, valid data. Do I still have to store invoice data inside the UAE? No. Decision 197 of 2026 replaced that rule. You now keep e-invoices, credit notes and related data for the period in the Tax Procedures Law and must be able to produce them to the FTA on request. Is ICTERP ready for UAE e-invoicing? Partly. It handles invoices, credit notes, tax IDs and VAT lines, and Odoo Community has a UAE accounting package. It doesn't produce the UAE e-invoice format or connect to an Accredited Service Provider, so that link needs integration work. What happens to sales inside a VAT tax group? They're excluded for 24 months from 1 January 2027. You can still choose to send them voluntarily, in which case the e-invoicing rules apply to those invoices but the penalty decision doesn't. Sources - Ministry of Finance, Ministerial Decision No. 197 of 2026 (in force 1 October 2026) - UAE Cabinet, Cabinet Decision No. 173 of 2026 on violations and administrative penalties - Ministry of Finance, Ministerial Decision No. 243 of 2025 and No. 244 of 2025 - Ministry of Finance, announcement of the deadline extension (10 May 2026) - Ministry of Finance, list of Accredited Service Providers (page updated 2 November 2026) - Odoo Community 19.0 source, electronic invoice formats by country (checked 2 November 2026)
How to Install Odoo 15 on Ubuntu 20.04 Odoo may be a popular open-source suite of business apps that facilitate firms to manage and run their business. It includes a large vary of applications like CRM, e-Commerce, website builder, billing, accounting, producing, warehouse, project management, inventory, and far additional, all seamlessly integrated. Odoo is put in in several ways that, looking on the utilization case and accessible technologies. the best and fastest thanks to install Odoo is by using the official Odoo APT repositories. Installing Odoo in a virtual setting, or deploying as a docker instrumentation, offers you additional management over the applying and permits you to run multiple Odoo instances on identical system. This article goes through putting in and deploying Odoo 15 within a Python virtual setting on Ubuntu 20.04. We'll transfer Odoo from the official GitHub repository and use Nginx as a reverse proxy. Installing Dependencies The first step is to install git , Pip , Node.js , and development sudo apt update sudo apt install git python3-pip build-essential wget python3-dev python3-venv \ python3-wheel libfreetype6-dev libxml2-dev libzip-dev libldap2-dev libsasl2-dev \ python3-setuptools node-less libjpeg-dev zlib1g-dev libpq-dev \ libxslt1-dev libldap2-dev libtiff5-dev libjpeg8-dev libopenjp2-7-dev \ liblcms2-dev libwebp-dev libharfbuzz-dev libfribidi-dev libxcb1-dev Creating a System User Running Odoo beneath the basis user poses a good security risk. We'll produce a brand new system user and cluster with home directory /opt/odoo15 which will run the Odoo service. To do so, run the subsequent command: sudo useradd -m -d /opt/odoo15 -U -r -s /bin/bash odoo15 You can name the user anything you want, as long you create a PostgreSQL user with the same name. Installing and Configuring PostgreSQL Odoo uses PostgreSQL as the database back-end. PostgreSQL is included in the standard Ubuntu repositories. The installation is straightforward: sudo apt install postgresql Once the service is installed, create a PostgreSQL user with the same name as the previously created system user. In this example, that is odoo15: sudo su - postgres -c "createuser -s odoo15" Installing wkhtmltopdf wkhtmltopdf could be a set of open-source command-line tools for rendering markup language pages into PDF and varied image formats. To print PDF reports in Odoo, you'll got to install the wkhtmltox package. The version of wkhtmltopdf that's enclosed in Ubuntu repositories doesn't support headers and footers. The suggested version for Odoo is version 0.12.5. We'll transfer and install the package from Github: sudo wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.bionic_amd64.deb sudo apt install ./wkhtmltox_0.12.5-1.bionic_amd64.deb Installing and Configuring Odoo 15 We'll install Odoo from the source inside an isolated Python virtual environment . First, change to user "odoo15": sudo su - odoo15 Clone the Odoo 15 source code from GitHub: git clone https://www.github.com/odoo/odoo --depth 1 --branch 15.0 /opt/odoo15/odoo Create a new Python virtual environment for Odoo: cd /opt/odoo15python3 -m venv odoo-venvCopyCopy Activate the virtual environment: source odoo-venv/bin/activate Odoo dependencies are specified in the requirements.txt file. Install all required Python modules with pip3: pip3 install wheelpip3 install -r odoo/requirements.txt Once done, deactivate the environment by typing: deactivate We'll create a new directory a separate directory for the 3rd party addons: mkdir /opt/odoo15/odoo-custom-addons Later we'll add this directory to the addons_path parameter. This parameter defines a list of directories where Odoo searches for modules. Switch back to your sudo user: exit Create a configuration file with the following content: sudo nano /etc/odoo15.conf /etc/odoo15.conf [options] ; This is the password that allows database operations: admin_passwd = my_admin_passwd db_host = False db_port = False db_user = odoo15 db_password = False addons_path = /opt/odoo15/odoo/addons,/opt/odoo15/odoo-custom-addons CopyDo not forget to change the my_admin_passwd to something more secure. Creating Systemd Unit File A unit file is a configuration ini-style file that holds information about a service. Open your text editor and create a file named odoo15.service with the following content: sudo nano /etc/systemd/system/odoo15.service /etc/systemd/system/odoo15.service [Unit] Description=Odoo15 Requires=postgresql.service After=network.target postgresql.service [Service] Type=simple SyslogIdentifier=odoo15 PermissionsStartOnly=true User=odoo15 Group=odoo15 ExecStart=/opt/odoo15/odoo-venv/bin/python3 /opt/odoo15/odoo/odoo-bin -c /etc/odoo15.conf StandardOutput=journal+console [Install] WantedBy=multi-user.target Notify systemd that a new unit file exists: sudo systemctl daemon-reload Start the Odoo service and enable it to start on boot by running: sudo systemctl enable --now odoo15 Verify that the service is up and running: sudo systemctl status odoo15 The output should look something like below, showing that the Odoo service is active and running: ● odoo15.service - Odoo15 Loaded: loaded (/etc/systemd/system/odoo15.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2021-10-26 09:56:28 UTC; 28s ago ... You can check the messages logged by the Odoo service using the command below: sudo journalctl -u odoo15 Testing the Installation Open your browser and type: http://<your_domain_or_IP_address>:8069 Assuming the installation is successful, a screen similar to the following will appear: Share Article: odoo 15, odoo 15 on ubuntu
ICTERP Is on GitHub: Eleven Open Source Modules That Fill the Gaps in Odoo 19 Community > Originally published at ictinnovations.com ICTERP Community is now public at ictinnovations/icterp. It's eleven open source ERP modules for Odoo 19 Community, released under the LGPL-3, the same licence as Odoo Community itself. They add the things most people expect from an ERP and don't get in the free edition: an app home page, payroll, your own branding, and a complete school, college and university suite. We've been running these modules for customers for a while. Putting them on GitHub means you can read the code before you commit to it, run it on your own server for nothing, and hand it to any developer you like when you want something changed. The gaps it fills Odoo Community is a very good base. We build on it because the core is solid and the licence lets us. But if you've ever installed it for a school or a small business, you'll know where it stops. The tiled app home page is Enterprise only. So is payroll. Everything carries the Odoo name and links back to odoo.com. And there's nothing for education at all. Here's how the eleven modules split up: - Core (3): icterp_branding swaps the name, colours, icons and email wording. icterp_home gives you a home page with app tiles grouped into sections you set up in Settings. icterp_website keeps the branded sign-in page and drops the Odoo generator tag when you install the Website app. - Education (7): students, admissions, timetable, attendance, exams, fees and library, plus a student and parent portal, course registration with GPA, CGPA and transcripts, bank fee challans with bank file import, exam date sheets with clash checks and seating plans, online admissions with entry tests and merit lists, and outcome based education (PEOs, PLOs and CLOs) with attainment reports for accreditation. - HR (1): icterp_payroll for salary structures, payslips and payslip batches, built on OCA Payroll. If you've been looking for a free school management system that also does accounting properly, this is our answer to that question. The education apps share one database with invoicing, so a fee challan and the invoice behind it are the same record, not two systems kept in step by hand. How the repository is put together We made one decision early that shapes everything else: the repository holds only our code. Odoo, OpenEduCat and OCA Payroll aren't copied into it. You pull them yourself, at the exact versions we test against. In practice that means: - Odoo 19 Community and PostgreSQL 16 come from the official Docker images. There's no Odoo Enterprise code anywhere in the stack, and you don't need an Enterprise subscription for any of it. - OpenEduCat Community is fetched by tools/vendor-openeducat.sh at commit 46a5d7d (the 19.0 branch as of 13 October 2026). - OCA Payroll is fetched by tools/fetch-oca-payroll.sh at commit 58f8a39 (19.0, 5 October 2026). Pinning matters more than it sounds. Both upstream projects move every week, and an education install that worked on Monday can break on Friday because a field got renamed upstream. With a pin, what you install is what we tested. When we move the pin, it shows up as a one-line change in the repository history. The OpenEduCat script does change a few things, and we'd rather tell you exactly what than have you find out. It replaces the app icons, renames the apps from "OpenEduCat X" to "Education: X", and removes the marketing pages from the app descriptions. It also blanks the endpoint OpenEduCat uses for its daily usage report, and it stops with an error if that edit doesn't take. Copyright headers, author lines and the licence file are left exactly as they are. That's what the LGPL asks of us, and it's the right thing to do anyway. Getting it running You'll need Docker, plus Python 3.10 or newer if you run Odoo outside it. The short version: git clone https://github.com/ictinnovations/icterp.git && cd icterp bash tools/vendor-openeducat.sh addons-vendor/openeducat bash tools/fetch-oca-payroll.sh addons-vendor/payroll cp .env.example .env cp config/odoo.conf.example config/odoo.conf docker compose up -d Set the same database password in both copied files first. Skip either fetch script if you don't need education or payroll. Then open http://localhost:8069, create a database and install ICTERP Branding and ICTERP Home before anything else. Odoo listens on 127.0.0.1 only in the shipped compose file, so you'll need to put a reverse proxy in front if you want other people to reach it. Every module has tests in its own tests/ folder, and the README shows how to run them against a throwaway database. If you send a pull request that changes behaviour, please add or update a test with it. What isn't in the repository, and why Calling from the CRM, campaigns and website chat history aren't here. Those come from our ICTContact and ICTDesk products, and the connectors that link them to ICTERP ship with ICTERP Enterprise alongside those products' own licences. It's the same split you'll see across our other open source projects: the platform is open, and the commercial products it talks to keep their own terms. Enterprise also covers the parts that are really a service rather than code: setting ICTERP up under your brand, support, monitoring and the yearly move to the next Odoo version. If you'd rather not run servers yourself, the ICTERP packages page has the details. If you're happy running it yourself, the Community modules are free and stay free. Credits ICTERP wouldn't exist without three other open source projects, and we want to name them properly: - Odoo Community by Odoo S.A., LGPL-3, the platform and its business apps. - OpenEduCat Community by OpenEduCat Inc., LGPL-3, the base of the education apps. - OCA Payroll by the Odoo Community Association, LGPL-3, the engine behind ICTERP Payroll. Odoo is a trademark of Odoo S.A. ICTERP isn't affiliated with or endorsed by Odoo S.A. FAQ Is ICTERP Community free? Yes. All eleven modules are LGPL-3. You can use them, change them and run them commercially. You only pay if you want us to set it up, support it, or add ICTContact and ICTDesk. Which Odoo version does it need? Odoo 19 Community with PostgreSQL 13 or newer. We test on the official odoo:19.0 image with PostgreSQL 16. We move ICTERP to each new Odoo Community version once a year. Can I install just payroll, or just the home page? Yes. Each module installs on its own, apart from its listed dependencies. Install ICTERP Branding and ICTERP Home, then add only what you need. The education modules need OpenEduCat; payroll needs OCA Payroll. Does it include Odoo Enterprise code? No. Nothing in the repository or the Docker stack comes from Odoo Enterprise. The home page and payroll are our own modules and OCA's, written for Community. How do I contribute or report a bug? Open an issue or a pull request on GitHub. The contributing guide is short: one change per pull request, a test when you change behaviour, and Odoo 19 conventions for file layout. Please report security problems privately through our ticket desk rather than in a public issue. Where are the user guides? On icterp.com, with screenshots for each app, including payroll, fee challans, date sheets and the student and parent portal. The code is at ictinnovations/icterp. Stars help other people find it, and issues help us make it better.
15,000 e-invoices, 12 generators: 4 setups pass every validator and still bill the wrong amount --- title: "15,000 e-invoices, 12 generators: 4 setups pass every validator and still bill the wrong amount" published: true tags: einvoicing, xrechnung, peppol, opensource canonical_url: kobima6813.github.io --- Finding first: in our October run, 4 generator configurations pass KoSIT (XRechnung 3.0.2), the CEN EN 16931 rules and Peppol BIS 3.0.20, yet on 472 of 600 invoices each the amount due (BT-115) differs from what the shop order actually charged. No validator catches this, because no validator knows the original order total. It only checks that the invoice is consistent with itself. What we ran - 15,000 synthetic invoices from 12 open-source generators (25 configurations × 600 orders: 300 B2B + 300 B2C). - Validators are pinned by SHA-256: KoSIT 1.6.3, CEN EN 16931 and Peppol BIS 3.0.20. - The orders are deterministic, tax-inclusive shop carts with % discounts and shipping, i.e. what a WooCommerce or Odoo shop actually produces. Full report: kobima6813.github.io The "passes but wrong" cases | Configuration | Validators | Amount due ≠ order total | |---|---|---| | Mustang 2.26.0 (library-computed totals) | all pass | 472 / 600 | | speedata/einvoice 0.0.23, CII | all pass | 472 / 600 | | speedata/einvoice 0.0.23, UBL | all pass | 472 / 600 | | josemmo/einvoicing 0.3.1, 2-decimal rounding | all pass | 472 / 600 | The cause is the same in all four. A gross (tax-inclusive) cart is converted into EN 16931 net arithmetic, and rounding lands in a different place than the shop rounded. The amounts are usually cents, but the invoice no longer matches what the customer paid, and that breaks automatic payment matching. Mustang already merged a fix (PR #1318). It isn't released yet. Validator failures we reported upstream - Odoo 18/19 Factur-X: PEPPOL-EN16931-R120 on 242/300 B2B invoices and BR-CO-10 / BR-S-08 with round_globally. We tested two fix PRs (#297750, #297752) against the corpus, and the errors go to 0. The maintainer confirmed the results. - WooCommerce PDF Invoices & Packing Slips 5.16.4: ram:RoundingAmount is out of XSD order, so 238/600 Factur-X invoices are XSD-invalid (#1662). Another user reproduced it independently. - horstoeko/zugferd: the VAT breakdown for exempt categories was wrong. It's fixed in v1.0.133. - speedata/einvoice: UBL element order and a BT-27/BT-28 swap. Both are fixed in v0.0.23. - josemmo/einvoicing 0.3.1: the default config gives 590/600 CEN failures (#93). It passes once a rounding preset is set. - ZUGFeRD-csharp 18.0.1: CII without a delivery date is XSD-invalid. This was already known upstream (PR #981), so it's not our report. France: 30 of 30 pass France's receiving obligation started on 1 Sep 2026. We added 5 French scenarios: standard 20 % + 5.5 %, the VAT franchise (art. 293 B), domestic reverse charge, an intra-EU supply and all four French rates. Each one ran in 2 Factur-X profiles (EN16931, EXTENDED) on 3 generator versions (drafthorse + factur-x, horstoeko 1.0.132 and 1.0.133). All 30 pass. Honest caveats: - In our first run, horstoeko failed BR-IC-12. That was our driver's mistake: the ship-to address is dropped unless setDocumentShipTo() is called before setDocumentShipToAddress(). It was not a library bug. - We have not tested the French platform-specific (PA/PPF) rule sets, because they aren't available as free, pinned validators. Free self-check You can check one of your own invoices here: kobima6813.github.io It runs in your browser, and the file is not uploaded anywhere. It covers a subset of EN 16931 and tells you how many problems it found. It is not a replacement for KoSIT or a Peppol validator. Limits - The orders are synthetic. Real catalogs have edge cases we don't generate yet. - Each configuration is one library version with one setting. Your integration code can add or hide bugs. - Corrections are welcome. Every number links to a file in the repo, and you can reproduce it with scripts/run_matrix.sh. Repo and home page: kobima6813.github.io If you maintain one of these generators and think a result is wrong, open an issue and I'll re-run it.
odoo#65477 odoo#154301 odoo#181583 Triaged 2 issues and 1 more PR in @odoo repo.
odoo#238707 odoo#162115 odoo#78791 Triaged 2 more PRs and 1 issue. @Odoo
odoo#213925 odoo#204084 Helped in triaging both.
Konteks: Mencoba berkontribusi ke Open source sejuta umat ini 👇 Prometheus: prometheus#20048 Odoo: odoo#295861
Odoo 19 fatal POS input issue I'm experiencing weird issue in odoo 19 POS, employee A login odoo > login POS > input item > make payment, but odoo says sales is made by employee B that logged in before A. Employee B already logged out both POS and odoo session. The solution is to reload > full in POS but this is quite annoying especially since 18 didnt have this issue.. and my employees could miss this solution during POS input and mess the whole report. Anyone else encounter this issue? i'm trying to figure out whether this is odoo 19 cache bug in general, or is it because my install method where i'm using tteck's script to install odoo as lxc.. odoo#242728 this is the closest reported bug i could find but it seems to be different from my case Wanted to upgrade to 20 but there are several custom modules that aren't ready for v20..
In case anyone finds it interesting, I'm maintaining my AI agent skill set for #Odoo here: OdooEssentials/odoo-ai-skills It supplements what already is in the official repo skills.