Wednesday, July 15, 2026
25 changes · 19.0
Enhancements to existing features
Imported XML invoices can include technical codes inside note fields. This update hides those codes from the invoice form so users see cleaner, more business-friendly invoice notes.
Original PR description
When importing an xml, in the notes you can have codes. We don't want them to be shown in the form view of invoice. task-6365267 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The French accounting chart now includes additional 2026 plan accounts for impairments on tangible fixed assets. This helps keep French financial reporting aligned with official account mappings and reduces manual adjustments.
Original PR description
Add the missing 2912, 2913, 2914, and 2915 accounts from the 2026 PCG so the French chart matches the balance sheet impairment mappings for tangible fixed assets. task-6226138 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The journal creation wizard can now be navigated with keyboard arrow keys, making setup faster and easier for users who prefer keyboard workflows. This improves accessibility and efficiency during accounting configuration without changing the underlying process.
Original PR description
This commit aims to allow for navigation through the journal create wizard via keybaord arrows. Related Odoofin PR: https://github.com/odoo/odoofin/pull/502 task-5796200
Resolved issues and error corrections
This fix updates the Cofidis payment mapping in Worldline to use the latest identifier from Worldline's documentation. It helps ensure Cofidis payment requests are routed correctly and reduces the risk of payment processing issues for customers using this method.
Original PR description
opw-6368979 Description of the issue/feature this PR addresses: Update the Worldline Cofidis payment method mapping to match the latest payment product ID defined in the Worldline documentation. Current behavior before PR: The Cofidis payment method was mapped to the outdated payment product ID (3012), causing payment requests to use an incorrect mapping. Desired behavior after PR is merged: The Cofidis payment method is mapped to the correct payment product ID (5129) as per the latest Worldline documentation, ensuring payment requests use the correct mapping. Forward-Port-Of: odoo/odoo#275881
Features or functions removed from Odoo
This update removes an old check in the self-ordering point of sale flow that no longer had any effect. It simplifies the code without changing how customers or staff use the system.
Original PR description
Description of the issue/feature this PR addresses: Removed obsolete code checking "this.config.self_ordering_mode !== 'qr_code'". Since "qr_code" is not a valid value of the "self_ordering_mode" selection field. The condition is always true. Forward-Port-Of: odoo/odoo#275962 Forward-Port-Of: odoo/odoo#273245
Documentation and clarification updates
The GIF search placeholder now shows “Search KLIPY” to meet Klipy’s attribution requirements. This keeps the mail GIF picker compliant with the third-party provider’s branding guidelines without changing how users search for GIFs.
Original PR description
Klipy requires attribution with "Search KLIPY" as the default placeholder [1]. This commit complies these guidelines. [1]: https://docs.klipy.com/attribution Forward-Port-Of: odoo/odoo#275995 Forward-Port-Of: odoo/odoo#275677
Miscellaneous changes
Time-off accrual milestone units such as days and years now appear in the user's selected language. This improves clarity for employees and HR users working in translated interfaces, such as French.
Original PR description
Issue: ---------------------------------------- The units (day, year, etc.) aren't being translated in the Milestones view. Steps to reproduce: ---------------------------------------- - Switch the language to French - Go on an Accrual plan form view - In the milestones view, the units aren't translated Cause: ---------------------------------------- We input the key value of the selections fields `start_type` and `added_value_type`. These values aren't translated. Solution: ---------------------------------------- We create a dictionary with the same keys as the fields and a translated value as values. In the view, we read the values of the dictionary to get the translated units. opw-6367235 Forward-Port-Of: odoo/odoo#275575
This fixes a flaky automated test in the Mail module that sometimes failed when checking whether opening a conversation marks inbox messages as read. The change makes the test setup more consistent, helping reduce false test failures and improving confidence in future Mail updates.
Original PR description
The "Opening thread with needaction messages should mark all messages of thread as read" test opens a channel that holds an inbox (needaction) message and asserts mark_all_as_read is sent. Two flows can mark that message as read: the channel messages fetch, through set_message_done, and mark_all_as_read, sent by markAsRead when the channel gets focused on open. When the self member's new_message_separator is 0, opening the channel fetches its messages around 0, and that fetch marks the message as read and drops the needaction counter to 0 before markAsRead runs. mark_all_as_read is then skipped and the step assertion receives nothing. Give the member a non-zero separator (the pre-existing message is already read) so opening the channel no longer fetches around 0, leaving mark_all_as_read as the flow that marks the inbox message read. https://runbot.odoo.com/odoo/error/243651 Forward-Port-Of: odoo/odoo#276181
Timesheets moved to a non-billable project will no longer keep a previously selected sales order item. This prevents incorrect sales links from remaining on work that should not be billed, helping keep project billing data accurate.
Original PR description
## Steps to reproduce: - Install sale_timesheet - Create a timesheet with a Sale order item linked to it - Change the sale order item on that timesheet - Change the project linked to the timesheet to a non-billable project - Notice the sale order item still linked to the timesheet ## Cause: When computing the so_line we filter out the records that has is_so_line_edited as true, so when changing the SOL before changing the project we don't reset so_line field when setting a non-billable project. ## Fix: We reset the is_so_line_edited field to false when changing the project to a non-billable one. opw-6311549 Forward-Port-Of: odoo/odoo#275919
This fix ensures animated GIFs keep playing when used with website image shapes in Firefox and Safari. It applies an existing compatibility workaround across the remaining image shape templates, giving users consistent visual behavior regardless of the chosen shape.
Original PR description
Animated GIFs applied with an image shape freeze on Firefox and Safari when the shape's SVG is otherwise static. A dummy `<animateMotion dur="1ms" repeatCount="indefinite"/>` child on the <image> element keeps the animation running so the GIF plays. This hack was introduced in [1] but was missing from most shapes. This commit adds it to every <image> element that lacked it so any shape can be used with a GIF. task-5967171 [1]: https://github.com/odoo/odoo/commit/144e5ef799060da860a5fb1fbe0fd009919afe79 Forward-Port-Of: odoo/odoo#275259
This fix ensures the numbering sequence used for batch payments is created only after the accounting module is fully initialized. That prevents setup timing issues and helps companies process batch payments without missing sequence configuration.
Original PR description
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#275309 Forward-Port-Of: odoo/odoo#273905
Fixed an issue that could prevent users in Developer Mode from replacing an existing video on a website page. This helps ensure video editing works reliably without unexpected validation errors.
Original PR description
Steps to reproduce: ------------------------------------ 1. Enable Developer Mode. 2. Open the Website Module and edit any page. 3. Add a Video snippet and configure a video. 4. Save the page. 5.…
Steps to reproduce: ------------------------------------ 1. Enable Developer Mode. 2. Open the Website Module and edit any page. 3. Add a Video snippet and configure a video. 4. Save the page. 5. Edit the same page again. 6. Select the existing video and click "Replace Video". Observation: ------------------------------------ An error related to props validation is raised when attempting to replace the existing video while Developer Mode is enabled. ``` OwlError: Invalid props for component 'VideoOption': 'value' is not a string Error: Invalid props for component 'VideoOption': 'value' is not a string ``` Issue: ------------------------------------ The Video snippet component validates its props in Developer Mode. During the video replacement flow, the 'value' prop can be either a string or a boolean. However, the component only accepts 'string', causing props validation to fail and raising an error when replacing an existing video. https://github.com/odoo/odoo/blob/499420f7062ab467ff6f50b30c547e54c35ae1e9/addons/html_editor/static/src/main/media/media_dialog/video_selector.js#L351-L352 Solution: ------------------------------------ Allow the 'value' prop to accept both String and Boolean so props validation succeeds during the video replacement flow in Developer Mode. opw-6369196
Kanban views no longer crash when a user opens a group while another grouping update is being applied at nearly the same time. This improves stability in everyday list organization workflows by safely handling cases where the group to scroll to is no longer available.
Original PR description
Before this commit, a crash could occur in kanban views but it required a very precise timing. If 2 renderings of the kanban renderer occurred at the same time, one coming from a group that has just been opened, and one coming from a new groupby being applied in the search view, we tried to scroll to the opened group to ensure that it is in the viewport, but we couldn't find it. Task~6391414
The French tax report now displays E3 tax grid amounts when they are stored as negative values. This prevents valid E3 amounts from appearing blank or being wrongly deducted from totals, improving tax report accuracy for French localization users.
Original PR description
**Steps to reproduce:** * Install l10n_fr. * Create an invoice using a tax with the E3 tax grid. * Post the invoice so it is included in the tax report. * Open the French tax report. **Observed Behaviour:** The E3 line is blank even though the amount is present in the report data. The amount is recorded as a negative value, while the report formula expects a positive value, causing it to be deducted from the report total. **Cause:** The E3 tax report expression used the formula E3, which does not account for tax grid amounts stored as negative values. **Fix:** Update the E3 report expression formula from E3 to -E3 so that negative E3 amounts are correctly displayed in the tax report. opw - 6321790
Peppol registration tokens now remain valid for longer than one hour to allow time for manual verification steps. This helps prevent registration interruptions or repeated attempts when checks take longer to complete.
Original PR description
Registration token now needs to be valid for much longer than 1 hour due to manual verifications
Fixed an issue that could cause an error when users returned to the budget report list using breadcrumbs. This keeps the Analytic Budgets workflow smooth and prevents an unexpected interruption during budget review.
Original PR description
Problem:
The `budget.report` model had its default sorting (`_order`) set to False. When a user navigates back to the report list view via the breadcrumbs, the web client invokes `web_read_group`, which runs `self._order.split(',')`. Because `_order` is a boolean rather than a string, this raises an AttributeError and throws an RPC_ERROR.
Solution:
Set `_order = 'date desc'` on `budget.report`. Both queries within the `_table_query` UNION ALL expose a `date` column, providing a semantically correct and safe default ordering constraint.
Steps to replicate:
- Go to Accounting > Accounting > Analytic Budgets.
- Select any budget.
- Click 'Audit' on any budget line to land on the budget report view.
- Click to open any individual record.
- Navigate back using the breadcrumbs.
- -> RPC_ERROR: AttributeError: 'bool' object has no attribute 'split'
opw-6372610Shopee order lines now show the SKU for the exact product variant ordered instead of the broader product template SKU. This helps sales teams and customers see the correct item details on orders when listings include variants.
Original PR description
Currently, _prepare_order_lines_values resolves SKU as `item_sku or model_sku`. Shopee always sends item_sku (product.template SKU), so when a listing has variants the order line description shows the template SKU ([item_sku]) even though the correct variant is linked via `model_sku`. task_id: 6335110 Forward-Port-Of: odoo/enterprise#124031
This fixes a Belgian payroll configuration issue where a payroll rule for employee termination holidays was assigned to the wrong salary structure. The correction helps ensure affected payslips are calculated and validated against the appropriate payroll setup.
Original PR description
Oversight of 553ba7d0d066b4179b7f89f8ec9ef8f0bffe964d Forward-Port-Of: odoo/enterprise#124331 Forward-Port-Of: odoo/enterprise#123765
The Dutch reports module no longer shows an outdated website link in its module information. This prevents users from being directed to an unrelated external site and keeps the module details accurate.
Original PR description
The URL leads to a website that has nothing to do with what it used to be so it needs to be removed. Task-6360682 Forward-Port-Of: odoo/enterprise#124155 Forward-Port-Of: odoo/enterprise#123019
This fixes an internal payroll issue where reused rule settings could be unintentionally altered during calculations. Payroll rules now receive a safe copy of these settings, reducing the risk of inconsistent or hard-to-trace payroll results.
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-6329380
Forward-Port-Of: odoo/enterprise#124141
Forward-Port-Of: odoo/enterprise#123057This fix ensures the express mention in French VAT report files is placed in the correct part of the submission sent to Aspone. This helps avoid rejection or processing issues caused by the mention being included in an unsupported section.
Original PR description
in this commit: https://github.com/odoo/enterprise/commit/93c1a4fe15d1f09e4c3df3a5db0e06006121c027 we added a way to have an express mention in the xml sent to aspone. But we placed it in the "T-IDENTIF" zone, but this zone doesn't accept express mention. It should be located in the form it self. task-6253745
Opening Studio from a project task list now keeps the browser address clean and correctly tracks the active project context. This prevents errors when users go back in the browser or open a Studio URL directly.
Original PR description
Go on a project, then open its task list view Open studio with the menu item. At this point, studio is open but the url looks like: `/odoo/project/5/tasks/studio/5` the last `/5` is wrong ; this commit fixes this. Then, hit the browser's back button. There is an error because the active_id was not correctly set when leaving studio that way Try loading `/odoo/project/5/tasks/studio`, again, there is an error because the active_id is read from the wrong object Forward-Port-Of: odoo/enterprise#122405
When a new employee contract is created from a template, its analytic distribution is now copied correctly. This prevents missing payroll cost allocation information and reduces the need for manual correction after contract creation.
Original PR description
Problem: When creating a new contract from a template, the analytic distribution field is not copied from the template to the contract. Steps to reproduce: 1. Create a contract template with an analytic distribution. 2. Create a new contract for an employee from the template. 3. Check the analytic distribution field on the new contract. 4. Notice how the analytic distribution field is empty, even though it was set on the template. Cause: The field is not included in the list of whitelisted fields to copy from the template. https://github.com/odoo/odoo/blob/0133e46f89df7dce8c39d2bacd29579d57a83fad/addons/hr/models/hr_version.py#L443 opw-6370781
This fixes a display issue where the CFDI Origen field could disappear from Mexican invoice forms when the Colombian e-invoicing module was also installed. Users working with Mexican electronic invoicing can now reliably access the needed field without module conflicts.
Original PR description
The field 'CFDI Origen' (l10n_mx_edi_cfdi_origin) is not visible on the account move form view if l10n_co_edi module is installed because this https://github.com/odoo/enterprise/blob/19.0/l10n_co_edi/views/account_invoice_views.xml#L10 is the last group on ="//sheet/group//group[last()]" and it is invisible for mx. This commit fixes that. I created this issue https://github.com/odoo/odoo/issues/276358 reporting the bug. Task Adhoc side: 67269