Daily updates from Odoo
Wednesday, May 27, 2026
43 changes · saas-19.3
Resolved issues and error corrections
This update resolves a problem where icon assets (like `.woff2`) weren't loading correctly, causing errors. The fix ensures that asset versions are handled consistently, preventing mismatches and improving the display of icons on the website. This improves the user experience by ensuring all icons load properly.
Original PR description
Currently, an exception is raised while loading icon content assets such as `.woff` or `.woff2`, due to a mismatch between the requested asset version and the latest available version. Steps to…
Currently, an exception is raised while loading icon content assets such as `.woff` or `.woff2`, due to a mismatch between the requested asset version and the latest available version. Steps to produce: - Install website - Open page `/web/assets/1/6a783c3/web.odoo_ui_icons.min.woff2` Error: `UnboundLocalError: cannot access local variable 'assets' where it is not associated with a value` This issue occurs because the code at [1] compares `binary.extension` with `asset_type`, causing the condition to fail because `binary.extension` contains values such as `woff` or `woff2`, while `asset_type` is set to `'binary'`. The root cause is that `asset_type` with value `'binary'` is being passed as a parameter to the `bundle.get_link` method (see [2]). The `asset_type` value comes from the `_parse_bundle_name` method (see [3]), where it is set to `'binary'` whenever the file extension belongs to `BINARY_EXTENSIONS`, such as `woff` or `woff2` (see [4]). This commit fixes the inconsistency between `bundle.get_version()` and `bundle.get_link()` when `binary` is `True`. Currently, `bundle.get_version()` used `extension if binary else asset_type`, while `bundle.get_link()` always received `asset_type`. This could lead to an incorrect redirect when handling binary assets. The fix normalizes the value by updating `asset_type` beforehand and reusing it consistently in both `bundle.get_version()` and `bundle.get_link()`. This also improves readability by removing the inline conditional expression. [1]: https://github.com/odoo/odoo/blob/8a2e001cffd381a89ab192f2e391ccc0843108c4/odoo/addons/base/models/assetsbundle.py#L166 [2]: https://github.com/odoo/odoo/blob/8a2e001cffd381a89ab192f2e391ccc0843108c4/addons/web/controllers/binary.py#L146 [3]: https://github.com/odoo/odoo/blob/8a2e001cffd381a89ab192f2e391ccc0843108c4/odoo/addons/base/models/ir_asset.py#L93-L94 [4]: https://github.com/odoo/odoo/blob/8a2e001cffd381a89ab192f2e391ccc0843108c4/odoo/tools/constants.py#L6-L7 Sentry-7441025709 Forward-Port-Of: odoo/odoo#263506
This update corrects a bug that prevented users from creating bank accounts with certain proxy values (CPF/CNPJ or Random Key). The issue stemmed from incorrect data types being passed to validation functions, causing an error. This fix ensures bank account creation processes smoothly for all users.
Original PR description
Creating a bank account with a falsy proxy value generates a traceback. Steps to reproduce the error: - Install ``l10n_br`` module with demo data - Switch to BR Company - Go to Contacts >…
Creating a bank account with a falsy proxy value generates a traceback. Steps to reproduce the error: - Install ``l10n_br`` module with demo data - Switch to BR Company - Go to Contacts > Configuration > Bank Accounts > Create a new bank account > Add any value as Account Number > Account Holder: BR Company > Proxy Type: CPF/CNPJ(BR) or Random Key (BR) > Save Traceback: ```py InvalidFormat: The number has an invalid format. ``` ```py TypeError: 'bool' object is not iterable ``` https://github.com/odoo/odoo/blob/132f042ca14012877f608783b57a0ca9c4e565f3/addons/l10n_br/models/res_partner_bank.py#L38-L45 For ``CPF/CNPJ`` validation, calling ``check_vat_br`` with a falsy proxy value raises a traceback. https://github.com/odoo/odoo/blob/132f042ca14012877f608783b57a0ca9c4e565f3/addons/l10n_br/models/res_partner_bank.py#L56-L61 For ``Random Key`` validation, ``re.fullmatch`` expects a string value, but receives ``False``, leading to a traceback. sentry-7488238698 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266243 Forward-Port-Of: odoo/odoo#264995
This update fixes an issue where CodaBox statements were sometimes incorrectly routed to the wrong bank journal due to currency differences. The system now prioritizes journals with explicit currency IDs, ensuring statements are accurately assigned to the correct currency-specific account. This improves financial reporting accuracy.
Original PR description
When several journals share the same IBAN but use different currencies, a CODA could land on the wrong journal instead of the currency-specific one. Split the lookup in two passes: first a journal with an explicit currency_id matching the CODA, then fall back to the no-currency journal (qualified by the company currency). Steps to reproduce: - Create 2 bank journals sharing the same IBAN; one without currency and one with USD. - Setup CodaBox connection and retrieve USD statements. - Before this fix: may land on the EUR journal. opw-6048931 Forward-Port-Of: odoo/enterprise#117457 Forward-Port-Of: odoo/enterprise#114590
This update resolves a bug in the HTML Editor that caused crashes when users removed tables while resizing. The fix restricts resizing to the primary mouse button and prevents the editor from running resize logic when no target is available, improving stability and preventing unexpected errors.
Original PR description
#### Description of the issue this PR addresses: - Table resize listeners are not cleaned when the table is removed while resizing - Next mousemove runs resize logic with a null target and throws traceback #### Desired behavior after PR is merged: - Restrict resize start to primary mouse button only - Prevent resize logic execution on null targets #### Steps to reproduce: - Open the todo app - Insert a table and select whole table - Move cursor on a table cell border to see resize cursor - Right click and choose Cut from browser context menu - Move the mouse again - Resize logic crashes with null target traceback task-6212279 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266274 Forward-Port-Of: odoo/odoo#264065
This update fixes a problem where invoices with year-range invoice numbers wouldn't send correctly to MyInvois. The change ensures the system correctly processes these invoice numbers, allowing invoices to be successfully transmitted for accounting purposes. This resolves a disruption in the automated invoice submission process.
Original PR description
Currently, an error is produced when sending invoices to MyInvois if the invoice number uses a year-range sequence. **Steps to Reproduce:(v-19.0)** 1. Install the `accountant` and `l10n_my_edi`…
Currently, an error is produced when sending invoices to MyInvois if the invoice number uses a year-range sequence. **Steps to Reproduce:(v-19.0)** 1. Install the `accountant` and `l10n_my_edi` modules (with demo data). 2. Switch to "MY Company"(Malaysian company). 3. Enable "_Quick Encoding_" for Customer Invoices in Settings. 4. Create a customer invoice with customer "_MY Company_", set a Malaysian classification code and taxes on the invoice line, and confirm the invoice. 5. Set the invoice back to Draft and modify the invoice number with a year-range sequence (e.g., INV/2025-2026/00001), then confirm it again. 6. Open the invoice list view and click **"Send to MyInvois"**. **Error:** `ValueError: not enough values to unpack (expected 4, got 2)` The `_get_sequence_date_range()` method on `myinvois.document` overrides the method from `sequence.mixin` and returns only two values from `date_utils.get_fiscal_year()`. However, it expects the method to return four values at [1]. [1] - https://github.com/odoo/odoo/blob/57b6b8d63b038ede32dfcc833c30e93d0cf4166c/addons/account/models/sequence_mixin.py#L146 Ref: https://github.com/odoo/odoo/blob/1ce06257f877711bd5de5487364909d72b476318/addons/account/models/account_move.py#L4263 sentry-7320998540 Forward-Port-Of: odoo/odoo#266221 Forward-Port-Of: odoo/odoo#253237
This update fixes an issue where the template name wasn't correctly displayed after selecting a template using the 'Search More' feature in the employee form. The fix ensures that the correct template label is shown, improving the user experience when loading templates. This prevents users from seeing 'Unnamed' and ensures accurate template selection.
Original PR description
Version: - saas-19.1 Steps to reproduce: - Open an employee form. - Click "Load a Template". - Use "Search More" and select a template. Issue: - The selected template label is displayed as "Unnamed" after selecting a template from the search view. Cause: - When selecting a record through "Search More", the returned value only contains the record `id` and does not include `display_name`. As a result, the many2one field cannot render the correct label and falls back to "Unnamed". Fix: - Perform an ORM read to fetch the missing `display_name` using the selected record id, then update `selectedTemplate` with the complete value so the correct template name is displayed. Task-6186635 Forward-Port-Of: odoo/odoo#264556
This update fixes an issue where the End Balance columns in the Romanian Trial Balance reports were displaying incorrect totals when the report hierarchy was enabled. The fix eliminates double-counting of account groups, ensuring accurate and consistent financial reporting for Romanian businesses using Odoo Enterprise.
Original PR description
### Issue before this commit: The total row for the End Balance columns in the Romanian 4-column and 5-column Trial Balance reports displayed incorrect values when the report hierarchy was enabled. ### Steps to reproduce the issue: 1. Downaload Accounting and l10n_ro 2. Switch to RO company 3. Go to Trial Balance report and be sure that Posted Entries, Accrual Basis are setted on Hierarchy and Subtotals 4. See that the End Blance both debit and credit is not correct ### Cause of the issue: The _custom_line_postprocessor method iterated over all report lines indiscriminately, adding account group subtotals to the running accumulator and causing duplicate counting. ### Reason to introduce the fix: To eliminate group double-counting and providing consistency with the totals in all the trial balances reports. opw-6146200 Forward-Port-Of: odoo/enterprise#118080 Forward-Port-Of: odoo/enterprise#117855
This update ensures that accounting reports accurately reflect reconciled transactions even after a reconciliation is removed. Previously, leftover data caused incorrect display of reconciled items. This fix cleans up the system to prevent misleading reporting and maintain data integrity.
Original PR description
### Description `account.full.reconcile` has no `unlink()` override, so when the record is removed PostgreSQL nulls `full_reconcile_id` on the linked `account.move.line` rows via the default…
### Description
`account.full.reconcile` has no `unlink()` override, so when the record is removed PostgreSQL nulls `full_reconcile_id` on the linked `account.move.line` rows via the default `ondelete='set null'` FK rule, but `matching_number` is a plain `fields.Char` that nobody recomputes. The line ends up with a decimal `matching_number` (the id of the deleted full) while `full_reconcile_id` is `False`, no partials point to it and `amount_residual` is the full open amount. The line is rendered as reconciled in the UI even though the reconciliation is gone.
This PR mirrors `account.full.reconcile.create()`'s contract on the unlink path: invoke `_update_matching_number(amls)` after the records are removed, so every previously-linked line is cleaned. The integrity check `_constrains_matching_number` is also extended with `full_reconcile_id` in its `@api.constrains` tuple, so future ORM writes that desync the field surface the inconsistency immediately.
### Steps to reproduce
A single-call reproducer on a vanilla `19.0-all` runbot, no third-party modules:
```python
company = env.ref('base.main_company') # USD company
partner = env['res.partner'].create({'name': 'demo'})
# Foreign currency rates with a sharp move so the payment generates an FX diff
env['res.currency.rate'].create([
{'currency_id': env.ref('base.EUR').id, 'name': '2026-01-15', 'rate': 0.90, 'company_id': company.id},
{'currency_id': env.ref('base.EUR').id, 'name': '2026-03-15', 'rate': 1.20, 'company_id': company.id},
])
inv = env['account.move'].create({
'move_type': 'out_invoice', 'partner_id': partner.id,
'currency_id': env.ref('base.EUR').id,
'invoice_date': '2026-01-15', 'date': '2026-01-15',
'journal_id': env['account.journal'].search([('type','=','sale')], limit=1).id,
'invoice_line_ids': [(0,0,{'name':'x','quantity':1,'price_unit':1000.0})],
})
inv.action_post()
env['account.payment.register'].with_context(
active_model='account.move', active_ids=inv.ids
).create({'payment_date': '2026-03-15'}).action_create_payments()
recv = inv.line_ids.filtered(lambda l: l.display_type == 'payment_term')
full = recv.full_reconcile_id
assert full and recv.matching_number == str(full.id)
full.unlink() # the bug detonator
recv.invalidate_recordset()
assert recv.matching_number is False # FAILS without this PR
assert not recv.full_reconcile_id
```
Before the PR `recv.matching_number` keeps the decimal id of the deleted `account.full.reconcile`. After the PR it is cleared together with `full_reconcile_id`.
### Diagnostic query
```python
env['account.move.line'].search([
('matching_number', '!=', False),
('matching_number', 'not like', 'P%'),
('matching_number', 'not like', 'I%'),
('full_reconcile_id', '=', False),
])
```
Returns lines in the orphan state on any database.
### Impact
Observed on a real production database: 142 `account.move.line` records in this orphan state accumulated over ~13 days of normal accounting activity, on receivable, payable and bank accounts. All those lines display as reconciled in the UI while the underlying reconciliation is gone. Empty `account.full.reconcile` rows are also left behind.
### Tests
`addons/account/tests/test_account_move_reconcile.py::TestAccountMoveReconcile::test_full_reconcile_unlink_clears_matching_number`
### Linked
* Bug report: closes #264790
The change is a single-file 13-line `unlink()` override plus a one-character extension to an existing `@api.constrains` tuple. No data migration is needed for new databases; existing orphans on databases that hit the bug before the fix lands can be cleaned with a one-off:
```python
env['account.move.line'].search([
('matching_number', '!=', False),
('matching_number', 'not like', 'P%'),
('matching_number', 'not like', 'I%'),
('full_reconcile_id', '=', False),
]).write({'matching_number': False})
env['account.full.reconcile'].search([
('reconciled_line_ids', '=', False),
('partial_reconcile_ids', '=', False),
]).unlink()
```
Forward-Port-Of: odoo/odoo#264805This update ensures a more visually appealing and consistent look for the HTML Builder by aligning the accent colors used in buttons with the text colors. Previously, the text colors had a weaker contrast, now they match the button styles for better readability and a polished design.
Original PR description
In the html builder, we use strong, neon colors especially for the `btn-success` and `btn-danger`. However, the tint for `text-succes` / `text-danger` was duller, with a bad contrast against the background. This commit simply uses the same color, within builder buttons, for the text classes accent colors as for the btn classes. Forward-Port-Of: odoo/odoo#262277
This update fixes an issue where long task names in the calendar's 'to schedule' panel would overflow, making it difficult to read. Now, task names are automatically truncated with an ellipsis when they are too long, ensuring a cleaner and more user-friendly experience.
Original PR description
**Before this commit:** Task names in the "to schedule" side panel of the Calendar view were not truncated, causing them to overflow their container when the name was too long. **After this commit:** Task names in the "to schedule" side panel are now properly truncated with an ellipsis when they exceed the available width. task-6237072 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266018
This update fixes a visual issue where the reply composer remained visible after a live chat conversation ended or a channel became read-only. Now, the composer automatically disappears when replying is no longer possible, ensuring a cleaner and more consistent user experience. This improves usability and prevents confusion.
Original PR description
***=im_livechat** **Steps to Reproduce: [Livechat case]** - Start a Live Chat conversation between an Operator and a Visitor. - From the operator side, click Reply on a visitor message. - From the…
***=im_livechat** **Steps to Reproduce: [Livechat case]** - Start a Live Chat conversation between an Operator and a Visitor. - From the operator side, click Reply on a visitor message. - From the visitor side, close the conversation. - Return to the operator side. - Observe that the replyToMessage composer is still visible even though the live chat has ended. **[Channel Read-only case]** - Create a channel between two users. - Ensure the channel is writable initially. - From one user's side, click Reply on another user's message. - While the user is in reply mode, make the channel read-only from the admin side. - Return to the replying user's side. - Observe that the reply-to-message composer is still visible even though the channel has become read-only. **Current behavior before PR:** Before this PR, the reply composer could remain visible after the conversation became unavailable for replying, such as when a channel turned read-only again or when a livechat conversation ended. **Desired behavior after PR is merged:** After this PR, the reply composer is automatically dismissed whenever replying is no longer possible, keeping the composer state consistent with the conversation state. task-[6208973](https://www.odoo.com/odoo/project/1519/tasks/6208973) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265487
This update simplifies the process of adding bank journals in Odoo. Previously, users needed to immediately provide a bank account number via the Odoofin iframe. Now, the system handles this more flexibly, allowing for account number entry later or creating the journal directly if all required data is available.
Original PR description
Previously, when adding a bank journal via the Odoofin iframe, the bank account number was strictly required. Starting from version 19.2, bank journals can no longer be created from the standard form view. This change forces users to provide an account number immediately via the iframe, even if they intended to synchronize it later. While the form view restriction is a 19.2 change, this improvement is applied to 17.0 because the Odoofin iframe is shared across versions. This is resolved across both environments with the: - Odoofin commit: The account number requirement is removed from the iframe. - Enterprise commit: If the account number is missing, the system no longer returns a setup wizard. It creates the bank directly if all required data is available; otherwise, it creates the journal without an account number. task-6072798 OdooFin PR: https://github.com/odoo/odoofin/pull/539 Forward-Port-Of: odoo/enterprise#112506
This update fixes several issues identified by Runbot during testing of the restaurant POS module. Specifically, problems related to order identification and refund processing were addressed, preventing disruptions to the checkout and payment flow. The changes include safety measures like optional order ID handling and improved tour navigation.
Original PR description
Runbot failed in three cases: taxGroupLabels could run while order_id was missing and crash on fiscal_position_id. During sync, is_refund on the order could disagree, so _askForPreparation showed the kitchen prompt on refund flows and blocked payment. The delete-line tour sometimes asserted before the table was closed; the tour now opens the plan again to close and sync tables. Safety fix: Optional chaining on order_id; Wait for sync refund for the preparation check; Explicit plan navigation in the tour. runbot error - 242601-242604 Forward-Port-Of: odoo/odoo#260264
This update fixes a translation issue within the HTML editor's 'move' tooltip. Previously, tooltips weren't displaying translated text due to a technical limitation in how the editor processed templates. This change ensures all tooltips are correctly translated for users, improving the overall user experience.
Original PR description
Currently the move tooltip in the HTML editor is not translated because the exporter can't see `_t()` calls in tagged template literal. This commit fixes the issue by moving the call outside of the template literal. Forward-Port-Of: odoo/odoo#266233 Forward-Port-Of: odoo/odoo#265991
This update resolves an issue preventing correct data handling with Odoo v19.0 databases. Specifically, it ensures the 'owner' key is included in event notifications, and it also corrects a bug where old session data was not being properly cleared, improving overall system performance.
Original PR description
For compatibility with v19.0 db, we need to keep the owner key in lp events. We do have them in the action direct response thanks to the `handle_message` base response message, but this is not forwarded to the event route. We also take the opportunity to fix the session cleaning, which was keeping only old sessions instead of newer ones. Forward-Port-Of: odoo/odoo#266377
This update increases the timeout for printing large documents, resolving an issue where documents taking longer than 30 seconds to print would fail. By extending the timeout to 90 seconds, users can now successfully print larger files without interruption. This enhances the overall printing experience.
Original PR description
To allow printing large documents that take more than 30 seconds to print, we increase the timeout to 90 seconds. opw-6235827 Forward-Port-Of: odoo/odoo#266005
This update resolves a technical issue where email server configuration records would fail if no authentication details were provided. The fix ensures that all records are processed correctly, preventing errors and improving the reliability of email functionality. This change enhances the stability of the system.
Original PR description
Description of the issue/feature this PR addresses: The compute method for `smtp_authentication_info` did not properly handle cases where no `smtp_authentication` value was set. Current behavior before PR: * When `smtp_authentication` was empty or had an unsupported value, `smtp_authentication_info` was never assigned. * This caused the compute method to fail with: `ValueError: Compute method failed to assign ir.mail_server(...).smtp_authentication_info` * As a result, reading or displaying the record could raise an exception. Desired behavior after PR is merged: * The fallback branch explicitly resets `smtp_authentication_info`. * `smtp_authentication_info` is always assigned during computation. * Records without an authentication method no longer raise compute errors and are handled correctly. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266411
This update resolves an issue where the system incorrectly flagged deductions on receipts, potentially preventing users from accurately recording expenses like self-employed individuals. The change ensures that deductions on receipts are now properly processed, aligning with common accounting practices. A new test has been added to verify this functionality.
Original PR description
As using deductions on receipts is a plausible accounting situation, such as in the case of self-employed person booking a ticket, there shouldn't be a validation error raised in this case. task-6037582 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254371
This update fixes an issue where portal messages were incorrectly restricted, preventing access to certain message types. The change ensures all non-internal messages are visible while still hiding internal notes as intended. This improves user experience and data accessibility within the portal.
Original PR description
*: test_mail_full Since #138233, portal messages were strictly filtered by the `mt_comment` subtype. This was intended to hide internal notes, but it incorrectly excluded other non-internal message subtypes. Basically we want the share domain (`_get_search_domain_share()`) to apply to all users in the portal. This change ensures internal notes remain hidden while allowing all other non-internal non-comment subtypes to be visible. opw-6031571 Forward-Port-Of: odoo/odoo#265096 Forward-Port-Of: odoo/odoo#263052
This update corrects a restriction in the Recruitment app where Interviewer users could view talent pools but lacked the ability to manage applicants or create new pools. The fix addresses a security rule preventing access, aligning with the intended role limitations for Interviewers.
Original PR description
## Issue In the Recruitment app, users with the *Interviewer* role have access to the Talent Pool action menu, can see the different talent pools, but don't have any read/write access to the…
## Issue
In the Recruitment app, users with the *Interviewer* role have access to the Talent Pool action menu, can see the different talent pools, but don't have any read/write access to the applicants within the pools, and cannot create new pools either.
## Steps to reproduce
1. Install *Recruitment* (`hr_recruitment`) with demo data
2. Set Marc Demo's *Recruitment* role to *Interviewer*
3. As Marc Demo, navigate to Recruitment > Applications > By Talent Pools
4. **We can see the existing pools, but they all appear empty ("0 Talents"), and we cannot add talents to a pool, nor create new pools.**
## Cause
Interviewer do not see any applicants in the talent pools because of the following rule:
https://github.com/odoo/odoo/blob/e751fa1e010dbda63903d598048ef415709b4af4/addons/hr_recruitment/security/hr_recruitment_security.xml#L48-L60
In fact, applicants in talent pools do not have a job_id set:
```sql
190=# SELECT a.partner_name, a.job_id FROM hr_applicant a
190-# JOIN hr_applicant_hr_talent_pool_rel tpr
190-# ON (tpr.hr_applicant_id=a.id);
partner_name | job_id
---------------+--------
Cameron Ellis |
Ethan Carter |
Noah Bennett |
Test Talent |
(4 rows)
```
This leads to no applicants being shown to the interviewers in the talent pools.
## Justification
Interviewers by default only have access to applications who they are interviewer for, it is not intended for them to see entire pools of potential candidates. Letting interviewers access the talent pools view is counter-intuitive, as they have nothing they can do from there.
opw-6187187
Forward-Port-Of: odoo/odoo#265812This update enables payment provider settings to be duplicated when a branch company is created. Previously, this was restricted due to accounting practices, but now it's supported to align with the option to use journals in branch companies. This simplifies setup and management of payments across our business locations.
Original PR description
This PR will allow payment providers to be duplicated into branch companies when a branch company is created. Previously this was prevented because in accounting it's preferred not to use journals in branches. However, there it is still possible to setup a journal in branches. So it makes sense to allow it also in payment providers. opw-6013978 Forward-Port-Of: odoo/odoo#265831
This update speeds up the rendering of stock barcode reports, particularly when dealing with large tables like Accounting reports. By simplifying the CSS rules, the system now recalculates styles more quickly, leading to a smoother user experience during actions like scrolling and resizing.
Original PR description
Avoid using `:has` selector with using a class on body to replace the has behavior. This change made a gain of in the `(re)calculate style` step when we hover a node on large table like a `report selector` on `Accounting`. The recalculation time during actions like window resize, heavy scrolling, or table sorting. Replacing it with using the specific class reduces those global checks and improves rendering performance. Forward-Port-Of: odoo/enterprise#118362
This update fixes a potential issue during Odoo deployments by logging missing module dependencies. Previously, deployment problems could be difficult to diagnose. Now, a warning is displayed, making it easier to identify and resolve any missing dependencies, streamlining the deployment process.
Original PR description
Log the issue as a warning, and add the missing module dependencies. This should ease managing such deployment issue. Forward-Port-Of: odoo/odoo#266030
This update fixes an issue where the field selector popover was hidden behind the field creation popover in the Email Marketing module. The fix removes an unnecessary offset setting, ensuring the field selector appears correctly and allows users to easily add dynamic fields. This improves the overall user experience.
Original PR description
Problem: In Email Marketing, the field selector popover is displayed behind the field creation popover. Cause: `useOverlayServiceOffset` offsets all `MassMailingIframe` overlay sequences by `+1000` (default sequence `50` becomes `1050`). The field selector popover was using the default sequence, causing it to appear below the main popover. Solution: remove the `useOverlayServiceOffset` hook as it is not needed anymore. Steps to reproduce: - Create a new Email Marketing record. - Try to add a dynamic field. - Open the field selector. - Observe that the selector popover appears behind the main popover, making field selection difficult. opw-6203734 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263493
This update fixes an error that occurred when users reviewed eMPF contribution reports. Specifically, the system would fail if an employee wasn't assigned to a contribution line. The fix now prompts the user to assign an employee, ensuring reports can be accurately reviewed.
Original PR description
Currently, an error occurs when the user checks the report line errors. **Steps to Reproduce:** - Install the `l10n_hk_hr_payroll_empf` module with demo data. - Switch to the `Hong Kong` company. -…
Currently, an error occurs when the user checks the report line errors. **Steps to Reproduce:** - Install the `l10n_hk_hr_payroll_empf` module with demo data. - Switch to the `Hong Kong` company. - Go to `Payroll` > `Reporting` > `Hong Kong` > `eMPF Contributions`. - Create a record by setting the `Scheme` and adding a `contribution line`. - Ensure that the employee and payslip fields are empty in the contribution line. - Click on `Validate`, then click on the `error icon` on the report line. `ValueError: Expected singleton: hr.version()` This error occurs when the user manually adds a line and checks the errors on it.. The system attempts to open the employee record from the version [1], but the version is not set [2] on the line because there is no employee. And it raise the error [3]. This commit ensures that when checking errors, if the version is not set on the line, a UserError is raised, prompting the user to set the employee on the line. It also corrects a typo in the status message. [1]- https://github.com/odoo/enterprise/blob/7889b2b0b3d13b32e6e36e616e20379d8c8f8812/l10n_hk_hr_payroll_empf/model/l10n_hk_empf_contribution_report_line.py#L219 [2]- https://github.com/odoo/enterprise/blob/7889b2b0b3d13b32e6e36e616e20379d8c8f8812/l10n_hk_hr_payroll_empf/model/l10n_hk_empf_contribution_report_line.py#L142-L156 [3]: https://github.com/odoo/odoo/blob/98855c6b70df24500babe6027109aa9e17431ec1/addons/hr/models/hr_version.py#L609-L611 Forward-Port-Of: odoo/enterprise#116607
This update fixes an issue where extra prices on combo products weren't correctly converted to the sale order's currency, leading to inaccurate totals. The change ensures that combo product extra prices are now properly converted, resulting in correct pricing calculations for sales orders in different currencies. This improves the accuracy of sales quoting and invoicing.
Original PR description
The total of a sale order containing a combo product that has an extra price is not correclty converted to the sale order's pricelist currency Steps to reproduce: 1. Install Sales 2. Go to Invoicing…
The total of a sale order containing a combo product that has an extra price is not correclty converted to the sale order's pricelist currency Steps to reproduce: 1. Install Sales 2. Go to Invoicing > Configuration > Accounting > Currencies and activate currency MXN 3. Go to Sales > Products > Pricelists and create a new pricelist for currency MXN 4. Go to Sales > Products and create a new combo product "test" 5. Create a combo choice "combo" with options "Large Cabinet" and extra price 10000$ 6. Go to Sales and create a new quotation for customer Acme Corporation with product "test" (total is $10,001) 7. Change the pricelist to MXN and update prices 8. The total is ~MX$10,018 (it should be ~MX$186,682) Issue: The extra price of a combo product is not converted to the sale order's pricelist currency, so we end up adding the price of the product in the order's currency with the extra price not converted Solution: Convert the extra price of the combo product to the sale order's pricelist currency opw-6192935 Forward-Port-Of: odoo/odoo#266172 Forward-Port-Of: odoo/odoo#265008
This update resolves an issue where timesheet data wasn't consistently synchronized between Odoo tabs. The fix ensures that changes made in one tab's timesheet are accurately reflected in all other tabs, improving data accuracy and user experience. This prevents discrepancies in timesheet records.
Original PR description
This PR reworks the implementation of https://github.com/odoo/enterprise/pull/116007 Task-6180394 Forward-Port-Of: odoo/enterprise#117914
This update fixes an issue where Preparation Displays (PDIS) weren't properly synchronized when performing actions like transferring or merging orders on the POS system. Previously, new PDIS were created instead of reusing existing ones, leading to inconsistencies. Now, PDIS are correctly updated across all table actions, ensuring accurate data between the POS and kitchen screens.
Original PR description
Task: [#5005179](https://www.odoo.com/odoo/1737/tasks/5005179) --- When executing table actions such as transfer, merge, link, or unlink, the related Preparation Displays (PDIS) were not being updated. This caused inconsistencies between the POS orders and the kitchen screens. Also, when merging or linking orders and cancelling some lines, a new `pdis_order` was created instead of reusing the existing one. This fix ensures that PDIS are correctly synchronized and notified on any table actions. Forward-Port-Of: odoo/enterprise#108009 Forward-Port-Of: odoo/enterprise#98374
This update fixes a problem where preparation displays (PDIS) weren't correctly updated when transferring, merging, or linking POS orders. Previously, new PDIS were created instead of reusing existing ones, leading to inconsistencies between the POS and kitchen screens. Now, PDIS are synchronized across all table actions, ensuring accurate kitchen order information.
Original PR description
Task: [#5005179](https://www.odoo.com/odoo/1737/tasks/5005179) --- When executing table actions such as transfer, merge, link, or unlink, the related Preparation Displays (PDIS) were not being updated. This caused inconsistencies between the POS orders and the kitchen screens. Also, when merging or linking orders and cancelling some lines, a new `pdis_order` was created instead of reusing the existing one. This fix ensures that PDIS are correctly synchronized and notified on any table actions. Forward-Port-Of: odoo/odoo#249657 Forward-Port-Of: odoo/odoo#233630
This change corrects a technical issue where Odoo couldn't properly import a necessary library. The problem stemmed from a dependency on an older version of lxml, leading to an error. This fix ensures Odoo's core functionality operates correctly.
Original PR description
still ``lxml.html.clean`` import is needed because ``lxml.html`` init file don't have clean file. So, it will be not loaded For reference :-…
still ``lxml.html.clean`` import is needed because ``lxml.html`` init file don't have clean file. So, it
will be not loaded
For reference :- https://github.com/lxml/lxml/blob/lxml-4.9/src/lxml/html/__init__.py
```
Traceback (most recent call last):
File "/tmp/tmpj23nirpw/odoo/19.0/./odoo-bin", line 3, in <module>
import odoo.cli
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/cli/__init__.py", line 2, in <module>
from .command import Command, main # noqa: F401
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/cli/command.py", line 8, in <module>
import odoo.init # import first for core setup
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/init.py", line 28, in <module>
from .tools.gc import gc_set_timing
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/tools/__init__.py", line 11, in <module>
from .i18n import format_list, py_to_js_locale
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/tools/i18n.py", line 8, in <module>
from odoo.tools.misc import babel_locale_parse, get_lang
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/tools/misc.py", line 40, in <module>
from lxml import etree, objectify
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/_monkeypatches/__init__.py", line 45, in exec_module
patch_module(module.__name__)
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/_monkeypatches/__init__.py", line 67, in patch_module
module.patch_module()
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/_monkeypatches/lxml.py", line 14, in patch_module
lxml.html.clean._find_image_dataurls = re.compile(r'data:image/(.+?);base64,').findall
AttributeError: module 'lxml.html' has no attribute 'clean'
```
https://upgradeci.odoo.com/upgradeci/run/301804
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#266591This update fixes a minor error in the GSTR2B report generation, ensuring accurate reporting of non-GST supplies. The change corrects a domain issue that previously misidentified a section key, now correctly classifying and reporting these transactions. This ensures compliance and accurate financial reporting for Indonesian businesses.
Original PR description
Before this commit, the domain of the non-GST supplies report line in GSTR2B used the GSTR section `purchase_nongst`, while the actual section key is `purchase_non_gst_supplies`. This commit fixes the domain by using the correct GSTR section key. task-6239820 Forward-Port-Of: odoo/enterprise#118313
This update resolves a memory issue that occurred during large product imports, preventing potential application crashes. The fix utilizes a more efficient batch processing method to reduce unnecessary calculations and memory usage, resulting in improved performance and stability for invoice and bill imports.
Original PR description
Before this commit, for DBs with a very large number of products it was possible for the thread to run out of memory when importing an invoice or a bill. The reason is that the name on…
Before this commit, for DBs with a very large number of products it was possible for the thread to run out of memory when importing an invoice or a bill. The reason is that the name on product.product is non stored and computed. This leads to tons of recomputes, which in turn leads to reads and stores in cache of the underlying `product.product`, which down the line uses up all of the available memory for the thread. The proposed method uses batches instead of a `search_fetch` as the latter would not solve the recompute problem and hence the underlying memory problem. Another alternative approach could be going straight for the `product.template.name`, but that approach might introduce a loss of precision or functionality when searching for products at invoice import. Here is the memory graph from memray before the fix: <img width="1106" height="450" alt="opw-6168737-memray-pre-fix" src="https://github.com/user-attachments/assets/f971dc4d-aa09-41e3-a8c5-e5ca53f9786d" /> And here is the same graph after the fix: <img width="1106" height="450" alt="opw-6168737-memray-post-fix" src="https://github.com/user-attachments/assets/0a784cdc-9b40-498b-bbcb-89114eec1ec9" /> We can see a much lower peak memory usage after the fix. We an also observe that the memory complexity shifts from `O(n)` to `O(1)`, with `n` being the number of `product.product` records stored in the DB. For both presented graphs, the same, unaltered database was tested. The database contains 389 467 `product.product` records. opw-6168737 Forward-Port-Of: odoo/odoo#265639 Forward-Port-Of: odoo/odoo#262591
This update ensures that payments received from providers are always fully reconciled, rather than allowing partial reconciliations. Previously, the system incorrectly permitted partial reconciliation for these payments, leading to inaccurate accounting records. This change guarantees accurate financial reporting for payments originating from external providers.
Original PR description
When we receive a payment from a provider, we allow partial reconciliations to be done on this move, but we shouldn't. Payments coming from providers are always either fully paid, or not paid at all. task-5893189 Forward-Port-Of: odoo/odoo#254597
This update corrects a problem where invoice PDFs were incorrectly displaying 'Proforma' as the header, even after the invoice was sent. The fix ensures that invoices are initially generated with the correct 'Proforma' header until sent, then switch to the standard invoice header. This improves the professionalism of invoices sent to customers.
Original PR description
***Steps to reproduce*:** - Create and confirm an invoice. - Open the invoice preview and use the Print option to generate the PDF. - Send the invoice to the customer. ***Observed behavior*:** - In…
***Steps to reproduce*:** - Create and confirm an invoice. - Open the invoice preview and use the Print option to generate the PDF. - Send the invoice to the customer. ***Observed behavior*:** - In the preview, the header is displayed as *Proforma*. - Before sending the invoice, the downloaded PDF from the Print option does not contain the *Proforma* header. - After sending the invoice, the preview correctly no longer shows the *Proforma* header, but the Print PDF output also continues without the expected behavior. ***Cause*:** - The *Proforma* header should be displayed when a confirmed invoice has not yet been sent to the customer. - Once the invoice is sent, the document should display the normal invoice header instead. - The PDF generation flow from `action_print_pdf` did not correctly pass the proforma context based on whether the invoice had already been sent. ***Fix*:** - Update the functional logic in `action_print_pdf` to use: `with_context(proforma_invoice=not self.invoice_pdf_report_id)` - This ensures that invoices not yet sent to the customer are generated as *Proforma* invoices. - Once the invoice has been sent, the PDF is generated with the normal invoice header instead. opw-6169132 Forward-Port-Of: odoo/odoo#265825
This update corrects a technical issue preventing invoices from being properly submitted to the Kenyan Revenue Authority (KRA) eTIMS system. The fix addresses a character limit restriction on invoice line descriptions, ensuring compliance and preventing submission rejections. This ensures accurate and timely tax reporting.
Original PR description
The eTIMs specification limit the `itemNm` to 200 characters, so truncate the invoice line description to that limit to ensure that the invoice can be correctly submitted eTIMS server. Otherwise it will be rejected with: ``` Error sending to the KRA: - Request parameter error[<ItemList><itemNm>: length must be between 0 and 200] ``` Task-Id: 5220129 Forward-Port-Of: odoo/enterprise#118152
This update corrects a bug where refund actions were incorrectly triggering the cancellation of original invoices. The fix adds a check to ensure the automatic cancellation flow only applies to invoice replacements, preventing credit notes from causing unintended cancellations. This ensures accurate accounting and avoids disruption for users.
Original PR description
Issue: Implementation of automatic CFDI cancel flow of an invoice substituted by a new one accidentally resulted in sending credit notes created from an invoice also triggering cancellation of the original. Solution: adding a check to only apply to invoice replacements and not refunds. ticket-6245456 Forward-Port-Of: odoo/enterprise#118327
This update resolves a critical issue that prevented the generation of PDF reports for Vietnamese tax filings (Appendix 142), specifically when reports had no data. It also corrects data references and ensures the correct naming and ordering of reports for accurate tax reporting, improving data integrity and usability.
Original PR description
This commit resolves multiple issues in the Vietnamese accounting reports module: 1. Appendix 142 PDF Export Crash: - Extracted the PDF sectioning logic into a new `_get_pdf_sections` method. - Added…
This commit resolves multiple issues in the Vietnamese accounting reports module: 1. Appendix 142 PDF Export Crash: - Extracted the PDF sectioning logic into a new `_get_pdf_sections` method. - Added safeguards to gracefully handle cases where the report has no lines, preventing an `IndexError` when attempting to access `lines[-1]`. - Added unit tests to ensure empty lines are correctly parsed without crashing. 2. XML Data and Dependency Fixes: - Fixed an invalid `report_id` reference in `account_return_data.xml` by correctly pointing it to `l10n_vn_reports.l10n_vn_tax_report` instead of `l10n_vn.form_01_gtgt_report`. - Reordered the `__manifest__.py` data loading sequence. `account_tax_report_data.xml` now loads before `account_return_data.xml` to prevent "External ID not found" errors during module installation/upgrades. 3. Naming and Sequencing Improvements: - Renamed "Vietnamese Tax Report" to "VAT Declaration - 01/GTGT" to reflect the actual Vietnamese tax form accurately. - Added explicit `sequence` fields to the tax reports (VAT Declaration: 10, Appendix 142: 20) to ensure proper UI ordering. Task-6216318
This pull request updates the core spreadsheet component within Odoo. It addresses several minor bugs and improvements related to chart rendering, data handling, and pivot tables, ensuring a smoother user experience. The update also includes enhancements to the Claude skill integration.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/0cf1540a3f [REL] 19.3.5 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/0cf1540a3f [REL] 19.3.5 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/079996753d [FIX] formulas: add IFERROR second argument when exporting data [Task: 5993405](https://www.odoo.com/odoo/2328/tasks/5993405) https://github.com/odoo/o-spreadsheet/commit/46d7a7645a [FIX] range: correctly handle unbounded ranges on row/col changes [Task: 6167358](https://www.odoo.com/odoo/2328/tasks/6167358) https://github.com/odoo/o-spreadsheet/commit/a8deb38b10 [FIX] Chart type: keep the label range when changing the chart type [Task: 6197123](https://www.odoo.com/odoo/2328/tasks/6197123) https://github.com/odoo/o-spreadsheet/commit/6fc6a5f456 [FIX] Chart type: first chart type change resulted in empty chart [Task: 6197123](https://www.odoo.com/odoo/2328/tasks/6197123) https://github.com/odoo/o-spreadsheet/commit/07397934ad [FIX] pivot: unused pivot detection with composed formula [Task: 6105894](https://www.odoo.com/odoo/2328/tasks/6105894) https://github.com/odoo/o-spreadsheet/commit/b157f2c97c [FIX] pivot: unused pivot detection with calculated measure [Task: 6105894](https://www.odoo.com/odoo/2328/tasks/6105894) https://github.com/odoo/o-spreadsheet/commit/6010f72a6c [IMP] claude: add review skill [Task: 6223095](https://www.odoo.com/odoo/2328/tasks/6223095) https://github.com/odoo/o-spreadsheet/commit/99418f299d [IMP] claude: add testing skill [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/4df8cb15be [IMP] claude: add CLAUDE.md file [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update ensures a more predictable sorting experience when using grouped lists in Odoo. Previously, sorting by the 'Count' column toggled between ascending and descending order with each click. This change standardizes the sorting behavior across all columns, providing a more intuitive and consistent user experience.
Original PR description
Before this commit, clicking on the 'Count' column in a grouped list view was sorting the groups by Count in Desc order, clicking again sorted it in Asc order. However, other columns have the following behavior: * First click: ASC * Second click: DESC * Third click: Reset This commit harmonizes those behaviors by moving the sort by count logic from the `search_model` to the `dynamic_group_list` (and 'list_renderer'). task-6241803
This update fixes an issue where long translated text in the HTML editor was incorrectly centered. Now, the text aligns to the start, which is better for RTL languages and ensures proper display. The update also includes support for RTL language display within the translate dialog.
Original PR description
Before this commit: when the translated text is very long, the text is centered by default, because it's a clickable button. After this commit: the text is aligned to the start. This is better than align to the left because it will also adjust to the RTL language when the direction is set to RTL. Also added support to display RTL language properly in the translate dialog. Note that the check of isRTL language is rather naive and uses a pre-defined set. task-6234280 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where product combination data wasn't being properly checked during the website sale collection process. The team reverted a change that removed a key check (`is_storable`), ensuring accurate product availability information is displayed to customers. This prevents potential errors and improves the overall shopping experience.
Original PR description
Issue: --- In 5064c352c79ac72bcc4a098436aa95c560c4d9ef, unwanted diff removed `is_storable` which should still be checked in `website_sale_collect` implementation of `_get_additionnal_combination_info()`. opw-5990419
This update fixes an issue where invoices imported from UBL files were incorrectly calculating prices due to a missing discount application. The change ensures that discounts from AllowanceCharges are accurately added to the PriceAmount, resulting in correct invoice pricing. This improves data accuracy for financial reporting.
Original PR description
**PROBLEM** When importing a ubl bis3 file, with only the amount in the AllowanceCharge on PriceAmount it doesn't add the discount to PriceAmount to get the undiscounted price. Which means we create an invoice with the wrong price. This PR fixes that. opw-6102962 Forward-Port-Of: odoo/odoo#258964
This update optimizes how Odoo renders large pages, like account reports, by streamlining the styling process. The change avoids slow style calculations that can occur when targeting elements broadly, resulting in faster page loading and smoother interactions. This improves the overall user experience.
Original PR description
Avoid using the attribute substring selector (`*=`), which forces a broad match and can be slower than class selectors. Target the correct node directly using the `o-we-hint` class instead. On very large pages (thousands of DOM elements like account_report) `*=` can increase style recalculation time during actions like window resize, heavy scrolling, or table sorting. Replacing it with using the specific class reduces those global checks and improves rendering performance. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266381