Friday, February 27, 2026
26 changes · saas-18.2
New functionality added to Odoo
This update adds support for accessing and using the latest currency exchange rates from the Central Bank of Cuba (BCC). This expands Odoo's currency conversion capabilities to include transactions involving Cuban currency, improving financial reporting accuracy for businesses operating in or with Cuba.
Original PR description
This commit introduces a new exchange rate provider for the Central Bank of Cuba (BCC). - Implement new exchange rate provider for Central Bank of Cuba (BCC) - Retrieve rates from official BCC source - Reference: https://www.bc.gob.cu/tasas-de-cambio (official published data and documentation) - Parse and normalize published currency values - Support multiple rate types (official, public, special)" Forward-Port-Of: odoo/enterprise#108789 Forward-Port-Of: odoo/enterprise#108367
Enhancements to existing features
This update makes stock workflow tests more precise so they select the intended action button instead of a similar-looking page element. It helps prevent false test failures, supporting smoother maintenance and more reliable releases without changing user-facing behavior.
Original PR description
#### Description of the issue/feature this PR addresses: This avoids unit test failures when the overly generic `.fa-list` matches an unexpected element instead of the "Open Move" button. #### Current behavior before PR: Tests fail. #### Desired behavior after PR is merged: Tests pass. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248234
Resolved issues and error corrections
The departure wizard now archives employees through the standard archive process instead of a lower-level status switch. This helps ensure any related business rules or follow-up actions tied to employee archiving are applied consistently.
Original PR description
When archiving an employee from the departure wizard, use the action_archive method instead of toggle_active. Related to odoo/enterprise#100437 task: 5354002 Forward-Port-Of: odoo/odoo#250365 Forward-Port-Of: odoo/odoo#247224
Documentation and clarification updates
This pull request adds the contributor license agreement signature for mega-ramo. It is an administrative legal update that confirms contribution eligibility and does not change product behavior.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250493
Expense bill references are now made more distinct when multiple expenses for the same employee are posted at the same time. This reduces unnecessary duplicate bill warnings and helps accounting teams process expense reports more smoothly.
Original PR description
Before : If several expenses of one employee are posted simultaneously then the bill reference for one employee is always stay the same, causing the bill duplicate warning to be triggered as it is based on the bill reference After: If several expenses of one employee are posted simultaneously then the most recent date is appended behind the bill reference. task-5262550
This update reduces the time and noise generated by automated tests by reusing common setup work and avoiding unnecessary password hashing during test runs. It helps Odoo's development and release process run more efficiently without changing end-user functionality.
Original PR description
- move a bunch of expensive setUp to setUpClass - backport #152378 to avoid password keying in 17.0 also Forward-Port-Of: odoo/odoo#250887 Forward-Port-Of: odoo/odoo#250667
This update caches repeated language parsing checks so Odoo avoids unnecessary file system lookups when processing many dates or templates. It should improve performance in high-volume rendering scenarios without changing user-facing behavior.
Original PR description
`babel.Locale.parse` checks if a locale is valid by calling `os.path.exists` on the resolved filename for the locale (this is done in `babel.localedata.exists`). Babel does have a locale cache which it checks, but currently that cache is only populated when the locale is actually loaded[^1], therefore in cases where we instantiate a significant number of locales but never actually need to load locale data (e.g. formatting a significant number of datetimes, in qweb, using only non-localised patterns) this results in severe FS traffic for no reason. [^1]: python-babel/babel#1254 has been submitted to fix this issue Forward-Port-Of: odoo/odoo#250888 Forward-Port-Of: odoo/odoo#249795
This update streamlines test setup by centralizing it within test classes. This change improves the reliability and efficiency of our automated testing process, particularly for modules like L10n BE, HR Payroll, Timesheet Grid, and related areas. It ensures consistent test environments and reduces potential issues during development.
Original PR description
Forward-Port-Of: odoo/enterprise#108872 Forward-Port-Of: odoo/enterprise#108739
CRM lead generation now correctly detects when a customer has run out of credits and shows the appropriate no-credit message. This avoids misleading users into thinking their filters returned no results, helping them understand they need credits to continue.
Original PR description
Before this commit, when the user uses CRM to generate new leads and does not have credits, the error message they would get is "Your request did not return any result (no credits were used). Try removing some filters." This commit fixes this in _perform_request by instead of expecting InsufficientCreditError raised it now expects the credit_error flag to be set. task-5925047 Forward-Port-Of: odoo/odoo#250433
Point of Sale invoices are no longer rounded when rounding is not required. This prevents small incorrect invoice adjustments and helps keep customer billing and accounting totals accurate.
Original PR description
Backport of https://github.com/odoo/odoo/pull/247223. opw-5890586 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249834
This fix makes Point of Sale and Self Order automated checks more reliable by waiting for the final request to finish before ending a test. It also ensures all products are available where needed, preventing random build failures in community environments.
Original PR description
https://runbot.odoo.com/odoo/runbot.build.error/241044 We were not waiting the last request to be processed before ending the test, which could cause some random errors. https://runbot.odoo.com/odoo/runbot.build.error/241151 All products were not available in PoS and Self, which caused some errors on community builds. Forward-Port-Of: odoo/odoo#251126
This fixes an issue where users working in right-to-left languages, such as Arabic, could not drop website editor snippets onto valid page areas outside the drop zone. The editor now accounts for the sidebar being on the left in those languages, making drag-and-drop behavior consistent across languages.
Original PR description
When dropping outside a dropzone but still on the page, the code checks if the drop happened well outside of the sidebar (so on its left). However, in RTL languages, the sidebar is positioned on the left, so we need to check if the drop is on the right side of it instead. The fix checks if the sidebar is at the left edge (the body of the document should have the `o_rtl` class) and verifies the drop position is on the right of the sidebar. Steps to reproduce: - Set your profile to Arabic - Drag and drop a snippet outside of a dropzone => It's not dropped, but it should, as it would with an LTR language. task-5484936 Forward-Port-Of: odoo/odoo#247759
Portal users linked to a company with no country can now submit the profile edit form without triggering a server error. If required fields are missing, the page should show the normal validation feedback instead of an error 500, improving reliability for affected customers.
Original PR description
How to reproduce:
- Create a company with no country
- Set a contact's company to that company
- Grant portal access to that contact
- Login as that contact
- Go to the edit information tab
- Leave some of the required fields (Phone, Street & City) empty
- Click on save
The problem:
The page displays an error 500
Why:
When you try to submit the form with some required field missing, the page will try to evaluate this expression : 'int(country_id)''. But since this commit (https://github.com/odoo/odoo/commit/d6d6bee087fe2d3dc17974054353430c2662aecf), the post variable country_id is set to "False" if the partner has no country. 'int("False")' will then raise an error.
opw-5867975
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#247761This fix prevents errors when editing tables through Studio by ensuring the editor has the required menu setup. It also improves table menu visibility and positioning, including when content is edited inside embedded frames, making table editing more reliable for users.
Original PR description
Description of the issue: Commit [1] replaces `overlay` with `localOverlay` for the table menu. However, studio uses its own `wysiwyg` instance and config, which does not define `localOverlayContainers`, causing a traceback when `table_menu` accesses `this.config.localOverlayContainers.key`. Solution: - Define `localOverlayContainers` and its corresponding key in studio’s `wysiwyg` config. - Additionally, adjust the table menu position calculation when the table cell is inside an iframe. ENT PR: https://github.com/odoo/enterprise/pull/108724 [1]: https://github.com/odoo/odoo/commit/7d523d6402c9bff3c2e4bcd0329f486a2d0f45ec Forward-Port-Of: odoo/odoo#250645
This update fixes a typing-related error in the Sales combo configurator. It helps prevent disruptions when users configure bundled or combo products during the sales process.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249973
This fixes website menu links that should scroll to the top or bottom of a page so they are no longer tied to one specific page. Visitors can now use these common navigation links consistently across the website, including in headers and footers.
Original PR description
__Before commit:__ Menu items with anchor URLs (e.g., `#my-anchor`) are prefixed with the current page's path. This is correct for page-specific anchors but breaks generic ones like `#top` and `#bottom`. A menu with the URL `#top` becomes `/current-page#top`, preventing it from functioning as a universal "scroll to top" link. __Cause:__ The server-side logic for processing menu URLs does not differentiate between page-specific anchors and generic anchors like `#top` or `#bottom`, treating all anchor links as belonging to the current page. __Fix:__ In the `save` method, exclude `#top` and `#bottom` from the logic that prefixes anchors with the current page's URL. This ensures these special anchors, typically set on the header and footer, work consistently across the entire website. A new unit test verifies that `#top` and `#bottom` menu URLs are saved correctly without being prefixed. task-5941115 Forward-Port-Of: odoo/odoo#250136
The Discuss app now uses matching background colors for navigation buttons, breadcrumbs, and the control panel in dark mode. This removes a visual inconsistency and gives users a more polished, coherent experience.
Original PR description
The background color of navbar buttons and breadcrumbs in discuss app differed from that of control panel. This PR aligns and syncs these colors for a consistent UI. | Before | After | |--------|-------| |<img width="467" height="99" alt="image" src="https://github.com/user-attachments/assets/2def30f8-18aa-4399-a5d1-1cdc70b4cd81" /> |<img width="458" height="111" alt="image" src="https://github.com/user-attachments/assets/5578cd25-7686-4543-a8dc-3e0fe5aeb4fc" />| This PR contains backport of #217608 task-[4936733](https://www.odoo.com/odoo/project/1519/tasks/4936733) task-[5487197](https://www.odoo.com/odoo/project/1519/tasks/5487197)
This update fixes the XML templates used for Dutch SBR and ICP reports to align with the latest 2026 version of the Dutch taxonomy. This ensures accurate reporting for our Dutch customers, complying with local tax regulations and improving data reliability.
Original PR description
Fix the xml SBR and SBR ICP file template for the 2026 version of dutch taxonomy Documentation: https://www.sbr-nl.nl/werken-met-sbr/taxonomie/documentatie-nederlandse-taxonomie task-5974129
This update corrects a previous failed backport caused by attempting to use a field that hadn't been implemented in the 18.2 branch. The commit removes the reliance on this missing field, ensuring the backport now functions correctly. This resolves a technical issue preventing the update.
Original PR description
A previous backport was using a field that was not yet present in the 18.2 branch, which caused the backport to fail. This commit remove the use of the field. support: 5975960
This update fixes an issue where newly hired employees were incorrectly inheriting their private email address as their work email. The fix ensures that the employee's work email field is properly cleared during the contract creation process, preventing this duplication. This ensures accurate email data for new employees.
Original PR description
**Steps to Reproduce:** 1. Send an offer to an applicant. 2. The applicant submits their details via the salary configurator and enters their private email in the Email field. 3. Once the offer and contract are signed, an employee record is created in Odoo. 4. In the created employee record, the `work_email` field is populated with the email entered in the salary configurator. This same value is also present in `private_email`, which is correct. **Reason:** - The email entered in the salary configurator is stored on the partner and represents the applicant's private email. - The employee's `work_email` field is linked to the partner's email via compute and inverse methods, causing it to inherit the private email value when the employee record is created. **Solution:** - Explicitly clear the employee's work_email field when the applicant sign. task: 5502797 Forward-Port-Of: odoo/enterprise#108769 Forward-Port-Of: odoo/enterprise#106974
This update resolves an issue preventing power buttons from appearing in Odoo Studio reports. The fix defines a key configuration within the Studio editor, allowing it to correctly access and utilize necessary data. This ensures Studio reports function as expected and provides a more complete editing experience.
Original PR description
Description of the issue: Commit [1] replaces `overlay` with `localOverlay` for the table menu. However, studio uses its own `wysiwyg` instance and config, which does not define `localOverlayContainers`, causing a traceback when `table_menu` accesses `this.config.localOverlayContainers.key`. Solution: - Define `localOverlayContainers` and its corresponding key in studio’s `wysiwyg` config. - Additionally, adjust the table menu position calculation when the table cell is inside an iframe. - Also Before `localOverlayContainers` was not defined in studio, so power buttons did not appear in studio reports. Now that `localOverlayContainers` is defined, power buttons must be excluded from the main plugin to prevent them from appearing inside studio. Community PR: https://github.com/odoo/odoo/pull/250645 [1]: https://github.com/odoo/odoo/commit/7d523d6402c9bff3c2e4bcd0329f486a2d0f45ec Forward-Port-Of: odoo/enterprise#108724
This update resolves a warning generated during testing of document attachments. The team replaced artificial PDF content with a standard, minimal PDF file used for testing, ensuring consistent and reliable test results. This improves the stability of the testing process.
Original PR description
While creating attachments/documents for testing, using a "fake PDF content" generates warning from PyPDF 5.4.0 (even with `strict=False`) when the said PDF is eventually parsed. This commit replaces those "fake PDF content" by reading the "minimal" PDF file provided for testing purposes in `base`. runbot-231278 Forward-Port-Of: odoo/enterprise#108779
This update corrects a technical issue in the Spanish reporting module (l10n_es_reports) where an unnecessary date setting was added. This change ensures that reports are generated accurately and reliably, preventing potential data discrepancies. The fix was implemented as a routine maintenance update.
Original PR description
In the Forward Port of this PR: https://github.com/odoo/enterprise/pull/108575 A date_scope was wrongly added opw-5363664 Forward-Port-Of: odoo/enterprise#108886
This update corrects a technical issue that could cause inconsistencies between payslips and their associated line items. The change ensures that all payroll data remains synchronized, preventing potential reporting errors and maintaining accurate financial records. This resolves a minor disruption to payroll processing.
Original PR description
Forward-Port-Of: odoo/enterprise#108729
This update resolves an issue where the cash drawer wasn't automatically opening when the cash details popup was accessed for Italian Point of Sale (POS) systems. The fix ensures that the cash drawer opens consistently, regardless of whether the POS session is open or closed, improving the user experience for Italian retailers. This was a simple function call that was missed.
Original PR description
When opening the cash details popup the cash drawer should be opened. It was not the case for the Italian fiscal printer. Steps to reproduce: ------------------- * Setup a Italian fiscal printer with cash drawer support * Open PoS * Open the cash details popup > Observation: The cash drawer does not open * Try to close the PoS session * Open the cash details popup > Observation: The cash drawer opens Why the fix: ------------ The cash drawer opening function was simply not called opw-5391094 Forward-Port-Of: odoo/enterprise#107987
This pull request records that contributor ngochung207 has signed the Contributor License Agreement. This is a legal and administrative update that helps ensure contributions can be accepted under Odoo's contribution rules.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250278