Daily updates from Odoo
Tuesday, February 3, 2026
38 changes · master
New functionality added to Odoo
This update adds sample data for the Swiss HR Payroll Localization, enabling easier testing and demonstration of the payroll functionality. The data includes a company setup, employee details, and a year's worth of payslips, providing a realistic scenario for evaluation.
Original PR description
This commit adds demo data for the Swiss HR Payroll Localization to facilitate testing and demonstration of Swiss payroll. The demo data includes the company setup, employee with relevant details, and 1 year of payslip history for that employee. Task: 5870506 Forward-Port-Of: odoo/enterprise#105872
Enhancements to existing features
This pull request removes unnecessary functionality related to active tab keynav focus within the VoIP module. The change simplifies the user experience and prevents potential conflicts. It's a minor improvement to the VoIP application.
Original PR description
This is not needed.
This update improves the Helpdesk module by adding an offline searchbar. This change, mirroring a previous development, optimizes the user experience by allowing access to search functionality even without an active internet connection. It’s a minor enhancement focused on usability.
Original PR description
This commit is the enterprise counterpart of https://github.com/odoo/odoo/pull/244531, where we slightly change the kanban controller template (add a `t-elif` after the KanbanRenderer node). This change required an adaptation of the custom kanban controller in helpdesk. Task~244531
This update simplifies how Odoo identifies refund transactions within its accounting modules. Previously, checks for refunds were done with multiple, specific conditions. Now, a new method is added to `account.move` to directly determine if a move represents a refund, improving code clarity and maintainability. This change enhances the accuracy of refund processing across various Odoo localization modules.
Original PR description
Before this commit-
We had methods on `account.move` i.e.
`is_sale_document`, `is_invoice` but
at many instance in the code base,
we did do `self.move_type in ('out_refund', 'in_refund')`
After this commit-
We add new methods on `account.move` to
get and check if the move is refund
task-5850565This update adjusts the inheritance of a template used for displaying sales tax calculations on the website. The change reflects a shift in how the 'o_order_total_taxes' component is managed within the Odoo platform. This ensures accurate and consistent tax display for customers.
Original PR description
"o_order_total_taxes" is now in a different template, so inheritance has been adjusted. See also: - https://github.com/odoo/odoo/pull/229912 task-4805599
This update adjusts the maximum NSSF (National Social Security Fund) contribution limits to align with the latest regulations under the NSSF Act 2013. Specifically, the lower and upper earnings limits have been revised, impacting the total combined contribution a business can make. This ensures compliance with Kenyan tax laws.
Original PR description
This commit updates the NSSF Lower and Upper Earnings Limits in accordance with the 4th year of implementation of the NSSF Act 2013. - Set Lower Earnings Limit (Tier 1) to 9,000. - Set Upper Earnings Limit (Tier 2) to 108,000. - Resulting max combined contribution is now 6,480. Task: 5485002 Forward-Port-Of: odoo/enterprise#105019
This update clarifies the Professional Tax deduction on employee contracts by updating the tooltip and renaming the field label. This change improves user understanding and reduces potential confusion when configuring payroll settings.
Original PR description
Purpose: - Improve clarity and understanding of the Professional Tax deduction on the employee contract by providing a more descriptive tooltip and a clearer label. This PR includes: - Updated the Professional Tax tooltip to better understanding. - Renamed the field label from 'Professional Tax Slab' to 'Professional Tax'. task-5890446
This update clarifies the naming of a key field in our subscription tracking system. The 'Subscription State' column has been renamed to 'State Before' to provide a more intuitive understanding of the subscription's status at the time of an event. This change improves readability and reduces potential confusion for users.
Original PR description
The sale.order.log model includes a field named subscription state that records the state of the subscription at the moment an event occurs (i.e., the state before the change). To improve clarity for end users, this PR renames the column from Subscription State to State Before. task-5258195
This update standardizes the wording used for the Live Chat app across Odoo. This change improves the user experience by ensuring a consistent and professional brand image. It's part of a larger effort to streamline and refine key Odoo features.
Original PR description
This commit harmonizes the copywriting of the Live Chat app name. part of task-4461200 part of task-5867464
This update enhances the Odoo Enterprise softphone by adding tooltips to country flags displayed alongside phone numbers. This improves user recognition of the flagged countries, making the call process more intuitive and user-friendly. A new component was created to avoid code repetition and simplify future updates.
Original PR description
In voip.call form/list view, country flags are shown with phone numbers. In this commit, we add alt/tooltip to country flags for users to recognise them. Task-[5404442](https://www.odoo.com/odoo/5778/tasks/5404442)
Resolved issues and error corrections
This update resolves a bug that prevented automated tours from correctly initializing drag actions on the Gantt chart. The change re-enabled a safety check during pill dragging, ensuring actions work as expected while still allowing users to drag pills outside the chart's grid.
Original PR description
In PR https://github.com/odoo/enterprise/pull/103230, a fail-safe was removed to allow dragging pills outside the grid (for unscheduling). This caused issues in automated tours where actions triggered on off-screen pills (where no cell is hovered) failed to initialize the drag properly. This commit reinstates a validation check within `onWillStartDrag`. This ensures the drag only starts if a valid target is confirmed, fixing the tour failures while preserving the ability to drag pills out of the grid. runbot-error-238521
This update resolves a test issue related to a recent change in how the select component is implemented. The new component uses a popover instead of the traditional `<select>` tag, requiring adjustments to the tests to account for changes in how the user interface is rendered, particularly on smaller screens.
Original PR description
Following the current introduction of a new select component, we no longer rely on the native `<select>` tag, and instead invoke a popover that displays the select possible values. Since our new component relies on `<div>` and a popover which can be set as invisible if the browser window is too small, the tests needed to be adapted so that the dom helpers (that are sensitive to a node visibility by default) can still work. runbot error - 238438
This update fixes an issue where Swiss payslips were generated with the generic name "new Payslip" instead of the correct name including the employee's details. The fix ensures that payslips now display the employee's name and pay period, improving clarity and accuracy for payroll reports. This resolves a minor user experience problem.
Original PR description
_ ## Short functional explanation of the error When generating a payslip from a payrun for an employee on the swiss localization, the name of the PDF payslip is simply "new payslip" instead of…
_ ## Short functional explanation of the error When generating a payslip from a payrun for an employee on the swiss localization, the name of the PDF payslip is simply "new payslip" instead of "Salary Slip - <name of employee> - <time period of the slip>" ## Reproduction Steps 1. Install the app l10n_ch_hr_payroll. 2. Make sure you use a Swiss company. 3. Go to Payroll and click on the Payslips tab > payslips. 4. Click on Pay Run. Select Switzerland: ELM salaries and click Continue. 5. Select an employee for which you'd like to generate the payslip. 6. Click on the employee row in the list view. 7. Click Compute sheet > Print. ## Expected behavior A PDF with name "Salary Slip - <employee name> - <time period>" is generated. ## Unexpected Behavior A PDF with name "new Payslip" is generated. ## Origin of the issue When printing the slip with this flow, we don't call the method ```_compute_name()``` used to compute the name of the current slip. Therefore, it stays at 'New Slip', which is the default name. Henceforth, we have to call this method manually when printing the slip. _ opw-5253811 Forward-Port-Of: odoo/enterprise#103471
This update corrects a previous issue where the payslip report displayed the company's working schedule instead of the employee's. The report has been updated to accurately reflect the employee's individual working schedule, providing more accurate payroll information.
Original PR description
-The display for working schedule info in the payslip report was referring to the company's working schedule. -The report has been adjusted to include the employee's working schedule.
A recent test failure related to restaurant appointment tours has been resolved. The fix ensures the test accurately simulates the Point of Sale system's time, preventing inconsistencies and improving the reliability of our automated testing process. This ensures that the tour behaves predictably during testing.
Original PR description
The `RestaurantAppointmentTour` was failing inconsistently because the browser used the real system clock during the initial Point of Sale load, while the test data was created for a specific mock date (Jan 28). Because the PoS logic filters appointments based on the current time, the test data was being misinterpreted or "normalized" by the application before the tour had a chance to freeze the clock. Moving `Chrome.freezeDateTime` to the absolute first step of the tour ensures the simulated time is applied as early as possible, making the test deterministic. runbot-232601 Forward-Port-Of: odoo/enterprise#106024
This update enhances the performance of account reporting by optimizing the way data is filtered within key tables. The changes address inefficiencies in the account reports module, leading to faster report generation and improved system responsiveness. This ensures smoother operations for financial reporting.
Original PR description
In addition to: - [x] #104936 And other PRs in Odoo core: - [x] odoo/odoo#243833 - [x] odoo/odoo#243967 - [x] odoo/odoo#246440 Forward-Port-Of: odoo/enterprise#106080 Forward-Port-Of: odoo/enterprise#105960
This update fixes a potential error in the achievement reports that could cause issues when dealing with large order IDs. By using a bitwise operation instead of multiplication, the system now correctly handles IDs, preventing errors and ensuring accurate report generation. This improves the stability and reliability of the sales commission reporting.
Original PR description
Before this commit, we had issues on odoo.com when the ids of the account move, account move line, sale order or sle order line were too high. We would end up with ids bigger than BIGINT limit. This commit ensure it does not happen anymore by using bitwise operation on ids istead of multiplying the values. task-5423978 Forward-Port-Of: odoo/enterprise#105643 Forward-Port-Of: odoo/enterprise#103264
This update resolves a minor issue with the barcode app's tours related to scrap adjustments. The problem stemmed from a Chrome browser incompatibility with number input fields, leading to incorrect quantity updates. This fix ensures accurate scrap quantity entries, improving data consistency.
Original PR description
This commit fixes tours related to scrap refactor (odoo/odoo#210299) that included setting the quantity field in the scrap form in the barcode app. The issue was caused by <input type="number"> not supporting text selection in Chrome, which made the tour's edit() helper append instead of replace the value (e.g., "0.00" + "15" = "0.0015"). Fixed by using direct DOM value assignment, matching the existing workaround pattern for number inputs. Build Errors: https://runbot.odoo.com/odoo/runbot.build.error/238376 https://runbot.odoo.com/odoo/runbot.build.error/238374 https://runbot.odoo.com/odoo/runbot.build.error/238375
This update removes a redundant 'Follow-Up Report' line from PDF reports sent to customers. This line previously displayed the partner's total balance, which was confusing. Removing it simplifies the report and improves clarity for customers without impacting the report's core information.
Original PR description
When generating the followup report, compute and display the total in a single foreign currency if all invoices shown in the report share that same foreign currency. The total is suppressed (not displayed) if there is at least one invoice in a different currency (mixed currency scenario). task-4554514 --- When sending follow-up reports via the "Send" feature or payment reminders, the printed PDF includes a "Follow-Up Report" line. In this specific context, this line always equals the partner's total balance. This line is redundant and can be confusing for customers. Removing it clarifies the report without losing any necessary information.
This update resolves a test failure related to date restrictions in the dividend fiscal year selection field. The fix ensures the test environment uses the correct 'frozen' dates, preventing errors. While a long-running server scenario is theoretical, this change improves test reliability.
Original PR description
The selection field of the dividend_fiscal_year has a restricted range based on dates, which has implication for the frozen dates in the test. That is why the test will fail today: 2021 is not anymore in the selection. But, suppose however that you have a server running for 3 years, it could be problematic as well. (quite theoretical however) So we can simply make the selection field selection in the wizard a lambda method and that way also in the test, it will take the 'frozen selection'. build error 237681 https://runbot.odoo.com/odoo/runbot.build.error/237681 Forward-Port-Of: odoo/enterprise#106132
This update corrects a bug that prevented the system from correctly creating vendor partners when processing vendor bills in Uruguay. The issue stemmed from an incorrect state search when the 'Departamento' tag was missing from the XML data. This ensures accurate vendor partner creation and avoids disruptions in financial processes.
Original PR description
If the xml file has a tag "Departamento" without a value, the vendor partner creation fails because the state is searched with an empty string and detects a state that is not correct because the xml has no state value. Task Adhoc side: 109004 Forward-Port-Of: odoo/enterprise#105801
This update fixes an issue where the 'Next Booking Start' field for rooms was incorrectly empty when bookings existed. The change removes a filter that excluded occupied rooms from availability calculations, ensuring the field accurately reflects upcoming booking times. This improves the user experience when viewing room availability.
Original PR description
Steps to reproduce:
1. Install `room`
2. Create a room.
3. Create a booking for the current time (so the room becomes occupied).
4. Create another booking for tomorrow.
5. Open the list view of rooms.
Current Behavior:
- The `Next Booking Start` field is empty for the created room, despite Having future bookings.
Cause:
- The method `_compute_next_booking_start` filters the rooms using `self.filtered('is_available')`. Since the room is currently occupied (due to the active booking), the room is excluded from the query entirely.
Solution:
- Remove the `is_available` filter from the search domain. The next booking start time is now calculated for all rooms, regardless of whether they are currently available or occupied.
opw-5360101
Forward-Port-Of: odoo/enterprise#102129This update resolves a technical issue preventing the demo data for the Switzerland - HR Payroll module from functioning correctly. A recent change removed a related database model, causing errors. The fix removes outdated references to this model within the demo data, ensuring the demo environment operates as intended.
Original PR description
**Steps to reproduce:** - Install the "Switzerland - HR Payroll" module with demo data. - You get a traceback **Issue:** A recently [merged PR](https://github.com/odoo/enterprise/pull/99418) removed `res.bank` model leaving demo data with references to this model invalid. **Solution:** Remove references to `res.bank` in demo data. Task: 5905983
This update fixes a bug that occurred when users copied and then undid copying planning slots. The issue was triggered when a previously deleted slot was involved in the undo process, resulting in an error. Now, the system verifies that records exist before attempting to delete them, ensuring a smoother user experience.
Original PR description
### Steps to reproduce: - Install Planning - Navigate to the gantt view for planning slots - Copy previous week's slots - Delete one of the newly copied records - Undo the copying action - Notice an Error is raised that a record doesn't exist ### Cause: When undoing the copy process we unlink all the newly created records but if the user has already deleted one of them it will trigger an error that this record doesn't exist and it has already been deleted ### Fix: We check the existence of the records before deleting them. opw-5490327 Forward-Port-Of: odoo/enterprise#105530
This update fixes a translation issue where warnings on payslips didn't correctly display translated field names in French (CH). The change ensures that all missing information fields on payslips are accurately translated, improving the user experience for French-speaking Swiss users. This resolves a reported bug impacting data clarity.
Original PR description
The warnings that appear on a payslip when the employee's form misses information are not fully translated Steps to reproduce: 1. Install module l10n_ch_hr_payroll 2. Switch to "My Swiss Company" and change language to French (CH) 3. Open app "Paie" and create a new employee (only add a name) 4. Click on "Contrats" in the stat button and create a new contract for the employee (only add a name), save it and set it as "En cours" in the status bar 5. Go to "Fiches de paie" > "Toutes les fiches de paie" and create a new payslip 6. Add the newly created employee to the payslip 7. The warnings in the form displaying the missing fields from the employee form do not translate the name of the missing fields Solution: Use `get_description` to get the translated name of the missing fields opw-5403634 Forward-Port-Of: odoo/enterprise#106188 Forward-Port-Of: odoo/enterprise#104499
This update resolves an issue where sending a voice message without text would trigger a WhatsApp API error. The fix ensures the system correctly handles empty HTML composer content, preventing the creation of unnecessary text messages and allowing voice messages to be sent successfully. This improves the reliability of the WhatsApp integration.
Original PR description
Sending a voice message without any text can trigger a WhatsApp API error because the empty HTML body is incorrectly treated as a valid text message. ### Reproduction Steps 1. Open the Discuss app.…
Sending a voice message without any text can trigger a WhatsApp API error because the empty HTML body is incorrectly treated as a valid text message. ### Reproduction Steps 1. Open the Discuss app. 2. Select a WhatsApp channel. 3. Record and send a voice message without typing any text in the composer. 4. Observe the message status. Result: The status changes from "Sent" to "Failed" with the error `(#100) The parameter text['body'] is required`. ### Cause The WhatsApp API does not support captions for audio files. Messages containing both audio and text are split into two separate WhatsApp messages: one for the audio file and one for the text body. Whether the text message is created depends on whether the message body is considered non-empty. Since commit odoo/odoo@f4dcc83adf552466ba7b05f09a4c651fe69f18ff , the composer’s default content is an empty HTML element. Although visually empty, this HTML is still a non-empty string at the data level. As a result, the system incorrectly determines that a text message is required and creates a secondary `whatsapp.message` record. When processed, the empty HTML is converted to a plain text string (`""`). Sending this as a text message fails validation because WhatsApp requires a non-empty body for text messages. ### Fix 1. Update `DiscussChannel.message_post()` to use `tools.is_html_empty(body)` to detect semantically empty HTML. This prevents creating a separate text message for audio attachments when the composer content is effectively empty. 2. Update `WhatsappMessage._send_message()` to check the truthiness of the converted plaintext `body` rather than the raw HTML field before adding a caption. This prevents sending an empty `caption` parameter for attachments when the body is empty. opw-5266805 Forward-Port-Of: odoo/enterprise#103213
This update resolves an issue preventing users from seeing the 'compare' button when browsing rental options. The fix ensures the button is consistently available during the rental selection process, improving usability. It also adds a stability measure to prevent errors when adding products.
Original PR description
This commit fixes the issue where the "compare" button wasn't visible in the view. Now, the compare button is accessible within the process. Additionally, it addresses the indeterminacy by adding a step where the comparison bar is explicitly waited for before adding a product. runbot-error-id~231524 Forward-Port-Of: odoo/enterprise#106182
This update corrects the Odoo Enterprise system to reflect recent changes on the Swiss Federal Tax Administration website. The import of tax rates for payroll has been adjusted to use the new URLs, ensuring accurate calculations and continued functionality of the single-canton import feature.
Original PR description
Due to recent updates on the Federal Tax Administration website, the single-canton import feature was made temporarly unavailable, this PR adjusts the new URLs for downloading the tax rates Forward-Port-Of: odoo/enterprise#106288
This update simplifies the subscription plan view by removing irrelevant order line details like sections and discounts. Previously, the view was cluttered with unnecessary information. Now, it only displays the actual products included in the subscription, making it easier to configure and understand.
Original PR description
The subscription plan view was displaying all order line types, including sections, notes, and discount lines, which added unnecessary clutter. This update filters the order lines to display only actual subscription products, improving clarity and usability in the plan configuration. task-5404614 Forward-Port-Of: odoo/enterprise#106076 Forward-Port-Of: odoo/enterprise#101796
A recent issue with the sign tour process was resolved, preventing it from failing due to a selector timeout. This update ensures the sign tour now correctly opens documents in the signing view, restoring successful test results and improving the overall sign experience.
Original PR description
The sign_tour was failing because the `.o_sign_sign_directly` button was not found in the document view, causing the tour step to timeout and breaking both sign UI tests. This was due to the tour not properly opening the document in the signing view. The tour now relies on a stable selector, restoring successful execution of `test_sign_tour` and `test_sign_tour_without_sign`. Runbot issue: https://runbot.odoo.com/odoo/runbot.build.error/234923 Forward-Port-Of: odoo/enterprise#105844
This update corrects a minor error in the invoice XML format used by the Ecuadorian accounting module. The fix removes an extra closing tag, ensuring the system generates invoices correctly and avoids potential processing issues. This improves the reliability of financial reporting.
Original PR description
Currently, the `account_move_form_invoice_and_withhold_view` contains an invalid closing group tag (`</group>>`) introduced by PR [1], at [2]. The extra `>` results in malformed XML. This commit removes the stray character and restores a properly closed `</group>` tag. [1]: https://github.com/odoo/enterprise/pull/77592 [2]: https://github.com/odoo/enterprise/blob/7c574d758ff5b1404b808cc647d4a2ae40f5f0c0/l10n_ec_edi/views/account_move_views.xml#L79 **No task Id** Forward-Port-Of: odoo/enterprise#106104
This update resolves an issue where outdated account synchronization records could cause problems, preventing new connections. By focusing on fresh, uninitialized links, the system is now more reliable and stable for account online synchronization. This ensures a smoother experience for users.
Original PR description
Prevent reusing stale account.online.link records that have a provider_type set, which can leave an unusable row and block new connections. By adjusting the search domain in action_new_synchronization, we only reuse clean, uninitialized links. opw-5868438 opw-5867799 Forward-Port-Of: odoo/enterprise#106259 Forward-Port-Of: odoo/enterprise#105187
This update resolves a test failure within the Enterprise module related to how exported models are configured. The change prevents unintended behavior during installation that was causing a test to fail. This ensures the full Enterprise test suite runs correctly and reliably.
Original PR description
Updating the fieldsets of `DEFAULT_FIELDS_TO_EXECUTE` in place changes the behaviour of `test_23_export_hardcoded_models_and_fields` if that test runs after `_compute_excluded_fields` has been executed for one reason or an other, which apparently does not occur during post_install but *does* occur during at_install, and so fails in the "full" enterprise test running everything in a single job. https://runbot.odoo.com/odoo/error/238451 https://runbot.odoo.com/odoo/error/238449 https://runbot.odoo.com/odoo/error/238497 Forward-Port-Of: odoo/enterprise#106110
This update ensures the accounting dashboard data is compatible with the latest Odoo 18.5 version. The change addresses a technical issue where data formats were being incorrectly upgraded, and while partially resolved, requires further refinement for full functionality with all filter options.
Original PR description
This commit upgrades the data for the accounting dashboard from the 18.4.x file format to 18.5.x The goal is to avoid having `ODOO.FILTER.VALUE` being upgraded to `ODOO.FILTER.VALUE.V18` because the dashboard was already adapted to work[*] with the new formula see 682d6ec1ddb825674999e0db1fc0cc48c3be67c5 *: it only half-works. It only works for simple values of filters (years, quarter, months), but it doesn't work properly with others (Last 7 days, etc.) Forward-Port-Of: odoo/enterprise#106269
This update corrects an issue where demo bank data was no longer accurate after a recent change to the `res.bank` model. The team has adjusted the demo data to align with the current system, ensuring accurate reporting and demonstration functionality for the l10n_ch_hr_payroll module. This ensures a smooth experience for users.
Original PR description
after this the following commit 712b7bf `res.bank` model was removed, accordingly demo data needs to be adapted in master. task-5907863
This update removes obsolete comments left over from a previous development exploration. These comments were a minor distraction and have now been cleaned up as part of a routine maintenance task. This ensures the codebase remains clear and focused on current functionality.
Original PR description
During the development of #102625, the idea of splitting the conversion date from the order date was explored. However, it was quickly dismissed, and some outdated comments slipped through. Forward-Port-Of: odoo/enterprise#106301
Features or functions removed from Odoo
This update removes the `device_controller` class, which was no longer needed. The team now directly utilizes the `iot_http` service, streamlining the integration. This change improves code efficiency and simplifies maintenance.
Original PR description
We remove the the `device_controller` class, now unused as we use the `iot_http` service directly. This commit removes the last usage of it in `iot_device_hook` and the last usage of `iot_device_hook` in `delivery_iot`. see odoo/upgrade#9383 task: 5885929
Code cleanup and technical improvements
This update enhances our stock testing process by introducing a dedicated company within the tests. This ensures more consistent and reliable test results, ultimately improving the stability and accuracy of the Odoo Enterprise stock module.