Friday, September 18, 2026
17 changes · 19.0
Enhancements to existing features
The Belgian payroll module now includes the new CP200 homeworking representation fee amount of 164.21, effective September 1, 2026. This helps payroll calculations stay aligned with the latest expected Belgian sector parameter for eligible employees.
Original PR description
Add a value of 164.21 for the rule parameter "CP200: Representation Fee - Homeworking - Amount" with `date_from` set to September 1, 2026. Task:6580623
Resolved issues and error corrections
Creating an onsite event from the Onsite action now uses the current user's employee record when no employee is provided. This prevents an error and ensures the new event is visible in the expected onsite event view.
Original PR description
The Onsite action only sets the hr_skills_event_add_employee key in its context, without any employee. Reading default_employee_id directly then raised a KeyError. Even before that, no attendee was added, so the new event did not match the domain of the action and stayed hidden in the kanban view. We now fall back on the employee of the current user. taskid-6361432
Documentation and clarification updates
Joris Debonnet has submitted confirmation that the required contributor license agreement has been signed. This administrative update helps ensure contributions can be reviewed and accepted under Odoo's contribution rules.
Original PR description
I confirm I have just signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an internal manufacturing test that could fail depending on the timezone where it was run. The change improves confidence in automated checks without changing day-to-day user functionality.
Original PR description
**PROBLEM**
In `test_generate_serial_button_sequence()` we generate a serial number based on the day of the year. In ir_sequence, we use the time based on the environment timezone, but in the test, we don't use any timezone. This can lead the assertion to fail, since the day of the year can differ with the timezone used.
**REPRO STEPS**
1. edit the freeze_time in the test to `freeze_time('2024-01-15T23:00:00')`
If your timezone is UTC+2, then the time according to your timezone will be `2024-01-16T01:00:00`
So, without in UTC+0, it's the 15th day of the year, but in UTC+2 it's already the 16th.
Remove the timezone in the last assertIn() (ie, remove the fix).
(if your timezone is different, adjust the freeze_time accordingly)
2. run the test and see it fails.
runbot-237780Product option pills in the sales configurator now keep consistent spacing when they wrap onto multiple lines. This improves readability and avoids a cramped layout for products with many attribute choices.
Original PR description
Pill-style attribute values used Bootstrap's list-inline/list-inline-item, which only sets margin-right between items. When pills wrapped onto a new line, the rows touched with no vertical gap. Fix: Switch the pill list to a flex container with gap-2, matching the spacing website_sale already uses for its own attribute-value lists, so wrapping rows get the same gap as pills on the same row. opw-6584507 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an error that could occur when creating an event linked to employee skills if employee information is missing from the setup context. It helps keep the event creation process reliable and avoids unnecessary interruptions for users.
Original PR description
The create method searches for an employee by matching the ID with the `default_employee_id` in the context. This is not guaranteed to exist; thus, a KeyError is possible. Instead, we can use a get. opw-6581421
Invoices that have already been sent through PEPPOL can no longer have the PEPPOL sending option selected again. This prevents users from accidentally attempting to resend an invoice through the same electronic invoicing channel and makes the form behavior clearer.
Original PR description
If the invoice is already sent through PEPPOL, the checkbox for sending the invoice should then be readonly and unchecked. Currently is correctly unchecked but not readonly. We fix it by copying what French localization (`l10n_fr_pdp`) does already, giving a reason for disabling. <img width="1359" height="948" alt="immagine" src="https://github.com/user-attachments/assets/6f91ab34-8989-487e-8cd9-96dafee7bcb5" /> . Pad: https://pad.odoo.com/p/accountingv20 pad-accountingv20 Forward-Port-Of: odoo/odoo#288898
This fixes a case where linked child contacts could show an incorrect EU VAT validation result when processed before their parent company. Parent companies are now validated first, so child contacts that share the same VAT number inherit the correct result and business records remain accurate.
Original PR description
**Description of the issue/feature this PR addresses:** When a batch recompute of `vies_valid` contains both a parent (commercial) partner and a child sharing the same VAT, and the child happens to…
**Description of the issue/feature this PR addresses:**
When a batch recompute of `vies_valid` contains both a parent (commercial) partner and a child sharing the same VAT, and the child happens to be iterated before its parent, the child ends up with `vies_valid=False` instead of the parent's real, freshly-checked value.
**Current behavior before PR:**
`_compute_vies_valid` loops over `self` in whatever order the batch happens to have:
```python
for partner in self:
...
if partner.parent_id and partner.parent_id.vies_vat_to_check == partner.vies_vat_to_check:
partner.vies_valid = partner.parent_id.vies_valid
continue
status = partner._check_vies_iap()
partner._update_vies_status(status)
```
`Field.compute_value()` removes the whole batch from the "to compute" queue *before* running this loop (it does so upfront, in case the method does not assign every record). So when the loop reaches a child and reads `partner.parent_id.vies_valid` to reuse it, that field is no longer marked "to compute" for the parent, and reading it just returns whatever is currently cached/stored — which, if the parent has not been processed yet in this same loop, is still the old/default value. The child copies that stale value and, being a stored field, keeps it forever: nothing re-triggers its computation afterwards.
Example:
```python
parent = env['res.partner'].create({'name': 'Parent Co'})
child = env['res.partner'].create({'name': 'Child Address', 'parent_id': parent.id})
child.vat = 'BE0477472701' # queues the child's compute first
parent.vat = 'BE0477472701' # queues the parent's compute second
child.vies_valid # False, even though the VAT is valid
parent.vies_valid # True
```
**Desired behavior after PR is merged:**
Every partner without a parent is always computed before any child that may reuse its value, regardless of the batch's original order — so the child correctly ends up with the parent's real `vies_valid`.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#287251
Forward-Port-Of: odoo/odoo#279927This fixes a customization issue where websites could not reliably override which flag is shown for a language. Businesses can now tailor language flag choices to better match their region, audience, or branding without duplicating the underlying field setup.
Original PR description
Which flag stands for a language is a presentation choice, not a property of its code. `_compute_field_flag_image_url` derives the URL from the country part of the locale, and a site that wants a…
Which flag stands for a language is a presentation choice, not a property of its code. `_compute_field_flag_image_url` derives the URL from the country part of the locale, and a site that wants a different flag for a language it offers, a regional one or the flag of the country it actually serves rather than the one the code names, has to compute that URL its own way.
That is not possible today. The field passes the compute as the function object:
flag_image_url = fields.Char(compute=_compute_field_flag_image_url)
`determine()` takes the `callable` branch and calls that object with the recordset. A plain function is not bound, so the implementation of `base` runs whatever class the record has: a module that inherits res.lang and defines `_compute_field_flag_image_url` changes nothing, and nothing says so. No error, no warning, and the field keeps answering the same URL. Getting around it means redeclaring the field only to replace its compute, which is more than the situation calls for.
Passing the method name puts the computation back on the MRO and costs nothing else: `Field.get_depends` resolves a string with `resolve_mro` and collects `_depends` from every implementation it finds, so the `@api.depends('code', 'flag_image')` declared here keeps applying, to this implementation and to an override alike.
This is the same kind of fix as #185419, which made the `domain` of a field reachable by an override for the same reason. Two field declarations in the codebase still pass a function object this way; the other is `website.menu.is_mega_menu`, which passes `inverse` the same way and is left alone here.Users adding reactions in Discuss can now hold Shift when selecting an emoji from the Quick Reaction Menu to keep the emoji picker open. This makes it easier to add multiple reactions in a row without repeatedly reopening the picker.
Original PR description
When adding a reaction to a message in Discuss, selecting an emoji adds the reaction and closes the emoji picker. This can be inconvenient when adding multiple reactions in a row, as the picker has to be reopened every time. To address this problem, the emoji picker remains open when the user holds Shift while selecting an emoji. However, this behavior was overlooked when implementing the Quick Reaction Menu, which therefore closes the emoji picker upon emoji selection, regardless of whether Shift is pressed. This commit fixes the Quick Reaction Menu so that holding Shift while selecting an emoji once again prevents the emoji picker from closing. [Task-6575382](https://www.odoo.com/odoo/project/1519/tasks/6575382)
This fix ensures that grid views recalculate their visible content when the page element behind them is recreated. Users should no longer see an empty grid after certain refreshes or interface updates until they scroll or resize the window.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281721
When helpdesk tickets are merged, related timesheets now use the sales order item from the destination ticket. This prevents mismatched billing or reporting details after tickets with different sales items are combined.
Original PR description
Currently when you merge helpdesk tickets with differing sale order items, the sales order item listed on the timesheets of the source ticket is not updated to match the destination ticket's sales order item. This PR ensures uniformity bugfix-6473396 Forward-Port-Of: odoo/enterprise#131155 Forward-Port-Of: odoo/enterprise#129060
This change removes duplicated logic from the US ISO 20022 payment file process after the shared payment logic was updated. It keeps the US-specific requirement to include the bank country, reducing maintenance risk without changing the expected business workflow.
Original PR description
Since this previous [commit](https://github.com/odoo/enterprise/commit/05f175c8c9a2562beaefe331af0573f807a4a679) `MmbId` is now the location that the bank clearing code is instead of directly within `ClrSysMmbId`. This means the extra code in the US specific ISO generation system is unecessary. As such this PR removes the duplicated code and instead just focuses on adding the Country of the bank to the node which currently no other implementation requires.
This fix places company car-related payroll fields in the correct fleet payroll module instead of the base Belgian payroll module. It prevents payroll setup tests from failing when Belgian payroll is installed without fleet features, improving installation reliability.
Original PR description
On https://github.com/odoo/enterprise/pull/94557, fleet-related fields where added to the whitelist of l10n_be_hr_payroll. However those fields are added in l10n_be_hr_payroll_fleet, which causes the TestWhitelistFromTemplate.test_be_contract_template_loading test to failwhen payroll is installed but not fleet. This commit adds those fields to the whitelist on the correct module.
AI-generated views that group data by columns are now accepted when the setup is valid. This prevents users from being blocked when applying legitimate AI-created views, while still rejecting invalid configurations.
Original PR description
When opening a view with a column groupby, the AI view validators incorrectly rejected the generated configuration, even though it was valid. As a result, valid AI-generated views could not be applied. This commit updates the validation logic to correctly accept valid column groupbys while preserving the existing validation behavior for invalid configurations. task-6377810
This fixes the background styling for constant signature fields so they remain slightly transparent instead of appearing as a lighter solid grey. It also prevents a recurring stylesheet warning during PDF signing asset generation, reducing noise and future compatibility risk.
Original PR description
### Problem `sign/static/src/scss/iframe.scss` sets the background of `.o_sign_sign_item.o_color_constant` with ```scss background-color: hsl(0, 0%, 80%) / 0.9; ``` That slash is not the modern CSS…
### Problem `sign/static/src/scss/iframe.scss` sets the background of `.o_sign_sign_item.o_color_constant` with ```scss background-color: hsl(0, 0%, 80%) / 0.9; ``` That slash is not the modern CSS alpha syntax. Sass parses it as a division of a color by a number: `hsl(0, 0%, 80%)` is `#cccccc`, each channel is divided by 0.9 (204 / 0.9 = 226.67 -> 227) and the rule compiles to an opaque `#e3e3e3`. Constant sign items lose the transparency they were meant to have and render a shade lighter than the `o_color_responsible_*` items right above, which do use 90% alpha. Generating the `sign.assets_pdf_iframe` bundle also logs, every time: ``` DEPRECATION WARNING: The operation `#cccccc div 0.9` is deprecated and will be an error in future versions. Consider using Sass's color functions instead. ``` ### Fix Use `rgba()`, the way the two `o_color_responsible_*` blocks just above already do. Compiled with libsass 3.6.5 (the compiler `ScssStylesheetAsset` uses): | | compiled output | | --- | --- | | before | `background-color: #e3e3e3;` plus the deprecation warning | | after | `background-color: rgba(204, 204, 204, 0.9);`, no warning | 18.0 is not affected: there the rule was written as a plain `opacity: 0.9`. In saas-19.4 the same declaration already reads `rgba(mix(...), .9)`, so this only brings 19.0 in line with it.
Accounting predictions now use the most recent prior entries instead of older records. This helps improve the relevance of suggested accounting values and reduces the chance of predictions being based on outdated activity.
Original PR description
This commit: https://github.com/odoo/enterprise/pull/38830/changes#diff-6f6931855e0903ff0d3f2b39bd5703ceaef9bdf9a516862b83f38d2d5b21a232 change the order of the predictive queries, removing the sorting order by date. Based on the current docstring: https://github.com/odoo/enterprise/blob/66682012145e5116ebec0183102bc5e930c2c343/account_accountant/models/account_move.py#L676 this is not correct, as we expect to retrieve the previous 100 entries, rather than the oldest ones. Correcting the query order ensures that the most recent entries are considered for predictive purposes. opw-6558929 Forward-Port-Of: odoo/enterprise#131776 Forward-Port-Of: odoo/enterprise#131731