Wednesday, August 27, 2025
26 changes · saas-18.3
Enhancements to existing features
The Belgian point-of-sale blackbox check now retries and records clearer diagnostic information when identifying devices. This helps reduce cases where a valid blackbox is missed, improving reliability for compliant POS operations.
Original PR description
This PR adds a retry mechanism and a logger to better identify and prevent cases where a blackbox isn't correctly identified as such Forward-Port-Of: odoo/enterprise#92489
Resolved issues and error corrections
The Italian localization now uses the updated €100 threshold for the VP7 line in the monthly tax report, replacing the previous €25.82 amount. This keeps Italian tax reporting aligned with current requirements and helps avoid incorrect report calculations or exports.
Original PR description
While implementing the modulo tag of the tax report xml export, it came to light that the vp7 line of that report which previously used a 25,82€ threshold has been changed for one at 100,00€. This commit adapts the amount across the module. --- Enterprise PR: https://github.com/odoo/enterprise/pull/86642 task-4826511 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224073 Forward-Port-Of: odoo/odoo#216887
Duplicated journal entries no longer keep the original partner displayed when users change the partner on the copied entry lines. This prevents confusion in accounting lists and helps ensure duplicated bank journal entries show the correct customer or vendor information.
Original PR description
When changing `partner_id` on the `account.move.line`s of a duplicated journal entry if this journal entry already had a partner_id, it will stay the same (possible to see from list view) but the…
When changing `partner_id` on the `account.move.line`s of a duplicated journal entry if this journal entry already had a partner_id, it will stay the same (possible to see from list view) but the move line will be correctly changed. Step to reproduce: - Select a journal entry of type PBNK - Duplicate the journal entry - Change the partner on the journal items and save - Go back to the list view, the partner name displayed is from the original journal entry When clicking on duplicate it will call the function copy and super.copy() will call copy_data from account_move; This line allow to copy the partner_id (which is needed since invoices revert goes through copy) Since there is no condition on the type of entry, it will also copy the partner_id in our case: https://github.com/odoo/odoo/blob/22c333d0ed7eba1165f6462e668998d37fcabb73/addons/account/models/account_move.py#L2424-L2426 The introduction of this change introduced our issue, It allow for all duplication to copy the partner_id. Original fix : https://github.com/odoo/odoo/commit/e1d18960b57b36b8bf69bc787ef6078dcba8c855 opw-4907648 Forward-Port-Of: odoo/odoo#223959 Forward-Port-Of: odoo/odoo#217755
This corrects an invalid label-ending command in stock product label templates. It helps ensure ZPL barcode labels are generated in a format printers can understand, avoiding failed or malformed label output.
Original PR description
In the ZPL, the `^XZ` command indicates the end of a label. For an unknown reason (a typo ?), the PR [1] replaces some of them by `^XZj` which is not a valid ZPL command. [1]: https://github.com/odoo/odoo/pull/187225 Forward-Port-Of: odoo/odoo#220518
This update stabilizes an internal time off accrual test by making it use a fixed date. It helps prevent future date-related test failures, improving confidence in payroll and leave management quality checks without changing user-facing behavior.
Original PR description
The test is failing when run one year in the future as it depends on the date but we don't freeze the time. runbot-error-230721 Forward-Port-Of: odoo/odoo#224240
This fixes an issue where meeting information, such as the title copied from a task, could disappear when users expanded a calendar form dialog. Users can now switch to the larger form view without losing the details already prepared in the pop-up.
Original PR description
### Steps to reproduce: - Go to any task in project module - Create a new meeting activity - Open Calendar and drag to create a slot - Notice the name of the meeting in the pop-up is the same as the…
### Steps to reproduce: - Go to any task in project module - Create a new meeting activity - Open Calendar and drag to create a slot - Notice the name of the meeting in the pop-up is the same as the task - Click on the expand button top-right of the dialog - Notice the calendar.event form opened but without a name ### Cause: When expanding the view using 'More options' button we are keeping the context in the new request. https://github.com/odoo/odoo/blob/d9c63a85955c2321bae1a705cc09b2554155f826/addons/calendar/static/src/views/attendee_calendar/attendee_calendar_controller.js#L45-L49 But when doing the same through the expand button we don't pass the current context so it will be lost. https://github.com/odoo/odoo/blob/3dde420665257c63885e891f1ec366568df5007b/addons/web/static/src/views/view_dialogs/form_view_dialog.js#L106-L116 ### Fix: Backporting the commit https://github.com/odoo/odoo/commit/4f71fbbd26b428e57943d974e8441bef295cdef1 to pass the context while expanding the form view opw-4966486 Forward-Port-Of: odoo/odoo#221422
Fixes an issue in the Website editor where resizing a text box in a newly added floating card could cause an error. This helps users edit website content more reliably without interruptions.
Original PR description
Steps to reproduce: - In "Website" app. - Create a "Floating cards" block using website editor. - Add a new card. - Adjust the text box size. - Error occurs. It was due to the XML structure of the new card, which was incorrect and caused the resize to crash in "grid" mode. opw-5027795
A CRM interface test is now skipped when running in simulated time mode because that environment can make its date-based check fail incorrectly. This prevents false test failures and helps keep release validation stable without changing customer-facing CRM behavior.
Original PR description
When using the faketime mode for testing, the crm_rainbowman tour fails because the underlying SQL query is using `CURRENT_DATE`. Unfortunately, this SQL keyword cannot be replaced globally by a function easyly (like it was done for the NOW function in faketime mode). ~~With this commit, the SQL query is adapted to use the SQL NOW function instead.~~ With this commit, the tour will be skipped in faketime mode Forward-Port-Of: odoo/odoo#223909
This fixes an issue where animated website content could extend beyond the mobile screen and let visitors scroll sideways. Pages now stay within the expected screen width during scroll animations, improving the mobile browsing experience.
Original PR description
Scenario: - add a 2 columns content widget - set the right column text to "On Scroll" animation with "Slide" effect and "From Right" direction so the content may be out of the page - save and reload…
Scenario: - add a 2 columns content widget - set the right column text to "On Scroll" animation with "Slide" effect and "From Right" direction so the content may be out of the page - save and reload the page on mobile - scroll down get in middle of animation with some content out of page - try to scroll to the right Result: we can scroll to the right and see the overflowing animated content outside of the expected page limit. History: During an animation, a fix prevent the horizontal scrollbar by setting "overflow-x: hidden" (or crop depending on version) on a given element: - in odoo/design-themes@51abb093c77993363b170b12be134c95b3009895 (14.0: 2021) it was added to $().getScrollingElement() - in 189a7c96e6e26825dc05c0c6466576fe63aa091e (18.0: 2022) the main page scroll was moved from #wrapwrap to html - in fece9cb85761e6cb3fe3642f947661464402363b (18.0: 2024) the "overflow-x: hidden" was moved to the body element Cause: the "overflow-x: hidden" is ignored by mobile browser on html and body tags ([example of report]), so in 18.0 and over the possible horizontal scrollbar caused by an animation is not hidden. Fix: apply the "overflow-x: clip/hidden" on #wrapwrap element. [example of report]: https://stackoverflow.com/questions/14270084 opw-4575726 Forward-Port-Of: odoo/odoo#213802
The Job Position form now correctly shows available recruiters and interviewers even when no company is selected. This prevents empty selection lists and helps hiring teams assign responsible users without first choosing a company.
Original PR description
In the Job Position form, the 'Recruiter' and 'Interviewers' fields were empty when no company was selected. This was due to the static domain using 'company_id' directly without taking into consideration that company_id can be False. This fix introduces computed domain fields (, ) that dynamically adapt based on the selected company. If a company is set, users belonging to that company are shown. If not, only internal users are listed regardless their companies. Related task: 4926154. 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#224114 Forward-Port-Of: odoo/odoo#217884
This update makes an internal privacy lookup test more robust when additional localization modules are installed. It prevents false test failures without changing how the product works for users.
Original PR description
The test `test_wizard_indirect_reference` failed when modules like `l10n_gt_edi` were installed. This was due to additional Many2one fields (e.g., `l10n_gt_edi_consignatory_partner` on `account.move`) referencing `res.partner`, which were picked up by the privacy lookup wizard. This commit updates the test to avoid assuming a fixed number of reference lines and instead asserts the presence of the expected ones (the partner and the company). No change in functional behavior. RB-[230449](https://runbot.odoo.com/odoo/error/230449) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222105
Creating a child menu in Website no longer mistakenly turns it into a main menu. This keeps website navigation organized as intended and avoids manual cleanup after saving menu changes.
Original PR description
Steps to reproduce: - Have a database with only the website module installed --> Turn on the developer mode. - Go to Configuration ---> Menus - Create a Menu (Parent) and a child menu (Child) in that. - Upon saving, the following behaviour is observed: the child menu is converted to the main menu. Issue: Before this commit, when we create a child menu for single website then it takes the website.menu_id.id as the parent_id. Which is wrong because it gives the parent_id of the websites' top menu. Solution: With this commit, we have passed the correct parent_id from vals to solve this issue. task-4231974 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222615
This fixes a website editor issue that could cause an error when users pasted multiple content blocks inside inline text areas. It improves editing reliability and adds test coverage for this hard-to-reproduce scenario.
Original PR description
Problem: When pasting two blocks inside an inline element, a traceback occurs. Cause: During `insert`, when `insertBefore` is `true` and `isEmptyBlock(right)` after `splitElement`, `currentNode` is set to `right`. But `right` may already have been deleted, leading to an invalid reference. Solution: Delete `right` if empty, but do not set `currentNode` to `right` in that case. Steps to reproduce: It is tricky to reproduce manually (you must copy two blocks and paste them in an inline element). A test has been added to cover the case. opw-4972695 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224029 Forward-Port-Of: odoo/odoo#223229
This update fixes an unstable automated test for Point of Sale product and pricelist loading. It helps ensure quality checks run consistently, reducing false failures during development without changing the customer-facing Point of Sale experience.
Original PR description
Use expectUnloadPage key in tour to fix undeterministic behavior. 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#224176
The employee public form now uses the correct employee record when displaying organization chart information. This helps avoid showing incorrect or missing employee details in the HR organization chart view.
Original PR description
This commit retrieves the correct employee ID in the Employee Public Form view. task-5039701 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
An unavailable Vimeo video used in the website editor has been replaced with a working one. This keeps the related dialog experience intact for users and avoids broken video content in the website-building flow.
Original PR description
This commit replaces an unavailable vimeo video with a new one to maintain the dialog structure. This commit is a backport of [1], which was merged only into master, but is also necessary in the stable versions. [1]: https://github.com/odoo/odoo/commit/ad6f8716ea7e886b6dd3b657309d7cc51e5eb50f Forward-Port-Of: odoo/odoo#224054
Point of Sale receipts now consistently display the selected customer when loyalty features are used. This avoids missing or repeated customer information on receipts, improving clarity for both staff and customers.
Original PR description
**Steps to reproduce:** - With pos_loyalty installed, launch the PoS - Select a customer and make a purchase - This needs to create a new loyalty coupon (new customer or program) - The customer name…
**Steps to reproduce:** - With pos_loyalty installed, launch the PoS - Select a customer and make a purchase - This needs to create a new loyalty coupon (new customer or program) - The customer name is not displayed on the receipt **Problem:** When a customer is set for an order in pos_loyalty, it should appear on the receipt. Before this commit, sometimes it was not displayed. **Why the fix:** The customer was not displayed everytime because it was displayed inside this if statement, https://github.com/odoo/odoo/blob/033c7a63bdf3d10d9d2c5084959fd34f52011bea/addons/pos_loyalty/static/src/app/screens/receipt_screen/order_receipt/order_receipt.xml#L6 So the customer would only be displayed if there was a new coupon being created, and not if we were updating a new one. This behavior was introduced in a REF in 18.3 461359e The behavior does not make sense as it displays the customer for each new coupon we have in this order, so it might be displayed multiple times. With this commit, we display the customer all the time, as it is weird to only display it if a new coupon is created or if loyalty logic is involved, as said here 879b415 opw-4929076 opw-4976885
This update improves how automated browser tests respond when a browser connection unexpectedly closes. Instead of waiting for timeouts and reporting a secondary cleanup problem, the test now fails sooner with a clearer indication of the original connection issue, helping teams investigate test failures more efficiently.
Original PR description
As far as I can tell this can occur if the ws connection gets closed while we're in a `recv`: in that case `recv` will mark the connection as closed (`connected=False` and `sock=None`) and raise…
As far as I can tell this can occur if the ws connection gets closed while we're in a `recv`: in that case `recv` will mark the connection as closed (`connected=False` and `sock=None`) and raise `WebSocketConnectionClosedException`, then any attempt to `send` will fail with `WebSocketConnectionClosedException`. Here this likely is an issue because in `_receive` `WebSocketConnectionClosedException` goes through the generic exception handler, which sees that: - it's not a `ConnectionResetError` - the result is not set - and the ws is not connected So `_receive` just cancels the result and `return`s, and when whatever's waiting on a future finally times out it tries to cleanly shut down and hits a connection that's already closed. Handle a connection closed in that context more properly: - unset `ws` so we don't try to clean it up, as we know it's closed - set the result as being in error - cancel every future in order to immediately go to the tour failure step rather than wait for timeouts Note that this will not really *fix* any error per se, because every time this happens it means the browser abruptly closed the WS connection (possibly straight up died), so this should mostly properly attribute the error so we can investigate it. https://runbot.odoo.com/odoo/error/229793 Forward-Port-Of: odoo/odoo#224023
This fix ensures standard employee and department views remain available after a user customizes Employees with Studio. It prevents useful view options like calendar, activity, kanban, and pivot from disappearing, keeping HR navigation consistent.
Original PR description
**Steps to reproduce:** - Install `hr` and `web_studio`. - Go to Employees → click Studio icon. - Views → activate Calendar view. **Observation:** - Existing views (activity, kanban, pivot, etc.) disappear from the view types. **Issue:** - After commit https://github.com/odoo/odoo/pull/160280/commits/e67ed24320c555c0cc63d59aa4921267e10a472d, view_mode in actions was removed, so only default (list, form) and Studio-added views remain. **Solution:** - Add view_mode to the action to preserve standard views after customisation. opw-4967654 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222485
The New Zealand tax report now counts zero-rated sales only once in the Total Sales and Income section. This prevents inflated totals for companies issuing invoices with 0% tax, improving reporting accuracy.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_nz - Switch to a New Zeland company (e.g. NZ Company) - Create an invoice with a 0% tax - Go to "Accounting / Reporting / Statement Reports / Tax Report" - Select "Tax Report (NZ)" and the period of the invoice **Issue:** The amount of the invoice with the 0% tax is included twice in `Total Sales and Income` section. Cause: The formula for `Total Sales and Income` is `BOX5 + BOX6 + BOX9`. However, the value of BOX6 is already included in BOX5 as seen in its description `[BOX 6] Zero-rated supplies in Box 5`. opw-3883198 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224095 Forward-Port-Of: odoo/odoo#171595
The Estonian tax report XML export now combines the two 22% VAT reporting lines into a single transaction entry. This prevents duplicate transaction22 lines while preserving the correct total amount for reporting across the tax rate transition.
Original PR description
Before this pr: - There are two transactions22 entries were introduced because we are having two report lines for 22% tax computation, one with '1' tag, which is valid till 31 June 2025, and another one with '1_2' tag, which is valid from 1 July 2025. After this pr: - The balance computation during export to XML is now adding the balance of both line '1' and '1_2' into line '1' only. - So now we do not need an extra transactions22 entry in the XML tax report. - We are keeping both report lines for now, but the XML report will have only one entry with the total sum of balances in both report lines Related PR: https://github.com/odoo/enterprise/pull/91364 Forward-Port-Of: odoo/enterprise#93197 Forward-Port-Of: odoo/enterprise#92662
This update fixes an automated guide used in the field service reporting area so it targets the correct action button. This helps keep product validation stable and reduces the risk of false failures during release checks.
Original PR description
In this commit, we fix the tour industry_fsm_tour by removing "body:not(.modal-open) nav.o_main_navbar" (this trigger is always true) from trigger to let only button[name="action_generate_new_template"]. Forward-Port-Of: odoo/enterprise#93169 Forward-Port-Of: odoo/enterprise#91771
This fixes how Swiss payroll accounting handles negative payslip lines for account 2050. It ensures amounts are posted to the correct side of the accounts, helping keep payroll accounting entries accurate.
Original PR description
…r 2050 Invert accounts for negative payslip line Forward-Port-Of: odoo/enterprise#93074
Expenses can now be saved when the selected employee is not linked to a user account. This prevents a save error in expense document processing and helps teams record expenses for all employees reliably.
Original PR description
Currently, an error occurs when creating an expense for an employee that is not linked to a user. **Steps to reproduce:** - Install the `hr_expense` module. - Create a new employee `test` (ensure…
Currently, an error occurs when creating an expense for an employee that is not linked to a user. **Steps to reproduce:** - Install the `hr_expense` module. - Create a new employee `test` (ensure this employee is not linked to a user). - Go to Expenses > upload [1] and open it. - Set the `Employee` to `test` and click `Save` (it may take up to 5 seconds). (See [2] for Steps to reproduce) **Error:** `AttributeError: 'hr.expense' object has no attribute 'uid'` **Root Cause:** At [3], the code incorrectly uses `self.uid` instead of `self.env.uid`. Since `hr.expense` records do not have a `uid` field, this leads to an `error`. **Fix:** This commit ensures that expenses can be saved correctly, even when the selected employee is not linked to a user. [1]: https://drive.google.com/file/d/1Ew2B_zMFCQbw-6nwfKctJPy1W4y2ZaIb/view?usp=sharing [2]: https://drive.google.com/file/d/1qP-9L_emaox3l9JyoNVYjqj1Ht8bJSmZ/view?usp=sharing [3]: https://github.com/odoo/enterprise/blob/804f263b80cb78884e3f246bcc7fa7ea4e0cf73a/hr_expense_extract/models/hr_expense.py#L90 sentry-6834628909
This update adds a test to confirm bank statement reconciliation works correctly when no payment account is configured. It helps prevent the same accounting issue from returning and improves reliability for affected finance workflows.
Original PR description
Add a test to previous fix: https://github.com/odoo/enterprise/commit/582e3ee22cba404ff38782534e76569bc93a44ef opw-5039931 opw-5039807
This fix prevents an error when a user completes a scheduled activity linked to an approval rule that has since been deleted. It helps keep the Sales and Studio workflow running smoothly instead of blocking users with a database error.
Original PR description
An error occurs when a user attempts to mark a scheduled activity as done after the associated approval rule has been deleted. **Steps to Reproduce:** 1) Install Sales and Web Studio modules. 2) Log…
An error occurs when a user attempts to mark a scheduled activity as done after the associated approval rule has been deleted. **Steps to Reproduce:** 1) Install Sales and Web Studio modules. 2) Log in as Admin and use Studio to add an approval rule to the Sale Order’s Preview button. >- Set Allowed Group to Access Rights. >- Set Responsible User to Mitchell Admin. 3) In the Incognito Tab, login as Demo, open the same sale order and click on preview to create activity in chatter. 4) Delete the Approval Rule in the original tab. 5) Switch back to Demo and click Mark Done under Planned Activity in chatter. **Error:** `SyntaxError: syntax error at or near ')'` `LINE 1: SELECT id FROM studio_approval_rule WHERE id IN () FOR UPDAT. ^` **Root Cause:** The error occurs because the SQL query at [1] includes an empty tuple of rule IDs `(all_rule_ids)`. An empty `IN ()` clause in SQL results in a syntax error. [1]- https://github.com/odoo/enterprise/blob/7ea45724e7689a0df11d20ace9c562788f5d19e3/web_studio/models/studio_approval.py#L366 **Solution:** This commit avoids the error by ensuring that the SQL query only runs when `all_rule_ids` is not empty. sentry-6306636466 Forward-Port-Of: odoo/enterprise#86982