Daily updates from Odoo
Monday, October 20, 2025
211 changes
23 changes
Security fixes and vulnerability patches
IoT Boxes are now blocked from connecting to a database unless that database has a valid token. This helps prevent unintended or unauthorized box connections and improves connection safety for customers using IoT hardware.
Original PR description
We added a check to prevent IoT Boxes from connecting to a database if the database doesn't have a valid token. Task: 5177501 Forward-Port-Of: odoo/enterprise#97579 Forward-Port-Of: odoo/enterprise#97531
Enhancements to existing features
Payment terminals connected through Odoo IoT will no longer be automatically registered for event handling, because they already manage their own events. This reduces unnecessary background handling and aligns terminal behavior with devices that send events independently.
Original PR description
As for printers that can send event whenever they want, payment terminals handle event themselves. We then removed auto event registering for payment terminals. odoo/enterprise#97617
Point of Sale payment terminals connected through an IoT Box now use the same communication service as other IoT actions. This enables more connection methods, including WebRTC and websockets, which can improve reliability and responsiveness when processing payments.
Original PR description
As for any other actions sent from the db to the IoT Box, we updated payments terminals logic to use the `iot_http` service in order to allow them using webrtc and websocket in addition to longpolling. Backport of odoo/enterprise#92896 (`iot_http` service refactoring only, to allow listening without sending action) Backport of odoo/enterprise#96634 odoo/odoo#232282
This change makes Odoo's automated test browser shutdown more robust when Chrome reports rare shutdown errors. It helps prevent stuck test builds and lingering browser processes, improving runbot reliability without affecting normal users.
Original PR description
In some instances, Chrome can apparently fail CDTP calls with "Execution context was destroyed". According to the internet this mostly happens because of navigation events, here it's not clear if…
In some instances, Chrome can apparently fail CDTP calls with "Execution context was destroyed". According to the internet this mostly happens because of navigation events, here it's not clear if this is in response to `stop`-ing the page, or a pre-existing navigation directive interfereing with the stop-ing of the browser. I tried reproducing locally under the assumption that the `Page.stopLoading` might be the cause but got nowhere[^1]. This issue seems extremely infrequent, and in most cases is but a minor annoyance, an error appears on the corresponding build, and that's it. However if the error occurs during `ChromeBrowser.stop` then the browser is not terminated, which on runbot prevents the docker image from shutting down properly, and leaves zombie builds. Therefore make `ChromeBrowser.stop` more resilient to errors in the initial section so that we do terminate the browser even if the "graceful CDTP shutdown" fails. While at it, add a fallback to kill the browser if it does not terminate gracefully. https://runbot.odoo.com/odoo/error/233442 [^1]: and the error only happening in 18.0 and later when `Page.stopLoading` was present long before that makes it likely the proximal cause is in the code being run, especially as all the errors sampled from the builds list are related to pos and the failure are immediately preceded by ongoing HTTP requests Forward-Port-Of: odoo/odoo#232222 Forward-Port-Of: odoo/odoo#232060
Swedish batch payments can now include both international IBAN accounts and local BBAN, Bankgiro, or Plusgiro accounts in the same batch. When mixed account types are used, the system generates a ZIP file containing separate XML payment files, reducing manual splitting and making payment processing more flexible.
Original PR description
This commit add a new behaviour for batch payments in Sweden. Before this commit: batch payment with mixed payment for iban and bban/bankgiro/plusgiro wasn't allowed After this commit: now if the user create a batch payment with both type of account, we create a zip file with 2 xml files, one for iban and one for bban/bankgiro/plusgiro. Linked:https://github.com/odoo/odoo/pull/230104 [task-5107240](https://www.odoo.com/odoo/project/967/tasks/5107240) Forward-Port-Of: odoo/enterprise#97556 Forward-Port-Of: odoo/enterprise#95463
Resolved issues and error corrections
Restaurant owners can now print POS sales reports directly during an active session instead of needing to use the backend. This makes it faster and easier to review sales while operations are still running.
Original PR description
- Restaurants owners need to be able to print a sales report during a session. Before this commit, they were only available to print the report via the backend. task-id: 5076080 Forward-Port-Of: odoo/enterprise#94181
This fixes missing payroll group information on some Swiss payroll employee fields. It helps keep payroll data correctly organized and reduces errors during payroll processing or validation.
Original PR description
The payroll group was missing on some payroll fields. Related runbot issue: https://runbot.odoo.com/odoo/runbot.build.error/233445 task-5179821
Ecuadorian XML vendor bills that include a discount now bring that discount into Odoo when imported. This prevents missing discounts on bills, helping accounting totals match the original XML document.
Original PR description
In the l10n_ec_edi localization, XML files that include a <descuento> (discount) tag do not apply the discount when imported into Odoo. - Create an invoice with a discount and export the XML. - Re-import the XML as a vendor bill — the discount is missing. This commit fixes the issue by computing and importing the discount percentage from the <descuento> tag. opw-5137439
Point of Sale barcode scanning now uses the quantity encoded in GS1 barcodes instead of ignoring it. This helps cashiers add the correct product quantity automatically, reducing manual corrections and checkout errors.
Original PR description
Before this commit, the quantity encoded in a GS1 barcode was ignored when scanning. After this commit, the product will be added with the correct quantity extracted from the GS1 barcode. opw-5126522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232010 Forward-Port-Of: odoo/odoo#229678
The help text for advanced employee access in Point of Sale settings now matches how the setting actually works. This reduces confusion for businesses configuring which employees can use advanced POS features.
Original PR description
Before this commit, the help text of the advanced_employee_ids field was inconsistent with its behavior, as it was not possible to keep it empty. This commit updates the help to reflect the actual behavior. opw-5112862 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232004 Forward-Port-Of: odoo/odoo#228612
Fixed an issue where a partial bank payment could incorrectly mark an installment invoice as fully paid and create an unnecessary suspense balance. Payments are now applied only up to the transaction amount, improving invoice payment accuracy and reconciliation reliability.
Original PR description
Steps: - Have a payment term making 3 installments (33.33%, 33.33% and 33.34%) - Create and confirm an invoice for $200 with the previously created payment term - Create a bank transaction for $90…
Steps: - Have a payment term making 3 installments (33.33%, 33.33% and 33.34%) - Create and confirm an invoice for $200 with the previously created payment term - Create a bank transaction for $90 -------- Option 1 -------- - Reconcile the statement line with the three invoice lines from the reconcile button on the stmt line itself -------- Option 2 -------- - From the invoice, add the stmt line from the outstanding payments widget -> The invoice is marked as fully paid and the bank entry looks like this: | account | debit | credit | | ------- | ----- | ------ | | Bank account | 90.00 | 0.00 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 66.68 | | Suspense account | 110.00 | 0.00 | It should look like this: | account | debit | credit | | ------- | ----- | ------ | | Bank account | 90.00 | 0.00 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 23.34 | This is because we're calculating the partial amount only when looping over the last move line, which result with no partial amount since the transaction amount is already exceeded, therefore we end up adding all the line and balancing it with the suspense account line, which is wrong. With this commit, we add some conditions to check wether the amount is exceeded or will be exceeded, and we calculate the partial amount accordingly. opw-5076498 Forward-Port-Of: odoo/enterprise#96847
This fixes a crash that could happen when users synced fields in sales spreadsheets while using undo or redo. It helps keep spreadsheet-based sales workflows stable and avoids interruptions when reviewing or correcting changes.
Original PR description
Fix an issue where field sync would crash when used with UNDO/REDO. Task: 4854879 Forward-Port-Of: odoo/enterprise#92883
A previously disabled automated test for website animation hover options has been re-enabled after the timing issue behind unreliable failures was addressed. This helps maintain confidence that website editing animation settings continue to work correctly without changing end-user functionality.
Original PR description
In commit 22c4ecff46d34a37549dfa3feda8cfe12cf00407, the test was disabled because it had non-deterministic failures It was failing because the preview (that was made by the hover before the click) took sometimes long enough that `waitForEndOfOperation` was executed before preview finished, so it only waited for the end of the preview, not the end of the commit made by the click. Thus the `waitDomUpdated` that followed did not wait for the update caused by the commit (thus had nothing to wait for). And the assertions failed as the sidebar was not updated yet. In order to wait enough, the helper `waitSidebarUpdated` has been introduced in commit 143c40bdb7eac35126d51ac85fb89e37ecb75f13. In this commit, we just un-skip the test (which was updated to use that helper) task-4367641
Fixed an issue that could cause the Helpdesk ticket list to crash when there were no tickets to display. This improves reliability for teams opening an empty ticket list and ensures the page loads normally.
Original PR description
When accessing the Helpdesk ticket list view with zero tickets, the view previously crashed due to improper handling of folded sample data. This commit ensures that sample data folding does not trigger errors when the view is empty, improving overall stability. Steps to reproduce: 1. Navigate to Helpdesk > Teams > Tickets. 2. Ensure there are no tickets. 3. Switch to list view. Task-4971510 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Grouping records by multi-select linked fields now follows the same visibility rules as the field itself. This prevents users from seeing groups for archived or filtered-out records, making list and reporting views more consistent.
Original PR description
Previously, grouping by a Many2many field did not consider either the field's domain or the field's context (that often contains `'active_test': False`). This caused inconsistent behavior in the web client: users would see groups related to archived Many2many records, even though these records weren't visible in the Many2many widget itself. This commit resolves the inconsistency by ensuring that both the field's domain and the field's context are respected when grouping by Many2many fields. backport of b0f3850aab0578791535e8a802e0ffd7790f3b45 task-4808679 Forward-Port-Of: odoo/odoo#230930 Forward-Port-Of: odoo/odoo#230582
Fixes an issue where highlighted text in eLearning articles appeared correctly in the normal view but disappeared in fullscreen mode. This ensures learners see the same formatted course content regardless of viewing mode.
Original PR description
**Steps to reproduce:** - Go to eLearning course on the website - Edit an article - Add the highlighting effect on the text - Save the changes - The text is properly displayed in normal article - Go to the fullscreen version - The highlighting is not present in this version **Issue:** This is an ordering issue caused by the dynamic rendering of fullscreen slides. When in normal mode, the content is initialized and then the `TextHighlight` widget is started. But the rendering of the slides in fullscreen mode is delayed and occurs after the widget is applied. **Fix:** Recreate and restart the widget on `_renderSlide` in the `slides_course_fullscreen_player`` opw-4978798 related: https://github.com/odoo/odoo/commit/f64c9f27f1a9106bc009ad2f696845f2c5c58066 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232077 Forward-Port-Of: odoo/odoo#225150
Companies using the Turkey and Jordan accounting setups will again receive a default cash journal when they are initialized. This restores a compliance-related accounting setup that had been removed during earlier user interface cleanup work.
Original PR description
This commits adds back default cash journal for companies intializing with l10n_tr and l10n_jr. In our efforts to cleaning the UX/UI of accounting (PR #192031 task-4430969) We removed the default cash journal, however, some locatizations, such as l10n_tr and l10n_jo, require them for compliance reasons task-4991218 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#232113 Forward-Port-Of: odoo/odoo#231200
This fix ensures the barcode app respects the delivery setting that blocks extra products when workers scan whole packages. It prevents unintended items from being added to deliveries and also makes package lines removable when needed, improving control during warehouse operations.
Original PR description
## Issue 1: "Allow Extra Products" option ignored for packages ### Steps to reproduce: - In the settings enable "Packages" - Go to Inventory > Configuration > Warehouse Management > Operation Types -…
## Issue 1: "Allow Extra Products" option ignored for packages
### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehouse Management > Operation Types
- Disable "Allow Extra Products" on the "Delivery" operation type
- Create two storable product P1, P2 and add on hand quantities
- 10 x P1 in a package PACK01
- 10 x P2 in a package PACK02
- Create and confirm a delivery for 10 unit of P1
- Open your delivery from the barcode app
- Scan PACK02
#### > The content of PACK02 is added to the delivery even thought it contains extra products.
### Cause of the issue:
The check for extra products is only applied when scanning individual products but is bypassed by package scan. To be more precise, the `barcode_allow_extra_product` option is checked in the public method `createNewLine`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L59-L80
While this method is called at new line creation when a product is scanned, scanning a package will add new lines during the `_processPackage` adn bypasses the rest of the `_processBarcode`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_model.js#L1261-L1267
The issue being that the `__processPackage` does not check the `barcode_allow_extra_product` option and creates its new lines via the private `_createNewLine` call:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1564-L1565
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1655-L1667
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1671
### Fix:
Since scanning a package is expected to add all its content to the picking, and since a package can not be split among two locations, it is necessary to check in advance if any product of its content is extra and avoid any update in this case.
## Issue 2: impossibility of package line removal
### State of the art:
There is currently no option to remove a package line from the barcode. In particular, once the option `show_entire_packs`(Move Entire Packages) is enabled on a picking type, you can not remove the package line once generated by a scan.
#### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehoue Management > Operation Types
- Enable "Move Entire Packages" on the "Delivery" operation type
- Create a storable product and add on hand quanties:
- 10 units in package PACK01
- 10 units in package PACK02
- Create and confirm a delivery for PACK01 (in the package lines)
- Open your delivery from the barcode app
- Scan PACK02
#### > The new line associated to PACK02 can not be removed by any mean
opw-4863621
opw-5080637
Forward-Port-Of: odoo/enterprise#97360
Forward-Port-Of: odoo/enterprise#96299Fixed an issue that could cause an error when refreshing appointment slots based on a selected staff member. This helps customers continue booking appointments smoothly without unexpected interruptions.
Original PR description
This commit fixes an issue where the refresh with appointment based on staff user was raising a traceback as it also tried to compute the max capacity possible. Related commit 3cca7e47ab58f8a7d4e9196dbf60f7068348216b task-5118860 Forward-Port-Of: odoo/enterprise#97561 Forward-Port-Of: odoo/enterprise#95862
The Swedish localization demo data now uses a valid IBAN for the sample bank journal. This prevents confusion or validation issues when businesses test Swedish accounting setup with demo data.
Original PR description
This commit replace the wrong `SE0826566594158439377422` IBAN by `SE5850000000014938684140` The actual IBAN of the sweden bank journal demo data is not following the official format, which is: - Country code: 'SE' -> **OK** - Valid checksum digit: '58' -> **OK** - Valid bank code: '5000' -> **KO**, '2656' is not a valid SE bank code - n zeros to fill the IBAN: '0000' -> **KO**, it's missing the zeros - Account number: '14938684140' -> **OK** Linked:https://github.com/odoo/enterprise/pull/95463 task-5107240 Forward-Port-Of: odoo/odoo#232190 Forward-Port-Of: odoo/odoo#230104
The search bar will now avoid automatically focusing on tablet devices, preventing the on-screen keyboard from appearing unexpectedly. This keeps tablet navigation smoother while preserving the intended behavior on mobile phones.
Original PR description
This commit fixes the usage of the 'mobile' param in the useAutofocus hook, which incorrectly focused the input on tablets, instead of only enabling it on mobile devices. A test has been added as well to cover this use case. task-5169698 Forward-Port-Of: odoo/odoo#232191 Forward-Port-Of: odoo/odoo#232054
Logging for IoT-connected payment terminals is now more consistent across each step of a transaction. This makes it easier for support teams to identify and trace terminal transactions when investigating issues.
Original PR description
This PR improves the logging of terminals used with iot box. We will now get a log for every step of a transaction along with some information identifying the transaction Forward-Port-Of: odoo/enterprise#97216
Error messages in US payroll and NACHA payment flows now use the same bank field label that users see on the form. This makes it easier for users to identify and complete the required bank routing information.
Original PR description
The label shown in the res.partner.bank form view depends on the show_aba_routing field. If we don't show the correct label in these error messages it's not clear to the user what field they have to fill. task-5052996 Forward-Port-Of: odoo/enterprise#97318
19 changes
Enhancements to existing features
Peruvian customer addresses no longer need a ZIP code. This better matches local address practices in Peru and reduces unnecessary friction when creating or updating customer records.
Original PR description
As ZIP codes are not widely used in Peru, the requirement for a ZIP code to be provided for a Peruvian customer should not be present. task-5012593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223157
Swedish batch payments can now include both international IBAN accounts and domestic BBAN, Bankgiro, or Plusgiro accounts in the same payment run. When mixed account types are used, the system automatically creates a ZIP file with separate XML payment files, reducing manual work and avoiding blocked batches.
Original PR description
This commit add a new behaviour for batch payments in Sweden. Before this commit: batch payment with mixed payment for iban and bban/bankgiro/plusgiro wasn't allowed After this commit: now if the user create a batch payment with both type of account, we create a zip file with 2 xml files, one for iban and one for bban/bankgiro/plusgiro. Linked:https://github.com/odoo/odoo/pull/230104 [task-5107240](https://www.odoo.com/odoo/project/967/tasks/5107240) Forward-Port-Of: odoo/enterprise#97556 Forward-Port-Of: odoo/enterprise#95463
Resolved issues and error corrections
Invoices with a small remaining balance will no longer be automatically marked as fully paid when a partial payment is matched from the invoice screen. This prevents unintended write-offs and keeps the remaining amount visible so users can decide how to handle it.
Original PR description
Prevents the system from creating a write-off and marking an invoice as 'Fully Paid' when a partial payment (within tolerance) is reconciled from the invoice form. The invoice status will now correctly remain 'Partially Paid', giving the user control over the remaining balance. task-5114658
Point of Sale barcode scanning now uses the quantity encoded in GS1 barcodes instead of ignoring it. This helps cashiers add the correct product quantity automatically, reducing manual adjustments and checkout errors.
Original PR description
Before this commit, the quantity encoded in a GS1 barcode was ignored when scanning. After this commit, the product will be added with the correct quantity extracted from the GS1 barcode. opw-5126522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232010 Forward-Port-Of: odoo/odoo#229678
The Point of Sale employee access settings now describe the actual behavior more accurately. This avoids confusion for administrators when configuring which employees can use advanced POS features.
Original PR description
Before this commit, the help text of the advanced_employee_ids field was inconsistent with its behavior, as it was not possible to keep it empty. This commit updates the help to reflect the actual behavior. opw-5112862 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232004 Forward-Port-Of: odoo/odoo#228612
This fix prevents spreadsheet field synchronization from crashing when users use undo or redo actions. It improves reliability for sales management spreadsheets, especially when reviewing or reverting changes.
Original PR description
Fix an issue where field sync would crash when used with UNDO/REDO. Task: 4854879 Forward-Port-Of: odoo/enterprise#92883
Grouping records by multi-select linked fields now follows the same visibility rules as the field itself, including filters and archived-record settings. This prevents users from seeing group headings for records that are not available in the related field widget, making reporting and list views more consistent.
Original PR description
Previously, grouping by a Many2many field did not consider either the field's domain or the field's context (that often contains `'active_test': False`). This caused inconsistent behavior in the web client: users would see groups related to archived Many2many records, even though these records weren't visible in the Many2many widget itself. This commit resolves the inconsistency by ensuring that both the field's domain and the field's context are respected when grouping by Many2many fields. backport of b0f3850aab0578791535e8a802e0ffd7790f3b45 task-4808679 Forward-Port-Of: odoo/odoo#230930 Forward-Port-Of: odoo/odoo#230582
The Planning / Timesheet Analysis report now calculates planned and remaining hours using each employee's actual working schedule instead of assuming a standard Monday-to-Friday week. This gives managers more accurate reporting for employees with part-time or custom calendars.
Original PR description
To reproduce: ============= - set the company calendar to 40h/week (Mon to Fri) - create an employee with a 32h/week working schedule (doesn't work on Fri) - on planning app, create a shift for this employee for ex from 01/09 to 15/09 with 2h allocated - go to Planning / Timesheet Analysis report and check report for this employee on september -> planned hours and remaining hours are wrong Problem: ======== when querying the data for the desired period, we divide the allocated hours by the number of weekdays (Mon to Fri) in the period, but we should divide by the number of working days according to the employee's working schedule Solution: ========= we compute the number of working days based on the resource calendar of the employee and use this number to compute the planned hours and remaining hours opw-5008066
Fixed an issue where shipping labels and related delivery documents could fail to print automatically after validating a delivery. The validation process now includes these print actions directly, making document printing more reliable for warehouse and shipping teams.
Original PR description
The `button_validate` method called clicking "Validate" returns a list of client actions to call. After these clients actions are executed, the page reloads. This reload makes our broadcasted action not to be caught by the client if there is only one connected. Anyway, this flow was overcomplicated and has been simplified overriding the method returning the client actions, adding the "shipping labels" and "shipping documents" to it. Forward-Port-Of: odoo/enterprise#97573 Forward-Port-Of: odoo/enterprise#97462
Point of Sale now applies minimum-quantity pricelist rules correctly when the same lot-tracked product is split across multiple lots. This ensures customers receive the intended price when their combined purchase quantity meets the discount threshold, improving pricing accuracy at checkout.
Original PR description
**PROBLEM** Pricelist rules based on a minimum quantity does not work well with lot tracked product, when the quantity is splitted between multiples lots. For example, if you take 2 product from lot…
**PROBLEM** Pricelist rules based on a minimum quantity does not work well with lot tracked product, when the quantity is splitted between multiples lots. For example, if you take 2 product from lot A, and 3 product from lot B, a rule defining the price for a minimum quantity of 5 will not trigger (it should). **STEP TO REPRODUCE** 1. install pos 2. create a lot tracked product 3. create a pricelist rule for the product, with a price based on min qty 4. from the pos, order the min qty but split it accross multiple lots 5. price will not takethe rule into account **CAUSE** Order line of lot tracked products are never merged. The quantity used to compute if a pricelist trigger is the quantity of each line individually. **FIX** For lot tracked product, to determine the price of a line, we parse find all corresponding lines and add their quantities together. Then we update all of their prices. To know if we should take into account a line, we verify if they would have been merged, if their product wasn't lot tracked. **REMARK** Ideally, their would be a way to merged order line of lot tracked product, while being able to edit the quantity taken from each lot directly from the pos. From now, order line doesn't work well with multiple lots, and it would require unstable change on the db. opw-4751920 Forward-Port-Of: odoo/odoo#230836 Forward-Port-Of: odoo/odoo#219110
The Swedish localization demo data now uses a properly formatted IBAN for the sample bank journal. This prevents confusion or validation issues when users test Swedish accounting workflows with demo data.
Original PR description
This commit replace the wrong `SE0826566594158439377422` IBAN by `SE5850000000014938684140` The actual IBAN of the sweden bank journal demo data is not following the official format, which is: - Country code: 'SE' -> **OK** - Valid checksum digit: '58' -> **OK** - Valid bank code: '5000' -> **KO**, '2656' is not a valid SE bank code - n zeros to fill the IBAN: '0000' -> **KO**, it's missing the zeros - Account number: '14938684140' -> **OK** Linked:https://github.com/odoo/enterprise/pull/95463 task-5107240 Forward-Port-Of: odoo/odoo#232190 Forward-Port-Of: odoo/odoo#230104
This update lets Odoo prepare files before upload, including resizing images so they take up less space. This helps reduce database growth when users upload icons or images through web components such as Studio.
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#231899 Forward-Port-Of: odoo/odoo#226611
App icons created in Studio are now automatically resized before being saved. This prevents oversized images from unnecessarily increasing storage, cache size, and request payloads, helping keep the system lighter and more efficient.
Original PR description
Before this commit, the IconCreator images were sent as is in their full size. Downstream it was problematic because apps' icons were bigger than necessary, bloating the different caches, the database, and the request. After this commit, icon are resized to a max of 64x64 pixels. Forward-Port-Of: odoo/enterprise#97369 Forward-Port-Of: odoo/enterprise#94480
This fix prevents the search bar from automatically focusing on tablet devices, so users are not unexpectedly interrupted by the on-screen keyboard. Autofocus remains limited to phones, and a test was added to help prevent the issue from returning.
Original PR description
This commit fixes the usage of the 'mobile' param in the useAutofocus hook, which incorrectly focused the input on tablets, instead of only enabling it on mobile devices. A test has been added as well to cover this use case. task-5169698 Forward-Port-Of: odoo/odoo#232191 Forward-Port-Of: odoo/odoo#232054
Mobile self-order now shows the correct order after a customer places a new order, avoiding confusion with a previously paid order. Receipts downloaded after refreshing the page also keep their payment details, so customers see accurate proof of payment.
Original PR description
This PR contains 2 small fixes for mobile self order: - **[FIX] pos_self_order: wrong order on confirmation screen** Steps to reproduce: 1. Configure a Self Order POS to use QR menu + ordering 2. In…
This PR contains 2 small fixes for mobile self order:
- **[FIX] pos_self_order: wrong order on confirmation screen**
Steps to reproduce:
1. Configure a Self Order POS to use QR menu + ordering
2. In the mobile menu, make an order and confirm
3. The confirmation screen shows order S001, pay at the counter
4. In the POS, pay and validate the order
5. In the mobile menu, make another order and confirm
Expected behaviour:
- The confirmation screen shows order S002, pay at the counter
Actual behaviour:
- The confirmation screen shows order S001, already paid
The cause of this is that `selectedOrderUuid` is cleared whenever the
`getUserDataFromServer` method is called, even if the server doesn't
return an order to replace it with. The self order service then tries
to find the current order and takes the previously paid order instead of
the new order.
To fix this, we simply don't clear `selectedOrderUuid`. It will still be
overwritten if the server does return new order data.
- **[FIX] pos_self_order: incorrect receipt after refresh**
Steps to reproduce:
1. Configure a Self Order POS to use QR menu + ordering
2. Make an order in the mobile menu
3. Pay and validate the order in the POS using the 'Card' payment method
4. Go to 'My Orders' in the mobile menu, and download the receipt
5. Observe the correct 'Card' payment line is shown on the receipt
6. Refresh the page
7. Download the receipt again
Expected behaviour:
- The downloaded receipt is the same as the first one, with the 'Card'
payment line.
Actual behaviour:
- The downloaded receipt has no payment lines, so it just shows a
negative 'Change' line at the end.
The cause of this issue is that the payment lines and payment methods
used to render the receipt were not being persisted in the indexed DB.
The fix is simply to add these models to the data service options so
that they also get saved locally.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#231910This update makes IoT payment terminal logs more consistent and complete. Businesses and support teams can more easily trace each step of a transaction, helping diagnose payment issues faster.
Original PR description
This PR improves the logging of terminals used with iot box. We will now get a log for every step of a transaction along with some information identifying the transaction Forward-Port-Of: odoo/enterprise#97216
Error messages for US payroll and NACHA payment bank details now use the same field label users see on the bank account form. This helps users understand whether they need to enter an ABA routing number or another clearing number, reducing confusion when fixing payment setup issues.
Original PR description
The label shown in the res.partner.bank form view depends on the show_aba_routing field. If we don't show the correct label in these error messages it's not clear to the user what field they have to fill. task-5052996 Forward-Port-Of: odoo/enterprise#97318
This fix stops password manager browser extensions, such as Bitwarden, from showing an unnecessary popup over the Odoo main menu. The hidden search input now disables browser autocomplete, keeping the menu experience cleaner without changing search behavior.
Original PR description
Bitwarden pops up small form on top of the main menu for no reason. It is because of the hidden input created to trigger search when you type. Put `autocomplete="off"` to avoid these popups, as the search feature handle its own autocompletion. Note: this commit is a backport of odoo/odoo@403d7b70ab16b8b70ea46aa692883c7b4a6e83b7 Forward-Port-Of: odoo/enterprise#97506
Activity feedback on calendar events is no longer added to the meeting description, preventing it from being synced to external calendars or sent as meeting updates. The feedback remains available internally in the chatter note, keeping attendee-facing meeting details clean.
Original PR description
When marking a calendar.event activity as done, one can submit a feedback. Currently, that feedback is logged in the chatter, and is also appended at the end of the meeting's description. As this field is synchronized with external calendars, this may lead to notification / meeting updates. However, this should serve an internal purpose instead, and should not be shared to attendees in that way. Therefore, simply remove this behavior. The feedback will still be found in the note in the chatter. Task-5143141 Forward-Port-Of: odoo/odoo#231670
4 changes
Resolved issues and error corrections
Down payment invoices for subscription upsell orders now show the actual partial payment amount instead of zero. This gives customers and businesses accurate invoice totals when only part of an upsell order is paid online.
Original PR description
Version- 17.0 ### Issue: - When an upsell order is partially paid (e.g., 10% of the original amount), the generated downpayment invoice incorrectly displayed an invoiced amount of 0. ### Steps to reproduce: - Make an Upsell order of subscription. - Update the condition of Online Payment from 100% to 10% (in this case). - Make the payment of 10% from portal view. - The invoice amount will be shown as $0. ### Fix: - Updated `_get_subscription_qty_to_invoice` to correctly determine the invoiced quantity and amount for downpayment invoices on upsell orders. ### Impact: - The downpayment invoices for upsell orders now correctly reflect the actual invoiced amount. Forward-Port-Of: odoo/enterprise#97412 Forward-Port-Of: odoo/enterprise#96719
This fix prevents spreadsheet field synchronization in Sales from crashing when users use undo or redo. It improves reliability for users working with synced sales data in spreadsheets and helps avoid interruptions while editing.
Original PR description
Fix an issue where field sync would crash when used with UNDO/REDO. Task: 4854879 Forward-Port-Of: odoo/enterprise#92883
This change removes an unnecessary browser option from IoT device requests. It avoids errors in older Chrome versions while keeping IoT and point-of-sale hardware connections working as before.
Original PR description
This reverts commit 6d09dc6 which added the `"targetAddressSpace": local` option to IoT fetch requests. This is because of two reasons: 1. It caused errors on older versions of Chrome that implemented the obsoleted 'Private Network Access' standard. 2. It was not actually required in the first place, it is only needed in situations where a HTTP resource is accessed from HTTPS using a domain that resolves to a local IP. In Odoo we only ever do this for HTTPS -> HTTPS requests, where it works automatically. task-5157145 Forward-Port-Of: odoo/enterprise#97543 Forward-Port-Of: odoo/enterprise#97500
The main menu search field was adjusted so browser extensions like Bitwarden no longer show an unnecessary popup over the menu. This keeps the menu cleaner and avoids distracting users while preserving the existing search autocomplete behavior.
Original PR description
Bitwarden pops up small form on top of the main menu for no reason. It is because of the hidden input created to trigger search when you type. Put `autocomplete="off"` to avoid these popups, as the search feature handle its own autocompletion. Note: this commit is a backport of odoo/odoo@403d7b70ab16b8b70ea46aa692883c7b4a6e83b7 Forward-Port-Of: odoo/enterprise#97506
27 changes
Security fixes and vulnerability patches
IoT Boxes are now prevented from connecting to a database unless that database has a valid token. This helps ensure only properly authorized IoT hardware can connect, reducing the risk of unintended or unauthorized database access.
Original PR description
We added a check to prevent IoT Boxes from connecting to a database if the database doesn't have a valid token. Task: 5177501 Forward-Port-Of: odoo/enterprise#97579 Forward-Port-Of: odoo/enterprise#97531
Enhancements to existing features
Peruvian customer addresses no longer need a ZIP code to be accepted. This better reflects local address practices in Peru and reduces unnecessary data entry friction for customers and staff.
Original PR description
As ZIP codes are not widely used in Peru, the requirement for a ZIP code to be provided for a Peruvian customer should not be present. task-5012593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223157
Payslips in the Mexican payroll CFDI flow now show issue alerts when required information is missing. This helps payroll teams identify and correct problems earlier so CFDI documents can be generated correctly.
Original PR description
We now have a "issues" system on the payslips. Let's use it to signal what is missing for the correct generation of the CFDI. Task: 5068311
This update makes automated browser shutdown more reliable when Chrome reports rare errors during test cleanup. It helps prevent unfinished test environments and zombie builds, improving stability of the development and release pipeline.
Original PR description
In some instances, Chrome can apparently fail CDTP calls with "Execution context was destroyed". According to the internet this mostly happens because of navigation events, here it's not clear if…
In some instances, Chrome can apparently fail CDTP calls with "Execution context was destroyed". According to the internet this mostly happens because of navigation events, here it's not clear if this is in response to `stop`-ing the page, or a pre-existing navigation directive interfereing with the stop-ing of the browser. I tried reproducing locally under the assumption that the `Page.stopLoading` might be the cause but got nowhere[^1]. This issue seems extremely infrequent, and in most cases is but a minor annoyance, an error appears on the corresponding build, and that's it. However if the error occurs during `ChromeBrowser.stop` then the browser is not terminated, which on runbot prevents the docker image from shutting down properly, and leaves zombie builds. Therefore make `ChromeBrowser.stop` more resilient to errors in the initial section so that we do terminate the browser even if the "graceful CDTP shutdown" fails. While at it, add a fallback to kill the browser if it does not terminate gracefully. https://runbot.odoo.com/odoo/error/233442 [^1]: and the error only happening in 18.0 and later when `Page.stopLoading` was present long before that makes it likely the proximal cause is in the code being run, especially as all the errors sampled from the builds list are related to pos and the failure are immediately preceded by ongoing HTTP requests Forward-Port-Of: odoo/odoo#232222 Forward-Port-Of: odoo/odoo#232060
Swedish batch payments can now include both IBAN and BBAN, Bankgiro, or Plusgiro recipients in the same batch. The system automatically separates them into two XML files inside one zip file, reducing manual work and avoiding blocked mixed payment batches.
Original PR description
This commit add a new behaviour for batch payments in Sweden. Before this commit: batch payment with mixed payment for iban and bban/bankgiro/plusgiro wasn't allowed After this commit: now if the user create a batch payment with both type of account, we create a zip file with 2 xml files, one for iban and one for bban/bankgiro/plusgiro. Linked:https://github.com/odoo/odoo/pull/230104 [task-5107240](https://www.odoo.com/odoo/project/967/tasks/5107240) Forward-Port-Of: odoo/enterprise#97556 Forward-Port-Of: odoo/enterprise#95463
Links typed into the mail composer are now recognized and highlighted more reliably. This improves the message-writing experience while also simplifying the underlying editor setup for easier maintenance.
Original PR description
This commit enables the link plugin in the mail composer so that the link will be properly parsed and hightlighted. This commit also improves the plugin set and clean up the duplicated plugin lists. task-5172795 backport - https://github.com/odoo/enterprise/pull/97504 https://github.com/odoo/enterprise/pull/97666 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Links added in the mail composer are now recognized and highlighted more reliably. This improves message clarity for users and also simplifies the underlying editor setup to reduce duplicated configuration.
Original PR description
This commit enables the link plugin in the mail composer so that the link will be properly parsed and hightlighted. This commit also improves the plugin set and clean up the duplicated plugin lists. task-5172795 backport - https://github.com/odoo/enterprise/pull/97504 https://github.com/odoo/odoo/pull/232347
Resolved issues and error corrections
The mobile shop page no longer adds extra spacing that pushed carousel indicators out of alignment. This creates a cleaner, more consistent browsing experience for customers on phones.
Original PR description
This PR removes unnecessary mobile padding that misaligns the carousel indicators. task-5126294 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The asset list has been restored to its previous non-editable behavior so the New button opens the asset form correctly. This fixes a workflow issue that could block users from creating new assets as expected.
Original PR description
The previous change to make the asset list view editable caused a problem where the "New" button no longer opens the form view. This commit reverts that change to restore the intended functionality.
The website setup wizard now correctly selects the industry a user clicks in the dropdown instead of defaulting to the first result. This prevents setup mistakes and makes new website configuration smoother and more predictable.
Original PR description
Problem In the website configuration wizard, when selecting an industry by mouse clicking, the first industry in the list would get selected instead of the clicked one. Steps - In Odoo with the…
Problem In the website configuration wizard, when selecting an industry by mouse clicking, the first industry in the list would get selected instead of the clicked one. Steps - In Odoo with the Website addon installed - Create a new website in the website settings - Select any type of website - Write an industry name - Click on any industry in the dropdown list - The first industry of the list get selected Cause This bug only happens if the param `selectOnBlur` is activated. `selectOnBlur` makes clicking away from the input as a select of the first option. But, clicking on an option in the list is also considered as an onBlur, so when the user clicks on an industry, it will always select the first one of the list. Fix Added a flag `isOptionSelected`, set to true every time an option is selected. This is to prevent the `selectOnBlur` of overwriting what has been already selected. Deleted `selectOnTab` brought in this commit 8e6410b because the function already existed under `autoSelect`. Also added tests, and fixed linter errors in `autocomplete.js`. task-5139708
Restaurant owners can now print POS sales reports directly while a sales session is still open. This removes the need to go through the backend just to access the report, making day-to-day restaurant operations faster and more convenient.
Original PR description
- Restaurants owners need to be able to print a sales report during a session. Before this commit, they were only available to print the report via the backend. task-id: 5076080 Forward-Port-Of: odoo/enterprise#94181
This fixes errors that could occur when setting up or upgrading in-store pickup delivery methods in multi-company environments. The delivery method now uses the correct company when linking warehouses, preventing validation failures and incorrect warehouse assignments.
Original PR description
The record `carrier_pick_up_in_store` will get assigned the product `product_pick_up_in_store`. Since the warehouses are linked based[^1] on the env company, if it doesn't match that of the product…
The record `carrier_pick_up_in_store` will get assigned the product `product_pick_up_in_store`. Since the warehouses are linked based[^1] on the env company, if it doesn't match that of the product it will throw an error[^2] because of that mismatch. To reproduce: - Change the company of `product_pick_up_in_store` to one other than the active. - Delete the delivery carrier `carrier_pick_up_in_store` - Upgrade the module. **[FIX] website_sale_collect: Use right company for warehouses** While creating a delivery carrier the warehouses are linked using the env company. While using multi-company, you might select another company from the active ones rather than the one from env. This will trigger a validation error because the warehouses will be filtered by the wrong company. Same case if the company is left empty. To reproduce: - Create a delivery method selecting pick up in store, leaving the company empty. - It will still link the warehouses from the active company. - Activate a second company in the multi-company menu. - Create a delivery carrier, selecting pick up in store and the second company. - The warehouses will be linked to the first company, triggering a validation error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr [^1]:https://github.com/odoo/odoo/blob/9900375bc0bac2754150fd8cd6a1e45ecad8da83/addons/website_sale_collect/models/delivery_carrier.py#L47-L49 [^2]:https://github.com/odoo/odoo/blob/9900375bc0bac2754150fd8cd6a1e45ecad8da83/addons/website_sale_collect/models/delivery_carrier.py#L33-L38
Financial reports now translate currency adjustment amounts using the closing rate instead of the current rate. This restores the prior behavior so reports such as ledgers and trial balances better match expected period-end accounting values.
Original PR description
This reverts commit 0719c63a646c360a4b090745cd8105128332ef38. task-5085888 Forward-Port-Of: odoo/enterprise#97429 Forward-Port-Of: odoo/enterprise#97271
Feedback entered when completing a meeting activity is now saved in the event's internal notes instead of its public description. This prevents unnecessary updates or notifications from being sent through synced external calendars.
Original PR description
When using a meeting as activity, one can add feedback when marking the activity done. This feedback is currently added to the calendar.event description, which can in turn be synchronized with external calendars and trigger calendar event update notifications. As we added an internal 'notes' fields in [1] on the calendar.event model, add the feedback to that field instead. [1] : odoo/odoo@67d5383ce4a5fe2e1307ef787939d7e2371e6529 Task-5143141
Fixes an accounting reconciliation issue where a bank payment smaller than the invoice total could incorrectly mark the full invoice as paid and create an unnecessary suspense balance. The system now applies only the correct partial amount, keeping invoice payment status and bank entries accurate.
Original PR description
Steps: - Have a payment term making 3 installments (33.33%, 33.33% and 33.34%) - Create and confirm an invoice for $200 with the previously created payment term - Create a bank transaction for $90…
Steps: - Have a payment term making 3 installments (33.33%, 33.33% and 33.34%) - Create and confirm an invoice for $200 with the previously created payment term - Create a bank transaction for $90 -------- Option 1 -------- - Reconcile the statement line with the three invoice lines from the reconcile button on the stmt line itself -------- Option 2 -------- - From the invoice, add the stmt line from the outstanding payments widget -> The invoice is marked as fully paid and the bank entry looks like this: | account | debit | credit | | ------- | ----- | ------ | | Bank account | 90.00 | 0.00 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 66.68 | | Suspense account | 110.00 | 0.00 | It should look like this: | account | debit | credit | | ------- | ----- | ------ | | Bank account | 90.00 | 0.00 | | Receivable account | 0.00 | 66.66 | | Receivable account | 0.00 | 23.34 | This is because we're calculating the partial amount only when looping over the last move line, which result with no partial amount since the transaction amount is already exceeded, therefore we end up adding all the line and balancing it with the suspense account line, which is wrong. With this commit, we add some conditions to check wether the amount is exceeded or will be exceeded, and we calculate the partial amount accordingly. opw-5076498 Forward-Port-Of: odoo/enterprise#96847
This fixes how currency translation adjustments are calculated in accounting reports by reverting a prior change that used the wrong rate for year-over-year balance sheet revaluations. Businesses should see more accurate balance sheet currency figures when comparing periods.
Original PR description
This reverts commit c440bb52d19b8dcec8b708509973c4095a577b34 as it doesn't work as expected in year-over-year re-evaluation in balance sheets. task-5085888 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231990 Forward-Port-Of: odoo/odoo#231718
Internal chat and call tests now use simpler mock audio and video streams, reducing unnecessary resource usage during automated testing. This helps make test runs more reliable and lowers the chance of test cleanup issues, without changing user-facing behavior.
Original PR description
Before this commit, since https://github.com/odoo/odoo/pull/231222, the streams used for tests were unnecessarily realistic. - The audio stream was running with an oscillator, it is now an empty idle stream. This may also fix an issue where if the `oscillator.start` function crashes, the stream wouldn't be added to the stream list and not be closed. - The video stream was playing at 1fps, it now uses the default of canvas.captureStream which does not generate new frames if the canvas does not change. The commit also makes the `mockGetMedia` return the streams that it manages instead of using an exported global variable, which may cause issues as hoot retains the reference to window.
Point of Sale now uses the quantity encoded in GS1 barcodes when products are scanned. This prevents checkout errors where items were added with the wrong quantity, improving accuracy for retailers using GS1 labels.
Original PR description
Before this commit, the quantity encoded in a GS1 barcode was ignored when scanning. After this commit, the product will be added with the correct quantity extracted from the GS1 barcode. opw-5126522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232010 Forward-Port-Of: odoo/odoo#229678
The help text for advanced employee access in Point of Sale was updated to match how the setting actually works. This reduces confusion for users configuring employee permissions by making the description accurate.
Original PR description
Before this commit, the help text of the advanced_employee_ids field was inconsistent with its behavior, as it was not possible to keep it empty. This commit updates the help to reflect the actual behavior. opw-5112862 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232004 Forward-Port-Of: odoo/odoo#228612
A bug in the Mail module could cause field settings from one discussion record to be reused for another. The fix keeps each record's extra field list separate, helping prevent incorrect or unexpected information from appearing in mail and discussion views.
Original PR description
Before this commit, the `extra_fields` kwarg of Store.Relation would be mutated in place, causing unexpected behavior where the `dynamic_fields` of a record would be used for others. This commit fixes the shared list mutation issue by making a copy of the `extra_fields` and appending to that. Forward-Port-Of: odoo/odoo#232266
Point of Sale now prevents users without the required permissions from attempting to delete cash in/out entries, and shows a clear error if deletion is blocked. This avoids confusion for store staff and fixes receipt printing errors for cash movement receipts.
Original PR description
Before this commit, a user with "account.group_account_invoice" group could try to delete a cash in/out in the pos but had no feedback. Actually, his request was refused but we never tell the user why. We now display the error but also do not give the possibility to the user to delete a cash in/out if he does not have the right group. There was also errors appearing when printing the CashMoveReceipt. We call the ReceiptHeader in the CashMoveReceipt but without giving it a real order which could cause problems cause in the ReceiptHeader we consider the order that is given as a real one and we can call methods and stuff from the model. We now create a dummy order to give to the ReceiptHeader. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228789
This fixes how Facebook video links are recognized when users embed videos in the HTML editor. It helps ensure Facebook videos are handled correctly and reduces failed or incorrect embeds.
Original PR description
This PR improves the changes made in PR #215204.
When embedding facebook videos, the url looks like
`"//facebook.com/plugins/video.php?href=https://www.facebook.com/username/videos/{video_id}/"`
after embedding, so we need to check for "https:" and "http:"
with method `startsWith` instead of `includes`.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fixes an invalid Swedish IBAN used in demo data for the Sweden localization. The corrected account number follows the official IBAN format, helping demonstrations and test setups reflect valid banking data.
Original PR description
This commit replace the wrong `SE0826566594158439377422` IBAN by `SE5850000000014938684140` The actual IBAN of the sweden bank journal demo data is not following the official format, which is: - Country code: 'SE' -> **OK** - Valid checksum digit: '58' -> **OK** - Valid bank code: '5000' -> **KO**, '2656' is not a valid SE bank code - n zeros to fill the IBAN: '0000' -> **KO**, it's missing the zeros - Account number: '14938684140' -> **OK** Linked:https://github.com/odoo/enterprise/pull/95463 task-5107240 Forward-Port-Of: odoo/odoo#232190 Forward-Port-Of: odoo/odoo#230104
The search bar will no longer automatically focus and open the keyboard on tablet devices. This avoids an unnecessary interruption for tablet users while preserving the intended behavior on mobile phones.
Original PR description
This commit fixes the usage of the 'mobile' param in the useAutofocus hook, which incorrectly focused the input on tablets, instead of only enabling it on mobile devices. A test has been added as well to cover this use case. task-5169698 Forward-Port-Of: odoo/odoo#232191 Forward-Port-Of: odoo/odoo#232054
IoT payment terminals now record consistent logs for every step of a transaction, including details that help identify the transaction. This makes it easier for support teams to investigate payment issues and understand what happened during a terminal transaction.
Original PR description
This PR improves the logging of terminals used with iot box. We will now get a log for every step of a transaction along with some information identifying the transaction Forward-Port-Of: odoo/enterprise#97216
This fixes an internal payroll test that failed because newer Chrome versions changed how certain text styling information is reported. The adjustment keeps automated checks reliable without changing payroll features or user workflows.
Original PR description
Since either 140 or 141[^0] Chrome uses compact serialization rules for text-decoration, as a result of w3c/csswg-drafts#12486. This was merged [on August 12th][CL-6824265] and Chrome 139 was cut on August 5 so couldn't have had this change. The new serialization rule means values which can be ommitted from a shorthand (default or fallback) should be, so the default `text-decoration-line` and a `text-decoration-color` matching the `color` won't be serialized in `text-decoration` anymore. Instead of matching the shorthand, match the actual stored properties. [^0]: 140 was not deployed on chrome next so it may or may not have been broken then [CL-6824265]: https://chromium-review.googlesource.com/c/chromium/src/+/6824265
Fixed a stability issue in Sales spreadsheet field synchronization that could cause crashes when users used undo or redo. This helps keep spreadsheet-based sales workflows reliable and avoids interruptions during editing.
Original PR description
Fix an issue where field sync would crash when used with UNDO/REDO. Task: 4854879 Forward-Port-Of: odoo/enterprise#92883
21 changes
New functionality added to Odoo
This change appears to add or adjust email logging in Odoo's messaging area, helping businesses keep better records of communications. The file list also includes many module manifest updates and unrelated stock/web changes, so the business impact is likely limited unless the email logging behavior is activated in daily workflows.
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
Enhancements to existing features
Luxembourg payroll rules have been updated with the 2025 minimum social salary and related tax credit values. This helps ensure employee payslips and payroll calculations reflect the latest official rates.
Original PR description
Sources: - https://igss.gouvernement.lu/dam-assets/publications/param%C3%A8tres-sociaux/2025/par-soc-202501.pdf - https://igss.gouvernement.lu/dam-assets/publications/param%C3%A8tres-sociaux/2025/par-soc-202505.pdf task-5176255
Peruvian customer addresses no longer require a ZIP code because ZIP codes are not widely used in Peru. This makes customer data entry easier and avoids unnecessary validation issues for businesses working with Peruvian contacts.
Original PR description
As ZIP codes are not widely used in Peru, the requirement for a ZIP code to be provided for a Peruvian customer should not be present. task-5012593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#223157
Estonia VAT report XML exports have been optimized to handle large accounting periods without timing out. The change reduces repeated processing, allowing very large monthly reports to complete successfully and improving reliability for businesses with high transaction volumes.
Original PR description
Behavior before: When exporting the VAT report to XML, each newly added line triggered a fresh _compute_expression_totals_for_each_column_group call. With large volumes of journal items, this…
Behavior before: When exporting the VAT report to XML, each newly added line triggered a fresh _compute_expression_totals_for_each_column_group call. With large volumes of journal items, this resulted in excessive repeated queries and, for big datasets, timeout errors. Behavior after: Introduced _custom_unfold_all_batch_data_generator, which batches the computation of expression totals for all lines. Now, journal items are resolved in bulk and mapped back to their respective moves, significantly reducing redundant queries. The VAT XML export completes successfully, even on months with very large datasets. Root cause: The Estonia VAT report was missing a batch unfold method (_custom_unfold_all_batch_data_generator). Without it, the system executed totals computation for each line individually instead of in batch, causing major performance degradation. Benchmark: | Period size (journal items) | Before patch | After patch | |----------------------------------------|----------------------|--------------------| | ~15k | 7s | 5s | | ~200k+ | Timeout error| 21s | opw-5046077 Forward-Port-Of: odoo/enterprise#95047
Resolved issues and error corrections
The mail composer now handles failed file uploads without causing an error screen. This avoids disruption for users composing messages when an attachment cannot be uploaded.
Original PR description
Before this commit, when a file upload in the full composer would be fail, it would result in a traceback. This happens because we would try to access the attachment resulting from the upload, which is however undefined when the upload fails. This commit fixes the issue by guarding the access of said attachment. task-4778468
Improved the spacing of debug-mode menu option fields on event and event type forms, making it easier to match each label with its related setting. This helps administrators configure event website page menus with less confusion.
Original PR description
The PR fixes the display of the fields displayed when the debug mode is activated and used to show buttons in the menu of event website pages. Previously, it was difficult to determine what were the labels of the fields. To make it clearer, the spaces between the label-field couples have been increased. Task-4750239
Fixes crashes that could happen when users rapidly drag and drop cards in large grouped Kanban views. The change makes drag-and-drop safer during screen refreshes, helping users continue working without interruptions in busy boards.
Original PR description
On a grouped kanban view displaying a lot of records (i.e. with a lot of columns and a lot of records by column), drag and drop several records from the same column quick multiple times. Before this…
On a grouped kanban view displaying a lot of records (i.e. with a lot of columns and a lot of records by column), drag and drop several records from the same column quick multiple times. Before this commit, different crashes could occur. The first category of crashes concern the sortable hook. It called the onDrop callback even if the dragged element was no longer in the DOM (which occurs if there's a re-rendering while the user is dragging). This has been fixed in the hook, and tested. Another crash could arise in kanban (in the model). If the user dropped the card while there was a scheduled/ongoing re-rendering, i.e. at a specific moment where the model isn't synchronized with the DOM, the dropped card was still in the DOM, but it's associated datapoint was no longer referenced in hte model. In that case, we can do nothing but cancel the d&d. Note that this couldn't be tested, as reproducing the exact behavior (typically having a slow rendering due to the number of cards to render) isn't possible in a unit test, where user interactions are done programmatically. Task~5167650 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 fix ensures United Kingdom supplier records are reported with the correct country code in Mexico's DIOT tax report. It prevents UK-related transactions from being grouped under “Other country,” improving reporting accuracy for compliance reviews.
Original PR description
The DIOT country adaptation map lacked the ISO 3-letter code for the UK, causing records with country 'GB' to be reported as 'ZZZ' ("Other country").
Added mapping 'GB' → 'GBR' to ensure correct DIOT country code generation.

Forward-Port-Of: odoo/enterprise#96771Customers who navigate back during checkout and choose another delivery address are no longer shown an error. If the cart is no longer available, the site now sends them safely back to the shop so they can continue browsing or restart checkout.
Original PR description
Currently, an error occurs when the user changing the delivery address in the website. **Steps to reproduce:** - Install the `website_sale` module and enable the `Demo` payment provider. - Go to `Website` > `Shop` > `Add a product to Cart` > `View cart` > `Checkout`. - Ensure there are at least two different delivery addresses > `Confirm` > `Pay now`. - Quickly press the browser’s `back button` twice. - Select a different `delivery address`. **Error:** `ValueError: Expected singleton: sale.order()` **Root Cause:** At [1], the code calls `order.ensure_one()`. When the cart (`sale.order`) is empty, leads to an `error`. **Fix:** This commit prevents a traceback on the frontend when a user attempts to change the delivery address and safely redirects them to the shop page. [1]: https://github.com/odoo/odoo/blob/88c9a45ee1ff8dde871865723c3387c059af8289/addons/delivery/models/delivery_carrier.py#L157 sentry-6869972801
Calendar activity feedback is no longer added to the meeting description when an activity is marked done. This prevents internal notes from being synced to external calendars or triggering unnecessary meeting updates, while keeping the feedback available in the chatter.
Original PR description
When marking a calendar.event activity as done, one can submit a feedback. Currently, that feedback is logged in the chatter, and is also appended at the end of the meeting's description. As this field is synchronized with external calendars, this may lead to notification / meeting updates. However, this should serve an internal purpose instead, and should not be shared to attendees in that way. Therefore, simply remove this behavior. The feedback will still be found in the note in the chatter. Task-5143141
This fix ensures that Italian point-of-sale transactions still print the required receipt when the cash drawer option is enabled. It prevents a checkout issue for businesses using Italian fiscal printers, helping sales complete smoothly and compliantly.
Original PR description
Pull request https://github.com/odoo/enterprise/pull/91412 attempted to fix an issue related to printing the receipt with the italian fiscal printer. That PR forgot to handle the cash drawer correctly. This Pr fixes that. It is essentially a backport of commit 32b5651. Steps to reproduce: 1. clean DB 2. setup an italian POS 3. configure the printer 4. in the POS settings, tick the box "cash drawer" 5. attmept to make a sale After this commit, the receipt is correctly printed. opw-4882480
Fixed taxes on invoices with negative-priced products now correctly become negative as well. This prevents overstated tax amounts on refunds, discounts, or other negative invoice lines and keeps accounting totals accurate.
Original PR description
Steps to reproduce: 1. Create a fixed tax 2. Create a invoice with a product with negative price Problem: The amount of the tax is positive while the line is negative. opw-5128767
The Documents app now correctly applies debug mode changes made through the command palette. This fixes a navigation issue so users can switch debug mode without manually editing the URL.
Original PR description
Issue: In the documents app toggling debug mode through the command palette (ctrl-k) does not work. Manually editing the URL works as expected. Cause: A patch on `router.stateToUrl` for the documents app rebuilds the URL to create clean, shareable links. When doing so, it attempted to preserve the debug status by referencing the global `odoo.debug`. This global object did not reflect client-side state changes. The command palette correctly provides the intended future state to the router. The patch was ignoring this incoming state and using the outdated global value, causing the generated URL to be incorrect. Solution: Modify the patch to use the `state` argument provided to `stateToUrl`, which contains the correct, up-to-date information for the navigation. Task-5095056
Invoice terms and conditions now update automatically when a customer's language is changed during invoice creation. This helps ensure customers receive invoice text in the correct language without needing to recreate or manually adjust the invoice.
Original PR description
Issue: When changing the customer’s language during invoice creation, the terms & services were not retranslated, unlike when creating a new partner in a different language. Repro Steps: 1. Create an invoice with terms link or plain enabled. 2. Change the partner's language from the invoice creation view. 3. Terms is not translated. Cause: The translation compute was only triggered on partner change, not language change. Fix: Added dependency for partner_id.lang to the narration compute to ensure it updates when the language changes. opw-5031933
Users who choose to handle notifications inside Odoo could receive the same browser push notification twice when they had an Odoo tab open. This fix prevents duplicate alerts so users receive a single, clearer notification for each message.
Original PR description
**Steps to reproduce:** - Sign into one user - Go to his `Preferences` menu - Set notification to `Handle in Odoo` (`notification_type='inbox'`) - Enable push notification in the browser - Go to…
**Steps to reproduce:**
- Sign into one user
- Go to his `Preferences` menu
- Set notification to `Handle in Odoo` (`notification_type='inbox'`)
- Enable push notification in the browser
- Go to another window / browser (at the same time as the first one is opened)
- Log in with another user
- Go to any record with a chatter, then ping the first user with a message
- Two push notifications are received by the first user, for the same message
(This only happens if the receiving user tab is still open)
**Issue:**
When using default `notification_type='email'`, notification is created by
the mail part and sent with a web_push.
(`_notify_thread_by_email` and `_notify_thread_by_web_push`)
When using `notification_type='inbox'`, it is triggered as a bus notification and
a web_push, which led to duplicates on the user side.
(`_notify_thread_by_inbox` and `_notify_thread_by_web_push`)
Also, we can't just remove any of the two as they serve different purposes.
```
-> (backend) -> mail.thread
-> _notify_thread_by_inbox -> user with mail.thread -> bus.bus
-> (frontend) -> bus_service -> mail.out_of_focus -> notify -> serviceWorker -> "message" event -> browser web_push
-> _notify_thread_by_web_push -> stored devices -> push_to_end_point
-> (frontend) -> device -> serviceWorker -> "push" event -> browser web_push
```
**Fix:**
Reapply this fix https://github.com/odoo/odoo/commit/4fc16a3cc469dbdc206260487693a572ba62cbbe
to explicitly check for redundant notification when `this.store.self.notification_preference === inbox`.
The service worker only shows a push notification if no open tab refuses it, this is done
by sending a `notification-display-request` and if any tab answers with a
`notification-display-response` the notification is removed.
Seems to kind of work, but the notification might be rethrown in edge cases (quick refresh ?).
The fix ensures the browser ignore duplicate inbox push notifications since
they're already handled by `mail.message/inbox` bus notifications, and
the `modelsHandleByPush` heuristic in `out_of_focus_service.js` isn't reliable
enough to detect these cases. The logic should probably be improved in master.
opw-4639507
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prFixes an issue where reconciling journal items could fail when a company had customized the default journal entry type. The reconciliation wizard now consistently creates write-offs as standard journal entries, preventing avoidable errors about missing partners or account type restrictions.
Original PR description
Behavior before commit: On certain configurations, attempting to reconcile a Journal Item through the wizard caused an exception to be thrown due to either a missing `partner_id` or incorrect account…
Behavior before commit: On certain configurations, attempting to reconcile a Journal Item through the wizard caused an exception to be thrown due to either a missing `partner_id` or incorrect account type. Root cause: The wizard used the default `move_type`. While this is usually `entry`, a customisation can change it. Since types other than `entry` have more robust requirements in terms of necessary fields (ie. `partner_id`) and account type limitations, this results in an exception being raised. Fix: Added a line in `write_off_vals` that explicitly assigns `move_type` as `entry`. Steps to reproduce: 1. Have unreconciled Journal Items. 2. Define a new User-defined default for the Journal Entry model, setting its default type to a value other than "Journal Entry". 3. Select an unreconciled Journal Item in the list view and attempt to reconcile it through the wizard. 4. Observe the exception pointing to a missing `partner_id` or incorrect account type. opw-5107155 Forward-Port-Of: odoo/enterprise#97028
Customers receiving Gelato shipping notifications now get a working tracking link for single-parcel shipments. This prevents broken links in delivery emails and helps customers follow their orders more reliably.
Original PR description
After receiving the shipping webhook from Gelato, we send a shipping notification with the tracking information to the customer. This commit fix the tracking url for single parcel, which was pointing to an inexistant url. opw-4637331 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website form fields that are still in use can no longer be deleted from the underlying model. This prevents page editing crashes and guides users to remove the field from the form before deleting it.
Original PR description
The system crashes when a user tries to edit a website form field and that field has already been deleted from the model. **Steps to produce:-** - Install the `website` module. - Create a `new custom…
The system crashes when a user tries to edit a website form field and that field has already been deleted from the model. **Steps to produce:-** - Install the `website` module. - Create a `new custom field` on a model(for example, a field on the `mail.mail` model). - Website > edit > `add Form` widget to a page, and configure it to use the `mail.mail` model. - Add the newly created custom field to the form and save the page. - Now, `delete` the custom field which is created previously. - Return to the website page > edit > mark the deleted field as required, and attempt to save the changes. **Error:-** `ValueError: Unable to whitelist field(s) [''] for model 'mail.mail'.` **Root cause:-** - At [1], we can see that in the current version, it `only logs an error` using the logger, but in later versions, it `raises a ValueError` instead. **Solution:-** - This fix prevents a field from being deleted if it is actively used in any website form. - It adds a validation check that blocks the deletion and raises an error, forcing the user to remove the field from the form first. [1]: https://github.com/odoo/odoo/blob/d4f424d731fa93ccd232d0def0a7612997345ef7/addons/website/models/website_form.py#L123-L126 **sentry-5689731444** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures the Spanish Facturae electronic invoicing tax information is loaded for the right Spanish tax templates, including mainland and Canary Islands setups. It prevents unrelated taxes from receiving an incorrect default electronic invoicing tax type, improving accuracy for compliant invoice reporting.
Original PR description
Currently the tax data defined in l10n_es_edi_facturae is incomplete and never loaded. This commit makes sure that the l10n_es_edi_facturae_tax_type is loaded correctly and adds the appropriate templates for es_common_mainland and es_canary_common. The default is also removed on the field l10n_es_edi_facturae_tax_type to avoid the value being assigned for unrelated taxes. task-4981325
The main menu search field now tells browsers and password managers not to offer autocomplete suggestions. This prevents unwanted Bitwarden popups from covering the menu while keeping Odoo's own search suggestions unchanged.
Original PR description
Bitwarden pops up small form on top of the main menu for no reason. It is because of the hidden input created to trigger search when you type. Put `autocomplete="off"` to avoid these popups, as the search feature handle its own autocompletion. Note: this commit is a backport of odoo/odoo@403d7b70ab16b8b70ea46aa692883c7b4a6e83b7 Forward-Port-Of: odoo/enterprise#97506
Documentation and clarification updates
The contributor list has been updated to include Acsone/Tobias Zehntner as having signed the required contributor agreement. This helps keep Odoo's contribution records complete and supports clear legal governance for future contributions.
Original PR description
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
6 changes
Enhancements to existing features
This update refreshes Luxembourg payroll parameters for 2025, including minimum social salary values and employee tax credit calculations. It helps payroll teams apply the latest official Luxembourg social security and tax rules accurately in salary computations.
Original PR description
Sources: - https://igss.gouvernement.lu/dam-assets/publications/param%C3%A8tres-sociaux/2025/par-soc-202501.pdf - https://igss.gouvernement.lu/dam-assets/publications/param%C3%A8tres-sociaux/2025/par-soc-202505.pdf - https://impotsdirects.public.lu/fr/az/c/CIP/cip2025.html - https://impotsdirects.public.lu/fr/az/c/credit-impot-salaries/cis2025.html task-5176255
Resolved issues and error corrections
This fix helps ensure automated tests finish cleanly by detecting leftover processes that could keep running after a test ends. It also adds a warning during server shutdown when such processes are found, making test issues easier to identify and resolve.
Original PR description
In some case a process could remain aive at the end of a tests In addition to possible race condition, this can also cause a program to remain stuck at the end of the tests. This commit proposes to - catch all remaining processes at the end of a base case. - log a message if a process is found at the shutdown of the server. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an unwanted Bitwarden popup appearing over the Odoo main menu when users start typing to search. The hidden search field now disables browser and extension autocomplete, keeping the menu experience clean while Odoo’s own search suggestions continue to work.
Original PR description
Bitwarden pops up small form on top of the main menu for no reason. It is because of the hidden input created to trigger search when you type. Put `autocomplete="off"` to avoid these popups, as the search feature handle its own autocompletion. Note: this commit is a backport of odoo/odoo@403d7b70ab16b8b70ea46aa692883c7b4a6e83b7
The Planning Analysis report now excludes employee time off and public holidays when calculating planned hours. This prevents leave days from being counted as project work, giving managers more accurate planning and timesheet reporting.
Original PR description
**Description** The Timesheet/Planning Analysis report (Timesheets > Planning Analysis) incorrectly calculates planned hours by not excluding employee time-off and public holidays. This results in…
**Description** The Timesheet/Planning Analysis report (Timesheets > Planning Analysis) incorrectly calculates planned hours by not excluding employee time-off and public holidays. This results in leave days being assigned the average daily hours from planning slots and incorrectly attributed to projects. **Steps to Reproduce** 1. Create a planning slot for an employee spanning a full month 2. Add employee time-off (resource.calendar.leaves) during that period 4. Navigate to Timesheets > Timesheets / Planning Analysis report 5. Filter by the employee and date range 6. Observe: Planned hours include leave days, incorrectly attributed to the planning slot's project **Root Cause** The SQL query filters by day of week (weekends) but never queries `resource_calendar_leaves`. While `working_days_count` correctly excludes leaves, the report still generates rows for those leave days and assigns them average hours per day, causing the discrepancy. **Solution** Filter out dates that have employee time-off or public holidays by joining to `resource_calendar_leaves` and excluding matching dates. opw-5126359
After users validate their email for e-learning access, outdated validation messages no longer keep reappearing on the website. This avoids confusion and gives users a cleaner confirmation experience without requiring them to log out and back in.
Original PR description
**Description** External users signing up for e-learning courses. They encounter an "account not validated" banner on the website. After clicking the "Validate Account" button in the email, users are…
**Description** External users signing up for e-learning courses. They encounter an "account not validated" banner on the website. After clicking the "Validate Account" button in the email, users are redirected back to the website, and the> 1. **When user validates email**: The system sets `request.session['validation_email_done'] = True` 2. **Template shows banner based on session**: `validation_email_done` from session determines if congratulations banner appears 3. **Session persists but doesn't sync**: Even after user is fully validated, the session flag stays `True` 4. **Page refresh = banner reappears**: Every page reload checks session and shows banner again 5. **Clicking "X" only hides temporarily**: The close button doesn't actually clear the session flag properly **Cause**: When clicking on close button, bootstrap detach `.validated_email_close` alert component from the DOM. When jQuery should call `_onCloseValidatedEmailClick` handler, it finds that `.validated_email_close` is not a child of `.o_wprofile_email_validation_container` so it ignores the event. **Fix**: Check that the event target was `.validated_email_close` inside `_onCloseValidatedEmailClick` instead of using delegation. **Result**: The congratulations banner shows once after validation, then automatically disappears forever without requiring logout/login. **Additional issue identified**: After implementing the frontend fix, the `validation_email_sent` banner persists because this session flag is never reset. This creates a new UX issue where users continue to see "verification email sent" messages inappropriately. **Solution**: Clear the `validation_email_sent` flag when email validation succeeds. This ensures proper session state cleanup and prevents stale banner messages. opw-4817084
Mexican global invoices now use the invoice sequence configured for the branch company when one exists. This ensures the CFDI series shown on invoices matches the branch issuing the document, reducing numbering errors and manual corrections.
Original PR description
**Issue description:** When generating a Mexican global invoice (CFDI), the system uses the sequence from the parent company, even when a separate sequence was defined for the branch company.…
**Issue description:** When generating a Mexican global invoice (CFDI), the system uses the sequence from the parent company, even when a separate sequence was defined for the branch company. **FIX:** We first check for a dedicated sequence on the branch company. If it does not exist, we use/create the sequence for the parent company. **Steps to reproduce:** 1. Ensure that `l10n_mx_edi` is installed 2. Create a Mexican company and a branch for it. 3. Create a sequence for the parent company with code = `l10n_mx_global_invoice_cfdi` and set the prefix, or try to generate a global invoice from the parent company to create the sequence automatically (similar to step 6). 4. Create a similar sequence for the branch company (set company = branch), but use a different prefix to distinguish it from the parent company sequence. 5. Using the branch company, create an invoice. 6. From the invoice list view, select the invoice and use the action "Create Global Invoice". 7. Open the invoice and check the CFDI XML. The `Serie` field is incorrectly set to the prefix of the parent company's sequence instead of the branch's sequence. opw-5096687