Monday, July 13, 2026
31 changes · saas-19.3
Enhancements to existing features
The website AI Assistant is now unavailable to users who do not have permission to edit and design website pages. This avoids confusion by disabling the button and showing a clear explanation when the feature cannot be used.
Original PR description
Restricted Editors do not have permission to edit website pages. However, the AI Assistant button remains available, giving the impression that the feature can be used even though any changes cannot be saved. This commit disables the AI Assistant button for users without 'Editor and Designer' access and adds a tooltip explaining why the feature is unavailable
Resolved issues and error corrections
Fixed an issue where Chilean export invoice PDFs could show customs information under the wrong column when origin or destination port details were missing. The printed export document now keeps blank cells in place so package quantities and port information remain correctly aligned.
Original PR description
### Issue: On Chilean export invoices, the customs information table may display data in the wrong columns When `Origin Port` or `Destination Port` is not set, the corresponding `td` is omitted by…
### Issue: On Chilean export invoices, the customs information table may display data in the wrong columns When `Origin Port` or `Destination Port` is not set, the corresponding `td` is omitted by QWeb, causing the remaining columns to shift left This results in `Qty of Packages` appearing under `Origin Port` or `Destination Port` in the printed document ### Cause: `l10n_cl_port_origin_id` and `l10n_cl_port_destination_id` have no default value and are optional fields `t-out` on a falsy value omits the `td` entirely in QWeb, breaking the column alignment Adding `or ''` ensures an empty `td` is always rendered, preserving the table structure regardless of whether the fields are set ### Steps to reproduce: - Install `l10n_cl_edi_exports` and switch to CL Company - Create an Invoice (any customer, any line) - In the gear menu, select Print > Invoice PDF copy (Chile) Before the fix, `Qty of Packages` appears under `Origin Port` when neither port field is set opw-6304670 Forward-Port-Of: odoo/enterprise#122906 Forward-Port-Of: odoo/enterprise#121923
This fix ensures Belgian CODA bank statement files are read correctly after a prior change added an extra returned value. It prevents import failures or incorrect statement data handling, helping accounting teams continue processing bank statements reliably.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/54ff6637af96533e7f035eeff84f79336dc4650b we made a fix because thanks to this commit:https://github.com/odoo/enterprise/commit/c66995fda83e19b28a38312af8efdc1601881cf0 where we did a backport of the extension number. The backport adds the extension number to the return of the _parse_bank_statement_file. With that we have 4 args returned. Without the * we would have the "too many value to unpack" error. But when doing that we miss to change the stmt_vals = data to take the last element. Otherwise, we will have a list of two elements. no task id Forward-Port-Of: odoo/enterprise#124019
This fixes an incorrect display of the total exemption amount in Belgian payroll declaration 274. The change helps payroll teams review declarations with accurate displayed totals, without changing the underlying payroll process.
Original PR description
The total exemption amount (only used for display) was wrongly computed. Forward-Port-Of: odoo/enterprise#123714
Fixed FedEx label creation so enabling return labels no longer marks the original outbound shipment as a return. This keeps the expected reference field visible on outbound shipping labels, helping teams identify shipments correctly.
Original PR description
Issue ----- When setting the delivery method to create return labels aswell, the reference (`REF`) field is not present on the original outbound shipment. <img width="438" height="148" alt="image" src="https://github.com/user-attachments/assets/42acce7b-6177-4f8f-81d3-ad6dfd3e4bb2" /> Steps to reproduce ----- - Setup Fedex - Enable returns - Create a product (set weight) - Create a delivery for the product - Set carrier as Fedex - Validate delivery - Open the label > REF field is empty Cause ----- Fedex doesn't include references on the label of returns. When the option for returns is enabled, the outbound shipment is marked as a "Courtesy return". It doesn't make sense to specify a return reason on the original shipment. Expected outcome (after fix) ---- <img width="428" height="146" alt="image" src="https://github.com/user-attachments/assets/0d22e147-da90-4aa4-b3ca-2d996c7cc147" /> ----- Ticket: opw-6101620 Forward-Port-Of: odoo/enterprise#118659
The payroll payrun warning for missing payslips now checks the right information after an older filter was removed. This helps payroll teams notice incomplete payruns reliably before processing payroll.
Original PR description
The missing payslip in a payrun warning wasn't triggered correctly because we were filtering on the schedule pay of the payrun and this field was removed in a previous PR. task-6329134
This fixes a commission subscription test so it correctly clears currency rate data across companies when demo data is present. It helps keep automated checks reliable and prevents false failures in subscription commission calculations.
Original PR description
Steps to reproduce: 1- Initialize a new database with demo data 2- Run the test `test_sub_commission_no_currency_rate` Issue: `AssertionError: 0 != 10 : Regular invoice, 10 percent of 100` Why this happens: The test used to delete all rows in the res_currency_rate table for the current company only. When we load the database with demo data, the query in `_get_subscription_currency_rates` would find entries for the other companies and wouldn't resort to the default. Later when joining, it would find no rates for the current company and the test fails. runbot-243440 Forward-Port-Of: odoo/enterprise#116197
The Odoo Box Point of Sale module is now included in the translation setup. This allows the module's text to be translated for users in different languages, improving localization coverage.
Original PR description
In odoo/enterprise#118646 the `obox_point_of_sale` module was added in stable, but the `.weblate.json` file wasn't updated, meaning it cannot be translated. This commit fixes the issue.
Payslip email activity now records a neutral sent-by-email note instead of incorrectly saying the payslip was re-sent. This avoids misleading payroll chatter entries and prevents duplicate notes when emailing payslips for multiple employees.
Original PR description
**Issue:** Clicking Send By Email on a payslip opens the hr.payslip.send.mail wizard. Its action_send() always logs "The payslip has been re-send to the employee." in the payslip chatter, even when…
**Issue:** Clicking Send By Email on a payslip opens the hr.payslip.send.mail wizard. Its action_send() always logs "The payslip has been re-send to the employee." in the payslip chatter, even when the payslip is being sent for the first time. The log call also runs inside the loop over the employees and goes through all the payslips of the wizard on each pass, so when the wizard sends payslips of several employees every payslip gets the same note once per employee. This started with the rework of the wizard in https://github.com/odoo/enterprise/commit/39e0488a7e076ee648b47cc3d1cad41cadfd692e **Fix:** The wizard cannot tell a first send from a resend. There is no field on the payslip that keeps track of a previous send, and the chatter cannot be used for that either because the mail sent automatically on validation can be deleted after sending. The fix changes the log in action_send() to say the payslip has been sent by email, which is true in both cases, and moves it out of the employee loop so each payslip gets exactly one note. **Steps to reproduce:** 1. In Payroll > Configuration > Settings, set "Send payslips to employees" to When Paid and save 2. In Payroll > Payslips, create an off-cycle payslip for an employee, click Compute, then Validate 3. Go back to the settings and set "Send payslips to employees" to When Confirmed 4. On the payslip, click Pay, then Mark as Paid 5. Click Print so the payslip document is generated 6. Click Send By Email and send the mail 7. Check the payslip chatter => The chatter shows "The payslip has been re-send to the employee." while the payslip was never sent before Ticket [link](https://www.odoo.com/odoo/project.task/6324204) opw-6324204 Forward-Port-Of: odoo/enterprise#123298
This fix reverts a previous change in the Belgian payroll employee form to prevent the same information from appearing twice. It keeps the employee record screen clearer and avoids confusion for HR users.
Original PR description
- A previous change has been reverted to avoid appearing twice.
The Colombian DIAN invoicing flow now correctly hides the Reset to Draft option for credit notes that have already been accepted by DIAN. This prevents accepted documents from being accidentally reverted, helping maintain compliance and data consistency.
Original PR description
Issue: The reset button would still appear for credit notes that were already accepted by the DIAN. Steps to reproduce: Create a credit note, confirm it and send it to DIAN. You will be able to select Reset to Draft even though it shouldn't be possible to convert to draft after accepted by DIAN. Cause: The function to compute if the reset button would appear or not was only taking into account Invoices. Solution: Added credit notes, to the function that verifies if the reset button should appear. opw-6219265 Forward-Port-Of: odoo/enterprise#119696
This fixes an issue where payroll rule settings reused by the system could be accidentally changed during calculations. The change helps prevent hard-to-trace payroll inconsistencies by ensuring each calculation works with its own safe copy of the setting data.
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-6329380Fixed a payroll correction action so it consistently applies the chosen popup option to every affected payslip in a batch. This helps payroll teams avoid missed corrections when processing multiple payslips at once.
Original PR description
**What:** - Corrected the method logic 'action_keep_wrong_version' to make sure that it works for both option in the view popup. task-6356957 Forward-Port-Of: odoo/enterprise#122625
The POS now loads only the Kenya e-invoicing classification records that are actually used by products. This avoids unnecessary data loading, helping improve POS startup performance and reduce resource usage.
Original PR description
Before `product.unspsc.code` and `l10n_ke_edi_oscu.code` records were loaded without domain, which could lead to loading all records of these models in POS, which is not necessary. This commit adds a domain to the loading of these records, so that only the records that are actually used in the products are loaded in POS. Forward-Port-Of: odoo/enterprise#123992 Forward-Port-Of: odoo/enterprise#123684
This update resolves a problem preventing users from successfully downloading files through the FileViewer feature in Odoo. The previous issue stemmed from an incorrect port configuration, which has now been corrected. This ensures reliable file downloads for all users.
Original PR description
fix bad forward port 9a7ebe96750 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 fixes an issue where the 'Load Demo Data' button in the Employee app would overflow text when the app was set to French or Arabic. The fix automatically adjusts the button's width to fit the text, ensuring a cleaner and more user-friendly experience. This improves readability and usability for all users.
Original PR description
Steps to reproduce: ---------------------------------------- - Be in a company with no employees - Switch to French or Arabic - Open the Employee app - The text in the button overflows Cause: ---------------------------------------- The button has a specified width: `w-100` And the text is `text-nowrap` So it overflows from the button box Solution: ---------------------------------------- Make the width auto adapt to the text with `w-auto`. Before: <img width="727" height="201" alt="image" src="https://github.com/user-attachments/assets/0347125b-1595-44ea-a0bd-b7c77e6c753d" /> After: <img width="723" height="236" alt="image" src="https://github.com/user-attachments/assets/18e40b39-f7b9-488c-9e47-3b9b82bdb445" /> opw-6345094 Forward-Port-Of: odoo/odoo#274405
This update resolves an issue where attachments were incorrectly flagged as 'unsupported' when using non-UBL sending methods. The fix also corrects a minor typo, ensuring accurate attachment identification. This improves the reliability of UBL invoice sending.
Original PR description
In the send wizard, don't mark attachments as "unsupported" if the sending method is not ubl dependent Also fix a typo in "Unspported" no-task Forward-Port-Of: odoo/odoo#275301
This update streamlines the verification of EU VAT numbers during company creation. Previously, a redundant check was performed twice, impacting performance. This change consolidates the verification process to a single call, optimizing efficiency and reducing potential issues with external service limitations.
Original PR description
When we create a company with a EU VAT, we used to do 2 IAP call to verify the VAT number. One was on the create() and the other one on the write(). For performance reason and because the vies check service may limit ip address, the verification was already disable when importing files (in both create and write). This commit remove the compute on the create one (and keep the one on write), so that it only do 1 IAP call to verify the VAT. Task-6139346 Forward-Port-Of: odoo/odoo#275456 Forward-Port-Of: odoo/odoo#274644
This update fixes several issues within the HTML editor's file box functionality, specifically within the Todo module. It now correctly handles plain text pasting, prevents unexpected cursor movement, and eliminates a scrollbar that appeared when the file box was empty. These changes ensure a smoother and more reliable editing experience.
Original PR description
### Purpose of this PR: * Prevent the powerbox from opening inside a static file box. * Paste content as plain text inside a static file box, since formatting is not supported there. * Prevent the cursor from leaving an empty file name box when pressing `ArrowLeft` or `ArrowRight`. * o_we_preview_favicon had a fixed height larger than its content, causing the link popover to overflow and show an unwanted scrollbar when the file input was empty as there was nothing to preview. Reduced the height to match the actual content size. * Shorthands (such as `#` for headings or `*` for lists) should not trigger when editing inside a file box. task-6283420 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275308 Forward-Port-Of: odoo/odoo#268827
This update corrects a bug where clickable carousel slides linked to 'odoo.com' would incorrectly redirect users to a website URL followed by 'odoo.com'. The fix ensures that carousel links function as intended, directing users to the correct Odoo domain. This resolves a potential usability issue for website visitors.
Original PR description
Steps to reproduce: - Drop any carousel - Set any slide to clickable - Set the link to "odoo.com" (without https://) - Save => On click, you are redirected to "yourwebsite.url/odoo.com" task-5949973
This update corrects a visual inconsistency in the website's accordion controls. A previous change caused the accordion to display two different colors depending on whether it was open or closed. This fix ensures a consistent color scheme across all accordion states, improving the overall user experience.
Original PR description
In commit[1] we restyled the accordion snippets, removing the background-image to use oi-icons instead. However due to selector specificty, the rule was taking priority. This :not is actually wrong since we want the color to apply as well when the accordion is collapsed (else you have 2 different colors between the collapsed uncollapsed state) task-6361379 [1]: f26a1535b96c728e4360d94c0c06de138a6b1b3f --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274577 Forward-Port-Of: odoo/odoo#274016
This update corrects a bug that occurred when attempting to merge empty distribution models within Odoo. The fix removes unnecessary merging logic, preventing errors that arose when this operation was performed. This ensures smoother and more reliable distribution model management.
Original PR description
It is possible to have an empty distribution model, there is therefore ne need to merge it, especially since it raises when doing this ```python self.env['account.analytic.plan'].mapped(lambda p: p._column_name()) ``` Forward-Port-Of: odoo/odoo#275839
A technical bug in the restaurant order tour was prematurely closing the user session, preventing error reporting. This fix ensures that errors related to order cancellations are properly logged and displayed, improving the reliability of the restaurant order process. The change addresses a reported runbot error.
Original PR description
The tour was closing the session in frontend and in the backend, which was causing a missing error. runbot error: 242197
This update removes a confusing message ('Connect your software...') from sales quotations that was appearing in PDF documents for customers with portal access. The change ensures all quotes, regardless of customer portal usage, display the standard, streamlined portal button. This improves the customer experience and avoids unnecessary confusion.
Original PR description
Steps to reproduce: 1. Install Contacts and Sales 2. Open any of the contacts, click on the gear icon at the top and click on "Grant portal access" 3. Grant access to all contacts 4. Create a Sale Quotation for that contact and print it Issue: The sentence 'Connect your software... ' appears in the pdf when sending the quote to a contact who was portal access, while it does not appear if the contact does not have portal access Expected behavior: Should not appear regardless of whether the customer has a portal account or not since they have it appear as a smart button in their portal. opw-6308357 Forward-Port-Of: odoo/odoo#275469 Forward-Port-Of: odoo/odoo#272893
This update automatically sets accounts as non-reconcilable when reconciliation with banks or cash transactions isn't expected. This simplifies the accounting process for various Odoo localization modules (like CA, KE, US, etc.) by preventing unnecessary reconciliation steps. It ensures that accounts are configured correctly from the start, reducing potential errors and improving data accuracy.
Original PR description
Changing the "payment reconciliation" boolean to false where it should be, ie. when no reconciliation with the bank nor cash transaction is expected. task-4902124
This update fixes an issue where duplicated point-of-sale printers would lose their configured IP addresses. The fix ensures that when a printer is duplicated, it retains the original IP address, simplifying setup and preventing connection problems. This improves the reliability of the POS system.
Original PR description
Steps to reproduce: ==== - Configure a printer from printers menu. - Duplicate the printer. Issue: ==== - The duplicated printer's IP address is reset to `0.0.0.0`. Cause: ==== - copy_data()` unconditionally overrides `printer_ip` with `0.0.0.0`. Fix: ==== - Stop overriding `printer_ip` so the duplicated printer inherits the original IP address by default. task-6365809 Forward-Port-Of: odoo/odoo#274964
This update fixes several issues within the Odoo spreadsheet component, ensuring improved stability and functionality. It addresses problems with chart rendering, conditional formatting, and named range selection, enhancing the user experience. Multiple developers collaborated on this update to ensure a robust solution.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/35c06d3a8 [REL] 19.3.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/35c06d3a8 [REL] 19.3.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/ed527c0f5 [FIX] named range selector: select hidden named range [Task: 6171849](https://www.odoo.com/odoo/2328/tasks/6171849) https://github.com/odoo/o-spreadsheet/commit/2e56727ca [FIX] conditional_formatting: handle zero color scale midpoint [Task: 6312961](https://www.odoo.com/odoo/2328/tasks/6312961) https://github.com/odoo/o-spreadsheet/commit/da294bd6a [FIX] charts: handle undefined values in treemap chart [Task: 6329404](https://www.odoo.com/odoo/2328/tasks/6329404) https://github.com/odoo/o-spreadsheet/commit/a40202e4f [FIX] config: filter-out claude folder from prettier [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update resolves an issue where pressing the space key in the Contact app could cause a technical error. The fix ensures the system handles missing configuration data gracefully, preventing the error and maintaining a stable user experience. This improvement enhances reliability for users working with Contact records.
Original PR description
**Steps to reproduce:** - Go to Contact app - Open any record - Press "Space" key - Traceback: `Cannot read properties of undefined (reading 'groupId')` **Issue:** `quickCreateState` props is undefined (as it is optional). **Fix:** Add check to safely handle such cases. [introduced by] https://github.com/odoo/odoo/commit/22c07c7dcb2a93d9ebef5a83e48aa3d252128519 opw-6377425 Forward-Port-Of: odoo/odoo#275329
This update adds a check to ensure contact emails entered during the French PDP registration process are valid. Previously, invalid emails could lead to errors later, causing frustration for users. This change improves data quality and prevents potential issues during the registration workflow.
Original PR description
No verification was done on the contact email in the wizard but if the email is invalid the user would have an error later task-6344324 Forward-Port-Of: odoo/odoo#274065
This update resolves an error that occurred when multiple product images with the same content were used on the website's 'Optimize SEO' feature. The fix ensures that image IDs are uniquely identified, preventing the 'duplicate key' error and improving the stability of the SEO optimization process. This ensures the website's SEO tools function correctly for all users.
Original PR description
## Problem: when snippets with identical images are added in the e-commerce website product page, the "Optimize SEO" option in debug mode causes an error to occur with a traceback. The traceback…
## Problem:
when snippets with identical images are added in the e-commerce website product page, the "Optimize SEO" option in debug mode causes an error to occur with a traceback. The traceback calls out a duplicate key in the `t-foreach` of a loop over `state.altAttributes`. the `t-key` for this loop is `img.id` which is generated by the `/website/get_alt_images` controller endpoint.
## Steps to reproduce:
1. Go to a product page and click on "go to website" smart nav btn.
2. Add a snippet with an image in the `description_ecommerce` field
3. Add a snippet with the same image in the `website_description` field.
4. In debug mode, open `site > Optimize SEO`
5. An error `Got duplicate key in t-foreach` is thrown.
## Solution:
The solution was simple to add a qualifier in the compound key generated by the controller action for the `id` field. The chosen qualifier in this case was `model['field']`. `field` is the position in the template where the image came from.
So now the keys for the two identical images go
FROM
> `${model}-${id}-${index}`
>
> 1st image of `website_description`:
> `product.template-6-0`
>
> 1st image of `description_ecommerce`:
> `product.template-6-0`
TO
> `${model}-${id}-${field}-${index}`
>
> 1st image of `website_description`:
> `product.template-6-website_description-0`
>
> 1st image of `description_ecommerce`:
> `product.template-6-description_ecommerce-0`
task-6325786
Forward-Port-Of: odoo/odoo#275789
Forward-Port-Of: odoo/odoo#272846This update fixes an issue where a database index wasn't being utilized by Odoo's internal queries. The change ensures the index works correctly for all queries, including those generated by Odoo, improving data retrieval performance. This enhances the efficiency of project and to-do related operations.
Original PR description
The index added by 778c09f4ffb4 works for the specific query it was meant to improve. Unfortunately, it cannot be used by ORM-generated queries, which is unfortunate. The reason is that the ORM generates queries with `IS TRUE` or `IS NOT TRUE` for boolean fields. Because `=` and `IS` do not have the same semantics, postgresql cannot use the index for ORM-generated queries. = -> eval(NULL = True) -> NULL IS -> eval(NULL IS TRUE) -> FALSE By changing both the index and the query to use `IS TRUE`, the index is now used by both the specific query and the ORM. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#275681