Daily updates from Odoo
Monday, July 13, 2026
11 changes · 18.0
Resolved issues and error corrections
This fix ensures cached payroll rule parameters are safely copied before use, preventing one calculation from accidentally changing values used by another. It reduces the risk of hard-to-trace payroll calculation issues and improves reliability for payroll processing.
Original PR description
Cached functions with `@ormcache` should not return immutable values, yet `_get_parameter_from_code()` could return dicts/sets/lists/etc. It could lead to very obscure bugs such as: ```python def…
Cached functions with `@ormcache` should not return immutable values, yet `_get_parameter_from_code()` could return dicts/sets/lists/etc.
It could lead to very obscure bugs such as:
```python
def some_innocent_code():
category_dict = self.env["hr.rule.parameter"]._get_parameter_from_code('l10n_be_work_entry_categories')
incapacity_codes = category_dict['partial_incapacity']
incapacity_codes |= category_dict['total_incapacity']
# ... then use incapacity_codes
def print_rule_param():
print(self.env["hr.rule.parameter"]._get_parameter_from_code('l10n_be_work_entry_categories')['partial_incapacity'])
print_rule_param() # OrderedSet(['LEAVE281'])
some_innocent_code()
print_rule_param() # OrderedSet(['LEAVE281', 'LEAVE264', 'LEAVE266', 'LEAVE217', 'LEAVE218', 'LEAVE219', 'MEDIC01'])
```
The solution was to either deepcopy the returned value each time, or to change all the rule parameters to their frozen equivalent. Since we don't have access to frozen objects in rule parameters's xml definitions, we opted for the deepcopy approach.
task-6329380This fix prevents internal deferred accounting dates from being imported or exported on Colombian electronic invoice lines. It avoids exposing vendor revenue recognition information to customers and keeps invoice data focused on relevant billing details.
Original PR description
The current implementation of the Peppol XML export incorrectly populates the cac:InvoicePeriod nodes on line level with internal deferred entry dates. These dates are intended for the vendor's revenue recognition process, and the customer has nothing to do with these dates. This PR ensures that: - deferred entries are never created when importing vendor bills. - cac:InvoicePeriod is no longer exported in invoice lines (for now). Part of the task-6014315 --- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)
Event communications now prevent users from creating or editing WhatsApp templates from the event mailing field. This avoids choosing an incompatible template model that could later show an access error and reflects the stricter approval requirements for WhatsApp templates.
Original PR description
Issue: User goes to Event.event Form -> communication tab -> add line Select whatsapp -> type something -> create and edit -> create new template with any model event.registration -> save ( all the way including the event form) reload page -> whatsapp event.mail displays "User does not have access to this record". Fix: add a patch to the js get m2oProps to deactivate edit, and create on the prop. WA Templates need more limitations for creation and edits due to the approval process from META's external API. We cannot block the full creation and edit in the xml becuase other event.mail types rely on that flow to create their types like social posts. This was a fix implemented due to needing to revert the oginal fix odoo/odoo@f58e9f97192ac0ff8d159377494d6c68f871d20b opw-6334168
Email links for appointments now use the website tied to the appointment instead of another website visited by the user. This prevents customers on multi-website setups from being sent to the wrong site when managing their bookings.
Original PR description
In Multiwebsite settings, when the public user interactions needs email generation (appointment or event flow), the email links are generated with a base url that does not corresponds to the one from…
In Multiwebsite settings, when the public user interactions needs email generation (appointment or event flow), the email links are generated with a base url that does not corresponds to the one from which the request started. Case 1: - Have website A and website B - Create an appointment page website A - Log in via website B - As public user, make an appointment in Website A - Check the generated email Issue: button links in the email will redirect to the wrong website, so users will encounter an issue when managing the appointment. This occurs because when an user log in, the system parameter 'web.base_url' is updated with the current url. This parameter is then used as fallback when we need to retrieve the base url without an active record Case 2: - Have website A and website B - Create an event and assign it to website B - As public user, access the event and register to it - Check the generated email Issue: button links in the email will redirect to the wrong website, so users will encounter an issue when managing the event. This occurs because the record `event.registration` has no website_id field and the base url is taken from the company default website (website A) Backport with improvements of 15bae202d8f1b5bf70bbc63b2d89025e9237e6cf opw-4146760 opw-4336369 Forward-Port-Of: odoo/enterprise#122669
This update resolves an issue where dragging tables in the HTML editor caused layout problems. Now, tables can be seamlessly dropped and pasted, maintaining their original formatting and functionality, ensuring a smoother editing experience.
Original PR description
**Current behavior before PR:** - Dragging and dropping a selected table caused the layout of the dropped table to become broken. **Desired behavior after PR is merged:** - Now, dragging and dropping a selected table now maintains the table's layout, ensuring that the entire table is dropped without any layout issues. task:4138408
During checkout, users experienced a frustrating issue where the 'Save Address' button would get stuck in a loading state when navigating back to the address form. This was caused by the browser's cache incorrectly preserving a disabled button state. This update ensures the button is correctly reset, providing a smooth and reliable checkout experience.
Original PR description
When the address form is submitted, the button is disabled and a spinner is shown while the POST is in flight. On success, redirect() is called, which schedules a navigation via location.assign()…
When the address form is submitted, the button is disabled and a spinner is shown while the POST is in flight. On success, redirect() is called, which schedules a navigation via location.assign() asynchronously. The browser's bfcache can snapshot the page at this point — while the button is still disabled — and restore that snapshot when the user presses back, leaving the button stuck in the loading state. Fix: re-enable the button and remove the spinner before branching on result.redirectUrl so bfcache always captures a clean button state. In Odoo master this was fixed implicitly by PR odoo/odoo#201730 (commit 1d79eddc62a0), which refactored the widget to use the Interaction class with makeButtonHandler(), which always restores the button after the handler's promise resolves. Description of the issue/feature this PR addresses: Current behavior before PR: During checkout, when pressing the return arrow to go back into the address editing panel, the "Save Address" button gets stuck in loading forever. Desired behavior after PR is merged: The "Save Address" button is shown normal. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue that was preventing batch payments from processing correctly. The fix corrects a faulty call within the Odoo system, ensuring that payment sequences initialize properly. This improves the reliability of batch payment operations.
Original PR description
Fix a wrong call to self breaking ensure_one 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 update adjusts Dominican Republic (l10n_do) income tax withholding rates to comply with Law 30-26, effective July 1st, 2026. The standard rate for service fees and rentals has increased from 10% to 15%, reflecting new tax regulations. This ensures accurate tax reporting for Dominican businesses using Odoo.
Original PR description
## Description Law no. 30-26 of June 18, 2026 (art. 17) amended article 309 of the Dominican Tax Code. Effective **July 1st, 2026**: - The income tax (ISR) withholding on fees, commissions and other…
## Description
Law no. 30-26 of June 18, 2026 (art. 17) amended article 309 of the Dominican Tax Code. Effective **July 1st, 2026**:
- The income tax (ISR) withholding on fees, commissions and other remunerations for services rendered by individuals not in a dependency relationship is raised from **10% to 15%** (payment on account).
- The ISR withholding on rentals of movable and immovable property paid to individuals is raised from **10% to 15%** (now a definitive payment).
Official references:
- Amended article 309 CT (art. 17 of the law): "a) 15% *(antes 10%)* ... alquiler o arrendamiento ... provistos por personas físicas ... pago único y definitivo; b) 15% *(antes 10%)* sobre los honorarios, comisiones y demás remuneraciones y pagos por la prestación de servicios en general provistos por personas físicas, no ejecutados en relación de dependencia ... pago a cuenta."
- Law 30-26 at the Ministry of Finance: https://www.hacienda.gob.do/marco-legal/ley-no-30-26/
- PwC summary quoting the new art. 309 scale ("15%, previously 10%"): https://www.pwc.com/ia/es/publicaciones/Noticias-Tax-Legal/Tax-and-legal-2026/modificaciones-Ley-30-26.pdf
- DGII implementation calendar (notice 10-26 — calendar only, the rates are in the law text): https://dgii.gov.do/publicacionesOficiales/avisosInformativos/Documents/2026/10-26.pdf
- DGII confirming the new percentages are in force since 2026-07-01: https://ayuda.dgii.gov.do/conversations/discusiones/retenciones-segun-ley-3026/6a42be2e3365d30845e40234
## Implementation notes
- The existing XML IDs (`ret_10_income_person`, `ret_10_income_rent`) are kept unchanged, so on existing databases the standard chart template reload (`_pre_reload_data`) replaces the outdated 10% taxes through the usual `[old]` renaming mechanism.
- The tax group `tax_group_person_services` labels are updated from "(10%)" to "(15%)" accordingly.
- No other article 309 rates changed for the taxes present in this template (5% government, 10% dividends, 2% N07-07, 27% remittances remain in force).
This is the first contribution by Grupo de Consultoria Henca (https://www.consultoriahenca.com); the corporate CLA signature is included in `doc/cla/corporate/consultoriahenca.md` as instructed by `doc/cla/sign-cla.md`.
## Related PRs
- 17.0: https://github.com/odoo/odoo/pull/275986
- 18.0: https://github.com/odoo/odoo/pull/275987
- 19.0: https://github.com/odoo/odoo/pull/275988This update resolves an issue where activity descriptions weren't consistently appearing in all tabs after duplicating a chat window. The fix removes unnecessary computed fields from activity broadcasts, ensuring descriptions are accurately reflected across all connected tabs. This improves the user experience for sharing and receiving activity updates.
Original PR description
**Steps to reproduce:** - Install Contacts app - Open any record - Go to the chatter - Create an activity with a description - Duplicate the tab - Go back to the initial tab - Description doesn't…
**Steps to reproduce:**
- Install Contacts app
- Open any record
- Go to the chatter
- Create an activity with a description
- Duplicate the tab
- Go back to the initial tab
- Description doesn't appear anymore
- Refreshing shows it but will remove it from the other tab
**Issue:**
Behavior comes from the broadcasting of activity changes between tabs `new browser.BroadcastChannel("mail.activity.channel");`.
Computed fields are not recomputed on the receiver side after value insertion in `_onActivityBroadcastChannelMessage` (also related components are not (re)mounted, e.g. when a new activity is created the other tab doesn't show it without a refresh).
This means that `isNoteEmpty` keeps its default value `true` (added by `this.toData()`) and the `note` stays hidden here [1]:
```xml
<div t-if="!props.activity.isNoteEmpty" class="o-mail-Activity-note text-break" t-out="props.activity.note"/>
```
**Fix:**
Remove computed fields in activity `serialize` before broadcasting them to ensure they don't force the default value.
(note installing `calendar` in 19.3+ removes this issue due to [2] which overrides the condition on `isNoteEmpty`)
[1] https://github.com/odoo/odoo/commit/eb9f0658c3da1a9fef69f1cc1117c2d44f9d61b1
[2] https://github.com/odoo/odoo/commit/44e2c2c5ca07849fd8964140f3ca61122c47f0c6
opw-6247412This update fixes an issue where event registration emails were directing users to the wrong website. The problem stemmed from a misconfigured base URL, leading to incorrect links. This change ensures that event registration emails now accurately reflect the event's assigned website, improving user experience and event management.
Original PR description
In Multiwebsite settings, when the public user interactions needs email generation (appointment or event flow), the email links are generated with a base url that does not corresponds to the one from which the request started. - Have website A and website B - Create an event and assign it to website B - As public user, access the event and register to it - Check the generated email Issue: button links in the email will redirect to the wrong website, so users will encounter an issue when managing the event. This occurs because the record `event.registration` has no website_id field and the base url is taken from the company default website (website A) opw-4146760 opw-4336369 Forward-Port-Of: odoo/odoo#274051
This update fixes a discrepancy in the default tax date obligation for Serbian VAT invoices. Previously, the system defaulted to a 'By Issuance Date' setting, which wasn't compliant with Serbian law. Now, it correctly defaults to 'By Delivery Date' as mandated by Article 16 of the Serbian VAT Law, ensuring accurate tax reporting.
Original PR description
According to[ Article 16 of Serbia's VAT Law](https://www.paragraf.rs/propisi/law-on-value-added-tax.html#:~:text=of%20Tax%20Obligation-,Article%2016,-A%20tax%20obligation), the tax obligation arises at the time of delivery of goods/services by default. 'By Issuance Date' only applies to a narrow set of services under Article 16(2a) Before: l10n_rs_tax_date_obligations_code defaulted to '3' (By Issuance Date) After: defaults to '35' (By Delivery Date) Upgrade: odoo/upgrade#10657 task-6348377 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273608