Daily updates from Odoo
Tuesday, September 16, 2025
8 changes · 17.0
Resolved issues and error corrections
Belgian companies are now registered on Peppol using the Enterprise Number required by Belgian authorities. The change also improves lookup checks by trying the alternative Belgian identifier when the first check does not find a match, helping avoid failed or duplicate Peppol registrations.
Original PR description
Belgium Peppol autorities enforces us to register our Belgian Peppol user with EAS 0208, the Enterprise Number (company_registry). Also allows for Belgium to check for 9925 existence on Peppol when 0208 check failed. And vice-versa. task-4852903
Survey invitation emails now correctly refresh their subject line when a different or updated email template is selected. This ensures survey recipients see the intended subject, reducing confusion and helping teams send accurate invitations.
Original PR description
Description of the issue/feature this PR addresses: Fixed [previous commit] where the subject doesn't update when the template was updated. This was due to a filter in place preventing this from happening. Steps to reproduce on runbot: 1. Go to mail templates and search for Survey 2. Open the Survey: Invite template 3. Update the subject on this template 4. Open the Surveys app and select any survey 5. Click on Share and then enable send by email 6. Change the template being used 6. The subject will stay the same [previous commit]: https://github.com/odoo/odoo/commit/16a2c28c9aec307f7ce9dbed0a660b512db31f3a opw-4654411 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures foreign customer invoices in Saudi e-invoicing use an accepted alphanumeric Other Buyer ID value. This helps avoid ZATCA acceptance warnings and supports smoother invoice compliance processing.
Original PR description
When an invoice is being issued to a Foreign Customer, the Other Buyer ID (Other Buyer ID (BT-46) <cac:AccountingCustomerParty / cac:Party / cac:PartyIdentification / cbc:ID>) should be OTH and filled accordingly to avoid an acceptance warning from ZATCA. According to ZATCA, the value needs to be in alphanumeric format, even if the value does not follow the specific country's VAT format Task-id: 5075005 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226593
The calendar year view now responds properly when the browser window is resized. This keeps the calendar layout usable and consistent for users without adding duplicate resize handling.
Original PR description
FullCalendar already applies a debounce on the `windowResize` handler. Thus, doing it again in our renderer is a duplicated effort. Also, in the Year calendar renderer, the debounced version of the handler is initialized after the FullCalendar instances (one for each month) are created... which prevents it from being run at all. This commit fixes and cleans this up by directly passing our handler to FullCalendar, letting him do the rest. task-4809668 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents taxes added during bank or cash journal reconciliation from being counted twice in cash basis tax reports. Businesses using cash basis accounting will see more accurate tax amounts after reconciling partial payments or payment differences.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Cash Basis" - Create/modify a tax with "Tax Exigibility" set to "Based on Payment" - Set an account as "Cash Basis…
**Steps to reproduce:**
- Install Accounting
- In Accounting settings, activate "Cash Basis"
- Create/modify a tax with "Tax Exigibility" set to "Based on Payment"
- Set an account as "Cash Basis Transition Account"
- Create an invoice:
* Customer: [any]
* Invoice Lines:
- [Price] 200.0
- [Taxes] The cash basis tax (e.g. 15%)
- Confirm the invoice
- Go to "Bank" journal
- Create a bank statement for a lower amount than the invoice (e.g. $200)
- Match the statement with the invoice from the "Match Existing Entries" tab
- Select the added line and click on "fully paid" link
=> A new line with the amount difference should be added
- On the new line, select an expense account and the cash basis tax
=> A new tax line should be added (e.g. $3.91)
- Validate
- Go to "Accounting / Reporting / Statement Reports / Tax Report"
**Issue:**
The amount of the Tax is equal to:
[Tax amount of the invoice] - 2 * [Tax amount of the difference line] = $30 - 2 * $3.91 = $22.18
which is not correct.
The tax amount of the difference line (coming from the bank reconciliation widget) is taken twice into account.
**Cause:**
A cash basis move is created for the tax line created in the bank reconciliation widget.
This move is using the same tax account as debit and credit account and is directly reversed using the same account.
No cash basis move should be created for that line because the tax line is added while reconciling a bank statement, which means the tax should have been received.
**Solution:**
Do not create a cash basis move for journal entries made in a bank or cash journal.
opw-4663059
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#225151Fixes an accounting issue where taxes entered during bank reconciliation could be counted twice in cash basis tax reports. This helps ensure tax reports show the correct amount after reconciling partially paid invoices through a bank journal.
Original PR description
**Steps to reproduce:** - Install Accounting - In Accounting settings, activate "Cash Basis" - Create/modify a tax with "Tax Exigibility" set to "Based on Payment" - Set an account as "Cash Basis…
**Steps to reproduce:**
- Install Accounting
- In Accounting settings, activate "Cash Basis"
- Create/modify a tax with "Tax Exigibility" set to "Based on Payment"
- Set an account as "Cash Basis Transition Account"
- Create an invoice:
* Customer: [any]
* Invoice Lines:
- [Price] 200.0
- [Taxes] The cash basis tax (e.g. 15%)
- Confirm the invoice
- Go to "Bank" journal
- Create a bank statement for a lower amount than the invoice (e.g. $200)
- Match the statement with the invoice from the "Match Existing Entries" tab
- Select the added line and click on "fully paid" link
=> A new line with the amount difference should be added
- On the new line, select an expense account and the cash basis tax
=> A new tax line should be added (e.g. $3.91)
- Validate
- Go to "Accounting / Reporting / Statement Reports / Tax Report"
**Issue:**
The amount of the Tax is equal to:
[Tax amount of the invoice] - 2 * [Tax amount of the difference line] = $30 - 2 * $3.91 = $22.18
which is not correct.
The tax amount of the difference line (coming from the bank reconciliation widget) is taken twice into account.
**Cause:**
A cash basis move is created for the tax line created in the bank reconciliation widget.
This move is using the same tax account as debit and credit account and is directly reversed using the same account.
No cash basis move should be created for that line because the tax line is added while reconciling a bank statement, which means the tax should have been received.
**Solution:**
Do not create a cash basis move for journal entries made in a bank journal.
opw-4663059
Forward-Port-Of: odoo/enterprise#93735This fix prevents secondary failures when Odoo tries to take screenshots or screen recordings after a serious test error. It helps preserve the original error details, making failures easier to diagnose without changing business functionality.
Original PR description
Cf #226267 the "error condition" on the ws socket is that it's not present at all, not that it's `None`. So when used after a fatal error (e.g. in the context of trying to take a screenshot or take a screencast) these methods *can* in some cases trigger a compound failure and lose the original error because they fail on trying to access the ws to check if it's truthy. Forward-Port-Of: odoo/odoo#227385
This fix changes how Odoo applies default supplier taxes so large product databases can be updated without running out of memory. It helps companies with many products complete accounting setup or migrations more reliably.
Original PR description
As I mentioned in the query below, multiple grouped product.template records with the same supplier_taxes_id are being modified with the default purchase tax (account_purchase_tax_id),which leads to…
As I mentioned in the query below, multiple grouped product.template records with the same supplier_taxes_id are being modified with the default purchase tax (account_purchase_tax_id),which leads to a memory error. To prevent this, I have used an INSERT query.
```sql
SELECT tax_id, COUNT(*) AS product_count
FROM product_supplier_taxes_rel
GROUP BY tax_id
ORDER BY product_count DESC;
tax_id | product_count
--------+---------------
15 | 1262126
156 | 343332
114 | 36363
47 | 10132
23 | 202
546 | 11
474 | 5
782 | 2
666 | 2
1188 | 2
1318 | 1
3 | 1
(12 rows)
```
- Traceback
```python
Traceback (most recent call last):
File "/home/odoo/src/odoo/17.0/odoo/service/server.py", line 1314, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-16>", line 2, in new
File "/home/odoo/src/odoo/17.0/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/17.0/odoo/modules/registry.py", line 110, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/17.0/odoo/modules/loading.py", line 515, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/src/odoo/17.0/odoo/modules/migration.py", line 240, in migrate_module
migrate(self.cr, installed_version)
File "/home/odoo/src/odoo/17.0/addons/l10n_ch/migrations/11.3/end-migrate.py", line 8, in migrate
env["account.chart.template"].try_loading("ch", company)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 155, in try_loading
return self._load(template_code, company, install_demo)
File "/home/odoo/src/odoo/17.0/addons/point_of_sale/models/chart_template.py", line 22, in _load
result = super()._load(template_code, company, install_demo)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 214, in _load
self._post_load_data(template_code, company, template_data)
File "/home/odoo/src/enterprise/17.0/account_reports/models/chart_template.py", line 10, in _post_load_data
super()._post_load_data(template_code, company, template_data)
File "/home/odoo/src/odoo/17.0/addons/stock_account/models/account_chart_template.py", line 12, in _post_load_data
super()._post_load_data(template_code, company, template_data)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 669, in _post_load_data
sudoed_products_purchase._force_default_purchase_tax(company)
File "/home/odoo/src/odoo/17.0/addons/account/models/product.py", line 130, in _force_default_purchase_tax
product_grouped_by_tax.supplier_taxes_id += default_supplier_taxes
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1322, in __set__
records.write({self.name: write_value})
File "/home/odoo/src/odoo/17.0/addons/website_sale/models/product_template.py", line 176, in write
return super().write(vals)
File "/home/odoo/src/odoo/17.0/addons/rating/models/rating_mixin.py", line 100, in write
result = super(RatingMixin, self).write(values)
File "/home/odoo/src/odoo/17.0/addons/stock_account/models/product.py", line 55, in write
res = super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/mrp/models/product.py", line 74, in write
return super().write(values)
File "/home/odoo/src/odoo/17.0/addons/stock/models/product.py", line 921, in write
return super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/product/models/product_template.py", line 502, in write
res = super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/mail/models/mail_thread.py", line 311, in write
return super(MailThread, self).write(values)
File "/home/odoo/src/odoo/17.0/addons/mail/models/mail_activity_mixin.py", line 250, in write
return super(MailActivityMixin, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/website/models/mixins.py", line 218, in write
return super(WebsitePublishedMixin, self).write(values)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 4444, in write
field.write(self, value)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4337, in write
self.write_batch([(records, value)])
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4358, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4957, in write_real
y_to_xs[y].add(x)
File "/home/odoo/src/odoo/17.0/odoo/tools/misc.py", line 1136, in add
self._map[elem] = None
MemoryError
```
opw - 4544050
upg - 2459515
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr