Daily updates from Odoo
Tuesday, February 3, 2026
29 changes · 19.0
Security fixes and vulnerability patches
This update resolves security issues related to copying spreadsheets and dashboards. It simplifies the process by removing unnecessary security checks, allowing users to copy documents without requiring excessive permissions. This enhances usability and reduces potential security risks.
Original PR description
In order to be able to copy a spreadsheet or a dashboard on which the user has access to, without requiring a bunch of extra security rights, this fix removes the need to - when copying a dashboard, the copy of the field 'main_data_model_ids' that is only used on standard dashboards, would require the read right on ir_model for no good reasons - when copying any spreadsheety document (spreadsheet, dashboard, etc.) the remove the field spreadsheet_revision_ids from the data sent by the client, so the field security won't be triggered on an empty field
New functionality added to Odoo
This update expands our tax reporting capabilities to include EC Sales Lists and Intrastat returns for key European markets – Austria, Germany, Italy, Poland, Portugal, and The Netherlands. This aligns with previous tax return implementations and ensures compliance with local regulations, simplifying reporting processes for our international customers.
Original PR description
Following the implementation of the Tax returns feature in 18.3 which was focused on the general implementation and Belgium, we want to add the specification for other country and in this case Austria, Germany, The Netherlands, Italy, Poland, and Portugal. Adding EC sales list, Intrastat specific deadlines and periodicities. task-4776236
This update adds missing templates for Equity and Government checks within the Odoo Enterprise accounting reports. This ensures accurate and comprehensive reporting, fulfilling a key requirement for financial compliance and providing complete data for analysis. It builds upon previous work to ensure data integrity.
Original PR description
Completes the work started in odoo/enterprise#88360. The Equity and Government check templates were missing and are added here to fully complete the data. task-5365677
Enhancements to existing features
This update makes the top bar (embedded actions) visible by default when a new audit working file is created and opened for the first time. This simplifies the initial user experience and ensures users immediately have access to key controls. The visibility is still customizable based on user preferences.
Original PR description
Currently, the top bar (embedded actions) in Working Files in audit is not visible by default when the user creates and opens it for the first time. This commit makes it visible when the Audit is created and opened for the first time, later on the visibility is decided as per the user preferences set in the `res.users.settings.embedded.action` model. task-5388717
This update improves the speed of database synchronization by intelligently grouping requests and processing them in parallel. This resulted in a significant reduction in synchronization time – specifically, a 30-database sync that previously took 50 seconds now completes in just 15 seconds. This enhancement improves overall system performance and responsiveness.
Original PR description
With this commit, the requests sent to retrieve the information from the databases are grouped by IP, and each group is treated in parallel using a ThreadPoolExecutor, which uses a pool of 5 times the number of CPUs. On a set of SaaS databases, we reduced the time needed to synchronize 30 databases from 50s to 15s.
Resolved issues and error corrections
A recent test failure related to restaurant appointment tours has been resolved. The fix ensures the test accurately reflects the system's time by applying a simulated time early in the process, preventing inconsistencies. This improves the reliability of our test suite.
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
A crash in the Accounting module's Working Files feature, triggered during mass edits, has been resolved. The fix utilizes optional chaining to safely handle situations where configuration data is temporarily unavailable, preventing the web client from freezing.
Original PR description
**Steps to reproduce:** * Install **Accounting** with the **account_reports** module. * Go to **Accounting → Review → Working Files**. * Create or open an audit. * Open any line under **To Review**. * Set the status to **No Error** individually. * Select multiple lines and set the status to **Error** using mass edit. **Observed behavior:** * The web client crashes with `TypeError: Cannot read properties of undefined (reading 'viewType')`. **Cause:** * The status badge component assumes `env.config` is always defined. * When mass editing, the component is rendered in a context where `this.env.config` is undefined, causing the crash. **Fix:** * Add optional chaining (`?.`) to safely access `viewType`: `this.env.config?.viewType` instead of `this.env.config.viewType`. * This ensures the component handles contexts where `env.config` is undefined. opw-5481071
This update fixes a potential issue in the US payroll module by establishing a standardized way to manage city information for employees. Instead of free-form editing, a linked list of cities is now used, ensuring data consistency and accuracy for tax reporting. This improves the reliability of payroll calculations within the US.
Original PR description
**Description:** In United States we load all cities in the L10N package. idea was to make the city field on employee personal address a M2O referring to the list and not something freely editable. **Implementation:** . Add l10_us_private_city_id which's a M2O field referring to the list and not something freely editable. task-5877610
This update resolves an issue where sending voice messages without text would trigger an error. The fix prevents the system from incorrectly interpreting empty HTML as a required text message, ensuring voice messages are successfully sent via WhatsApp.
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
This update resolves an issue preventing the 'compare' button from appearing on the website's rental product selection page. The fix ensures users can now correctly compare rental options, improving the overall user experience. It also adds a waiting step to ensure the comparison process completes reliably.
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
This update corrects a technical issue related to a tour (tutorial) within the Swiss localization of Odoo's payroll system. Specifically, the tour was incorrectly guiding users through work entries, which aren't relevant for Swiss companies. This fix ensures the tour functions correctly for Swiss businesses.
Original PR description
The Work Entries button on the form view of the hr_payslips is defined differently in the Swiss localization. We need to override the tour to make it work for swiss companies. Runbot Error: 234647
A bug preventing the sign tour from completing was resolved. The fix ensures the sign UI tests run correctly by using a reliable selector for the document signing button, eliminating a timeout error. This improves the reliability of the document signing process.
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
This update corrects a bug in the salary configurator where the fuel card benefit would incorrectly appear enabled if no company car was chosen. The change ensures the field is properly initialized and remains disabled until a car is selected, preventing data inconsistencies. This improves the user experience and data accuracy.
Original PR description
On first load of the salary configurator, the fuel-card benefit could appear enabled even when no company car was selected. The dependency logic reacted to in-page changes but did not initialize the field correctly on page load. Initialize the fuel-card field from the current car selection and keep it non-selectable until a car is chosen to prevent inconsistent packages. task-5156562
This update resolves an issue where outdated account synchronization records could cause problems, preventing new connections. By focusing on fresh, uninitialized links, the system now reliably establishes and maintains account connections. This ensures smoother operation for our 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#105187
This update ensures the accounting dashboard's 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 implemented, requires further refinement for full functionality.
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.)
This update resolves a test failure related to a date restriction in the dividend fiscal year selection field. The fix ensures the test environment uses the correct, 'frozen' date range, preventing errors. While a long-running server scenario is considered 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 where canceled refunds were incorrectly included in global invoices generated from Point of Sale (PoS) orders. The fix filters out canceled refund lines during invoice generation, ensuring accurate invoice totals. This improves the reliability of financial reporting for Mexican VAT (EDI) transactions.
Original PR description
When generating global invoices for orders in the PoS, refund of those orders are also included in the global invoice. However, if the refund has been canceled, it should not be included in the global invoice. Steps to reproduce: ------------------- * Create a PoS order and validate it. * Go to the backend and create a refund for that order. * Cancel the refund. * Go to the PoS order list and select the original order * Click on "Generate Global Invoice" > Observation: The canceled refund is included in the global invoice. Why the fix: ------------ We simply filter out the canceled orders when searching for refunded order lines. opw-5492576 Forward-Port-Of: odoo/enterprise#105959 Forward-Port-Of: odoo/enterprise#105868
This update fixes a bug that occurred when users undid copying planning slots. Specifically, it prevented an error from appearing when a record had already been deleted. The fix ensures the system checks for record existence before attempting to delete, improving stability and usability of the Planning module.
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 simplifies the subscription plan view by removing irrelevant order line details like sections and discounts. The change focuses only on displaying the actual subscription products, making it easier for users to configure and understand their plans. This improves usability and reduces visual clutter.
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
This update fixes an issue where the 'Next Booking Start' field for rooms was displaying incorrectly when a room had existing bookings. The change removes a filtering step that prevented the system from accurately calculating the next available time, ensuring the field always reflects upcoming booking opportunities.
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#102129Rendering IoT reports from PoS is failing because of PoS using string uuids as `res_ids`. As they are not required to render pdf reports, we filter them out.
Original PR description
Rendering IoT reports from PoS is failing because of PoS using string uuids as `res_ids`. As they are not required to render pdf reports, we filter them out.
This update resolves an issue where opening reports with associated actions would cause a crash if the report data wasn't fully loaded. The fix ensures that report actions can be used reliably during the report loading process, improving user experience. This prevents unexpected errors and ensures consistent functionality.
Original PR description
When a report was loading if a reportAction was used and no report already was loaded before, it would crash. This happened because we tried to get the context from the data which were not yet loaded. To reproduce: - switch to debug mode (?debug=1) - add a 5s delay in _get_lines - when a report is opening, try to click on the settings cog that appear in debug mode
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 minor usability concern.
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 a problem that prevented the l10n_be_hr_payroll_fleet module from installing correctly when automatic module installation was skipped. The fix ensures the necessary dependencies are included, preventing a traceback error during demo data creation, and improving the module's stability.
Original PR description
Steps to reproduce: 1. Install l10n_be_hr_payroll_fleet with --skip-auto-install and demo data. 2. Traceback when creating demo data because driver_employee_id is missing on the model fleet.vehicle Cause: The module depends on fleet instead of hr_fleet so hr_fleet is only auto installed. Thus, when skipping auto install, the field driver_employee_id doesn't exist. Fix: Change the dependency from fleet to hr_fleet to force the module to be installed. Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/237909 Task: 5875410 Forward-Port-Of: odoo/enterprise#106199
This update fixes issues with how Odoo's website data is collected, specifically addressing problems with robots.txt and content cleanup. The changes ensure accurate data extraction and prevent errors related to website elements like popups and cookie bars, leading to more reliable website information.
Original PR description
## Fix Summary - Include the instance's base URL in internal domains to allow bypassing robots.txt checks for sites that have no domain. - Fix the scraper's cleaning logic to prevent content containers deletion edge cases on Odoo websites. - Refine noise removal for Odoo websites (popups, cookie bars, etc.).
This update resolves an issue where CFDI payroll validation failed when no deductions were present in the Mexican payroll structure. The fix ensures that the CFDI report accurately reflects the absence of deductions, aligning with official Mexican tax regulations. This prevents validation errors and ensures compliance.
Original PR description
…eductions Currently, if users modify the MX Payroll structure in order to have no deductions in the final payroll, CFDI validation for the payroll entry will fail. Steps to reproduce: - Set up…
…eductions
Currently, if users modify the MX Payroll structure in order to have no deductions in the final payroll, CFDI validation for the payroll entry will fail.
Steps to reproduce:
- Set up Payroll Structure "Mexico: Regular Pay" with Salary Rules:
- Used subsidy:
- Code: SUBSIDY
- Category: Allowance
- CFDI Concept: (O02) Employment Subsidy (Effectively Delivered to the Worker)
- Deduction:
- Code: DEDUCTION
- Category: Deduction
- CFDI Concept: (D04) Others
- Net Salary:
- Code: NET
- Category: Net
- CFDI Concept: (P01) Salaries, Wages, Stripes, and Day Labor
- Formula: `result = payslip.paid_amount`
- In Payroll > Payslips, Click 'New Off-Cycle'
- Select employee, compute sheet, create draft journal entry and post it
- Back to the payslip, mark as paid and generate CFDI
Issue:
CFDI Validation will fail with error
`Code : 301 Message : Error en complemento Nómina. [Error #NOM38] El atributo Nomina.TotalDeducciones, no debe existir. Folio: 0002. Serie: SLR/2025/12.`
It occurs because, according to the official specs [1] attribute `TotalDeducciones` should not be reported in case there are no deductions
[1] http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/GuiallenadoNomina311221.pdf
opw-5348789This update corrects a minor error in the invoice and withhold view for the Ecuador localization (l10n_ec_edi) module. The fix removes an extra closing tag that was causing formatting problems with the invoice XML, ensuring invoices are generated correctly. This improves the accuracy 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 a test failure within the Odoo Enterprise testing suite. The change prevents unintended modifications to a key configuration setting, ensuring consistent test results. This improves the reliability of our core enterprise application testing.
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 addresses a temporary issue with downloading tax rates for Switzerland (l10n_ch_hr_payroll) due to changes on the Federal Tax Administration website. The pull request adjusts the import URLs to ensure the system continues to function correctly and accurately reflect the latest tax rates.
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