Daily updates from Odoo
Navigate
Branch
Wednesday, November 12, 2025
170 changes
13 changes
Resolved issues and error corrections
This fixes an access issue that prevented some Recruitment administrators from sending referral campaigns when they did not have Employee access. The change ensures the right users can complete this common recruitment action smoothly.
Original PR description
STEP TO REPRODUCE:
------------------
1- Give to Marc Demo the right : Recruitment / Administrator (be sure he doesn't have any right on Employees)
2- Log as Marc Demo
3- Go to Recruitment
4- Click on the three dots in kanban card
5- Click on Referral Campaign
6- Click on Send
You will have an access error
This user (with these groups) should be able to send a referral campaign
task-5082344
Forward-Port-Of: odoo/enterprise#98773
Forward-Port-Of: odoo/enterprise#96746The upload button in accounting dashboards could be accidentally dragged out of place. This update locks the button in position so the interface stays stable and easier to use.
Original PR description
Issue: - In the dashboard, the upload button (purchase journal and others) could be dragged. - This caused unintended movement of the upload UI element. Fix: - Added `draggable=false` to the upload button element. - Ensures the button remains fixed and cannot be dragged around. TaskID-5114617 Forward-Port-Of: odoo/odoo#235086 Forward-Port-Of: odoo/odoo#229013
Updated a purchase-related test so it accepts the error type now returned by PostgreSQL 18. This keeps automated test runs stable after a database behavior change, without affecting customer-facing purchase features.
Original PR description
Apparently in pg18 a standard-compliance fix (postgres/postgres@086c84b23d99c2ad268f97508cd840efc1fdfd79) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted…
Apparently in pg18 a standard-compliance
fix (postgres/postgres@086c84b23d99c2ad268f97508cd840efc1fdfd79) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted `FOREIGN_KEY_VIOLATION`. One such case is specifically being tested for by `test_purchase_order_line_without_uom`, leading to this test failing systematically when running pg18:
psycopg2.errors.RestrictViolation: update or delete on table "uom_uom" violates RESTRICT setting of foreign key constraint "purchase_order_line_product_uom_id_fkey" on table "purchase_order_line"
DETAIL: Key (id)=(29) is referenced from table "purchase_order_line".
Update the test to use the more generic `IntegrityError` as it's probably more than sufficient for our purposes. Technically we could pass a tuple of `(ForeignKeyViolation, RestrictViolation)` but it doesn't really seem necessary. And it would require fixing the `_raisesContext` override as currently it is very much *not* compatible with that.
Forward-Port-Of: odoo/odoo#235119A test in the HR module was trying to access employee fields that are not always available on an employee record, which caused a build failure. The test now checks whether each field can actually be accessed before using it, preventing this crash and keeping automated builds stable.
Original PR description
This test had a bug: `self.env['hr.employee']._fields.keys()` may contain fields that do not exist in an `hr.employee` record. Now, employee fields that cannot be accessed are filtered out using `hasattr()`. To avoid further crashes. Runbot build error: https://runbot.odoo.com/odoo/runbot.build.error/233942 Bug has been introduced by task-5103739 task-5254322 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change fixes flaky website builder tests related to editing images. It ensures the required image assets load before the tests continue, so results are consistent and failures no longer happen randomly.
Original PR description
The goal of this commit is to fix the indeterminate tests related to image editing in the website builder. Problem: ===== Some tests related to image editing on the website fail in an indeterminate…
The goal of this commit is to fix the indeterminate tests related to image editing in the website builder. Problem: ===== Some tests related to image editing on the website fail in an indeterminate manner. This test failure is related to the sidebar's async. When selecting an image, the Image options need to fetch certain data (the original image, etc.). The “html_editor.assets_image_cropper” bundle is also loaded. This loading time can exceed 200 ms, causing the test to fail unpredictably. Solution: ====== 1.Preload the “html_editor.assets_image_cropper” bundle and store it in the cache. 2. Use `waitSidebarUpdated` when selecting an image. `waitSidebarUpdated`` will wait until all the data is loaded and the sidebar is updated. This solution is not optimal, but it will make all the tests deterministic. The best solution: ========= We should mock or preload all the data needed for the tests. This change requires adapting the current production code to make it easily patchable to mock, for example, “.text()” on a response to an image fetch. Error: https://runbot.odoo.com/odoo/error/232956 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a pivot table with date-based columns is inserted into a spreadsheet, it now keeps the same sort order as in the web view. This fixes cases where the spreadsheet version could appear unsorted because date values were not being translated into the expected display format.
Original PR description
If on the web pivot view we create a pivot with a date/dateTime field in the columns, and sort on one of these columns, the resulting pivot when inserted in a spreadsheet isn't sorted. This was because we didn't normalize the date values in the pivot `sortedColumn`, and we had UTC timestamps `2023-01-01 00:00:00` instead of normalized values `01/2023`. Task: [3575465](https://www.odoo.com/web#id=3575465&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#96508
This update prevents spreadsheet crashes when freezing or sharing sheets that use boolean global filters. It makes exporting to Excel more reliable by correctly handling empty filter values.
Original PR description
The method `getFilterDisplayValue` would not handled `undefined` values for boolean global filters, causing crashes when exporting to Excel. Task: [5188932](https://www.odoo.com/web#id=5188932&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) 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#232784
This change fixes Swiss ISO20022 payment files so they no longer mix incompatible XML formats and get rejected by some banks. The previous behavior is now only enabled when explicitly requested, which helps companies keep file generation compatible with their bank’s requirements.
Original PR description
[REV] account_iso20022: Wrong XML generated for Switzerland This reverts commit https://github.com/odoo/enterprise/commit/a0e981171808d4e475249431424955ab2223f5da. This commit was introduced after…
[REV] account_iso20022: Wrong XML generated for Switzerland This reverts commit https://github.com/odoo/enterprise/commit/a0e981171808d4e475249431424955ab2223f5da. This commit was introduced after this fix https://github.com/odoo/enterprise/commit/c160b2ead711797ca7362649971038cc245c5611. Though that original fix was correct, it had some unwanted side-effects: due to the payment method being forced on some payments in order to use SEPA, the sepa_pain_version field was used to generate the corresponding XML nodes, most of the time keeping its default value of pain.001.001.09. For Swiss banks supporting pain.001.001.09 (which becomes mandatory in November 2026), it was not a problem, and everything worked fine. This was the case of the customer for whom the fix was made (ticket 4535542). For the ones still not supporting it, and expecting pain.001.001.03, the bank refused the file, since the it contained unsupported nodes, like BICFI, or a subnode to ReqdExctnDt. The commit we revert here tried to patch the symptoms without really understanding the cause of the issue, by not forcing the payment method everywhere. It breaks again the case of the original ticket (because ScvLvl is not passed to "SEPA" on EUR payments), and essentially makes no sense. We revert it in favor of a better fix. ticket-4535542 ======================= [FIX] account_iso20022: Swiss variant: introduce config parameter to force SEPA nodes in the file https://github.com/odoo/enterprise/commit/c160b2ead711797ca7362649971038cc245c5611 made it so we now force SEPA payments into Swiss ISO20022 files when they're made in EUR to an IBAN account. Though all in all correct, this fix forgot to consider the fact that the SEPA nodes would be generated using the sepa_pain_version field, with defaults to pain.001.001.09 version of the ISO standard. As it is today, the Swiss file is still generated using pain.001.001.03 in Odoo (some task will change that soon, since the support for that old version will be dropped in November 2026). Having such pain.001.001.09 nodes in the file causes it to be rejected by a lot of Swiss banks, because they don't support that version yet, or simply because of the file mixing both versions of the standard. Since no one had asked us to enforce SEPA nodes within the file before recently, we make the choice to keep the fix behavior only when a config parameter is explicitly set to enable it. In all other cases, the former behavior is restored. We also now display the PAIN version field in the journal's form view when this config parameter is set, to give more control on the format of the generated file. ticket-4535542 Forward-Port-Of: odoo/enterprise#99005 Forward-Port-Of: odoo/enterprise#98918
Live chat visitors on mobile devices will no longer have the chat input automatically zoom in when they tap it. This keeps the send button visible and makes it easier to type and send messages without having to zoom back out manually.
Original PR description
Before this commit, when using livechat for visitors on mobile devices, click on input would zoom on input of about 115%. This zoom would hide send button at the very end of composer input, and would…
Before this commit, when using livechat for visitors on mobile devices, click on input would zoom on input of about 115%. This zoom would hide send button at the very end of composer input, and would force users to pinch-to-unzoom, making the UX quite poor. This problem happens because mobile devices have an auto-zoom feature that is triggered when font-size is below 16px. The discuss UI is designed with 14px font size (web client font size), and since 14px < 16px, it zooms on input focus to about 115%. This commit fixes the issue by using a font-size of 16px specifically for livechat visitor on mobile devices, so that this doesn't auto-zoom. Note that this problem doesn't happen on the web client even though this uses a font-size of 14px because it specifically disable the autozoom feature: https://github.com/odoo/odoo/blob/17.0/addons/web/views/webclient_templates.xml#L250 This solution is not practical for livechat, for which it has to work on any external website. opw-5229076 Before <img width="199" height="431" alt="after" src="https://github.com/user-attachments/assets/cc2f8e04-bde7-4eeb-84d5-b2efa2763490" /> After <img width="199" height="431" alt="before" src="https://github.com/user-attachments/assets/6c6679fc-9c16-40e7-ab6f-21540d20d59d" /> Forward-Port-Of: odoo/odoo#235182 Forward-Port-Of: odoo/odoo#234967
The website builder’s selection dropdown now correctly displays all available options when users change an existing choice. This fixes a bug where only four options were shown, helping users make updates without confusion or extra steps.
Original PR description
With the initial [website builder refactor], only 4 options appeared in the `many2x` dropdown when user try to re-select. This commit fixes the issue so the dropdown now fetches all required options through passing domain in rpc call instead of filtering after rpc call this makes sure we only fetch required data by avoiding already selected ids. Steps to Reproduce: 1. Open the website builder. 2. Drop any snippet onto the page. 3. Set the visibility option to conditionally. 4. In the UTM medium dropdown, select any social media option. 5. Try changing the selection again. 6. Only 4 options are shown. Expected: Dropdown should always display 5 options. [website builder refactor]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
This change makes input fields inside image captions use a transparent background instead of a dark gray one. It improves the visual consistency of captions and makes the editor look cleaner for users.
Original PR description
### Purpose of this PR: - Set the default background of inputs inside `<figcaption>` to transparent. This prevents them from appearing dark gray (rgb(59,59,59)) in caption. task-5122745 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents a table placed inside another table from growing beyond the space available in its parent cell when resized. As a result, nested tables stay usable and editable instead of becoming partially hidden or inaccessible.
Original PR description
**Current behavior before PR:** - When a table was created inside another table, resizing the inner table could cause it to overflow its parent cell, making it uneditable. **Desired behavior after PR is merged:** - The inner table no longer overflows its parent cell when resized, ensuring it remains editable. task-5216916 Forward-Port-Of: odoo/odoo#233554
This change fixes an issue in the mobile editor where using a formatting button like bold could incorrectly switch the toolbar to the image tools. The toolbar now stays in the correct mode and clearly highlights the selected formatting option, making editing on mobile more reliable.
Original PR description
**Current behavior before PR:** In mobile view, when applying the bold format using the toolbar button, the normal toolbar is incorrectly replaced by image toolbar. This occurs because `getFilteredTargetedNodes` returns an empty array, and as a result, the `isApplied` method evaluates to true since Array.every on an empty array returns true. **Desired behavior after PR:** This PR ensures that the toolbar remains in its normal state when a format is applied via the toolbar button. The corresponding format button (e.g., bold) is correctly highlighted. task-5123317 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234467 Forward-Port-Of: odoo/odoo#229454
18 changes
Enhancements to existing features
This change speeds up how Odoo calculates invoice and journal entry amounts, especially when there are many lines to process. It reduces waiting time and memory usage, which makes large accounting operations noticeably faster and more efficient.
Original PR description
Currently performance on `_compute_amount()` is bottlenecked by `__get__()` calls on fields on `line_ids`. We tackle this bottleneck by warming the cache with `fetch()` Benchmark on reconciling 2 account moves with ~70k lines each | |Total Time|Allocated Memory|Queries| |----------|----------|----------------|-------| |Before |43.23s |2GB |993 | |After |18.60s |1GB |693 | opw-5098543 Forward-Port-Of: odoo/odoo#234656
The point-of-sale opening flow no longer checks whether blackbox drivers are up to date. This streamlines session start, while outdated drivers will still trigger an error when a blackbox feature is actually used, so users are protected without an extra startup step.
Original PR description
When introducing the blackbox queue service, we added a check at the opening of the POS to ensure that the blackbox drivers were up to date. This check is done at the start of session opening. It is now not necessary anymore, if the drivers are not up to date, an error will also be shown to the user when they try to use a blackbox functionality.
This update adds a simpler way to select elements by their exact text in Hoot test selectors. It replaces a more complex matching pattern with a clearer option, making tests easier to read and maintain without changing business behavior.
Original PR description
This commit adds the ':text()' pseudo-class to the list of supported pseudo-classes in Hoot selectors. Its purpose is the same as ':contains()', with the specificity of being an *exact* match instead of a *partial* one. It effectively replaces ':contains(/^<expression>$/)' by ':text(<expression>)', improving the readability and making the developer experience a bit nicer. Enterprise: https://github.com/odoo/enterprise/pull/98772 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234989 Forward-Port-Of: odoo/odoo#234331
This update switches some internal test checks to a more precise text-matching method. It helps keep automated tests stable and reduces the chance of false matches when checking on-screen text.
Original PR description
This commit replaces all found occurrences where ':contains' (with an exact match regular expression) could be replaced by ':text'. Community: https://github.com/odoo/odoo/pull/234331 Forward-Port-Of: odoo/enterprise#99130 Forward-Port-Of: odoo/enterprise#98772
Resolved issues and error corrections
Users will now see inbox messages directly in the top messaging menu, including notifications like signature requests that were previously hidden there. This makes important messages easier to find and reduces confusion when a notification badge was shown but the message itself was not visible.
Original PR description
**Steps to reproduce:** - Set handle notifications in Odoo for one user - Go to `Sign` app with another user - Create a signature request for the first user - The first user is properly notified of…
**Steps to reproduce:** - Set handle notifications in Odoo for one user - Go to `Sign` app with another user - Create a signature request for the first user - The first user is properly notified of the signature request, as the counter badge is updated. - When clicking on the badge, no new message is shown. **Issue:** Inbox messages are not considered in the `MessagingMenu` when they are not linked to any record. It's the case when a signature request is sent and while the notification counter is updated, the message can't be seen in the top bar menu, it's only visible in the `Discuss` app > Inbox which is quite confusing for the users. In previous versions the behavior was different as the signature request was either considered as an activity or no notification was sent. Also if the inbox message is linked to a record, it only appears in the `all` filter of the menu. **Fix:** Added the inbox explicitly to the top `MessagingMenu` to be able to read the corresponding messages. We could also link the signature to its record when sending the message instead of `self.env['sign.request']._message_send_mail()` but it might cause access rights issues. Also ensured that a category `others` was used for such messages, and prevented an error caused by clicking on the conversation when the `Discuss` app was opened. Unfortunatly doing this will show duplicates in the notifications of the menu for messages which are in the inbox but which have a record set. (e.g. when such message appears, it will have one line in the inbox and one for the record itself) So we need to filter out the messages which have a thread from their record in the views to avoid it. related: https://github.com/odoo/enterprise/commit/463d6a2aae536356e6dee6b902f2e881dbc4fbda opw-4969005 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228740
This update corrects how date and work-time intervals are combined so the system always normalizes them before merging. It prevents inconsistent results and errors in planning-related operations, improving reliability when different interval types are used together.
Original PR description
## The issue Prior to this commit, the `other` parameter in the `_merge` method could belong to a different class, not necessarily an instance of `Intervals`.…
## The issue Prior to this commit, the `other` parameter in the `_merge` method could belong to a different class, not necessarily an instance of `Intervals`. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L158-L165 The comment indicates that normalization should be enforced; however, there is no corresponding reference to it within the `_boundaries` method. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L48-L53 That normalization just happens in the `__init__`. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L117-L132 ## Example For example, in Planning module, we perform operations between `Intervals` and `WorkIntervals`. The `WorkIntervals` class behaves differently from `Intervals`: while `Intervals` uses disjoint closed intervals, `WorkIntervals` uses disjoint semi-closed intervals. ## Side effects During these operations, the `_merge` method was not normalizing the `_items`, which caused inconsistencies and errors (when we are merging two unormalized intervals `([0, 10], [10, 20])` with an empty `others`). ## The fix This commit ensures that the `other` parameter is normalized before processing the `_merge` operation. The fix ensures that normalized intervals are always produced after `_merge`, even when unnormalized intervals are provided as input. ## Real case That issue has been found in that ticket: 5184291 Forward-Port-Of: odoo/odoo#234352
Livechat on mobile devices now keeps the message input at a size that prevents the browser from zooming in when it is tapped. This keeps the send button visible and makes it easier for visitors to chat without having to pinch back out.
Original PR description
Before this commit, when using livechat for visitors on mobile devices, click on input would zoom on input of about 115%. This zoom would hide send button at the very end of composer input, and would…
Before this commit, when using livechat for visitors on mobile devices, click on input would zoom on input of about 115%. This zoom would hide send button at the very end of composer input, and would force users to pinch-to-unzoom, making the UX quite poor. This problem happens because mobile devices have an auto-zoom feature that is triggered when font-size is below 16px. The discuss UI is designed with 14px font size (web client font size), and since 14px < 16px, it zooms on input focus to about 115%. This commit fixes the issue by using a font-size of 16px specifically for livechat visitor on mobile devices, so that this doesn't auto-zoom. Note that this problem doesn't happen on the web client even though this uses a font-size of 14px because it specifically disable the autozoom feature: https://github.com/odoo/odoo/blob/17.0/addons/web/views/webclient_templates.xml#L250 This solution is not practical for livechat, for which it has to work on any external website. opw-5229076 Before <img width="199" height="431" alt="after" src="https://github.com/user-attachments/assets/cc2f8e04-bde7-4eeb-84d5-b2efa2763490" /> After <img width="199" height="431" alt="before" src="https://github.com/user-attachments/assets/6c6679fc-9c16-40e7-ab6f-21540d20d59d" /> Forward-Port-Of: odoo/odoo#235150 Forward-Port-Of: odoo/odoo#234967
When a pivot table with date or date-time columns was inserted into a spreadsheet, its sort order could be lost. This fix keeps the original date-based sorting so spreadsheet pivots display in the expected order.
Original PR description
If on the web pivot view we create a pivot with a date/dateTime field in the columns, and sort on one of these columns, the resulting pivot when inserted in a spreadsheet isn't sorted. This was because we didn't normalize the date values in the pivot `sortedColumn`, and we had UTC timestamps `2023-01-01 00:00:00` instead of normalized values `01/2023`. Task: [3575465](https://www.odoo.com/web#id=3575465&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#96508
This change fixes an issue where installing the Argentina withholding demo data created duplicate tax records. As a result, users will now see a clean, single set of taxes instead of repeated entries with copy labels.
Original PR description
**Description of the issue/feature this PR addresses**: This pr is to avoid duplicated taxes when the demo data is installed. **Steps to reproduce**: 1. Install l10n_ar_withholding module with demo…
**Description of the issue/feature this PR addresses**: This pr is to avoid duplicated taxes when the demo data is installed. **Steps to reproduce**: 1. Install l10n_ar_withholding module with demo data. 2. Take position in "(AR) Responsable Inscripto" company. 3. Check the taxes created on "Invoicing > Configuration > Accounting > Taxes". 4. Delete the filter "Sale or Purchase". 5. Add custom filter: Argentina Withholding Payment Tax type (l10n_ar_withholding_payment_type) is in ["supplier", "customer"]. 6. You will see that there are duplicated taxes (duplicated names) with suffix (Copy). **Current behavior before PR**: Duplicated taxes are created when demo data is installed. <img width="1597" height="795" alt="image" src="https://github.com/user-attachments/assets/51b65037-bb89-4ec7-8adf-21636b68e405" /> **Desired behavior after PR is merged**: No duplicated taxes are created when demo data is installed. _Task latam side_: 1360. _Task Adhoc side_: 57627. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226992
This update adjusts an automated purchase test so it works correctly with PostgreSQL 18. It prevents the test suite from failing due to a database error code change, helping maintain reliable validation in ongoing development and releases.
Original PR description
Apparently in pg18 a standard-compliance fix (postgres/postgres@086c84b23d99c2ad268f97508cd840efc1fdfd79) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted…
Apparently in pg18 a standard-compliance
fix (postgres/postgres@086c84b23d99c2ad268f97508cd840efc1fdfd79) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted `FOREIGN_KEY_VIOLATION`. One such case is specifically being tested for by `test_purchase_order_line_without_uom`, leading to this test failing systematically when running pg18:
psycopg2.errors.RestrictViolation: update or delete on table "uom_uom" violates RESTRICT setting of foreign key constraint "purchase_order_line_product_uom_id_fkey" on table "purchase_order_line"
DETAIL: Key (id)=(29) is referenced from table "purchase_order_line".
Update the test to use the more generic `IntegrityError` as it's probably more than sufficient for our purposes. Technically we could pass a tuple of `(ForeignKeyViolation, RestrictViolation)` but it doesn't really seem necessary. And it would require fixing the `_raisesContext` override as currently it is very much *not* compatible with that.
Forward-Port-Of: odoo/odoo#235119The dashboard upload button can no longer be moved by dragging it. This keeps the interface stable and avoids accidental changes to the button’s position while users work.
Original PR description
Issue: - In the dashboard, the upload button (purchase journal and others) could be dragged. - This caused unintended movement of the upload UI element. Fix: - Added `draggable=false` to the upload button element. - Ensures the button remains fixed and cannot be dragged around. TaskID-5114617 Forward-Port-Of: odoo/odoo#235086 Forward-Port-Of: odoo/odoo#229013
This update fixes Swiss ISO 20022 payment files so banks receive the expected XML structure again. The change only forces SEPA-specific nodes when an explicit configuration is enabled, which helps avoid bank rejections caused by mixed or unsupported file formats.
Original PR description
[REV] account_iso20022: Wrong XML generated for Switzerland This reverts commit https://github.com/odoo/enterprise/commit/a0e981171808d4e475249431424955ab2223f5da. This commit was introduced after…
[REV] account_iso20022: Wrong XML generated for Switzerland This reverts commit https://github.com/odoo/enterprise/commit/a0e981171808d4e475249431424955ab2223f5da. This commit was introduced after this fix https://github.com/odoo/enterprise/commit/c160b2ead711797ca7362649971038cc245c5611. Though that original fix was correct, it had some unwanted side-effects: due to the payment method being forced on some payments in order to use SEPA, the sepa_pain_version field was used to generate the corresponding XML nodes, most of the time keeping its default value of pain.001.001.09. For Swiss banks supporting pain.001.001.09 (which becomes mandatory in November 2026), it was not a problem, and everything worked fine. This was the case of the customer for whom the fix was made (ticket 4535542). For the ones still not supporting it, and expecting pain.001.001.03, the bank refused the file, since the it contained unsupported nodes, like BICFI, or a subnode to ReqdExctnDt. The commit we revert here tried to patch the symptoms without really understanding the cause of the issue, by not forcing the payment method everywhere. It breaks again the case of the original ticket (because ScvLvl is not passed to "SEPA" on EUR payments), and essentially makes no sense. We revert it in favor of a better fix. ticket-4535542 ======================= [FIX] account_iso20022: Swiss variant: introduce config parameter to force SEPA nodes in the file https://github.com/odoo/enterprise/commit/c160b2ead711797ca7362649971038cc245c5611 made it so we now force SEPA payments into Swiss ISO20022 files when they're made in EUR to an IBAN account. Though all in all correct, this fix forgot to consider the fact that the SEPA nodes would be generated using the sepa_pain_version field, with defaults to pain.001.001.09 version of the ISO standard. As it is today, the Swiss file is still generated using pain.001.001.03 in Odoo (some task will change that soon, since the support for that old version will be dropped in November 2026). Having such pain.001.001.09 nodes in the file causes it to be rejected by a lot of Swiss banks, because they don't support that version yet, or simply because of the file mixing both versions of the standard. Since no one had asked us to enforce SEPA nodes within the file before recently, we make the choice to keep the fix behavior only when a config parameter is explicitly set to enable it. In all other cases, the former behavior is restored. We also now display the PAIN version field in the journal's form view when this config parameter is set, to give more control on the format of the generated file. ticket-4535542 Forward-Port-Of: odoo/enterprise#99005 Forward-Port-Of: odoo/enterprise#98918
This update fixes two issues on the careers page. Visitors who are not logged in will now be redirected to the correct country more reliably, and job opening counts will display correctly even when grouped by different office or location fields.
Original PR description
This commit fixes 2 bugs: When you are not logged in and geolocalized, we don't redirect the visitor to the right country because the visitor cannot read hr.job, so the count will always be 0. Now we use sudo to have the count whether you are logged in or not. Another bug is in compute_filter_selection_counters: in case you provide a key_getter that is not the same as the grouping_field, when we count, we only keep the last count in case of duplicates. Eg, if you group by address_id and count the address_id.country_id, you will get the count of hr.job open in the last office you iterate over.
This update prevents the website editor from crashing when someone presses Delete without an active text selection. It improves stability during normal editing so users can remove content without triggering an error message.
Original PR description
If the selection of the document is not set and the user presses the delete key, the delete handler of the list plugin throws an error. Steps to reproduce (in 19.0, where the issue was discovered): - Open website builder - Drop the video inner snippet in the header - Double-click & drag from the video to just outside the video - Click once on the video - Press "delete" - Bug: Traceback task-5186954
The website now uses the same tax display rules in its structured data as it does on the page itself. This keeps the price shown to search engines consistent with the price customers see, especially when the website is configured to show taxes included.
Original PR description
## Version
18.2+
SEO Schema refactoring from task-3866937
## Issue
The markup always contains the price without taxes, no matter the website settings for pricing display (with or without taxes).
## Steps to reproduce
- Go to Website settings:
- Choose "Taxes Included" for "Display Product Prices".
- Got to the shop and select any product on which taxes apply (e.g. Customizable Desk):
- Open console and execute `JSON.parse(document.querySelectorAll('[type="application/ld+json"]')[1].innerHTML)[0]['hasVariant'][0]['offers']['price']`;
- The found price and the displayed price (visible on the page) are different
## Fix
Allow tax inclusion based on parameter to mimic template's behavior on variants too depending on the website.
https://github.com/odoo/odoo/blob/52a6d88a188d5456262428847aed229f117da8ed/addons/website_sale/models/product_template.py#L377-L430
opw-4923780
Forward-Port-Of: odoo/odoo#225577This fix prevents a table placed inside another table from growing beyond its parent cell when resized. As a result, nested tables remain visible and editable, avoiding a frustrating editing issue for users.
Original PR description
**Current behavior before PR:** - When a table was created inside another table, resizing the inner table could cause it to overflow its parent cell, making it uneditable. **Desired behavior after PR is merged:** - The inner table no longer overflows its parent cell when resized, ensuring it remains editable. task-5216916 Forward-Port-Of: odoo/odoo#233554
The website SEO optimization dialog now waits for the page preview to finish loading before opening. This prevents occasional crashes when users open the dialog immediately after reloading a page on a slow connection.
Original PR description
Steps to reproduce: - Open Website app and enter edit mode on any page. - Reload the page with a slow connection. - Immediately open "Optimize SEO" from the navbar menu. Before this commit, the dialog accessed the preview document while the iframe was reloading, so reading location.origin raised a TypeError. After this commit, the dialog waits for the iframe to finish loading or returns immediately when it is already complete, preventing crashes. task-5104033 Forward-Port-Of: odoo/odoo#230820
This change resolves an error that could occur in Odoo Studio during automated testing. It helps ensure Studio behaves reliably and avoids interruptions in validation workflows.
Original PR description
Forward-Port-Of: odoo/enterprise#98881
4 changes
Resolved issues and error corrections
This change fixes a failing test in the app creation experience used by Studio. It helps keep the product stable by preventing an error in automated validation, reducing the risk of regressions reaching users.
This fix makes it possible to drag and drop documents on touch devices, where the previous browser behavior could lose the data needed to complete the drop. It improves the experience for mobile users by restoring a feature that was failing in some browsers.
Original PR description
For now, touch devices do not work with native drag and drop in browsers. When a datatransfer is set on a dragstart event, it is lost before reaching the drop event, but only when using a touch device. Unfortunately, I still haven't found any sources that clearly explain whether this is a known bug or a limitation. The fact that on mobile (really mobile, not devtools, you need a touch device) drag fails on Chrome but succeeds on Firefox. To fix this issue, this commit manages datatransfers in an external variable, without using the method in the Event. I keep the original behavior as default, I just add a fallback to my global datatransfer variable. opw-5139435 Forward-Port-Of: odoo/enterprise#97091
This update corrects a test in the barcode batch workflow so it runs reliably on newer Python versions. It prevents false test failures caused by changes in how record ordering is handled, helping maintain stable quality checks.
Original PR description
*: stock_barcode_picking_batch Steps to reproduce ================== Use python > 3.10 Run the test test_pack_batch_in_multiple_packages It fails on assertRecordValues, the records are not in the same order Cause of the issue ================== Recordsets ordering is not stable across python versions. It is implemented as `return set(self._ids) < set(other._ids)` https://github.com/odoo/odoo/blob/8a026b875a9b70f12689cdbd71d7e54b987d0612/odoo/models.py#L6636 Since this is a subset check, it always returns false when called with different ids Solution ======== Compare using the id directly opw-231140 Forward-Port-Of: odoo/enterprise#99118
This change simplifies a styling rule used in spreadsheet side panels. It keeps the same visual result while making the code easier to maintain and reducing the risk of future styling issues.
Original PR description
Because of a really strong rule in o_spreadsheet lib that forced the box-sizing property pretty much everywhere, we came up with a super dense rule to counteract it inside odoo and specifically inside the side panels. This commits aims to simplify it at best with the common denominator of those rules. Task-4878174 Forward-Port-Of: odoo/enterprise#98876
22 changes
Security fixes and vulnerability patches
The logout action now requires an intentional request, preventing users from being unexpectedly signed out by embedded content such as images in messages. This improves session reliability and reduces a minor security risk across affected workflows.
Original PR description
Currently, it is possible to trick and send an image containg '/web/session/logout' embedded in the chatter. Anytime, the image gets loaded, the user gets disconnected which can be pretty annoying. To avoid such behavior, we made to logout route POST only. task-5245320
Enhancements to existing features
The US Profit and Loss reports have been updated to make key sections easier to read and compare. This improves financial report clarity for users reviewing business performance, without changing the underlying accounting data.
Original PR description
Purpose: Improve the layout of the US Profit and Loss reports to enhance visualization of important sections. task-5231683
Applicants can no longer use interview scheduling links once their application is archived, refused, or hired. Future linked interview meetings are archived automatically, preventing outdated bookings while preserving past meeting history.
Original PR description
This PR aims to restrict the applicant from scheduling any further appointments if the application is archived, refused, or contract-signed. Additionally, all previous appointments will be archived from the calendar task - 4715325
UAE payroll calculations now include unpaid leave and out-of-contract days when determining gross salary. This improves payroll accuracy and helps ensure salary figures better reflect employee work and leave circumstances.
Original PR description
- Add a new rule category to include unpaid leave and out-of-contract rules in the gross salary computation. Task: 5079110
The follow-up accounting tests now use the company’s actual currency symbol instead of assuming a dollar sign. This prevents false test failures in countries or configurations where USD is labeled differently, improving reliability without changing customer-facing behavior.
Original PR description
This PR makes the currency symbol in `test_followup_lines_branches` and `test_followup_report_with_entries` dynamic, avoiding a hardcoded $ string. Why this is needed: Some localizations, like Argentina, use the $ symbol for their own currency (ARS). To prevent confusion with USD, in some cases a complementary module can change the USD symbol to "USD". When this happens, the original test fails because it specifically expects $. This change prevents that failure by fetching the symbol directly from the company's currency, making the test more resilient to configuration changes. Forward-Port-Of: odoo/enterprise#98163
Payroll users can now see the Pay Structure linked to each salary rule directly in the Salary Rule list view. This makes it easier to distinguish between rules with similar names and reduces confusion during payroll configuration.
Original PR description
This will allow users to identify which Pay Structure each rule is linked with, especially in cases where similar rule names exist. Task-ID: 5240252
Employee payslips in India payroll no longer show internal salary rule descriptions meant for HR teams. This keeps payslips clearer for employees and avoids layout issues caused by long explanatory text.
Original PR description
Salary rule descriptions are intended for HR officers, not employees. Displaying them on the employee payslip is unnecessary and causes cropping issues when the text is too long. task-4984330
Belgian accounting reports now display pre-payment amounts and balances more appropriately based on the return type and status. The inventory analytical review check now focuses on fixed assets rather than receivables, making the review better aligned with its business purpose.
Original PR description
* = account , l10n_be In this commit: --- For Pre-Payment: - Changed the Account return Kanban view logic to ensure `amounts` and `balances` are displayed appropriately depending on the return type and state just for Be Reports. For Inventory Analytical Review: - Update the `Inventory analytical review` check to filter by `Fixed Assets` instead of `Receivables`. task-5065775
SEPA payment users can now choose an instruction priority, with the relevant normal and high options available. If no priority is selected, payments default to normal, helping ensure consistent payment processing behavior.
Original PR description
Before this commit:
SEPA payments did't have an instruction priority option, and no default value
'NORM' was set. Only ISO20022 payments supported priority selection.
After this commit:
Added instruction priority to SEPA payments.
For SEPA, only relevant options ('NORM', 'HIGH') are used for the selection.
Also, 'NORM' is now set as the default priority if nothing is defined.
task-4890052A default attendance ruleset is now provided so employees can have attendance records created without manual setup. It includes standard handling for overtime and non-working days, reducing setup errors and keeping behavior consistent with migration data.
Original PR description
## PR Purpose It's impossible to create an attendance for an employee without a ruleset. To solve this problem, this PR adds a default ruleset with 2 rules: one for overtime, and another one for non working days. Those data are the same as the data added in the upgrade/migrations/hr_attendance/saas~18.5.2.0 post-migrate script. [Task#5082628](https://www.odoo.com/odoo/all-tasks/5082628) [Community#234628](https://github.com/odoo/odoo/pull/234628) [Upgrade#8684](https://github.com/odoo/upgrade/pull/8684) Forward-Port-Of: odoo/enterprise#95421
Adds an automated check that self-order kiosk orders can be sent correctly to an IoT preparation printer. This helps reduce the risk of printer-related issues in restaurant self-order flows before they reach customers.
Original PR description
This commit adds a tour to check that the self order can send an order on an IoT preparation printer. Forward-Port-Of: odoo/enterprise#98814
Resolved issues and error corrections
The Knowledge app’s automated history checks were updated after changes to the editor history window. This keeps quality checks reliable and helps prevent future issues in Knowledge history features.
Original PR description
Due to a revamp of the html_editor history dialog, some tests were failing. This commit fixes the knowledge history tour. requires: https://github.com/odoo/odoo/pull/231349 task-5135850
This update fixes how the Appointment website snippet includes its supporting page assets, aligning it with the newer platform method. This helps ensure the appointment booking section continues to display and behave reliably after recent framework changes.
Original PR description
See https://github.com/odoo/odoo/pull/104836 task-2963840 Forward-Port-Of: odoo/enterprise#99195 Forward-Port-Of: odoo/enterprise#35153
This fixes a problem that prevented PIN code encoding from working after queue processing was added to the Belgian POS blackbox. The update also improves how related success and error responses are handled, helping reduce checkout disruption for affected installations.
Original PR description
Since the introduction of the queue mechanism in blackbox, the PIN encoding was not working. This was due to the fact that the blackbox driver trying to access some non-existing data. This is now solved and improved to better handle the error and subsequent error or success. Forward-Port-Of: odoo/enterprise#99029
The payslip CFDI PDF now places employee-related information in the correct employee section instead of showing it under employer details. This helps prevent confusion in payroll documents and improves the accuracy of generated reports.
Original PR description
Some info related to the employee is shown in the employer section. Task: 5224191 Forward-Port-Of: odoo/enterprise#98534
Odoo now ignores an unsupported transaction reference field when fetching missing bank transactions from OdooFin. This prevents users from hitting an error during online bank synchronization and helps the process complete reliably.
Original PR description
… missing transactions The field `end_to_end_uuid` was introduced in `account_iso20022` on the bank statement line model but is absent from the corresponding transient model used by `account_online_synchronization`. When a transaction payload from OdooFin includes this field, processing it raises a traceback because the field does not exist on the transient model. This commit drops the `end_to_end_uuid` key from incoming transactions to avoid the error. task-5223434 Forward-Port-Of: odoo/enterprise#98786
The Ask AI website live chat widget no longer automatically takes focus when a page loads in fullscreen mode. This prevents visitors from being unexpectedly pulled to the widget while still allowing the input to refocus after an AI response.
Original PR description
Scenario: - add "Ask AI" snippet on bottom of a page - reload the page Result: we get autofocused on the "Ask AI" snippet if the snippet is in "Fullscreen" configuration. Fix: avoid the initial focus but keep the code so we re-focus on the input after AI answer. opw-5153332 Forward-Port-Of: odoo/enterprise#97260
This update aligns barcode packing behavior with related community changes so package nesting continues to work as expected. It also adjusts delivery test coverage to reflect the updated order of package move lines, reducing the risk of repeated updates to the wrong line.
Original PR description
Some adaptations based on the community side: - Adapt the compute of `outermost_result_package_id` so nothing changes functionality-wise in barcode. - Adapt a test as the priority of move lines from 'Put in Pack' have changed. Task-5116567 Forward-Port-Of: odoo/enterprise#95648
Pivot tables inserted from the web view into spreadsheets now preserve sorting when the sorted column is a date or date-time field. This prevents reports from appearing out of order and helps users rely on spreadsheet pivots for accurate analysis.
Original PR description
If on the web pivot view we create a pivot with a date/dateTime field in the columns, and sort on one of these columns, the resulting pivot when inserted in a spreadsheet isn't sorted. This was because we didn't normalize the date values in the pivot `sortedColumn`, and we had UTC timestamps `2023-01-01 00:00:00` instead of normalized values `01/2023`. Task: [3575465](https://www.odoo.com/web#id=3575465&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#99203 Forward-Port-Of: odoo/enterprise#96508
Payroll users can now cancel a duplicate payslip even when it shares work entries with another payslip. This prevents unnecessary blocking while ensuring shared work entries are not incorrectly reset unless they belong only to the cancelled payslip.
Original PR description
previous behavior: - Cancelling duplicate payslips wasn't possible because they had the same work entries linked current behavior: - Allows to cancel a duplicate payslip without affecting the linked work entries - Work entries are only set to draft when they are linked to one payslip that is being cancelled - added `test_duplicate_payslips_cancellation` task-id: 5075882 Forward-Port-Of: odoo/enterprise#99181 Forward-Port-Of: odoo/enterprise#94236
Code cleanup and technical improvements
This update reorganizes how main action buttons are defined and displayed across many Odoo views, making future customizations more consistent and easier to maintain. It should have little direct impact on day-to-day users, but helps reduce complexity for teams maintaining or extending these screens.
Original PR description
tl;dr : if you want to customize view's buttons, look for `buttonTemplate`. Following last years development (MILK redesign, ControlPanel buttons structure and cleanup, responsiveness...), the…
tl;dr : if you want to customize view's buttons, look for `buttonTemplate`. Following last years development (MILK redesign, ControlPanel buttons structure and cleanup, responsiveness...), the ControlPanel's slots related to the main buttons (i.e. left part of the ControlPanel) became redundant. Also, extending the views' buttons with custom JS ones (i.e. not in the arch) wasn't the clearer to understand. This commit's purpose is to both clean up and clarify how to manage those buttons. In a nutshell, the `control-panel-create-button`, `control-panel-always-buttons` and `layout-buttons` slots have been merged into a single `control-panel-buttons` slot. It makes it easier to know where main buttons (in general) will go in the ControlPanel. For the views, the goal was also to make it clearer how to extend/modify the view's main buttons. The main customization point is the `buttonTemplate` view's property as it allows to override the view's buttons. Beside very specific case, the `control-panel-buttons` shouldn't be touched for this purpose. The Form view has its own specificity: it explicitly handles the buttons used in dialog (also via the arch's `<footer>`) and in the ControlPanel. To take this difference into account, a dedicated `buttonDialogTemplate` property has been introduced for this view, allowing the same kind of extension as the `buttonTemplate`. Note: to match the global ControlPanel slots' naming scheme, `layout-actions` has been renamed to `control-panel-actions`. task-4277543
The WhatsApp integration was adjusted to stay aligned with recent discussion channel changes. This is an internal cleanup that helps keep member lists working consistently without changing the user experience.
Original PR description
This commit adapt channel_member_list_patch to use the channel props instead of thread. PR: https://github.com/odoo/odoo/pull/235287
22 changes
Enhancements to existing features
The point-of-sale receipt step is being streamlined by removing the separate receipt screen and using the feedback screen instead. This keeps the customer journey simpler while preserving existing features and integrations, so businesses should see the same outcomes with fewer steps.
Original PR description
pos*: l10n_br_edi_pos, l10n_it_pos, whatsapp_pos This commit aims at removing the receipt screen and replacing it with the feedback screen. Of course, the feedback screen needs some adaptations done in this commit to keep every existing feature. task-id: 5149815
The point-of-sale checkout flow has been simplified by replacing the separate receipt screen with the feedback screen. This keeps the same receipt-related features while reducing an extra step for staff and making the end-of-sale experience more consistent across POS setups.
Original PR description
pos*: point_of_sale, pos_restaurant This commit aims at removing the receipt screen and replacing it with the feedback screen. Of course, the feedback screen needs some adaptations done in this commit to keep every existing feature. task-id: 5149815 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
The follow-up report now correctly ignores invoice lines marked as "No Follow-Up" when calculating a partner’s balance. This prevents partners from being incorrectly shown as needing no action when they still have overdue items that should be chased.
Original PR description
### Issue: Have a partner with an overdue invoice and a credit note with an amount greater than the invoice but excluded from follow-ups. This partner will have a follow-up status of…
### Issue: Have a partner with an overdue invoice and a credit note with an amount greater than the invoice but excluded from follow-ups. This partner will have a follow-up status of `no_action_needed` where it should be `in_need_of_action`. ### Steps to reproduce: - Create an overdue invoice for a new partner - Create a credit note for this partner with an amount greater than the invoice - Accounting > Reporting > Partner Ledger - Change the report to 'Follow-up Report' - Unfold the new partner and tick 'No Follow-Up' for the credit note line - Go to the partner form view, under the 'Accounting' page - The status is 'No action needed' ### Cause: The query responsible for the computation of the follow-up status does not consider the `no_followup` option to compute the balance of the partner. So the partner has a negative balance and the line `WHEN partner.balance <= 0 THEN 'no_action_needed'` gives the partner the status `no_action_needed`. ### Solution: Only consider lines with `no_followup = False` in the computation of the partner balance. Now when a partner only has lines with `no_followup = True` the query will not return anything, so the test method `assertPartnerFollowup()` needed to be adapted. opw-5170038
This update adjusts an automated purchase test so it works correctly with PostgreSQL 18. It prevents the test suite from failing due to a database error type change, keeping development and validation runs stable.
Original PR description
Apparently in pg18 a standard-compliance fix (postgres/postgres@086c84b23d99c2ad268f97508cd840efc1fdfd79) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted…
Apparently in pg18 a standard-compliance
fix (postgres/postgres@086c84b23d99c2ad268f97508cd840efc1fdfd79) has led to `RESTRICT_VIOLATION` being emitted in cases which formerly emitted `FOREIGN_KEY_VIOLATION`. One such case is specifically being tested for by `test_purchase_order_line_without_uom`, leading to this test failing systematically when running pg18:
psycopg2.errors.RestrictViolation: update or delete on table "uom_uom" violates RESTRICT setting of foreign key constraint "purchase_order_line_product_uom_id_fkey" on table "purchase_order_line"
DETAIL: Key (id)=(29) is referenced from table "purchase_order_line".
Update the test to use the more generic `IntegrityError` as it's probably more than sufficient for our purposes. Technically we could pass a tuple of `(ForeignKeyViolation, RestrictViolation)` but it doesn't really seem necessary. And it would require fixing the `_raisesContext` override as currently it is very much *not* compatible with that.
Forward-Port-Of: odoo/odoo#235119The dashboard upload button could accidentally be dragged out of place, which made the interface behave unpredictably. This update keeps the button fixed in position so it stays where users expect it to be.
Original PR description
Issue: - In the dashboard, the upload button (purchase journal and others) could be dragged. - This caused unintended movement of the upload UI element. Fix: - Added `draggable=false` to the upload button element. - Ensures the button remains fixed and cannot be dragged around. TaskID-5114617 Forward-Port-Of: odoo/odoo#235086 Forward-Port-Of: odoo/odoo#229013
A bug that caused a server error when switching on eCommerce Categories in the website mega menu has been fixed. The editor now correctly finds the mega menu content even when the first element is not the expected one, preventing the traceback and making the customization work reliably.
Original PR description
A traceback would occur when clicking the "eCommerce Categories" toggle in the mega menu's style options. Steps to reproduce: 1. Go to the Website editor. 2. Add a mega menu to the page header. 3. Edit and Click on the mega menu's 4. In the sidebar, click the "eCommerce Categories" toggle. -> Traceback. Cause: When loading it was trying to find a specific class name (starting with `s_mega_menu_`) to identify the snippet. It was hardcoded to only look at the `firstElementChild` of the snippet's container. This assumption was too rigid. If the first element was a `<p>` tag or another element without the required class, the code would fail to find it. This resulted in an `undefined` value being sent to the server, causing the traceback. Solution: Use `querySelector` to search for any element with a class name containing `s_mega_menu_`. opw-5245777 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a guest joins a meeting and changes their name on the welcome page, the updated name now appears immediately in the participant list. This improves clarity for meeting hosts and helps everyone identify guests more easily.
Original PR description
**Steps to Reproduce:** - Login with Admin, start a meeting, open the member list. - Join the meeting with a guest, using the invite link. - Change the guest name from the welcome page. - Admin member list doesn't show updated guest name. **Current behavior before PR:** Before this PR, the guest appeared as `Guest` in the member list even after updating their name on the welcome page. **Desired behavior after PR is merged:** This PR ensures the guest name is updated and displayed instantly upon joining, providing a smoother and more consistent experience. task-[5062702](https://www.odoo.com/odoo/project/1519/tasks/5062702) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234299
This fix restores the ability to tap an order line to select it in the product screen when the IoT scale certification module is installed. It ensures the long-press configurator feature works without blocking normal line selection, improving usability at the point of sale.
Original PR description
Task: [5163235](https://www.odoo.com/odoo/project/1737/tasks/5163235) --- In the product screen, pressing an orderline was supposed to select this line and a long press was supposed to open the Configurator popup. However, since the feature of the long press, if we install the module `l10n_eu_iot_scale_cert`, pressing an orderline does not select it anymore. This was due to the fact that a `t-ref` was added in the orderline template and that in the `l10n_eu_iot_scale_cert` module, we were overriding this template completely. Forward-Port-Of: odoo/enterprise#98886 Forward-Port-Of: odoo/enterprise#96980
Selecting the same date filter again no longer triggers extra updates or chart redraws. This also fixes an issue in Custom Range where clicking inside the date fields could accidentally reapply the filter.
Original PR description
## Description - Re-clicking the current date filter (relative/month/quarter/year/range) triggered redundant RPCs and chart re-animations. In Custom Range, clicks inside inputs also bubbled to the dropdown item, causing unwanted updates. ##### This PR: - Stop event bubbling inside Custom Range inputs to avoid spurious updates. - In GlobalFiltersCoreViewPlugin.allowDispatch(), return NoChanges when the incoming value equals the current filter value (currentFilterValue). Task: [5187275](https://www.odoo.com/odoo/project/2328/tasks/5187275) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change lets users cancel a duplicate payroll slip even when it shares work entries with another slip. It prevents unrelated work entries from being reset, reducing disruption and making payroll corrections safer and easier.
Original PR description
previous behavior: - Cancelling duplicate payslips wasn't possible because they had the same work entries linked current behavior: - Allows to cancel a duplicate payslip without affecting the linked work entries - Work entries are only set to draft when they are linked to one payslip that is being cancelled - added `test_duplicate_payslips_cancellation` task-id: 5075882 Forward-Port-Of: odoo/enterprise#94236
This update fixes a warning caused by newer Python versions in the IoT webRTC client. It helps keep the system cleaner and more compatible without changing how users work.
Original PR description
In Python 3.12 the `asyncio.get_event_loop()` function was deprecated, and now logs a warning when it is used. To fix this we replace it with `asyncio.new_event_loop()`. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Scanning a self-invoicing QR code now sends users directly to the ticket validation screen, instead of opening a page with incomplete information. If the customer is already registered, it can go straight to the invoice, reducing friction and avoiding failed or confusing follow-up steps.
Original PR description
Before: QR scan(self invoicing) redirected to /pos/ticket with pre-filled data but missing ticket code. After: Now directly redirects to the validation screen or invoice if customer is already registered. taskID-4777138
The pivot field selector popover now keeps a normal light appearance in dark mode instead of switching to a dark theme. This makes the spreadsheet experience more consistent, since dark mode is not yet supported in the spreadsheet editor.
Original PR description
Spreadsheet does not support dark mode yet, but the pivot field selector popover was dark-themed in dark mode. Task: [5163919](https://www.odoo.com/web#id=5163919&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
This update restores menu mode in self-ordering so customers can browse and order as expected. It prevents disruptions in the ordering experience and helps ensure orders can be placed smoothly on mobile and kiosk flows.
Original PR description
Menu mode was broken in self ordering. This commit fix it. Forward-Port-Of: odoo/odoo#234460 Forward-Port-Of: odoo/odoo#232503
This change prevents an error when users paste a Vimeo link into the Knowledge app’s media dialog. It makes the video link handling more robust so the dialog works normally even when the link does not include extra time information.
Original PR description
Steps to reproduce: ------------------------- 1. Install the Knowledge app 2. Open any document and use `/media` to open the media dialog 3. Go to the Videos tab in the dialog 4. In another browser…
Steps to reproduce:
-------------------------
1. Install the Knowledge app
2. Open any document and use `/media` to open the media dialog
3. Go to the Videos tab in the dialog
4. In another browser tab, open the Vimeo website
5. Copy any Vimeo video link and paste it into the dialog
Observation:
-------------------------
When pasting a Vimeo link, a traceback occurs:
```
TypeError: Cannot read properties of undefined (reading 'match')
at EmbeddedVideoSelector.parseTimeToSeconds
```
Issue:
-------------------------
In the following function,
https://github.com/odoo/odoo/blob/b5ed2d5a3e4ac9379ed15549dd9c8e08547181bb/addons/html_editor/static/src/main/media/media_dialog/video_selector.js#L350-L353 This happens because the code splits the Vimeo URL using `#t`. If the URL does not contain `#t`, the result is undefined, which is then passed to the `parseTimeToSeconds` function.
Solution:
-------------------------
Added optional chain operator in `parseTimeToSeconds` for safe validation of
`value` before calling `.match()`
opw-5221403When users remove formatting from text inside lists, any applied text color is now also removed correctly. This makes the editor behave as expected and helps keep pasted or edited content visually consistent.
Original PR description
### Steps to reproduce: - Open the Todo and create a new list. - Type some text and press `Ctrl + A` to select all. - Apply a text color class using the color picker. - Remove formatting from the selected content. ### Description of the issue/feature this PR addresses: - When color was applied through classes inside list items and removeFormat was triggered, color classes were not removed. ### Desired behavior after PR is merged: - All text color styles and classes are removed when using `removeFormat`. task-5166472 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects the cursor behavior when adding an image caption so it stays in the expected place instead of jumping unexpectedly. It also makes the image description popover place the cursor directly in the description field, making image editing smoother and more reliable for users.
Original PR description
### Description of the issue/feature this PR addresses: - Commit [1](https://github.com/odoo/odoo/commit/9a3abd5f9e5658b72b8a5d2fa0384bdbb580873f) changed `selectionchange` listener to `addGlobalDomListener`. As result, calling this.captionInput.el.focus() in caption.js triggered `selectionchange` event. Since `<figure>` is contenteditable="false", the `fixSelectionOnEditableRootGeneric` method moved the selection to sibling `<div>`, causing the cursor to jump unexpectedly. ### Desired behavior after PR is merged: - The selection is explicitly set at the end of the `<figure>` when adding caption, preventing the cursor from moving to a sibling editable `<div>`. - When the image description popover opens, the cursor automatically focuses on the description input field by default. task-5122745 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects the helper logic behind the Documents sharing panel so the "Access through link" option no longer depends on the internal access setting by mistake. It helps ensure the sharing choices shown to users are accurate and behave as expected when setting up shared links.
Original PR description
This commit fix the helpers for the 'Access through link' option where a condition was mistakenly depending on internal access option. Task-5222910
This update fixes a display issue in the accounting reports control panel on mobile devices. It helps the page fit properly on smaller screens, improving readability and making it easier to use reports on the go.
Original PR description
Before this PR, the control panel had an overflow in mobile view. task-4768525 backport of https://github.com/odoo/enterprise/pull/84742
A layout issue in the Discuss app could cause the page to overflow horizontally when opening or closing the call sidebar during a call. This update adjusts the call layout so the main view resizes correctly, keeping the interface stable and preventing visual overlap.
Original PR description
Before this commit, when in a discuss call in the Discuss app with sidebar not compact and a right panel open, click on Discuss sidebar would overflow horizontally the UI. This happens because the rearrange of tiles of the discuss call grid would be triggered from sidebar toggle state change, but the rearrange of tiles was mistakenly coded to preserve the height of main tile. This is a problem with discuss call sidebar because while the overall height of call view should stay unchanged, the main card must have its height reduced to compensate with discuss call sidebar when shown. This commit fixes the issue by resetting temporarily the height of call card tile in `arrangeTiles()`, so that it takes into account when it has to adapt its height. Before  After 
This change corrects a field reference in stock accounting so the system uses the company currency instead of an invalid currency field. It prevents errors caused by the wrong field being used and helps stock valuation work as expected.
Original PR description
commit 9c63ac283b89807c23a8a1934eef8074a312c36d Introduced a bug since it uses the field `currency_id` instead of the correct field `company_currency_id` 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 change prevents a table placed inside another table from expanding beyond its parent cell when resized. It keeps the table within bounds so users can continue editing it normally.
Original PR description
**Current behavior before PR:** - When a table was created inside another table, resizing the inner table could cause it to overflow its parent cell, making it uneditable. **Desired behavior after PR is merged:** - The inner table no longer overflows its parent cell when resized, ensuring it remains editable. task-5216916 Forward-Port-Of: odoo/odoo#233554
10 changes
Enhancements to existing features
This update refreshes the official Luxembourg payroll rule numbers for 2025. It helps ensure payroll calculations stay aligned with the latest legal requirements and reduces the risk of incorrect withholding amounts.
Original PR description
Update the official numbers of the Luxembourg payroll rules for 2025. This is a backport of PR https://github.com/odoo/enterprise/pull/79805 task-5187202 Forward-Port-Of: odoo/enterprise#98763
Resolved issues and error corrections
This change cleans up an overly complex style rule used in spreadsheet side panels. It makes the code easier to maintain and reduces the risk of future styling issues without changing the user experience.
Original PR description
Because of a really strong rule in o_spreadsheet lib that forced the box-sizing property pretty much everywhere, we came up with a super dense rule to counteract it inside odoo and specifically inside the side panels. This commits aims to simplify it at best with the common denominator of those rules. Task-4878174
This change corrects how spreadsheet inputs are displayed when they are missing or invalid, so the warning state is always visible. It also prevents dark mode styling from breaking the spreadsheet’s default layout, improving consistency for users.
Original PR description
Following the style revamp of the o-spreadsheet lib, we introduced a class o-input (differs from odoo o_input) in order to avoid collision with the odoo classes which tend to be altered in dark mode which spreadsheet does not support. However, we still relied on the default behaviour of odoo classes to mark specific inputs as invalid or missing. This commit ensures that missing/invalid are always marked as such while make preventing the dark mode to break the default layout. Task-4878174 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 change prevents event tickets from being switched into a rental-style setup that the website event registration flow cannot handle. It avoids a payment-time error and keeps event ticket setup consistent so customers can register without issues.
Original PR description
Steps ----- 1. Have `sale_renting` but not `sale_stock_renting` installed; 2. create an event with a ticket; 3. make the ticket's product rentable; 4. change ticket's product type to Goods; 5. publish the event to website; 6. register for the event via website; 7. go to payment. Issue ----- > AttributeError: 'bool' object has no attribute 'tzinfo' Cause ----- By making it a rental product, it creates a rental order, but as registering for an event via website doesn't have any way to add rental dates, rental lines cannot be processed & rendered as expected. Solution -------- Prevent users from changing the `service_tracking` away from `'event'` by adding an `api.constrains` to `product.product` on `service_tracking` and `event_ticket_ids`. opw-5207045
This update fixes issues in spreadsheet data sources and filters so broken connections now return the correct error instead of failing silently. It also removes a confusing clear button when a filter is invalid, making the interface clearer and more consistent.
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
This change prevents spreadsheet filter screens from crashing when a datasource or filter is broken after a migration or model change. It also makes cleanup easier by showing delete options more consistently, helping users repair spreadsheets and keep working without errors.
This fix prevents mega menu links from showing when their content is not available to the current visitor. It avoids empty dropdowns and unnecessary navigation items on both desktop and mobile, making the website cleaner and less confusing for users.
Original PR description
Before this commit, when setting the mega menu content visibility, the navbar link would still appear even if the user does not have access to the mega menu content. This commit hides the navbar link for the mega menu in the mobile and desktop view when the user does not have access to the mega menu content, in order to prevent unnecessary elements in the navbar. Steps to reproduce the bug: - Add a mega menu element in the navbar - Open the mega menu - Set the mega menu content visibility to conditional (logged in) - Open the website while logged out (The mega menu link is here but the content is not displayed. However, the dropdown is still opened but it is empty.) task-3992066
This update corrects a styling issue in the live chat visitor view on mobile devices. It prevents the message input from auto-zooming unexpectedly, making the chat experience smoother and easier to use on phones.
Original PR description
Follow-up of https://github.com/odoo/odoo/pull/234967 Style rule was not applied due to missing `&` in SCSS, which this commit fixes. Forward-Port-Of: odoo/odoo#235216
This fix prevents a table embedded inside another table from expanding beyond the boundaries of its parent cell when resized. As a result, the content remains editable and users can continue working without layout issues.
Original PR description
**Current behavior before PR:** - When a table was created inside another table, resizing the inner table could cause it to overflow its parent cell, making it uneditable. **Desired behavior after PR is merged:** - The inner table no longer overflows its parent cell when resized, ensuring it remains editable. task-5216916 Forward-Port-Of: odoo/odoo#233554
This update fixes a warning generated by some calendar view components when they were missing expected properties. It helps keep the system quieter and avoids potential issues in automated checks without changing how the calendar works for users.
Original PR description
Some Components used by the calendar view did not have props set, which triggered warnings on the runbot. This has been corrected in saas-17.2 with odoo/odoo@dd583fd670e0ee03b04711780bad2429b18a0788 In the meantime, to avoid warnings, we just set props = ["*"] to avoid breaking the component's API related PR for which the runbot warns: https://github.com/odoo/enterprise/pull/98903 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#234563
11 changes
Enhancements to existing features
The Belgian account tags used for report 281.50 now include their country, making them easier to organize and group. This also makes these tags more reusable in other reporting or accounting cases.
Original PR description
Account tags for 281.50 are specific to Belgium. With this PR, the country is added to those tags, allowing easier group by and enabling their use in other cases as well. task-5236632
The official payroll figures used for Luxembourg have been updated to match the 2025 rules. This helps ensure employee payroll calculations remain accurate and compliant with the latest official values.
Original PR description
Update the official numbers of the Luxembourg payroll rules for 2025. This is a backport of PR https://github.com/odoo/enterprise/pull/79805 task-5187202
Resolved issues and error corrections
This update fixes an error that could appear when opening the Accounts Coverage Report for Spanish balance sheet reports. It ensures the report data is loaded and interpreted correctly, so users can view the report without a traceback.
Original PR description
Step to reproduce: - for Spain localization, in developer mode: - Go to Balance sheet - Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES) - Click on the parameters button…
Step to reproduce:
- for Spain localization, in developer mode:
- Go to Balance sheet
- Select either report 'Balance sheet - SMEs (ES) or Complete Balance Sheet (ES)
- Click on the parameters button
- Click on the "Accounts Coverage Report"
Observation:
- we receive a traceback
```
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type integer: "%(balance_sheet_11700_account)d"
LINE 1: ...ccount_tag" WHERE ("account_account_tag"."id" IN ('%(balance...
```
Cause:
- few records used a wrong format style for values of `domain_formula`
- These faulty domains were not [evaluated](https://github.com/odoo/odoo/blob/2070e30c540a066fb80851527e5e54e97fb23c4b/addons/account/models/account_report.py#L450-L453), but inserted into database as is.
- when browsing account.tag record using these domain, record ids were expected,
instead we got its string representation , causing traceback
https://github.com/odoo/enterprise/blob/8fa6fb27d2a79ee299361b281dc82182feee5860/account_reports/models/account_report.py#L5679-L5680
Fix:
- we fix the data file, which is properly evaluated and stored in database.
- Manifest's data file order is changed, so that account tags is loaded first.
opw-5224114This update fixes an issue where the background image of the website “text cover” snippet could disappear on mobile or when the page is zoomed in. It keeps the cover visible so pages look consistent across screen sizes.
Original PR description
Steps to reproduce: =================== - Go to website and add a "text cover" snippet - Zoom in on the page or switch to mobile view -> The cover's background image disappears Cause: ====== A Bootstrap rule applied `d-md-block` to the cover image container on screens (specifically when width >= 768px, which can be removed by zooming). https://github.com/odoo/odoo/blob/b093786714e9e8567cf75abf78ac3d954a3d89b2/addons/web/static/lib/bootstrap/dist/css/bootstrap.css#L8624 So `d-none` will be applied once d-md-block is removed. Solution: ========= Remove the `d-none` rule from this element to ensure the background image remains visible. A workaround is included for non-updated views until master. opw-5219747 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change fixes a test in the barcode batch workflow so it runs reliably on Python 3.11 and later. It improves compatibility across Python versions and prevents false test failures during validation.
Original PR description
*: stock_barcode_picking_batch Steps to reproduce ================== Use python > 3.10 Run the test test_pack_batch_in_multiple_packages It fails on assertRecordValues, the records are not in the same order Cause of the issue ================== Recordsets ordering is not stable across python versions. It is implemented as `return set(self._ids) < set(other._ids)` https://github.com/odoo/odoo/blob/8a026b875a9b70f12689cdbd71d7e54b987d0612/odoo/models.py#L6636 Since this is a subset check, it always returns false when called with different ids Solution ======== Compare using the id directly opw-231140
This update corrects how Odoo identifies serial ports on Raspberry Pi 5 devices. It prevents the built-in port from being shown as an available external device, reducing confusion and avoiding incorrect device selection.
Original PR description
The serial interface previously included a filter to not include the built-in serial port on the Pi 5, however this filter is now broken in Raspberry Pi OS Trixie. To ensure the filter works in all versions, we now explicitly look for the device `/dev/ttyAMA10` and ignore it. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Opening Studio on a calendar view now works even when the view includes fields with access groups. This prevents the calendar editor from crashing and makes customization more reliable for users.
Original PR description
Have a calendar view that has a field A. the field A has a group on it, defined either in python or in the XML. Before this commit, opening studio in the calendar view crashed, because calendar did not support yet those fields that are marked with studio_no_fetch in their attributes. After this commit, there is no crash
This change prevents warning messages from appearing in Odoo’s calendar views during automated checks. It does this by giving the affected calendar components a generic set of accepted properties, which keeps their behavior stable while avoiding unnecessary noise.
Original PR description
Some Components used by the calendar view did not have props set, which triggered warnings on the runbot. This has been corrected in saas-17.2 with odoo/odoo@dd583fd670e0ee03b04711780bad2429b18a0788 In the meantime, to avoid warnings, we just set props = ["*"] to avoid breaking the component's API related PR for which the runbot warns: https://github.com/odoo/enterprise/pull/98903 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 change makes the Swiss payroll transmission tests independent from accounting setup, so they can run more reliably in different environments. It also adjusts payslip validation so a payroll structure can be validated even when some accounting configuration is missing, reducing unnecessary test failures.
This update ensures the Kanban view returns to a normal record limit after a grouping is removed and the view is restored. It prevents the web client from loading too many records at once, which could slow down the page or cause it to crash.
Original PR description
Steps to reproduce ================== - Add a group by in the kanban product view - Switch to the list view - Remove the group by - Switch back to the kanban view -> No limit is applied, and the webclient can crash if too many records are returned. Cause of the issue ================== The groupsLimit is set as MAX_SAFE_INTEGER in the kanban view https://github.com/odoo/odoo/blob/df959e05ac9cf3136d1724bc80b7597a70932225/addons/web/static/src/views/kanban/kanban_controller.js#L168 Which is then reused as the limit https://github.com/odoo/odoo/blob/df959e05ac9cf3136d1724bc80b7597a70932225/addons/web/static/src/model/relational_model/relational_model.js#L368 Solution ======== There is already a code path to reset the limit when switching from grouped to ungrouped, but is wasn't called on the first load (when this.root isn't set yet) opw-5167769
This change fixes an issue where some BACS batch payments could be exported with the wrong amount due to rounding errors. It ensures the payment amount is written correctly in the batch file, preventing underpayment or mismatches during bank processing.
Original PR description
**Issue description:** When creating a BACS batch payment that contains a payment with an amount that can't be represented well in float (like 645.30), the generated BACS batch file will have a wrong amount (due to float precision) as the amount is represented in pence. **Steps to reproduce:** 1. Create a BACS vendor payment with amount = 645.30 2. Add this payment to a BACS batch payment. 3. Confirm the batch to generate the export file. In the file you will notice that the amount in the payment line is 64529 pence instead of 64530. opw-5159413