Daily updates from Odoo
Navigate
Branch
Friday, August 22, 2025
31 changes
Security fixes and vulnerability patches
An internal system object is no longer exposed through remote calls, reducing unintended access to backend internals. This change removes redundant behavior without affecting normal business workflows.
Original PR description
`BaseModel.pool` was exposed in RPC because it is considered as a public method: it is callable, not prefixed by `_`, not decorated with `@api.private`. There's no reason to expose this object in RPC, and `__call__` is redundant with `__getitem__`.
New functionality added to Odoo
Managers can now preview an employee's planned shifts before publishing them, making it easier to check schedules in advance. The system reuses existing previews when possible and converts them into real plans when sent, reducing duplicate work and keeping preview and publishing behavior consistent.
Original PR description
Add planning preview functionality with improved planning reuse logic - Introduced a new wizard to preview planning shifts for a selected employee - Created `is_planning_preview` field to flag planning records used only for preview - Reuse existing preview planning if one exists for the same date range, avoiding duplicate records - When sending planning to employees, reuse the preview planning by unflagging `is_planning_preview` - Ensured consistent datetime handling between preview and publish flows on the frontend task-4701095
Adds support for Swedish BBAN, Bankgiro, and Plusgiro payment flows, including XML export files. This helps Swedish businesses process local supplier payments through formats commonly used by Swedish banks.
Original PR description
Enable generic Swedish BBAN and Bankgiro/Plusgiro payments and xml exports. Task: 3814018 Forward-Port-Of: odoo/enterprise#92584 Forward-Port-Of: odoo/enterprise#87850
Enhancements to existing features
VoIP call recording is now handled by the core VoIP app instead of the AI transcription add-on, making recording available even when AI features are not installed. The update also standardizes the AI VoIP module name, cleans up the implementation, reuses existing upload handling, and adds protections against transcript tampering.
Original PR description
Clean up the VoIP transcription code. Among other things, this PR: - Moves the recording logic to VoIP (part of task 4417073) - Renames "ai_voip" to "voip_ai" - Lints the code - Reuses the file upload service - Adds safeguards against tampering with the transcript
Spreadsheet dashboards now use the right translation context for each module, helping labels and dashboard content appear correctly in the user's language. This improves multilingual dashboard reliability while keeping the change mostly behind the scenes.
Planning Analysis graph and pivot reports are now interactive, letting users click chart bars or pivot cells to open the related planning shifts list. This makes it faster for planners to move from high-level analysis to the underlying schedule details they need to review or adjust.
Original PR description
This commit enhances interactivity in the Planning Analysis report by enabling users to click on graph bars or pivot cells and be redirected to the respected planning.slot list view. The report itself is based on the planning.analysis.report model, but the goal is to redirect to the planning.slot list view on click. Simply removing the disable_linking from the xml view was insufficient for this behavior. To address this, we extended the renderer to override the openView method and explicitly set the resModel to planning.slot when a click action is triggered. task-4798544
Recruitment teams can now define expected skills for job positions, compare applicants and employees against those requirements, and browse better-matching roles from applicant records. The update also improves skill entry dialogs, recruitment views, matching reports, and follow-up activities for missing skills, helping teams make more consistent hiring and workforce planning decisions.
Original PR description
This PR introduces new and improved behaviours for managing skills on models related to the recruitment application. These changes include: - The ability to add expected skills to a job position. - A new widget for managing the expected skills on a job position - Improved dialog for creating skills both on an applicant and job position. - Improved form view for job positions - Improved form view for applicants - Added a new field, score, on education degrees for better job position match calculation - A new field to see how well an applicant matches a job position. - The ability to browse matching positions from an applicant. - A new cron to create activities for employees that are missing skills that are expected on a job position. - A new report that allows you to explore how well employees match a job position in respect to their skills. - Other small details like improved demo data, improved views, etc. task-4680302
This update stores the specific translation method for fields instead of only whether translation is enabled. This helps Odoo preserve clearer translation behavior across upgrades and customizations, reducing ambiguity for multilingual business data.
Original PR description
https://github.com/odoo/odoo/pull/219406 https://github.com/odoo/upgrade/pull/8085 https://github.com/odoo/upgrade-util/pull/296
The CRM pipeline dashboard has been refreshed to align with recent improvements to carousel titles. This provides a more consistent and polished dashboard experience for users reviewing sales pipeline information.
Original PR description
This commit updates the pipeline dashboard following the improvements on the carousel title. Task: 5030334
The VoIP call screen has been visually refined so call statuses look more consistent across regular and AI-assisted calls. This improves clarity for users during calls and creates a more polished, unified experience.
Original PR description
This commit refines the design of the call statuses to ensure consistency across them. task-5026907 Requires: - https://github.com/odoo/odoo/pull/223557 | Before | After | |--------|--------| | <img width="403" height="656" alt="Capture d’écran 2025-08-21 à 09 01 23" src="https://github.com/user-attachments/assets/fec26d4a-f373-4635-a57e-9fd5786350d4" /> | <img width="406" height="660" alt="Capture d’écran 2025-08-21 à 09 00 19" src="https://github.com/user-attachments/assets/dd4cb653-1650-4386-90d5-1e71b182816c" /> |
External planning users can now see open shifts directly in the calendar instead of in a separate list. Open shifts use a distinct background color, making it easier to spot unassigned work and compare it with employee shifts at a glance.
Original PR description
This commit's purpose is to have a better visual of the open shifts in the planning app for external user. Instead of having the list with values, the open shifts are now displayed in the calendar view with a specific background color to be able to differentiate them from employee shifts at one glance.
Resolved issues and error corrections
This fix ensures booking updates sent through Google Reserve keep all existing slot information while adding the party size. This helps Google receive correctly formatted booking details and reduces the risk of failed or inaccurate appointment updates.
Original PR description
The controller incorrectly modified the given "slot" to only contain the party size key. Instead, it should update the information to add this key next to the existing ones, and in turn return a properly formatted slot to Google. Task-3083812 Forward-Port-Of: odoo/enterprise#92839
Fixed an issue where the appointment booking tab could appear blank after reloading the Point of Sale with a booking action link. The booking view now opens automatically as expected, helping staff continue managing reservations without disruption.
Original PR description
**Before this commit**: When reload data in pos then booking tab is display blank. It is action method so need to call when component is called. **After this commit**: Booking view now correctly and automatically opens when the POS is loaded or reloaded with the `actionName=manage-booking` parameter. Task - 4873055 Forward-Port-Of: odoo/enterprise#87819
The Denmark RSU module name was updated to align with the naming used by other Denmark-related modules. This makes the module easier to recognize and keeps naming consistent for users and administrators.
Original PR description
This commit will edit the name of the module to be consistent with the other denmark modules no task id Forward-Port-Of: odoo/enterprise#92759
Fixed an issue where creating a draft journal entry from a filtered payslip list could create an empty entry in the wrong company. The payroll screen now keeps the correct pay run context, so accounting entries are generated for the intended company with the expected details.
Original PR description
Problem ---------- When you create a draft entry from the payslip list view filtered by payrun, it creates a empty journal entry in Company US instead of the current one. Objective ---------- Create a filled journal entry in the good company Solution ---------- The context of the payrun card component was empty. The context of the list controller is now transmitted to the Record Component to keep the same context task-4932712 Forward-Port-Of: odoo/enterprise#90273
Belgian POS sessions now include the required employee identification when clock-in updates are shared across devices. This prevents errors when another device receives the update and communicates with the fiscal blackbox, keeping POS operations running smoothly.
Original PR description
Before this commit, when clocking, the session was synchro with other devices but without the _employee_insz_or_bis_number custom field. _employee_insz_or_bis_number was thus not accessible after the device receives the websocket message and the pos was returning a traceback when trying to send a message to the blackbox. This commit fixes the issue. Forward-Port-Of: odoo/enterprise#92847
Activity deadline filters now focus on the current user’s own next activity deadline instead of mixing in deadlines from other users on the same record. This makes late, today, and future activity views match the activity counts users see and helps teams prioritize their personal follow-ups more reliably.
Original PR description
Partially revert [1] as users expect to see the deadline of their next activity, matching the count displayed in the systray menu. Currently clicking "late activities" for example will show you all records with *any* late activity, instead of records where you personally have late activities. As the more common use case is to view your own activities, that should be what the filter shows. Users may create their own filters to find records based on the next overall deadline. [1]: ad95d7d42f195527bbaccdf349da8316e9c9df12 task-4988330 Forward-Port-Of: odoo/enterprise#92333 Forward-Port-Of: odoo/enterprise#92282
This fix ensures Mexican electronic invoices use the same issue date and time as the invoice posting time. It also preserves record locking during sending, reducing the risk of inconsistent invoice data being submitted.
Original PR description
`fecha_datetime` could be set to a different value than the `document_post_time` passed as parameter because of the `min`. We also must revert the `_cr.commit` during the sending because it removes the lock on records. Instead we set the invoice post time and commit before locking. task-none Forward-Port-Of: odoo/enterprise#92355
The onboarding walkthroughs now guide users through invoicing before advanced accounting tasks, making the learning flow clearer. App-specific wording and button targeting were corrected so users see the right instructions in the right place.
Original PR description
Before this commit: account_accountant tour was displayed before accountant tour, which showed to the user how to do banks and vendor bills before invoices. The text showed for the invoicing app talked about accounting which is only done in the accounting module. Some of the buttons, such as "New" would be displayed at the right place but when switching with another tab with a "New" button it would also display on those. After this commit: first, the user goes through the account onboarding then goes back to the dashboard and does the account_accountant onboarding. The text showed for invoicing stays the same whenever it's invoicing community or enterprise, and shows a different one for accounting. Text is displayed on the right button if it's intended to be only a specified page. task-4822215
This fixes errors that occurred when users added or saved documents in Sign templates before the document preview was fully ready. It helps keep the template editing flow stable and prevents interruptions while preparing documents for signature.
Original PR description
This commit fixes the problem introduced at odoo/enterprise#91434 where the add of documents in the Sign Template got broken by a call to the undefined iframe of the document being added. Additionally, another traceback was being thrown regarding the saving of documents that were also depending on the not yet rendered iframe. This was fixed by skipping the call to the `saveChangesOnBackend` function in that not yet ready iframes. task-5032109
This update fixes an unreliable payroll test related to employee departure notices in Belgium. By setting a fixed test date, the notice duration is calculated consistently, helping prevent false test failures and improving confidence in payroll updates.
Original PR description
In this PR, we fixed the failed test realted to employee departure notice. The main reason, is that the time is not freezed in the test, which will affect the caclulated notice duration for departure. As a fix, we freezed the test time. Related task: 5030553.
Fixed an issue where the email editor in Documents could appear too short, making it harder for users to write messages comfortably. The editor now keeps its intended height when Documents is installed, improving usability without changing workflows.
Original PR description
Previously, the mail composer editor size was only a few lines long if documents was installed. This is because the mail composer override widget implemented in documents caused a CSS class matching the overriden widget to be removed, neutralizing the "min-height" attribute of the editor. This commit readds the overriden widget's CSS class alongside the override, allowing the editor to regain its appropriate height. (This is one of two propositions to fix this bug; please refer to the community PR for the other proposition.) task-5010871
This update corrects an automated payroll test flow related to Belgian employee job changes. It helps keep payroll contract validation reliable by aligning the test with current salary configuration behavior and required employee information.
Original PR description
This commit fixes multiple issues with the hr_contract_salary_tour_job_change tour: - The date version was updated to 2020 to avoid failure with rule parameters only available from this year - As the link was removed in 18.5, the test needed adaptations to get the correct link to go on the salary configurator page - With the version modification, the personnal information (stored on the version) need to be specified as we are using a contract template task-5028648
FedEx shipping requests now send province or state codes in the format FedEx expects, without an added country prefix. This helps prevent delivery label or rate requests from failing for countries where regional codes normally include the country code, such as Sweden.
Original PR description
Before this commit: The province code for some countries includes the country code too. FedEx expects a two letter code in the request. For example, the standard code for Stockholms lan is "SE-AB" and the code FedEx expects is "AB". After this commit: The country code is excluded from the province code. opw-4984662 Forward-Port-Of: odoo/enterprise#92650
This fixes test validation for Brazilian AvaTax requests so expectations match whether the related EDI module is installed. It helps keep automated checks stable without changing customer-facing tax behavior.
Original PR description
The PR #90703 introduced a mocking system for tests in the br modules, however, there was an issue with this in the expected requests validation. l10n_br_edi extends…
The PR #90703 introduced a mocking system for tests in the br modules, however, there was an issue with this in the expected requests validation. l10n_br_edi extends `_prepare_l10n_br_avatax_document_line_service_call` to always include the `itemCode` key in the Avatax or Edi request, as such this causes test cases to fail depending on module installation state. If _edi is installed, it expects the request to contain itemCode, if it isn't installed, the request is expected to not contain this key. A fix for this is to check the state of the current database and see if the module is installed, and include or remove that key from the json as necessary. This fix appears to be the smallest in terms of diff to solve the issue, one of the other options is to override test cases in l10n_br_edi to support the new key but that means that any new test cases that uses this in the future will need to duplicate their code to _edi as well. We may readdress this in the future with different approach but this solves the nightly runbot issues from single app test. runbot-230967
The commuting report now only shows data for the company currently being viewed, preventing records from other companies from appearing by mistake. This improves data separation in multi-company setups and adds test coverage for related ESG reports.
Original PR description
Steps to reproduce ------------------ 1) Create a company with commuting data. 2) Check that the data is visible within the commuting report. 3) Create a new company with no commuting data and use the switched to only see that company. 4) Go to the commuting report. You will see records from the previous company. This is simply because the report is not company-aware. This commit adds a company field, that we extract from the vehicle, and security rules to filter on the right records. Task-4914992
This update fixes an automated Planning test by removing an extra shift created during the test flow. It helps keep the test aligned with the intended scenario, reducing false failures and improving confidence in future Planning changes.
Original PR description
In this commit, we remove additionnal shift when it is created because we don't need it in this tour.
This update fixes an automated test related to batch payments so it works reliably in Python 3.13. It helps keep accounting quality checks stable across newer technology environments without changing user-facing behavior.
Original PR description
**Issue:** "test_partner_account_batch_payments_with_journal_entry" is failing when executed in a Python 3.13 env. **Cause:** Sorting the account move lines on a tuple doesn't necessarily result in the same order between version 3.13 and previous ones. runbot-230794 Forward-Port-Of: odoo/enterprise#92357
Products that are neither sellable nor rentable no longer appear as selectable items when creating a standard sales order. This prevents sales teams from accidentally adding unavailable products and adds test coverage to protect the behavior.
Original PR description
This PR adds a test for the explained case which was solved by: - PR https://github.com/odoo/enterprise/pull/91701 - Commit…
This PR adds a test for the explained case which was solved by: - PR https://github.com/odoo/enterprise/pull/91701 - Commit https://github.com/odoo/enterprise/commit/a2bbf33f5e787420389f1550d8e66b7b6995dc75 #### Issue: Not rentable product were displayed in sale order product dropdown list whether they were salable or not #### Step to reproduce: - install Sale, Rental, - create a product no Sales, no Rental - create a new sale order #### Current behavior: - your product appears in the dropdown list to add a product #### Expected behavior: - your product shouldn't appear in the dropdown list to add a product #### Cause: - From the commit [d5f72c2](https://github.com/odoo/enterprise/commit/d5f72c201bf0642f2f47315f06468528268251a3) domain for rental are computed on back end. - sale_renting module override the `_domain_product_id()` method. It add a OR to the domain on `'rent_ok' = order_is_rental`. Therefore, if one create a sale order outside of the rental app, every not rentable product is displayed. #### Solution: - This domain should apply only if `order_is_rental` is enabled. Therefore add a AND to check if `order_is_rental` is enabled. opw-4966082 Forward-Port-Of: odoo/enterprise#91210
This fix ensures that file uploads are consistently recognized as being in progress across several Odoo Enterprise apps. It helps prevent timing-related errors when users add files to messages, comments, knowledge articles, helpdesk content, spreadsheets, or WhatsApp conversations.
Original PR description
\* = knowledge, test_mail_enterprise, test_spreadsheet_edition, website_helpdesk_knowledge, whatsapp Enterprise counter-part. https://runbot.odoo.com/odoo/error/230901 https://github.com/odoo/odoo/pull/223367 Forward-Port-Of: odoo/enterprise#92796 Forward-Port-Of: odoo/enterprise#92620
Bank statement labels are now handled more safely when matching reconciliation rules. This prevents special characters in payment references or descriptions from disrupting automated matching, helping reduce missed or incorrect matches.
Original PR description
This commit will change the way we normalise the label. We now firstly check that the label is a structure reference and if so we don't escape the numbers. Otherwise, we do an escape of the label and the numbers. Escaping the label will allow to avoid case where we use character like * or . that would mess up the match regex. Example: '+++344/0660/16938+++' will be \\+\\+\\+344\\/0660\\/16938\\+\\+\\+ 'This is a test' will be 'This\\ is\\ a\\ test' task-5023114 Forward-Port-Of: odoo/enterprise#92616