Thursday, September 3, 2026
26 changes · saas-19.3
Resolved issues and error corrections
Updated Point of Sale stock test flows so customer searches can load matching records from the server when they are not already cached. This prevents automated test failures in databases with many demo customers and helps keep validation of stock-related POS workflows reliable.
Original PR description
When running tests with demo data, the partner list is populated with many records, causing 'Partner Test 1' to fall outside the initial 100 loaded partners in the PoS session cache. Because clickCustomer defaulted to pressEnter=false, searching in the UI filtered the in-memory cache and displayed 'No customers found, press Enter to load more.', but never dispatched the Enter key to fetch the partner from the backend, timing out the tour step. Pass pressEnter=true in pos_stock customer selection tours so that the Enter key is dispatched and the partner is fetched from the server via RPC. runbot-error: 242001 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an issue where some website header layouts showed an inaccurate preview when changing the header width setting. The option now applies in a way that matches the selected header template, reducing confusion while editing website designs.
Original PR description
The header width option is not previewed properly on the following header templates: - `template_header_boxed` - `template_header_sales_one` - `template_header_sales_two` - `template_header_sales_three` - `template_header_sales_four` - `template_header_search` This happens because these templates are not compatible with the action `previewableWebsiteConfig` (their width can't be previewed by adding a single class). This commit fixes the problem by using the action `websiteConfig` instead of `previewableWebsiteConfig` when one of these templates is set. task-6420611 Forward-Port-Of: odoo/odoo#286292 Forward-Port-Of: odoo/odoo#282311
The certificate setup flow no longer shows an error banner when a key file is added without a password. Users will only see the warning when they entered a password and it is actually incorrect, reducing confusion during certificate configuration.
Original PR description
When adding a key file without entering a password, an error banner is immediately displayed, incorrectly suggesting that the password may be invalid. Only show the error banner when a password was provided and is incorrect. Also refactored the compute function to avoid repeated try-except blocks. task-6299175 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285744 Forward-Port-Of: odoo/odoo#283589
This fix prevents the Mail reply box from staying open when a user presses Escape while mention suggestions are loading. It makes the reply discard action more reliable, especially under slower server conditions.
Original PR description
Two independent causes made "reply: discard on pressing escape" red, one commit each. "[FIX] mail: wait for the mention suggestions before Escape" is the one that fixes the reported failure, and it holds on every branch: the test presses Escape while the mention fetch is in flight, and the suggestions arriving from the server re-open the list that Escape closed, so the re-opened list takes the second Escape and the reply is never discarded. The test now waits for the fetched suggestions before pressing Escape. "[FIX] mail: keep the suggestion list closed on a re-render" backports "[FIX] mail: keep composer suggestion list closed on unrelated re-render", which entered at 19.0 and never came down. Here NavigableList is re-opened on every patch, so opening the emoji picker after Escape brings the dismissed list back, and it then steals the Escape meant for the picker. https://runbot.odoo.com/odoo/error/946314 Forward-Port-Of: odoo/odoo#286041 Forward-Port-Of: odoo/odoo#284725
Combo options with a negative extra price now show the discount amount clearly in POS and kiosk screens. This avoids confusing price labels such as '+ -0,30 €' and makes discounted combo choices easier for customers and cashiers to understand.
Original PR description
When a combo choice has a negative extra price, the POS and Kiosk would incorrectly display a '+' sign in front of the negative price (e.g., '+ -0,30 €'). Additionally, depending on the currency formatting rules, a negative price might be displayed with the minus sign after the currency symbol (e.g., '$ -1.00'). This commit fixes this by conditionally displaying the '+' sign only when the extra price is strictly positive, and handling the minus sign manually to ensure it is always prepended correctly (e.g. '- $ 1.00'). task-id: 6226406 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283498 Forward-Port-Of: odoo/odoo#265210
This fixes an issue where resize controls in the website builder could be hidden behind the sidebar when editing animated page elements. Users can now clearly see and resize selected content even while scrolling, making page editing more reliable.
Original PR description
Steps to reproduce: - Drop a few snippets to make the page scrollable - At the bottom, drop the `s_three_columns` snippet - Click on the last Card - Add an animation "onScroll" (Effect - Slide, Intensity - 100) - Scroll top slightly to hide a part of the card behind the sidebar => The resize overlay is partially hidden The elements `.hb-row` have a z-index of 2, so they appear in front of the overlay which has a z-index of 1. It was decided to fully show the overlay to allow resizing. Keeping the overlay visible in front of the sidebar also allow the user to see where animated element is. task-6476269 Forward-Port-Of: odoo/odoo#283842 Forward-Port-Of: odoo/odoo#282796
This fixes the website translations endpoint so it no longer applies website-specific language redirection rules when a language is already provided. It helps prevent unexpected redirects and cookie conflicts for users loading translations.
Original PR description
/website/translations does not require request.website or language redirection logic as `lang` is passed explicitly. Drop `website=True` to prevent unexpected language redirects and cookie conflicts. Backport of 4faddd8b44 (odoo/odoo#269325). runbot-231758 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281738
Product pages now keep multi-checkbox options unselected unless shoppers choose them. This prevents confusing automatic selections and unwanted URL changes after refreshing a product page.
Original PR description
**Steps to reproduce:** 1. Create a product. 2. Add two attributes: multi-checkbox and any single-select type (e.g. Radio). 3. Publish the product and open its page on eCommerce. 4. Verify that no…
**Steps to reproduce:**
1. Create a product.
2. Add two attributes: multi-checkbox and any single-select type (e.g. Radio).
3. Publish the product and open its page on eCommerce.
4. Verify that no multi-checkbox option is selected by default.
5. Refresh the page twice.
**Issue:**
On the second page refresh, the first option of the multi-checkbox attribute is automatically selected, and the URL is updated with its parameter.
**Cause:**
- `_prepare_product_values` construct attribute combinations by mapping requested `attribute_values` query parameters line by line.
- When URL query parameters were present (e.g., set after the first refresh), the fallback logic `or ptal.product_template_value_ids.filtered('ptav_active')[:1]` treated unselected `multi_checkbox` attribute lines as missing required selections rather than empty selections, forcing them to default to their first active option.
**Fix:**
If no selection is provided for `multi_checkbox` line, return an empty recordset instead of falling back to the first active option.
opw-6494697
Forward-Port-Of: odoo/odoo#284798The automated Click All test now skips the Website Shop menu to avoid repeatedly reloading the website preview. This prevents long-running test timeouts and keeps build validation reliable for the Website app.
Original PR description
Before this commit, every Click All build failed on the Website app:
FAIL: Subtest TestMenusAdmin.test_01_click_everywhere_as_admin
AssertionError: Script timeout exceeded
This happens because the Shop menu is an `ir.actions.act_url` on the current tab, so clicking it loads the website preview as a new page. Clickall resumes from the state it keeps in the local storage, but restarts the menu walk of the app at its first menu, so it reaches Shop again and the same menus are tested over and over, until the 1200 seconds script timeout.
This commit adds the menu to the Clickall blacklist. Master and saas-19.4 carry that entry from "[FIX] web: blacklist shop menu from Clickall to prevent infinite reload loop".
https://runbot.odoo.com/odoo/error/944407
Forward-Port-Of: odoo/odoo#286246Salary offers can now be created for employees whose new contracts start in the future, even when they have a current contract ending today. This prevents an incorrect date overlap error and helps HR teams prepare future contract offers without manual workarounds.
Original PR description
Before this commit, creating a salary offer for a contract starting in the future raised a ValidationError on contract dates if the employee had an active contract ending today. This occurred because the salary simulation fallback logic defaulted to using today's date for the default contract start date, causing the simulation to overlap with the current running contract. This commit uses the target contract version's start date instead of today's date, preventing contract date overlap validation errors during offer generation. Task: 6502960
Vendor bill XML imports now handle cases where the supplier country is missing from the file. When possible, the system uses the country already saved on the related partner record instead, preventing unnecessary upload errors for accounting users.
Original PR description
Steps to reproduce: - Install accounting and create BE company - Create BIS3 xml where there's no country for AccountingSupplierParty - From BE company, upload the xml vendor bill Current behavior: Error when trying to upload xml Expected behavior: No error Cause of issue: Currently there's no check to see if a country exists in the BIS3 xml. This PR adds a check and adds a fallback to get the country attached to the partner record if there's none present in the xml opw-6498830 Forward-Port-Of: odoo/odoo#284862 Forward-Port-Of: odoo/odoo#284554
The return creation wizard now checks for existing returns only within the relevant company. This prevents users working across multiple companies from being incorrectly blocked by returns that belong to another company.
Original PR description
To reproduce the issue: 1) Create two companies in Belgium: A and B 2) Manually create a return for A before its opening date 3) Switch to company B, and keep A active as well 4) Try creating a return of the same type and at the same date as in 2) ===> The wizard blocks you and displays a warning saying there's already a return at this date. There is, but for another company. We fix that by properly filtering the company when searching for existing returns. Moving the _read_group inside the loop on self is okay here: we'll never compute that field for multiple wizards at once. Forward-Port-Of: odoo/enterprise#130303
This fixes an issue in Belgian payroll where occupation attestations could fail or be calculated incorrectly when an employee contract had no end date. It helps ensure payroll-related attestations handle ongoing contracts reliably.
Original PR description
A check was missing if the contract end date was false
This fixes the DIN5008 German invoice layout when documents are sent by post, ensuring the recipient and information blocks are positioned correctly for snailmail. Regular DIN5008 invoices are unchanged, reducing the risk of layout regressions while restoring proper postal formatting.
Original PR description
**Steps to reproduce:** - Install l10n_din5008 and Accounting. - Enable Snailmail from Accounting → Settings. - Create a German customer (Fiscal Country: Germany). - Create and post a customer…
**Steps to reproduce:** - Install l10n_din5008 and Accounting. - Enable Snailmail from Accounting → Settings. - Create a German customer (Fiscal Country: Germany). - Create and post a customer invoice using the DIN5008 report layout. - Select Send by Post. - Enable Developer Mode and navigate to Settings → Technical → Email → Snailmail Letters. - Open the generated letter and send it. **Observed behavior:** The address blocks are incorrectly aligned when the DIN5008 report is rendered for snailmail. The information block and recipient address do not follow the expected vertical positioning. **Cause:** The DIN5008 layout previously applied vertical alignment rules to its table cells. These rules were removed while adapting the layout to the invoice table structure and its customizations, such as the position column and line numbering. While this alignment is no longer required for the regular DIN5008 invoice layout, the snailmail layout relies on it to correctly position the sender/invoice information and recipient address blocks. **Fix:** Add a `snailmail` class to the DIN5008 invoice section when `snailmail_layout` is present in the rendering context. Restore the required vertical alignment rules scoped to this class so they only affect snailmail reports, without changing the regular DIN5008 layout. **References** * **PR:** [#201225 – DIN5008 layout improvements](https://github.com/odoo/odoo/pull/201225) * **Ticket:** [6387869](https://www.odoo.com/odoo/project/49/tasks/6387869) opw-6387869 Forward-Port-Of: odoo/odoo#286056 Forward-Port-Of: odoo/odoo#285891
This fix ensures a Canadian payment validation test checks results in a consistent order. It helps avoid false test failures in automated checks, supporting smoother releases without changing customer-facing behavior.
Original PR description
Sorts the expected items in `test_cpa005` to ensure consistent ordering. runbot error: https://runbot.odoo.com/odoo/error/941567 Forward-Port-Of: odoo/enterprise#127703
Additional automated checks were added to make sure suggested timesheet entries are linked to the correct helpdesk tickets and calendar-related work items. This helps reduce the risk of incorrect time tracking suggestions reaching users.
Original PR description
task: 6475133
Canteen costs are now assigned to the first payslip in the month that includes a paid amount when an employee has multiple contracts. This prevents the cost from appearing on the wrong payslip and helps Belgian payroll stay accurate.
Original PR description
In case of multiple contracts for a single month (and then multiple payslips), the canteen cost must appear in the first payslip that have a paid amount.
This fixes an issue in the HTML editor where pressing Enter in a bullet list item that also contained a table did not split the list correctly. Users can now edit lists with embedded tables more naturally, while preventing accidental removal of mixed-content list items from the list.
Original PR description
### Steps to reproduce: - Insert a bullet list - Inside of the list, insert a table - Write before and/or after the table (in the same list item) - Press enter before and/or after the inserted text - Notice that the bullet is not split like in a normal list ### Root Cause: - On Enter, list plugin checked whether the list item contained unsplittable element. Since the table was inside the list item, it always treated the list item as unsplittable, even when the cursor was outside the table. As a result, the list item could never be split. ### Solution: - Instead of checking the whole list item, walk up from the split target to the list item and look for an unsplittable element along the way. This allows the list item to split normally when the cursor is outside the unsplittable. task-6449843 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284711 Forward-Port-Of: odoo/odoo#280903
This fixes how the HTML editor handles removed or reduced column layouts by dropping columns that only contain empty placeholder content. Users will get cleaner resulting content, while meaningful column content is still preserved and the editor remains usable when everything is empty.
Original PR description
#### Description of the issue this PR addresses: - When reducing the number of columns or removing a column layout, empty columns were previously unwrapped like any other column. - As a result, columns containing only placeholder paragraphs contributed empty paragraphs to the resulting content, even though they did not contain any meaningful user content. #### Desired behavior after PR is merged: - Fully empty columns are discarded when they are removed. - Non-empty columns continue to be merged as-is, preserving their content. - A single empty paragraph is still kept when all columns are empty to ensure the editor remains editable. - Rename `Remove columns` to `Remove column layout` and update its description to `Convert columns to regular content` to better reflect the operation. task-6296536 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284687 Forward-Port-Of: odoo/odoo#270220
The expense app now uses the correct status name, “approved,” in its views. This avoids confusing wording for users reviewing or managing expense reports and keeps the interface aligned with the actual workflow state.
Original PR description
Use the correct state name (approved) @Tecnativa --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285950
Forum information links are now treated as regular text links in the website editor instead of buttons. This prevents irrelevant button styling options from appearing, making forum page editing clearer and less confusing.
Original PR description
Steps to reproduce: - Go to a forum page. - Open the website editor. - Select the "About this forum" link in the sidebar. => Button styling options are shown for a regular link. Before this commit, forum information links used button classes, which made the editor expose button styling options for them. After this commit, the `btn`, `btn-sm`, and `btn-link` classes are replaced with `small` so the editor treats these elements as regular links on desktop and mobile. task-6259086 Forward-Port-Of: odoo/odoo#283156
The website editor’s block search field now shows a pointer cursor when users hover over the clear icon in browsers that display it. This small usability fix makes it clearer that the icon can be clicked to clear the search text.
Original PR description
Steps to reproduce: - Open the website editor. - Open the "Insert a block" dialog. - Enter text in the search bar. - Hover over the clear icon. => The cursor does not indicate that the icon is clickable. Before this commit, the search clear icon kept the default cursor. After this commit, the clear icon uses a pointer cursor to indicate that it is clickable. Note that Firefox does not natively add this clear icon to search inputs, unlike Chrome. This fix only affects browsers that render it. task-6259086 Forward-Port-Of: odoo/odoo#283435
The Romanian tax return previously shown as “Tax” is now labeled “D300”. This makes it easier for users to identify the correct Romanian declaration when choosing a return type.
Original PR description
Before this commit: When generating a Romanian tax return, one of the return types in the list was labeled "Tax", which was too generic to know which specific tax declaration it referred to. After this commit: The tax return is now renamed to "D300", making it easy to identify this return in the list instead of seeing a generic "Tax" label. task - 6388087 Forward-Port-Of: odoo/enterprise#124583
This fixes an internal automated test for Indonesian e-Faktur so it no longer depends on default tax settings being applied automatically. The change helps keep quality checks stable and prevents false build failures around e-Faktur invoice downloads.
Original PR description
Issue: In some build, when creating the invoice line it did not assign the default tax so it raise an error when downloading efaktur Fix: Assign the tax line manually in the unit test instead of relying on default taxes issue-[946227](https://runbot.odoo.com/odoo/error/946227) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285902
The website editor no longer shows a theme background option for tab sections when that option does not work in this version. This prevents users from selecting a setting that would have no effect, making page editing clearer and less confusing.
Original PR description
The theme background options (`o_cc` classes) on the `s_tabs` snippet's tabs doesn't work since 18.4 (html_builder refactor). It was not supported either in previous versions. We decided to fix it so it would be useable in master (20.0) but leave stable versions as is, by restraining the available tabs and removing the theme one. task-5951656 Forward-Port-Of: odoo/odoo#277528
Basic point-of-sale receipts for Peruvian companies now hide additional electronic invoicing details, such as the amount in words, that are intended only for full receipts. This keeps basic receipts shorter and aligned with the selected receipt format.
Original PR description
Step to reproduce - install l10n_pe_edi_pos with demo and switch to PE company - from settings> "Signature Provider" set it to SUNAT - create a pos, enable "Basic Receipt" from settings - open pos…
Step to reproduce - install l10n_pe_edi_pos with demo and switch to PE company - from settings> "Signature Provider" set it to SUNAT - create a pos, enable "Basic Receipt" from settings - open pos and fulfill a order - from feedback screen, print > print basic recipt Observation: - `Amount In Word` is visible in basic receipt, we should not show such info in basic receipt Cause: - commit [1] introduces the template `l10n_pe_edi_pos.pos_order_receipt`, which adds the info block to the receipt using xpath `<xpath expr="//div[contains(@t-if, 'use_self_invoicing')]" position="before">` - this inserts the block before the [target div](https://github.com/odoo/odoo/blob/1ace23afe8a937fc1dc53879f33ca591fd5d25b8/addons/point_of_sale/receipt/pos_order_receipt.xml#L70-L86), which is independent of the `basic_receipt` flag, causing the block to always be visible [1] https://github.com/odoo/enterprise/commit/a0c4f841cde0fcfda0a0c57f865f0eff6b6d6afe Fix: - place the block so it is shown only when `basic_receipt` is false - update the xpath expression to `prices` div ( here `basic_receipt` is false `//div[@name='prices']` with `position="inside"` After fix (for full receipt) <img width="257" height="349" alt="image" src="https://github.com/user-attachments/assets/3932cae1-3ceb-42ad-9ce4-16a9bd4fea7d" /> opw-6383358 Forward-Port-Of: odoo/enterprise#125118