Daily updates from Odoo
Wednesday, January 21, 2026
26 changes · saas-18.4
Enhancements to existing features
This update enhances the testing process for paying invoices with bank statement lines within the Odoo accounting system. The change introduces a reusable test helper, streamlining testing and ensuring more accurate invoice payment simulations. This improves the reliability of our accounting module's payment functionality.
Original PR description
Forward-Port-Of: odoo/odoo#244377 Forward-Port-Of: odoo/odoo#244281
This update organizes UBL test files for better compatibility with future move formats and improved schema validation. The change improves the structure of test data, streamlining development and testing processes related to UBL invoice generation.
Original PR description
This commit rearranges the UBL test files' subfolder to be one level higher, from `export/bis3/be` to `export/bis3/invoice/be`, in preparation for supporting different move formats and for better ignore schema support. task-4891206 Forward-Port-Of: odoo/odoo#244665
Resolved issues and error corrections
This update fixes an issue where product names on invoices were being incorrectly combined, leading to unreadable formatting. The change ensures product names are properly separated with spaces, aligning with API specifications and improving invoice clarity for Vietnam's VAT reporting. This ensures accurate data transmission and compliance.
Original PR description
Before: SInvoice was stripping newlines from the `itemName` field. Since we were directly using `line.name` (which contains a `\n` between product name and description), the content ended up concatenated without any separation. After: Now we replace the newline with a space before sending the value, so the name and description remain readable once processed by SInvoice and set limit to 500 characters as per API specs. task-5498120 Forward-Port-Of: odoo/odoo#243994
This update fixes a test that previously failed inconsistently when marking inbox messages as read after opening a channel. The change ensures the test waits for the initial message fetch, preventing a common scenario where the test incorrectly reports a failure. This improves the stability and reliability of the inbox read functionality.
Original PR description
The `Opening thread with needaction messages should mark all messages of thread as read` ensures that opening a channel marks the related inbox messages as read. However, this test can fail in a non-deterministic fashion. There are two flows that can mark inbox messages as read: fetching the messages or a manual request after opening the channel. The test expects the rpc to be issued, but if the messages are fetched before, it won't happen thus making the test fail. This commit awaits the initial fetch to prevent this issue. As a bonus, the second flow is also tested. runbot-237970 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#244693
This update strengthens the way Odoo handles errors during file uploads. Previously, the file upload service struggled with inconsistent responses from Odoo controllers (which could return data in different formats). Now, the service is better equipped to manage these errors, leading to a more stable and reliable file upload experience for users.
Original PR description
Odoo controllers often don't use coherent API they respond with either json, jsonrpc or html. On the client side, we have no reliable way to know this, and sometimes it is not possible to make a guess (rpc.js makes the guess that controllers are of json type -- actually meaning jsonrpc) The file upload service suffered from this and did not handle those error cases well. After this commit, the file upload service handles much of the errors. 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#244704
This update fixes an issue where Odoo was creating duplicate vendor contacts due to differences in how VAT numbers were formatted. Now, Odoo will correctly identify and link invoices with the same VAT number, regardless of whether the name or VAT number format includes dots. This ensures accurate record-keeping and reporting.
Original PR description
Description of the issue/feature this PR addresses: Odoo can create two contacts for the same VAT number Current behavior before PR: If you have two incoming vendor bills (over a period of time)…
Description of the issue/feature this PR addresses: Odoo can create two contacts for the same VAT number Current behavior before PR: If you have two incoming vendor bills (over a period of time) where the first bill has these details: - VAT number: `BE0477472701` - Name: `Odoo` And the second bill (e.g three months later) has these details: - VAT number: `BE0477.472.701` - Name: `Odoo S.A` Odoo will do something interesting and will create a second new contact. The reason is because the fallback on `name` from `res.partner` fails (since "Odoo S.A" is not equal to "Odoo". However, the `vat` number matching also fails! Since the VAT number "BE0477.472.701" is not identical to "BE0477472701". Throughout Odoo however VAT numbers are parsed and stored without dots in it. The function `_retrieve_partner_with_vat` however is an exception because the `vat` number here is sanitized for spaces but not for dots. Because of the combination of no exact match on neither `name` nor `vat` it now creates a second contact although the VAT number is technically the same. Desired behavior after PR is merged: Both an incoming vendor bill with `0477.472.701` and `0477472701` match to the same contact even if there are dots in it and if the name of the company is different. P.S: please find two sample XML's here: [sample_odoo_sa_bill.xml](https://github.com/user-attachments/files/24718225/sample_odoo_sa_bill.xml) [sample_odoo_bill.xml](https://github.com/user-attachments/files/24718226/sample_odoo_bill.xml) If you upload both back to back on a default V19 you will see two contacts. After this code change you will only see one contact where both bills are mapped to the same contacts. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244572
This update fixes an issue where employee names were being incorrectly formatted in payroll reports. The change ensures that employee names are consistently displayed as 'FirstName LastName', aligning with Swiss legal requirements and improving data accuracy for payroll processing. The fix also includes updated test data to reflect this corrected format.
Original PR description
* Fix _compute_l10n_ch_legal_name method to correctly assign first_name and last_name from employee name (was previously reversed) * Update all SwissDEC test data to use correct "FirstName LastName" format instead of "LastName FirstName" to match the corrected computation logic task-5102851 Forward-Port-Of: odoo/enterprise#95252
This update resolves an issue where accessing settings in the Romanian language version of Odoo resulted in an error. The fix corrects a mismatch in text matching within the system's configuration views, ensuring proper functionality for Romanian users. This improves the user experience for Romanian-speaking clients.
Original PR description
**Issue**: When the module `l10n_ro_edi_stock` is installed and Romanian is the selected language, accessing the settings app causes a traceback. **Steps to reproduce**: - Install the module…
**Issue**: When the module `l10n_ro_edi_stock` is installed and Romanian is the selected language, accessing the settings app causes a traceback. **Steps to reproduce**: - Install the module `l10n_ro_edi_stock` - Select a Romanian company - In Profile > My Preferences > select Romanian language - Try to access the settings -> A traceback occurs **Cause**: The error is caused by this XPath: https://github.com/odoo/odoo/blob/2309fb56553e6ae9f89b6dd0947aba2f54408960/addons/l10n_ro_edi_stock/views/res_config_settings_views.xml#L9C13-L11C21 Specifically, the `'select the option'` part. The XPath tries to replace this line in the parent view: https://github.com/odoo/odoo/blob/2309fb56553e6ae9f89b6dd0947aba2f54408960/addons/l10n_ro_edi/views/res_config_settings_views.xml#L39 but fails to find it because the source text has already been translated at that point, so `'select the option'` no longer matches: https://github.com/odoo/odoo/blob/2309fb56553e6ae9f89b6dd0947aba2f54408960/odoo/tools/template_inheritance.py#L154 **Solution** Only rely on strings that are translation-invariant. opw-5490346 Forward-Port-Of: odoo/odoo#244313
This update ensures that optional product images are only shown when the system is configured to display them. Previously, images were always shown, even when disabled, leading to a cluttered UI. Now, a placeholder is used when no image is available, providing a cleaner and more consistent experience.
Original PR description
Before this commit: =================== - When the `Show product images` setting was disabled, the optional products UI still displayed product images. - If an optional product did not have an image, the UI displayed the image's alt text - Also when the product don't have image, the combo popup and product card just display the product name. After this commit: ================== - Optional product images are displayed only when the `Show product images` configuration is enabled. - If the optional product doesn't have an image, we will display an image placeholder instead of alt text. - If there is no product image, the combo popup and product card will display the image placeholder. Task: 5480181 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243222
This update fixes an issue where the cookie consent wasn't being saved correctly when the 'I agree' button style was changed to 'Default'. The change triggered a default behavior in the popup system, preventing the consent from being recorded. This ensures that user cookie consent is properly saved after customizing the cookie bar's appearance.
Original PR description
Steps to reproduce: =================== 1. Enable the Cookies Bar in website settings. 2. Go to the website and enter Edit mode. 3. Select the Cookie Bar and change the button "I agree" style shape…
Steps to reproduce: =================== 1. Enable the Cookies Bar in website settings. 2. Go to the website and enter Edit mode. 3. Select the Cookie Bar and change the button "I agree" style shape to "Default" (this applies the `.btn-primary` class). & Save 4. Accept the cookies & refresh -> The cookie bar appears again because the consent was not saved. Cause: ====== The `CookiesBar` widget inherits from the generic `Popup` widget. The `Popup` class defines a default behavior for elements with the `.btn-primary` class: clicking them triggers `onBtnPrimaryClick`, which closes the popup. By default, the cookie bar button uses `.btn-outline-primary`, avoiding this behavior. However, when the user changes the style to "Default", the button receives the `.btn-primary` class. Consequently, the parent `Popup` handler is triggered. It closes the modal prematurely, interrupting the `CookiesBar`'s specific logic (specifically `onAcceptClick`),So onHideModal won't be called inside the function, and as a result, the user's consent cookie is never written. Solution: ========= Override the event to avoid side effects on hide. opw-5484578 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243562
This update resolves a technical issue that was preventing the employee version timeline from automatically saving correctly. The fix involved updating the test code to use a method that simulates a consistent time environment, ensuring data is saved reliably. This improves the stability and accuracy of employee version tracking.
Original PR description
As runbot faketimes test fail because the usage of dynamic dates now the test uses freeze_time Task#5717031 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where importing invoices could halt the entire process if one invoice encountered an error. Previously, failing on a single invoice would cause duplicate invoices to be created. This change ensures that the import process continues smoothly even if individual invoices have problems, improving data accuracy and reliability.
Original PR description
When you import a batch of invoice and one of them gets an unexpected Exception, the others are created but we stop the method. It's a problem with crons that don't expect to be interrupted in the middle. It creates duplicates as we fail on the same invoice each time. Of course, we should avoid all Exceptions when we can, but we should not loop on the same error. opw-5503069 part of task-5499871 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where multiple delivery reports were printed on the same page. The change in the report layout prevented automatic page breaks, causing reports with multiple deliveries to be combined. This ensures that reports with multiple deliveries are formatted correctly for printing.
Original PR description
When printing several picking operation at once, they are all in the same page. Steps to reproduce: ------------------- * Inventory>Operations>Deliveries * Create several Deliveries * Open list view to see all the deliveries * Select several deliveries * Print > Picking Operations -> All the picking operation report are on the same page. Observation: ------------- Since the change on the picking report layout https://github.com/odoo/odoo/pull/152280/changes#diff-7542c191def78bd64f54f1c33fde2c73e19e4d27f92b195c464d1d84e55b682fL6-R8 the report now uses a single article container for all records, this don't trigger automatic page break. opw-5481034 Forward-Port-Of: odoo/odoo#243817
This update resolves an issue where registration emails for events were displaying duplicate headers and footers. The fix removed a redundant email layout setting, ensuring that only the event's standard header and footer are included in the sent emails. This improves the email experience for registered users.
Original PR description
**Steps to reproduce:** - Go to Event module - Go to an open event - Register for the event - Go to the Attendees of the event - On the attendee record, click `Send by Email` - The received email shows twice the header and footer **Issue:** Encapsulating notification layout was applied with `default_email_layout_xmlid` but the main template used is `event_registration_mail_template_badge` which already has its own header and footer. **Fix:** Removed the `default_email_layout_xmlid` opw-5032767 Forward-Port-Of: odoo/odoo#236667
This update ensures popover animations in our tests run consistently, preventing unexpected behavior and reducing test complexity. A fix was implemented to address timing issues and enable the ResizeObserver, improving the reliability of our test suite. This enhances the stability of the web application.
Original PR description
This commit fixes two things; 1. Because the popover had his animation enabled in tests, it could on very rare occasion end too fast and call it's finished callback, triggering extra repositionning (and thus extra expect.steps). 2. The ResizeObserver could never trigger if there where no animations, it now can but some tests had to be adapted. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the IoT driver was adding unnecessary IDs to the system, slowing down performance when actions took longer than 6 seconds. The fix ensures IDs are only added to the cache when actions complete successfully, optimizing the driver's responsiveness and reducing potential bottlenecks.
Original PR description
If an action takes a long time to execute (>6s), then we don't add the unique id during this time as the action didn't finish. As it exceeds 6 seconds, we also send one through websocket, that isn't filtered as duplicate as the action id isn't set yet in the `_recent_action_ids` cache. To avoid this, we add the action id to the cache, then execute the action and remove the id from the cache if there is an exception.
This update resolves an issue where invoices sent to the Viettel SInvoice system were failing due to incorrect tax amount formatting. The change ensures the tax amount is calculated using the currency's rounding method, aligning with SInvoice's requirements and preventing errors.
Original PR description
When sending an invoice to SInvoice (Viettel), the API raises an `INVALID_DECIMAL_POINT_TAX_MONEY` error if the tax amount contains excessive decimal places (e.g., 100.02999999999997). This occurs because the tax amount is currently calculated using simple subtraction (`total - subtotal`). Due to standard floating-point precision issues, this can result in unrounded values that the API rejects. The tax amount calculation is now updated to explicitly use the currency's rounding method, ensuring the value is accepted by SInvoice. task-[5484845](https://www.odoo.com/odoo/project/967/tasks/5484845) Forward-Port-Of: odoo/odoo#244647
This update ensures that admin users retain their intended default options when reviewing courses, regardless of edits or deletions made by other users. This prevents unintended changes to the review process and maintains consistent functionality. The change was implemented to avoid a redundant fix previously addressed in another pull request.
Original PR description
*: website_slides The default values for the admin user should not be changed by editing or deleting others' messages in courses. task-5326273 Forward-Port-Of: odoo/odoo#243783 Forward-Port-Of: odoo/odoo#236475
This update fixes several issues within the odoo spreadsheet library, improving its stability and performance. It addresses bugs related to data handling, chart rendering, and export functionality, ensuring a smoother user experience when working with spreadsheets in Odoo. This update is a routine maintenance task.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/161472d280 [REL] 18.4.25 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/161472d280 [REL] 18.4.25 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/f49717979f [FIX] range: add result changeType [Task: 5095364](https://www.odoo.com/odoo/2328/tasks/5095364) https://github.com/odoo/o-spreadsheet/commit/b41863ff75 [FIX] range: adapt string XC on sheet rename [Task: 5095364](https://www.odoo.com/odoo/2328/tasks/5095364) https://github.com/odoo/o-spreadsheet/commit/62a0d0872a [FIX] range: rename parameter [Task: 5095364](https://www.odoo.com/odoo/2328/tasks/5095364) https://github.com/odoo/o-spreadsheet/commit/d92a622dc9 [FIX] range: add range to NONE [Task: 5095364](https://www.odoo.com/odoo/2328/tasks/5095364) https://github.com/odoo/o-spreadsheet/commit/d29e94e13c [FIX] Actions: ensure the sequence is applied on action children [Task: 5452669](https://www.odoo.com/odoo/2328/tasks/5452669) https://github.com/odoo/o-spreadsheet/commit/f1d753879a [FIX] composer: prevent autocomplete from closing on grid icon drag [Task: 5392156](https://www.odoo.com/odoo/2328/tasks/5392156) https://github.com/odoo/o-spreadsheet/commit/1b4e6fe6d8 [PERF] evaluation: don't spread single element matrix [Task: 5491138](https://www.odoo.com/odoo/2328/tasks/5491138) https://github.com/odoo/o-spreadsheet/commit/9e050665bb [FIX] evaluation: remove spread relation [Task: 5491138](https://www.odoo.com/odoo/2328/tasks/5491138) https://github.com/odoo/o-spreadsheet/commit/f54550a8df [FIX] vectorization: fix error message on size mismatch [Task: 5331324](https://www.odoo.com/odoo/2328/tasks/5331324) https://github.com/odoo/o-spreadsheet/commit/9a0677acca [FIX] chart: ignore NoChanges in gauge/scorecard side panel errors [Task: 5478288](https://www.odoo.com/odoo/2328/tasks/5478288) https://github.com/odoo/o-spreadsheet/commit/0a4ce58c32 [IMP] xlsx: export clip [Task: 5368130](https://www.odoo.com/odoo/2328/tasks/5368130) https://github.com/odoo/o-spreadsheet/commit/dedc6f5c30 [IMP] export: export align left when the cell content is a number; [Task: 5368130](https://www.odoo.com/odoo/2328/tasks/5368130) https://github.com/odoo/o-spreadsheet/commit/91e08a4315 [FIX] header_size: wrong row size from wrapped number [Task: 4878338](https://www.odoo.com/odoo/2328/tasks/4878338) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update resolves a minor performance issue within the o-spreadsheet plugin, specifically impacting the quality control and spreadsheet sale management modules. The change optimizes how the spreadsheet adapts to data ranges, resulting in faster loading and improved responsiveness for users.
Original PR description
…s args See https://github.com/odoo/o-spreadsheet/commit/6533266efa Task: 5095364
This update fixes an issue where VAT data in the Brazil localization module wasn't correctly processed after upgrading to version 18.4. The team reintroduced a small code change specifically for the Brazil module to ensure VAT data is properly formatted, preventing potential data inconsistencies.
Original PR description
In [^1], we removed the compacting code that existed in l10n_br modules as all vats are now stored as compact forms since [^2]. *However*, we did not consider that databases updated to 18.4+ would not automatically apply the compacting code to all records. As such, we have reintroduced a small block of compacting code in `l10n_br_edi_pos` as that one does special operations with the VAT that needs to be stripped of special characters. opw-5491321 [^1]: odoo/enterprise#87562 [^2]: odoo/odoo#179078
This update fixes an issue where highlight effects weren't consistently applied to multi-line text on websites, particularly in smaller viewports. The change adds a vertical position check to the detection process, ensuring highlights are correctly applied regardless of text layout. This improves the overall user experience and visual consistency of website content.
Original PR description
Steps to reproduce: 1. Go to Website (Edit mode) and drop a title block. 2. Select the title, set a highlight effect, and save the page. 3. Load the page in a reduced viewport in a way that makes the highlighted text split into multiple lines. 4. The highlight won't be applied correctly (only the last line will be detected). The current line detection mechanism relies on the horizontal comparison of rects (see `rectToBatch()`), which returns wrong results when applied to centered text content. The goal of this commit is to add a y-coordinate (vertical) check to detect new lines more reliably in `rectToBatch()`. This improves robustness for multi-line selections with unusual layouts. related to opw-4865891
This update corrects a visual bug where custom button snippets were incorrectly wrapped in paragraph tags when placed next to existing buttons. This ensured consistent button rendering across all button types, improving the overall website appearance and user experience. The fix was thoroughly tested to guarantee stability.
Original PR description
### Issue: When a custom button snippet was dropped next to an existing button wrapped in a `<div>`, it was incorrectly and unconditionally wrapped in a paragraph `<p>` tag. This issue did not occur…
### Issue: When a custom button snippet was dropped next to an existing button wrapped in a `<div>`, it was incorrectly and unconditionally wrapped in a paragraph `<p>` tag. This issue did not occur with standard button snippets or when the buttons were wrapped in a `<p>` tag. ### Steps to reproduce: 1. Drag a standard "Button" snippet next to an existing button (e.g., in the navbar). The structure is correctly `<a/><a/>`. 2. Save a button as a custom snippet. 3. Drag this new custom button snippet next to a button wrapped in a `<div>` (navbar in our example). 4. Observe the structure: `<div><a/><p><a class="s_custom_snippet"/></p></div>`, but it should be like `<div><a/><a class="s_custom_snippet"/></div>`. ### Fix The logic has been corrected to only wrap a button snippet in a paragraph tag if it has no sibling buttons and is not already inside a `<p>`. This ensures consistent behaviour between standard and custom button snippets. A tour test is also added, ensuring the behaviour is correct. Backport of https://github.com/odoo/odoo/commit/3a8f2cc418510c3b91f8b9086bb4a89a1745e40d task-[5032130](https://www.odoo.com/odoo/project/974/tasks/5032130) Forward-Port-Of: odoo/odoo#244121 Forward-Port-Of: odoo/odoo#224476
This update corrects a technical issue where order documents weren't being properly updated with the correct date. By forcing an update, we ensure accurate record-keeping for Mexican tax reporting (l10n_mx_edi), preventing potential discrepancies and compliance problems. This resolves a previous limitation in the update process.
Original PR description
Before the commit 8b118a7, the search of the documents to update has been limited and ordered. With the actual domain the records to update will be most of the time the same because is not being updated. To fix this issue we force to update it. OPW-5368047 Forward-Port-Of: odoo/enterprise#103272
This update enhances the reliability of connections to our IoT boxes. By directly using the IP address instead of domain names, we've eliminated potential issues caused by DNS resolution delays, particularly when using our LNA (Load Network Address) feature. This ensures smoother data transmission and a more stable system.
Original PR description
In order to avoid DNS resolution issues, we now parse the domain to get the IP of the IoT Box if LNA is enabled. Forward-Port-Of: odoo/odoo#244968
Features or functions removed from Odoo
This pull request removes a no-longer-used folder within the Odoo Enterprise software. The folder, related to Russian localization ('l10n_in'), was identified as containing obsolete files and has been safely removed. This cleanup improves the overall organization and efficiency of the codebase.
Original PR description
ref - https://github.com/odoo/enterprise/commit/ea7893a978c408e5d4437070ae7a6c7a7fbf7167 Forward-Port-Of: odoo/enterprise#104882