Thursday, October 30, 2025
31 changes · 19.0
New functionality added to Odoo
The AI assistance used in recruitment has been separated into a dedicated bridge module. This keeps the recruitment app better organized and makes it easier to manage AI-related functionality independently in future updates.
Original PR description
Task-5079755 Forward-Port-Of: odoo/enterprise#95167
Enhancements to existing features
The employee form no longer shows a separate extra hours checkbox because overtime behavior is already controlled through company settings. The extra hours field now appears only when an overtime ruleset is configured, reducing duplicate setup and making employee records clearer.
Original PR description
The extra hours checkbox in the employee form view was redundant, since overtime rules are already configured through the settings. This change removes the checkbox and makes the visibility of the extra hours field dependent on whether an overtime ruleset is defined. task-5082639
Resolved issues and error corrections
Fixes a checkout editor issue where adding a field to the Extra Info form could crash after the form's dedicated submit button was removed. New fields are now placed at the end of the form when the usual insertion point is unavailable, allowing website editors to continue configuring checkout forms reliably.
Original PR description
Steps to reproduce: =================== 1. Add an element to the cart. 2. Enable the “Extra Info” step. 3. Try to add a field in the “Extra Info” form. → Traceback occurs. Cause: ====== In previous versions, the “Extra Info” form contained a submit button, and when adding a new field, the code attempted to insert it relative to that button. Starting from version 19.0, this button was removed and replaced by the common “Confirm” button used in other checkout steps. As a result, the element used to determine the field insertion location (`locationEl`) was `null`, causing a crash when trying to insert a new field. Solution: ========= If no target element is found, the field is now inserted relative to the last element of the form instead, preventing the traceback. opw-5160322 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update makes internal follow-up report tests use the company's configured currency symbol instead of assuming a dollar sign. It helps ensure accounting tests remain reliable across countries where currency symbols may be customized, such as distinguishing USD from local currencies.
Original PR description
This PR makes the currency symbol in `test_followup_lines_branches` and `test_followup_report_with_entries` dynamic, avoiding a hardcoded $ string. Why this is needed: Some localizations, like Argentina, use the $ symbol for their own currency (ARS). To prevent confusion with USD, in some cases a complementary module can change the USD symbol to "USD". When this happens, the original test fails because it specifically expects $. This change prevents that failure by fetching the symbol directly from the company's currency, making the test more resilient to configuration changes.
The website shop editor now keeps product list page options visible when switching to the Style tab. This removes the need for users to click on the page first, making shop page customization more predictable and easier to use.
Original PR description
Before this PR, the ProductsListPageOption component only became visible after clicking on the web page (By example, clicking on a product). Now, by adapting the selector to target <main>, the page options remain visible when navigating to the "Style" tab.
Opening the duplicate transactions wizard without a linked journal no longer causes an error. This prevents an unnecessary crash in Accounting setup or administrative workflows and lets users access the view normally.
Original PR description
When user opens the ``account.duplicate.transaction.wizard.form`` view, a traceback appears.
Steps to reproduce the error:
- Install ``Accounting`` module
- Using Open View, Open ``account.duplicate.transaction.wizard.form`` view
Traceback:
```py
UndefinedFunction: operator does not exist: integer = boolean
LINE 5: WHERE st_line.journal_id = false
^
```
https://github.com/odoo/enterprise/blob/8146cfc7b47ba8536f0fa5208cc69685371b55b8/account_online_synchronization/models/account_journal.py#L278
When the view is opened, the ``_compute_provider_duplicate_ids`` method is triggered,
which calls ``_get_provider_duplicate_transactions`` method.
Since no journal is linked to the wizard, it will raise the traceback from the above line.
ref: 218e8a365b153a202d062152ff69234482bcccf2
sentry-6943450225
Forward-Port-Of: odoo/enterprise#97196Fixes a small typo in the Manufacturing split process that prevented the wizard from completing. This helps users split manufacturing orders without encountering the reported endpoint-related error.
Original PR description
Description of the issue/feature this PR addresses: Issue Mentioned on #233410 Current behavior before PR: Issue Mentioned on #233410 Desired behavior after PR is merged: The split wizard completes successfully. <img width="1920" height="903" alt="mrp_split_wizard_solved" src="https://github.com/user-attachments/assets/9a693ecd-f84f-4d71-b861-902d46276258" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue where creating a new user from a project task could accidentally turn that user's onboarding todo into a project task. This keeps onboarding reminders separate from project work, avoiding confusion in task lists and reporting.
Original PR description
Before this commit, when the user creates a new user from the user_ids field of a task, an onboarding todo will be created with the context given by Framework JS, which means, if the context contains `default_project_id` the onboarding todo will become a task inside the project instead of being a real todo (task with no project set). This commit makes sure the context is reset before creating the onboarding todo. task-5217306
This fix updates an internal automated test so it uses apps that are already included with the test module. It helps prevent false build failures and keeps quality checks reliable without changing customer-facing features.
Original PR description
Purpose: -------- Commit [1] added a test tour relying on the ai_app app which is not a dependency of test_discuss_full_enterprise (only ai is). This commit replaces usages of the views of the ai_app by the views of crm and im_livechat, which are dependencies of the module. Fixes https://runbot.odoo.com/odoo/runbot.build.error/233603 [1]: https://github.com/odoo/enterprise/commit/a7b6eb985e85477f38f15c0e269c2b5ae10d37f6
The Add to Cart button in the product options popup now appears in the shopper's selected website language. This improves the buying experience for non-English customers and keeps the checkout flow consistent across languages.
Original PR description
- t-out is used for variables, so static text inside it isn’t picked up for translation. - Replaced it with a direct <span> so the text is automatically translatable **Before Fix:** <img width="1185" height="915" alt="image" src="https://github.com/user-attachments/assets/dc035e6a-25d1-4b88-9b8f-c013a0aeb75b" /> **After Fix:** <img width="1185" height="915" alt="image" src="https://github.com/user-attachments/assets/80bd5e7b-c705-49a8-a785-86e32bc54daf" /> **Steps to reproduce before the fix:** Go to Website → change the website language to any non-English language. Add any product to the cart. A Product Configuration wizard (for options) will open. The “Add to Cart” button for options is not translated. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This restores the demo company data needed by the Mexican payroll module when it is installed on its own. It prevents installation errors caused by payroll demo records referring to a company that was no longer included.
Original PR description
In the pr #95221 the data from the demo company where no new fields were added was deleted. This decision was made to standardize the demo data in the smallest number of modules. However, the l10n_mx_hr_payroll module does not depend on any other l10n_mx module, as it does not need any of the information added by the other modules, but it does add information about departments and other items based on the company's demo data. This caused an error when installing this module alone, as it attempted to add this information to a company that did not exist. To fix this, the company information is also added as demo in this module, as it was before. I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Chilean electronic invoicing process now uses only one matching company when several records share the same tax ID. This avoids processing errors for organizations with branches or duplicate company records using the same RUT.
Original PR description
Before this commit, if multiple companies shared the same RUT (VAT), for example companies with branches, searching a recipient could return more than one company record. This could lead to errors when accessing variables that expect a single record. To prevent this issue, the search is now limited to one company record. OPW-5128543 Forward-Port-Of: odoo/enterprise#98352
Dimona-related employee fields are now shown only for Belgian employees instead of appearing for everyone. This reduces confusion for companies managing employees in multiple countries and keeps employee forms relevant to each worker's location.
Original PR description
Before this commit, the fields about dimona were shown for all employees, now these fields will be displayed only for belgian employees. task-5148931 Forward-Port-Of: odoo/enterprise#96703
This commit is a follow-up of this commit [[1]]. The aim of this commit is improving the Finnish translations for the localization. no task id Co-authored-by: [sahak-fin](https://github.com/sahak-fin) <sahak@odoo.com> [1]: https://github.com/odoo/odoo/commit/d0017410646500928bf8fe08077f21569c1fa47e --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233482 Forward-Port-Of: odoo/odoo#233042
Original PR description
This commit is a follow-up of this commit [[1]]. The aim of this commit is improving the Finnish translations for the localization. no task id Co-authored-by: [sahak-fin](https://github.com/sahak-fin) <sahak@odoo.com> [1]: https://github.com/odoo/odoo/commit/d0017410646500928bf8fe08077f21569c1fa47e --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233482 Forward-Port-Of: odoo/odoo#233042
The attendance management approval filter now includes records with zero overtime, so managers can still review, edit, or approve them when needed. This prevents relevant attendance entries from being hidden simply because no overtime was recorded.
Original PR description
Currently attendances having 0 overtime are hidden by the filter "To approve", which is weird because managers might want to manually edit them, or approve them. task-5189190 Forward-Port-Of: odoo/odoo#232796
The recruitment app no longer includes the AI widget in the applicant refusal reason screen because that widget has been moved into a separate bridge module. This keeps the recruitment module aligned with the new module structure and avoids showing a widget that is now managed elsewhere.
Original PR description
The ai widget was moved to a new bridge module. Task-5079755 Forward-Port-Of: odoo/odoo#227988
The salary package test setup was corrected to rely only on access groups from modules it already depends on. This prevents test failures caused by referencing payroll groups that may not be installed, improving reliability without changing user-facing behavior.
Original PR description
Before this commit: Running `hr_contract_salary` tests were failing, due to groups used from the module `hr_payroll`, which is not part of the dependencies. After this commit: Use groups from the dependencies. runbot-233547
This fixes a small configuration typo in Indian Payroll that could cause an error when the system looked for the wrong access group. The change helps payroll-related screens or actions load correctly without unnecessary interruptions.
Original PR description
Before this commit an error would trigger caused by a small typo where instead of referencing the hr_payroll module it referencd the hr module which did not define that group. The first appearance is odoo/enterprise#90795. task-5129283
This fix helps the Attendance app handle missing overtime-related day information safely. It reduces the chance of unexpected errors when processing attendance rules, improving reliability for HR operations.
Original PR description
add extra guard for access unusual_days dict using `.get(key, None)` instead of normal `dict[key]` Task: 5107868 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Deleting a signer role from a Sign template now works even when that role has radio buttons on the template. This prevents an error that could interrupt template editing and helps users manage signer roles more reliably.
Original PR description
Before this commit, when deleting a Signer role that already had a radio button dropped in the Template, it would trigger a traceback since the were trying to delete radio buttons individually. This was problematic because radio buttons are deleted in chain, so when deleting the first, we already delete all the remaining radio buttons and its chain link. After this commit, no issue is raised anymore when deleting a signer role, as radio buttons already deleted are now skipped in the code. task-5130925 Forward-Port-Of: odoo/enterprise#96097
The Sign app now handles the steps for adding a new signer in a more reliable order. This prevents occasional display issues where signer fields might not appear correctly, improving consistency for users preparing documents for signature.
Original PR description
Refactor setTimeout usage in sign_template_sidebar.js to prevent non-deterministic behavior. The previous implementation introduced potential timing issues by relying on a fixed 100ms delay, causing span and input components to not render consistently. The refactored code ensures proper rendering order and resolves the timing-related problem. task-4926187 Forward-Port-Of: odoo/enterprise#89741
This fix allows users to update an expense category's cost when vendor taxes from multiple companies are configured. It prevents a save error in multi-company setups, making expense category maintenance smoother for finance and HR teams.
Original PR description
Steps to reproduce: - Create 2 companies - Create a tax one each - Create an expense category - Set the 2 taxes as Vendor Taxes - Select only one of the companies - Change the cost of the expense category - Try saving --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232291
This fixes an issue in the HTML editor where typing next to a linked portion of formatted text could lose the intended formatting. Users editing website or email content should now see more consistent text styling around links, reducing accidental visual inconsistencies.
Original PR description
Problem: If we add a link on a slice of formatted text we end up being able to type unformatted content at the link edges. Cause: After https://github.com/odoo/odoo/commit/3bcbd6f34facb9c88290dbd6496cc5103665a0a2 the `span` can be split and `feff`s are placed around the link, precisely between the link and the `span`. This allows writing unformatted content at the caret when placed between them. Solution: Ensure that the link is created inside the `span`. Also prevent the formatting applied by `.btn` when the link is inside a `span`. Steps to reproduce: 1. Add "abc". 2. Format all the text: set font size 48 (or whatever). 3. Select "b". 4. Create a link on "b" only. 5. Put caret before "a". 6. Press Arrow left. 7. Type any character. → The character is not formatted as the link content. task-5092298 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231980 Forward-Port-Of: odoo/odoo#228353
This fixes an internal test issue where demo products could interfere with online shop product filter checks. The change keeps test data isolated so validation results are more reliable, without changing customer-facing shop behavior.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Set up a database with demo data; 2. run `:TestWebsiteSaleProductFilters.test_latest_sold_filter`. Issue ----- Test fails. Cause ----- The filter retrieves demo products that aren't part of the test suite. Solution -------- In `setUpClass`, execute a SQL query archiving all nonrelevant product templates/variants, bypassing any ORM-level constraints. runbot-233399 Forward-Port-Of: odoo/odoo#232793
Clearing the Horizon days field in the Replenishment view no longer causes an error. The system now treats an empty value as 0 days, keeping inventory replenishment workflows usable and uninterrupted.
Original PR description
Currently, an error occurs when the Horizon days field was cleared in the Replenishment view by the user. **Step to Reproduce:** - Install the `purchase_stock` module. - Create a new product and set…
Currently, an error occurs when the Horizon days field was cleared in the Replenishment view by the user. **Step to Reproduce:** - Install the `purchase_stock` module. - Create a new product and set the Minimum Quantity in the reordering rule (e.g., 5). - Update the In Hand Quantity to a value greater than the minimum (e.g., 10). - Go to Inventory > Operations > Replenishment. - In the Horizon section on the left panel, clear the days field. **Cause:** When the Horizon days field is cleared, **NaN** value is assigned to the context as `global_horizon_days` at [1]. As a result, the `get_horizon_days()` method returns **None**, which later triggers an error at [2] when performing date computation. **Error:** `TypeError- unsupported operand type(s) for +: 'NoneType' and 'int'` **Fix:** This commit handles the issue by defaulting the Horizon days value to 0, when the input is empty. [1] - https://github.com/odoo/odoo/blob/e7aeef2fca0897e5240b087e2c3b95291ed6d568/addons/stock/static/src/views/search/stock_orderpoint_search_panel.js#L21-L24 [2] - https://github.com/odoo/odoo/blob/e7aeef2fca0897e5240b087e2c3b95291ed6d568/addons/stock/models/stock_orderpoint.py#L816 sentry-6936562315
This fix stops non-editable file attachment boxes in the HTML editor from being accidentally styled when users select all content and apply a font color. It keeps protected file elements visually consistent and prevents unintended formatting changes in edited documents.
Original PR description
Problem: When having the `o_file_box` in the selected nodes and applying color, the file box gets the color applied even though it has `contenteditable=false`. Cause: `SelectionPlugin.resources.is_node_editable_predicates` only checks if the parent element is editable for a node. But the node itself can be non-editable even if its parent is editable. Solution: Use `isContentEditable` utils which properly check if a node is editable. Steps to reproduce: 1. Add file. 2. Press CTRL+A and apply a font color. 3. The color style is applied to the node. opw-5080082 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Uploading a damaged or empty PDF attachment no longer causes an error when Odoo tries to preview it in Discuss. This improves reliability for users handling attachments by failing gracefully instead of interrupting the workflow.
Original PR description
Currently, an error occurs when trying to preview the first page of a PDF attachment in Discuss if the PDF has no raw data. **Steps to produce:** - Install the `mail` module. - Open `Discuss` and attach the PDF file without raw data [1]. **Error:** `TypeError: a bytes-like object is required, not 'bool'` **Root cause:** At [2], `to_pdf_stream` directly calls `io.BytesIO()`, when the attachment has no `raw data`, Python raises an `error`. **Fix:** This commit prevents errors when a user attaches a PDF file that has no raw data. [1]: https://drive.google.com/file/d/1onJYlCL_k51UwqKhc0kFaYFJynKuk4fT/view?usp=sharing [2]: https://github.com/odoo/odoo/blob/d42102cac8fff3967cb605a897bbb0e8690464ed/odoo/tools/pdf/__init__.py#L222 sentry-6963775400
This fixes an issue where website editors could no longer change the main title on the blog landing page, such as “Our Latest Posts.” Businesses can now customize that heading directly in the website editor as expected.
Original PR description
*: html_builder, website Since [1] and [2] reverting it by mistake, the blog landing title was not editable anymore. Steps to reproduce: - Open /blog in the website editor. - Try to edit the "Our Latest Posts" heading. After this commit the heading becomes editable in the website editor. [1]: https://github.com/odoo/odoo/commit/ec49429d0d405948fcb93228e7350dfea585246f [2]: https://github.com/odoo/odoo/commit/f503f98915ab39efff80a5904494c879805bb057 Forward-Port-Of: odoo/odoo#233154
This fixes an internal mismatch in website editor resource names after a previous rename. It helps ensure accordion content is correctly treated as editable or non-editable in the website builder, avoiding editing glitches for users.
Original PR description
Since [1], the `force_editable_selector` resource has been renamed into `content_editable_selectors` and `force_not_editable_selector` into `content_not_editable_selectors`. However, resources introduced by [2] have not been converted by mistake. This commit fixes it. [1]: https://github.com/odoo/odoo/commit/13565e0330bbc44eeecbb5d2ecd3acd7b4cdded4 [2]: https://github.com/odoo/odoo/commit/627c1a5a3a113014d1d586a5179ebfe88549f809 task-5222853
The mail composer plugin now uses a cleaner internal identifier format so it can be referenced reliably by other plugins. This reduces integration issues behind the scenes without changing the user experience.
Original PR description
The id used for the mail_composer_plugin had dots, which leads to issues that it cannot be used as a dependency or shared in other plugins. Updated the static id format in mail_composer_plugin.js to use underscores instead of dots. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Archiving an employee with a departure description no longer triggers an error. The change keeps the relevant departure note visible in the employee chatter while avoiding unsupported tracking on the description field.
Original PR description
Issue: The tracking is not implemented for the html field, so when we archive an employee the tracking cannot work. Purpose of this PR: The tracking has been removed from the html field. The tracking is now replaced by a message in the chatter in the write method. Steps to Reproduce on Runbot: install hr archive employee set a `departure description` Notes: originally fixed by #140527 reintroduced by #223342 opw-5137695 Forward-Port-Of: odoo/odoo#229817