Friday, April 3, 2026
26 changes · 19.0
New functionality added to Odoo
This update introduces a new module for Romania to comply with SAFT (Simplified Fiscal Transparency) reporting requirements. Specifically, it focuses on generating the 'On Demand' XML file needed to submit inventory valuation data to the Romanian tax authority (ANAF). This ensures accurate and timely reporting for Romanian businesses using Odoo.
Original PR description
Baiscally the SAFT for Romania consists of 3 xml files to submit. This commit focuses on the "On Demand" xml to submit, consisting in the inventory valuation of of the company. File with fields and value to export can be found here: https://www.anaf.ro/anaf/internet/ANAF/despre_anaf/strategii_anaf/proiecte_digitalizare/saf_t/ task-3748978 Forward-Port-Of: odoo/enterprise#95540
This pull request updates the .weblate.json files to include translations for additional Odoo modules. This ensures that all user-facing content is accurately translated across different languages, improving the user experience for international customers. It’s a routine maintenance task to maintain localization quality.
Original PR description
Related: https://github.com/odoo/odoo/pull/254667 Forward-Port-Of: odoo/enterprise#112800 Forward-Port-Of: odoo/enterprise#111141
Enhancements to existing features
Odoo now includes a shared utility to better understand amounts written with different decimal and thousands separators, such as European or US formats. This helps reduce mistakes when processing imported or entered monetary-style values without depending on server locale settings.
Original PR description
Add a new utility function `float_parse_str`
that parses a localized amount string into (int_part, dec_part) as strings, without relying on locale settings.
The function detects the number format (European/US) purely from the string structure by analyzing the position and count of '.' and ',' separators.
Handles:
- Plain integers: '1334' -> ('1334', '0')
- European format: '1.334,00' -> ('1334', '00')
- US format: '1,334.00' -> ('1334', '00')
- Unambiguous decimals: '1.50' -> ('1', '50')
Raises ValueError for genuinely ambiguous cases like '1.000' or '1,000' where the separator could be either thousands or decimal.
Enterprise :- https://github.com/odoo/enterprise/pull/110410
Task [link](https://www.odoo.com/odoo/project/967/tasks/6026748)
task-6026748Resolved issues and error corrections
The website header now keeps appropriate side spacing when visual boundaries such as shadows or page background images are present. This prevents menu items and other header content from appearing stuck to the edge, improving the visual polish of boxed page layouts.
Original PR description
Before this PR, the left/right padding of the header would be removed when the header had no background color or when its background color matches the pages color. In these cases, the header boundaries were not visible and so we allowed the header to take more space. However, the previous condition would not check if the page had a background image, or if the header had a shadow defined. The header would have visible boundaries and the element on the extremities would be stuck to the boundaries. This commit updates the condition to include any possible option that would make the header boundaries visible. task-5367502
Documentation and clarification updates
This update records Eric Rieve's individual contributor license agreement for Odoo. It supports the project's legal contribution process by confirming the contributor's authorization to submit work.
Original PR description
Adds the individual contributor license agreement signature file for GitHub user `RieveFireProt` as described in Odoo's CLA contribution process. Contributor details: - Name: Eric Rieve - Email: eric@rievefire.com - GitHub: https://github.com/RieveFireProt Forward-Port-Of: odoo/odoo#256509
Miscellaneous changes
Related: https://github.com/odoo/enterprise/pull/111141 Forward-Port-Of: odoo/odoo#257206 Forward-Port-Of: odoo/odoo#254667
Original PR description
Related: https://github.com/odoo/enterprise/pull/111141 Forward-Port-Of: odoo/odoo#257206 Forward-Port-Of: odoo/odoo#254667
Romanian localization demo data can now be installed without being blocked by carrier validation checks tied to electronic stock documents. The update also sets a default stock valuation account for Romanian companies, reducing setup friction.
Original PR description
This commit ensures that stock picking carrier validation for Romanian EDI does not block demo data installation. task-3748978 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239870
Odoo now avoids sending real customer connection details to its VAT validation service when a database cannot receive follow-up updates. This keeps the service cleaner and prevents unnecessary processing for databases that are not ready to use the update mechanism.
Original PR description
If the user contacts us from an unreachable db (localhost, firewall, .. .), we currently rely on a cron on the db to pull updates by calling `vies_check_update`. Currently, all dbs, even those that don't have the cron (i.e. haven't yet upgraded the `iap` module) will send the `client_identifier/token` upon calling `vies_check_validity`. However, since they don't have the cron, they won't be able to pull updates from IAP. Thus, if we detect that the crond does not exist, we will now send dummy `client_identifier/token` to avoid poluting IAP. task-none
This update silently sends a notification to WhatsApp channels when a new template is sent by a different user. This prevents distracting pop-ups, especially when multiple templates are used, ensuring a smoother experience for users managing bulk communications.
Original PR description
When a different user sends a WhatsApp template, a warning notification is posted in the active channel indicating that future replies will be moved to a new chat. This notification is now posted silently to avoid unnecessary popups, especially when templates are sent in bulk to multiple contacts with ongoing conversations.
VAT validation error messages now show the correct local tax label for each country instead of the generic “VAT” text. This makes error messages clearer for users working with country-specific tax identifiers and avoids confusion during data entry.
Original PR description
Before this **PR**, instead of the VAT label of each country, 'VAT' appeared in the error message. This was due to a mismatch in the matching of country codes. Forward-Port-Of: odoo/odoo#257030
This fixes a visual issue where the empty editor hint could briefly disappear and reappear when users changed related fields such as a Todo title. The editor now only refreshes the hint when the cursor is actually inside the editable area, making the experience smoother and less distracting.
Original PR description
Problem: When the selection is updating, the hint is blinking in the editable. Cause: After 9df2662cc79c2d8277211f7ce0bdb389f783f933, `triggerDebouncedUpdateHints` clears the hint immediately and adds it back using a debounced version of `updateHints` which runs after a few seconds, thus causing this blink. Solution: We only update hint if the selection inside the editable. Steps to reproduce: - Create a new Todo. - Keep the editable empty. - Update the Todo title. - Observe the editable hint blinking. task-6025534 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253846
This fixes an issue where the editor toolbar did not appear when users selected text on macOS using Cmd+Shift+Arrow. The toolbar now responds reliably to that keyboard shortcut, making text editing smoother for Mac users.
Original PR description
Problem: The toolbar does not open when using Cmd+Shift+Arrow to select text on macOS. Cause: On macOS, when the Cmd key is held down, the `keyup` event is never fired for other keys. The toolbar…
Problem:
The toolbar does not open when using Cmd+Shift+Arrow to select text on macOS.
Cause:
On macOS, when the Cmd key is held down, the `keyup` event is never fired for other keys. The toolbar relies on `keyup` for Arrow keys to re-enable `onSelectionChangeActive` and trigger the toolbar update, so it never opens.
See section ("Issue 3 - keyup event put on hold for other keys"): https://web.archive.org/web/20160304022453/http://bitspushedaround.com/on-a-few-things-you-may-not-know-about-the-hellish-command-key-and-javascript-events/
Solution:
Track when an Arrow key is pressed while Cmd is held (`pendingArrowKey`) and use a `selectionchange` listener as a fallback to re-enable the toolbar. The `selectionchange` event fires reliably on macOS even when `keyup` is suppressed. A `isMouseDown` guard ensures the listener does not interfere with the existing mousedown/mouseup flow.
Steps to reproduce:
1- Type some text
2- Use Cmd+Shift+Arrow (left or right) to select text 3- Observe the toolbar does not appear
task-6013408
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#257166
Forward-Port-Of: odoo/odoo#253293This update fixes a faulty invoice report configuration in the Chilean localization module. It prevents upgrade and release issues caused by an invalid view, reducing manual checks for developers and improving deployment reliability.
Original PR description
There is a broken xpath in l10n_cl.report_invoice_document When the l10n_cl module is installed, it results in the faulty view being applied to v18 and later versions. This is particularly annoying because some rolling releases fail because a view with invalid locator is found. The view won't be disabled after a rolling release upgrade and many developers will be spared from checking the databases manually. Forward-Port-Of: odoo/odoo#254369 Forward-Port-Of: odoo/odoo#253588
The HTML editor now ignores non-editable embedded items and whitespace-only formatting nodes when deciding whether selected text is already bold. This lets users reliably turn bold formatting off again when selections include items like file embeds or indented list content, reducing formatting frustration in notes and other editable content.
Original PR description
When determining whether the "bold" action is about adding bold or removing bold, non-editable text nodes are also taken into account. Because of this, if the selection contains an embedded component such as `/file`, it always considers bold was not applied on all nodes, and should therefore be applied. The action thus never removes bold. This commit fixes this by only taking into account the editable nodes. Steps to reproduce: - Go to a "To do" note - Add a few lines of text - Add a `/file` in the middle - Select all - Press Ctrl+B: bold is applied on the surrounding text - Press Ctrl+B again => Bold was not removed from the surrounding text task-5955977 Forward-Port-Of: odoo/odoo#256209 Forward-Port-Of: odoo/odoo#249816
Closing the command palette by clicking outside it no longer makes the editable area jump back to the top. This keeps users in the same place while writing or editing content, reducing disruption and accidental loss of context.
Original PR description
Before this commit: the editable area scrolls to the top when the command palette is closed by clicking the gray zone After this commit: we override the focus function of the editable and use focusEditable instead, which keeps the selection. Note it's a succession fix of https://github.com/odoo/odoo/pull/250624 and both of them are a workaround without touching the ui_service and command palette. Also added super.destroy() in the previous fix till 18.4. On the 19.0 forward port, we introduced the special handling for textarea elements to call the default focus function. This is to properly update the selection from the textarea to the current editable. task-6034339 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256372 Forward-Port-Of: odoo/odoo#253638
Deleting text at the end of a toggle title no longer causes an error when there is no following item. This improves reliability for users creating or editing toggle lists in notes and other HTML editor content.
Original PR description
Steps to Reproduce: - Go to To-Do → Create New - Create a toggle list - Type something in the title - Press the delete button Description of the issue: - A traceback occurs. Cause: - In `handleDeleteForwardTitleEnd`, there is a check to verify whether the toggle title’s next sibling matches the toggle selector. However, when there is no next sibling, calling `matches()` results in a traceback. Solution: - Only check `matches()` if the next sibling exists. task-6040479 Forward-Port-Of: odoo/odoo#256379 Forward-Port-Of: odoo/odoo#254557
Inventory adjustments with no quantity change will no longer create journal entries with zero debit and credit. This reduces unnecessary accounting clutter and helps finance users focus on meaningful stock valuation records.
Original PR description
**Issue**: Applying a physical inventory adjustment with a 0 quantity difference creates an account move with 0 debit/credit, resulting in accounting noise. **Steps to reproduce**: - Configure a product with perpetual valuation - Go to Inventory > Configuration > Warehouse Management > Locations - Remove the internal filter and open the "Inventory adjustment" location - Set a Loss Account - Go to physical inventory - Create and apply for this product with counted quantity of 0 - Go to Journal Items -> An item is created **Cause**: While checking whether an `account.move` should be created: https://github.com/odoo/odoo/blob/9dfd673465e4a3326a6caa64c8d61fe7319cbc44/addons/stock_account/models/stock_move.py#L613-L620 The quantity of the `stock.move` is not taken into account. opw-5957406
This update removes a thin visual line that could appear in a website banner shape at certain screen sizes or zoom levels. It makes the banner design look cleaner and more consistent for visitors and editors.
Original PR description
Steps to reproduce the issue: 1. Enter website edit mode 2. Create a "Banner connected" block 3. Select the 10th option under "Bold" as the shape Issue: A thin line appears at certain resolutions or zoom levels Cause: This is due to inaccuracies with the svg's calculated style. Solution: This commit brings it in line with what's done for the Bold 20 shape, by creating a bit of overlap, which fixes the line. (Open images in fullscreen to see the difference!) Current behavior before PR: <img width="1919" height="861" alt="image" src="https://github.com/user-attachments/assets/f9ac02e6-9e89-4bf1-8f60-acdac8014e0f" /> Desired behavior after PR is merged: <img width="1918" height="847" alt="image" src="https://github.com/user-attachments/assets/a6808f48-e39f-41ec-8f6c-5738214ca412" /> Commit where these shapes were added, for reference: https://github.com/odoo/odoo/commit/81a2ff6d816bd6a279f6ce8fb5f935abc44f6518
Fixed an editor issue where adding a caption to certain images could disrupt surrounding content and allow duplicate captions. This keeps page content structured correctly and makes the caption toolbar state reliable for users.
Original PR description
Steps to reproduce: - Go to To-do - Open a demo record (e.g., "Welcome Mitchell Admin") - Click on an image - Click on "Caption" from the toolbar - Click on the image again Description of the issue:…
Steps to reproduce: - Go to To-do - Open a demo record (e.g., "Welcome Mitchell Admin") - Click on an image - Click on "Caption" from the toolbar - Click on the image again Description of the issue: - When adding a caption, the parent paragraph block of sibling nodes is removed, making them direct children of the editable area. - After adding a caption, reopening the powerbox does not show the caption button as active, allowing multiple captions to be added on the same image. Cause: - When the image has `display:block`, `closestBlock` returns the image itself as its closest block. - As a result, when a caption is added to an image, its parent paragraph block is not split around the image even if the image has sibling nodes, and when `unwrapContents` is called, both the image and its siblings get unwrapped, making them direct children of the editable area. - Since `closestBlock` is the image (and not a `<figure>`), the caption button in the toolbar is not marked as active even when a caption already exists, so clicking it again adds another caption instead of removing the existing one. Solution: - Instead of using the image's `closestBlock` directly, find the `closestBlock` of its parent element. - This ensures the correct block is found even when the image has `display:block`. task-6051549 Forward-Port-Of: odoo/odoo#255064
The website editor's Bold 10 decorative shape has been adjusted to prevent a thin unwanted line from appearing in some layouts. This improves the visual polish of banners across different screen sizes and spacing settings.
Original PR description
Steps to reproduce: - Enter website edit mode - Insert `s_banner_connected` snippet - Add "Bold 10" shape (`19.svg`) - Depending on padding, size, resolution etc. a thin line appears This commit adds an overlap to fix the apparition of the line. | Before | After | |--------|--------| | <img width="1919" height="861" alt="image" src="https://github.com/user-attachments/assets/06ecf9c4-f9d8-44bd-b48f-a3d8f559d973" /> | <img width="1918" height="847" alt="image" src="https://github.com/user-attachments/assets/1bda5da4-53f4-4105-9af2-06a57da67d0a" /> |
Editing or deleting a public holiday now only recreates timesheet entries for approved time off requests. This prevents refused or draft leave requests from generating incorrect timesheets, keeping attendance and reporting data accurate.
Original PR description
…d leaves Description of the issue/feature this PR addresses: When a public holiday is edited or deleted, the timesheet re-creation is erroneously done for *all* leaves, even those which are canceled or still in draft. Steps to Reproduce: 1. Create a Time Off request for a timesheet-creating leave type (i.e. `timesheet_generate = True`) that overlaps with a public holiday. 2. Refuse the Time Off request. 3. Delete the public holiday the request overlaps with. Current behavior before PR: The deletion of the holiday causes timesheet entries to be created, even though it's a refused request. Desired behavior after PR is merged: The deletion or editing of the public holiday only re-creates the timesheets for the leaves that are actually valid and thus need timesheet entries. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255155 Forward-Port-Of: odoo/odoo#250372
This fix lets users remove certain zero-value accounting lines when those lines were created with incomplete or incorrect information. It helps keep accounting entries cleaner without affecting normal posted accounting data.
Original PR description
-added some conditions to allow the user to remove some zero move lines as they may have been created and do not have good information. task-4590580 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#256369 Forward-Port-Of: odoo/odoo#202272
This fixes invoice tax calculations so price-included taxes are handled correctly even when a zero-value price-excluded tax is also present. Businesses get more reliable tax totals on invoices and avoid incorrect fallback calculation behavior in accounting.
Original PR description
…xes_data Suppose an invoice with price-included taxes but with a zero price excluded one. We don't want to fallback on the excluded mode just for that. opw-6060486 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257495
This update resolves an issue where the 'Edit Properties' button was unexpectedly appearing in the project view. The fix ensures this button only appears when relevant, streamlining the user experience for managing project database settings. This prevents confusion and improves usability.
Original PR description
Steps to produce: --- - Install `Databases` modules. - Go to project > Switch to list view and open project. - Click on the gear icon > Click `Edit Properties.` Observation: --- - Clicking `Edit…
Steps to produce: --- - Install `Databases` modules. - Go to project > Switch to list view and open project. - Click on the gear icon > Click `Edit Properties.` Observation: --- - Clicking `Edit Properties` does nothing. Root cause: --- - The `Edit Properties` action appears whenever a properties field is present in the view. - Currently, in `project.project` the field `database_kpi_properties` is added from database module (See [1]). - Here at [2], the field is added in `edit_project` view. - However, the field is only visible when `database_hosting` is set, and its value is different from `other`. Solution: --- - Patched `FormController.getStaticActionMenuItems()` and added a condition to make the `addPropertyFieldValue` menu item unavailable when the current model is `project.project`. [1]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/databases/models/project_project.py#L36 [2]: https://github.com/odoo/enterprise/blob/84022deef3414096fcaf61f8d45c08393431e0ab/databases/views/databases_project_views.xml#L158 Note: --- - Also found that, clicking `Edit Properties` from a page other than the KPI page does nothing. We could either show a guiding `dialog box` or limit the visibility of `Edit Properties` to the KPI page only. opw-5933007 ---
This update resolves a technical issue that caused Odoo to crash when calculating annual leave days for newly created employee records. The fix adds a check to prevent errors during calculations, ensuring the 'Annual Leave Days Total' field functions correctly for all employees, including those just added to the system.
Original PR description
This commit will add a guard condition to the `l10n_ae_annual_leave_days_total`'s compute method to skip SQL execution when the record has no database ID. Why: Users experienced a server-side traceback when opening Odoo Studio on the employee form and enabling the 'Annual Leave Days Total' field. The traceback occurred because the field's compute method attempted to execute a direct SQL query using `self.ids`. What: - Added a check for `self.ids` at the beginning of the compute method. - Ensured the field defaults to `0` or a neutral value if the record is still in the "New" state. task-5940225
This change updates URLs used for testing Wise direct deposit integrations to reflect Wise's upcoming domain change from sandbox.transferwise.tech to wise-sandbox.com. This ensures continued functionality of test and sandbox payment flows, though a new sandbox account will be needed.
Original PR description
Wise is deprecating their legacy sandbox (sandbox.transferwise.tech) in June 2026. Replace all sandbox URLs with the new wise-sandbox.com domain to avoid breaking test/sandbox payment flows. - API: api.sandbox.transferwise.tech → api.wise-sandbox.com - Portal: sandbox.transferwise.tech → wise-sandbox.com Note: API keys from the legacy sandbox are not transferable to the new environment. Affected users will need to create a new sandbox account, though the impact should be minimal as most customers do not actively use the sandbox. task-6074132