Friday, April 24, 2026
15 changes · saas-18.3
Resolved issues and error corrections
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity representation, particularly when dealing with batch transfers and wave transfers, improving data reliability.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#113927
Forward-Port-Of: odoo/enterprise#110241This update resolves an issue where editing bank reconciliation lines with analytic distributions would prevent account changes from being applied correctly. The fix ensures accurate account updates by disabling inverse methods during editing and explicitly recreating analytic lines upon saving. This improves the reliability of bank reconciliation processes.
Original PR description
Before this commit, editing a line with an analytic distribution caused inconsistent behavior when changing the account. When an analytic distribution was present, editing the line created analytic lines linked to the move line. However, changing the account from the form view in the bank reconciliation widget triggered _inverse_account_id, which in turn called _inverse_analytic_distribution. This resulted in unlinking the analytic_line_ids from the move line, preventing the account change from being applied. On a second attempt, the account could be modified because there were no longer any analytic lines to unlink. This led to orphaned analytic lines not linked to any journal item. To fix this, the inverse method is now disabled while editing the line in the form view. Upon saving, the analytic_line_ids are explicitly unlinked, and _create_analytic_lines is triggered during the update to correctly recreate the analytic lines. opw-6107329
This update corrects a display issue where the 'Update Payment' button remained visible after processing batch payments for Mexican CFDI invoices. The fix addresses a technical error in how the system compares invoice UUIDs, ensuring the button only appears for the relevant invoices, specifically the PDD payment, when a batch payment is created.
Original PR description
backport of f41900a4353ea867b08f71ed64f8702a13411bac - Create one invoice with the PUE payment policy. - Create another invoice with the PDD payment policy. - Send both invoices to the CFDI. - Create a batch payment for both and reconcile. - Click on Update Payment on one of the invoices. The Update Payment button does not disappear. In the method _l10n_mx_edi_cfdi_invoice_get_payments_diff, we compare the current UUIDs and the previous UUIDs to determine if the button should be shown. However, when there is a batch payment, the current UUID list includes the UUIDs of all invoices in the batch, including the PUE payment (which should normally be filtered out by the continue). The previous UUID list includes only the UUID of the PDD payment. opw-6055781 Forward-Port-Of: odoo/enterprise#114440
This update prevents unauthorized users from accessing asset information within invoices. Previously, users on certain groups could view assets linked to invoices, leading to errors. Now, access is restricted to users within the 'account.group_account_readonly' and 'account.group_account_invoice' groups, ensuring data security and proper workflow.
Original PR description
Only groups `account.group_account_readonly`, `account.group_account_invoice` or higher have access to model `account.asset`, therefore if an user goes to see an invoice with assets and they are not on either group, they will receive an error and won't be able to access said invoice. How to reproduce: - Create a vendor bill - Create an account.asset and link it to said account.move - Go to the form view with an user that it's on group "Purchase: User" for example --> They get a traceback --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#113858 Forward-Port-Of: odoo/enterprise#112890
A recent update caused an error when refreshing the Generic Tax Report page. This was due to a change in how the report was loaded, leading to incorrect data. The fix ensures the report loads correctly after a refresh, maintaining consistent functionality.
Original PR description
Currently an error occurs when user refreshes on Generic tax report. **Steps to produce:** * Install accountant (with demo) * Search Tax Returns > Enter values and `Apply`>Generic Tax report *…
Currently an error occurs when user refreshes on Generic tax report. **Steps to produce:** * Install accountant (with demo) * Search Tax Returns > Enter values and `Apply`>Generic Tax report * Refresh the page and error will occur on the terminal. **Error:** `ValueError: Expected singleton: account.report()` **Cause:** After a refresh, the ORM call [1] is executed. However, since the report view has changed, `reportId` becomes `undefined`, as it no longer exists in the context. This issue did not occur in `18.2` because, prior to refactor [2] , the report view remained unchanged after a refresh. As a result, it consistently received the same parameters. **Solution:** * Use the stored action `account_reports.action_account_report_gt` similarly to the issue solved in [3] [1]: https://github.com/odoo/enterprise/blob/1094409426eb8c7d24f385dc28e0011a75b2019d/account_reports/static/src/components/account_report/controller.js#L183-L193 [2]: https://github.com/odoo-dev/enterprise/commit/ff7a5f529c9984c2bfd7950136bcf8c0ecae3964 [3]: https://github.com/odoo/enterprise/pull/47896 **Sentry-6612074136**
This update resolves an issue that prevented users from discarding currency rate changes in the accountant module after manual updates. The fix ensures the necessary configuration is initialized, preventing a 'singleton' error that occurred in Odoo 18.3 and later. This ensures data consistency and prevents disruptions during currency rate synchronization.
Original PR description
This error occurs when a user attempts to discard changes after manually syncing currency rates. The issue arises because the `res.config.settings` record was not initialized beforehand. This error…
This error occurs when a user attempts to discard changes after manually syncing currency rates. The issue arises because the `res.config.settings` record was not initialized beforehand. This error occurs `saas-18.3` onwards after the following commit ff7a5f529c9984c2bfd7950136bcf8c0ecae3964 The error occurs on line: https://github.com/odoo/enterprise/blob/79a15ac661d6fb8b6afc9ef791f5fae9349ae2a2/currency_rate_live/models/res_config_settings.py#L1375 **Steps to replicate** * Install `accountant` * Enable Multi-Currency * Settings > Select Journal Under Tax periodicity (Do not save!) * Automatic Currency Rates > Next Run > Update now (reload button) > Discard `ValueError: Expected singleton: res.config.settings()` **Solution:** * Set Journal in `res_config_settings` similar to `saas-18.2` which initialized the `res_config_settings` model as shown below: https://github.com/odoo/enterprise/blob/fd82255b6a597627ff04d4cf65f8238ba8b921c7/accountant/__init__.py#L23-L24 **Sentry-6740605775**
This update resolves an issue that prevented the Payroll module from upgrading correctly after a specific configuration change (deleting a 'Worker' structure type). The fix restricts user deletion of structure types, preventing a ParseError and ensuring smooth module upgrades. This improves overall system stability.
Original PR description
Currently, a ParseError is arising when the user upgrades the `hr_payroll` module after deleting the `Worker` in Structure Types. Steps to Reproduce: --- - Install `Payroll` module (without demo…
Currently, a ParseError is arising when the user upgrades the `hr_payroll` module after deleting the `Worker` in Structure Types.
Steps to Reproduce:
---
- Install `Payroll` module (without demo data).
- Payroll > Configuration > Structures > Delete `Worker Pay`
- Configuration > Structure Types > Delete 'Worker'
- Now upgrade the `Payroll` module
Traceback:
---
```py
ValueError: External ID not found in the system: hr.structure_type_worker
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/hr_payroll/data/hr_payroll_structure_data.xml:15, somewhere inside <record id="structure_worker_001" model="hr.payroll.structure">
<field name="name">Worker Pay</field>
<field name="type_id" ref="hr.structure_type_worker"/>
```
At [1], we reference the ID of the `Worker` record. After deletion, that record no longer exists, which results in a ParseError.
Solution:
---
Users are restricted from deleting the Structure Type.
[1]- https://github.com/odoo/enterprise/blob/92ad37e25deeb1f9f1f24f85b085b575e70c0a5d/hr_payroll/data/hr_payroll_structure_data.xml#L15-L20
sentry-6377659355This update fixes an issue where upgrade scripts within Odoo modules weren't properly organized, leading to potential logging and warning problems. Now, these scripts are correctly associated with the core upgrade package, ensuring smoother and more reliable updates and reducing potential errors.
Original PR description
The resulting modules should be bound to the `odoo.upgrade` package. Side effects: - the loggers created inside the upgrade scripts are now in the `odoo.upgrade` namespace. - warnings raised by bad usages in upgrade scripts are now correctly filtered. Forward-Port-Of: odoo/odoo#261050 Forward-Port-Of: odoo/odoo#258025
This update fixes a mobile issue where swiping between settings would sometimes cause a blank page. The change ensures the settings page fully loads before transitioning, resulting in a smoother and more reliable user experience.
Original PR description
Before this commit, swiping between settings for different apps on mobile devices would often result in a blank page. This occurred because the swipe method did not wait for the target page to render completely before completing the transition. This commit ensures the swipe action waits for the rendering process, preventing the blank state during app navigation. Forward-Port-Of: odoo/odoo#260737 Forward-Port-Of: odoo/odoo#260563
This update corrects a visual issue where adding a new shift sometimes resulted in duplicate employee names appearing in Gantt views. The fix ensures that when employee data changes (like adding a new shift), the display updates correctly, preventing the duplication of employee names. This improves the user experience and data accuracy within the Gantt view.
Original PR description
Sometimes, when adding a new shift (with an employee) in a gantt view that uses `PlanningEmployeeAvatar`, we can have twice the same employee. It can happens on groupby/filtering/reordering/etc.. An…
Sometimes, when adding a new shift (with an employee) in a gantt view that uses `PlanningEmployeeAvatar`, we can have twice the same employee. It can happens on groupby/filtering/reordering/etc.. An exemple could be to have a gantt view with Shift1 User1 we have: ``` +--------------+ | Shift1 User1 | +--------------+ ``` Add another shift (Shift 2) with User2. We'll have: ``` +--------------+ | Shift1 User1 | +--------------+ | Shift2 User1 | +--------------+ ``` instead of ``` +--------------+ | Shift1 User1 | +--------------+ | Shift2 User2 | +--------------+ ``` Because in this case, when we add Shift2, the view will append Shift1 and after it will rename the old Shift1 to Shift2, but in our case, the renaming is not done and so, it retains the old value. This is because in the `PlanningAvatarAction` setup we use `setupDisplayName`. The purpose of this function is to split the displayName contained in a `span` into two `span` elements using a `useEffect`. For example, `<span>Employee (Department)</span>` will be replaced by ```html <span>Employee</span><span class="..">(Department)</span> ``` in order to apply a “muted” style to the department. But to do this, the function will replace the original first span and overwrite it, ```xml <span t-if=“props.displayName” class="text-truncate flex-grow-1" t-esc=“props.displayName”/> ``` since it contains a `t-esc`, which allows Owl to remain “subscribed” to this element and notify components when to update if the displayName ever changes; however, by overwriting it, Owl is no longer aware of the change. Therefore, whenever a component's value changes (in our case, Shift1 becomes Shift2), it is never updated. In fact, manually manipulating the DOM in a useEffect, as `setupDisplayName` does, is not a good solution. To fix this flow, this commit adds a new `t-key` attribute to the original span with a value of `this.props.displayName`, which ensures that when the `t-key` changes value because `displayName` is updated, Owl will recognize that a change has occurred and will re-render. opw-6128168
This update fixes a bug where users received duplicate notifications when submitting the email reminder form for events. The form is now correctly embedded within the event page's HTML, preventing unwanted redirects and ensuring a smoother user experience. This resolves a display issue and improves overall event registration efficiency.
Original PR description
This PR fixes the email reminder form with multiple commits: - Commit 1 fixes the notifications displayed when the email form is submitted as the messages of those notifications are redundant. - Commit 2 inserts the form inside the HTML body instead of the interaction's HTML since the surrounding HTML of this last one may cause display issues as with the <a> tag redirecting the users on the talks page when they click on the form which should not happen. Task-5347538
This update ensures that menu links correctly point to newly created pages, even when the menu URL contains spaces. Previously, URLs with spaces would cause a 404 error. A warning is now displayed in the menu editor to alert users about potential issues with spaceful URLs, preventing confusion.
Original PR description
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a…
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a 404. **Steps to reproduce**: 1. Create a menu item with a URL containing spaces and no leading slash (e.g., "some url"). 2. Click the menu item -> a 404 page is displayed (expected). 3. Click "Create Page" -> the page is created and saved. 4. Click the menu item again -> it still returns a 404 (unexpected). **Issue**: During page creation, the path is slugified (e.g., "some url" -> "/some-url"). The controller then tries to link the menu to the new page by setting `page_id`. However, `pagenew()` only searches for menu URLs with a leading slash, so a menu saved as "some url" is not found when searching for "/some url". As a result, `page_id` is never set, and `_clean_url()` keeps resolving the menu to "/some url" instead of the page's actual URL "/some-url". Menus without spaces (e.g., "mypage") have the same issue where `page_id` is not set, but since `_clean_url()` prepends "/" and renders "/mypage", which matches the new page URL, the menu still resolves correctly. **Fix**: Match both URL formats (with and without leading slash) when linking a menu to a newly created page. Additionally, a warning is now shown in the menu editor when a URL contains spaces, since spaces are slugified during page creation, which could cause confusion. (Note: this is only a warning - URLs with spaces are still allowed.) task-[5095646](https://www.odoo.com/odoo/project/974/tasks/5095646) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260726 Forward-Port-Of: odoo/odoo#248967
This update addresses a technical detail related to our integration with Peppol, a key European payment network. By adding a new field to track the status of Peppol transactions, we ensure accurate processing and future-proof our system for evolving Peppol standards. This enhances the reliability of our international payments.
Original PR description
With the addition of new peppol_move_state for the Application Responses in Peppol, some checks to know wether the move was sent through Peppol were not updated. This commit does that by adding a common field for it. This is usefull as we might add some extra peppol_move_state values in the near future (Peppol supports more response types than we currently offer to our users). Forward-Port-Of: odoo/odoo#258598
This update resolves a minor issue in the Swiss payroll module (l10n_ch_hr_payroll_elm_transmission) where the minimum IS (Intermediary Swiss Franc) amount was incorrectly calculated. The fix ensures accurate reporting for Swiss tax compliance, preventing potential discrepancies and improving data integrity.
Original PR description
Forward-Port-Of: odoo/enterprise#114463
This update fixes an issue where the 'Total' line was missing from reports like the Trial Balance when 'Hide lines at 0' was enabled. The change ensures that all report-level totals are always printed, improving the accuracy and completeness of financial reports. This enhancement provides a more reliable view of financial data.
Original PR description
When "Hide lines at 0" is enabled, printing e.g. the Trial Balance will drop the report-level "Total" line when printing. This commit fixes that. The issue was introduced in this commit[^1], which didn't consider total lines without a parent (i.e. root total lines). [^1]: https://github.com/odoo/enterprise/commit/7fec18b99eb2aa5ebc357dcad5f95f234db5b7d8 Forward-Port-Of: odoo/enterprise#114084