Thursday, May 28, 2026
41 changes · saas-19.3
New functionality added to Odoo
This update introduces a new reporting capability within Odoo Enterprise for Indonesian businesses. It adds a specific tax return type tailored to Indonesian regulations, allowing users to accurately report tax information. This enhancement improves compliance and reporting accuracy for our customers operating in Indonesia.
Original PR description
Create new module l10n_id_reports and add return type for Indonesia. task-6239169 Forward-Port-Of: odoo/enterprise#118467 Forward-Port-Of: odoo/enterprise#118304
Enhancements to existing features
This update enhances the Balance Sheet report to accurately reflect accounting standards (GAAP) by ensuring that all equity accounts are displayed individually, rather than grouped. This change improves the clarity and accuracy of financial reporting, aligning with best practices.
Original PR description
*=l10n_us_reports In the Balance Sheet, according to the GAAP rules, all equity accounts should be individually visible. task-6240500 Forward-Port-Of: odoo/enterprise#118149
Resolved issues and error corrections
This update enhances the testing process for Odoo apps submitted to the Odoo Apps Store. Specifically, it allows for more comprehensive checks of the app's manifest file, ensuring accurate pricing and currency information is included. This improves the quality and reliability of apps available on the Odoo Apps Store.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262653 Forward-Port-Of: odoo/odoo#255857
This update simplifies the way Odoo interacts with Swedish blackboxes, ensuring compatibility with both the new Skattedosan devices and older CleanCash models. By supporting both protocols at different baud rates, this change eliminates a potential compatibility issue and provides a more reliable connection for all blackbox types.
Original PR description
In odoo/odoo#260587, support was added for the modern Skattedosan brand Swedish blackboxes, using their own unique protocol. However, it turns out they also support the previous CleanCash protocol, just at a higher baud rate of 57600. This commit simplifies the SE blackbox driver by only supporting one protocol, but attempting to use it at both 9600 and 57600 baud. This results in both blackbox types being compatible. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266643
This update allows the IoT box to broadcast its IP address via Bluetooth for 5 minutes after startup. This simplifies troubleshooting for clients and support teams by providing a quick way to identify the device's network connection status. If no network is available, it will advertise 'No network connection' instead.
Original PR description
This PR allows the iot box to advertise its ip address over Bluetooth for 5 minutes after boot. The format is `IoT Box [S/N] - [ip]` If no network is available it would advertise "No network connection" instead of the ip This can help clients and support to troubleshoot IoT Box issues. Forward-Port-Of: odoo/odoo#265878 Forward-Port-Of: odoo/odoo#265738
This update clarifies the documentation for how API keys are generated and revoked within Odoo. The changes standardize documentation and add descriptions for key parameters, ensuring developers have clear guidance and improving the overall quality of the codebase.
Original PR description
Clarify and complete the docstrings of `res.users.apikeys` methods: - document accepted union types for `scope` and `expiration_date` parameters of method `_generate`, and standardize its `:returns:` and `:rtype:` annotations - add missing parameter descriptions for `generate` and `revoke` Forward-Port-Of: odoo/odoo#265488
This update fixes an issue where the product gallery on mobile devices would reset to the first items after scrolling or changing screen size. The fix reintroduces a mechanism to only trigger a gallery update when the screen size changes, preventing unnecessary re-renders and ensuring a smoother user experience. This improves the visual consistency of the product catalog across different devices.
Original PR description
Scenario: - drop product catalog snippet and save - go to the second page of product - on some mobile scroll, or just change window size Result: we are reset to the first items of the gallery. Cause: in some mobile (eg. iOS safari) scrolling up or down make the address bar appear, that makes the viewport size change. Since 18.4 refactor of website, we rerender dynamic widget at any size change, so scrolling rerender the snippet. Fix: reintroduce saas-18.2 listenSizeChange that only trigger throttled change of media breakpoint and was removed from dynamic_snippet.js in 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2. opw-6137005 Forward-Port-Of: odoo/odoo#260623
This update ensures that Knowledge print assets are consistently loaded, regardless of how printing is initiated. Previously, printing through various methods sometimes resulted in blank articles. To address this, the stylesheet has been updated to prevent unintended styling impacts on other Odoo modules, improving the overall printing experience.
Original PR description
Previously, the file containing the Knowledge print assets was lazy-loaded when the user triggered a print action through the UI. However, printing can also be initiated through other mechanisms…
Previously, the file containing the Knowledge print assets was lazy-loaded when the user triggered a print action through the UI. However, printing can also be initiated through other mechanisms (keyboard shortcuts, contextual menu, etc.), which prevented us from consistently detecting when to load the assets. In those cases, the assets were not loaded and the article appeared blank (see: odoo/enterprise#70243). To ensure the assets are always loaded regardless of how printing is triggered, we moved them to the common print bundle and adopted the standard asset-loading approach. This change also simplifies the codebase by removing JavaScript workarounds previously used to load the assets dynamically. However, some CSS rules in the Knowledge print stylesheet target global elements such as the web client container. Since the stylesheet is now included in a global asset bundle and always loaded, these rules apply to all modules and may cause rendering issues when printing views outside of Knowledge. To prevent such side effects, the CSS rules in `knowledge_print.scss` will be updated to use more specific selectors. The rules will be scoped so they only apply when the container includes the Knowledge view (using the `:has`). This PR also refactors the stylesheet by removing outdated rules that no longer match any elements. Several of these rules predate the major UI refactoring introduced in Odoo 16. Task-5999878 Forward-Port-Of: odoo/enterprise#109379
This update resolves an issue where setting Intrastat fields on product templates without associated products would trigger an error. The fix ensures that the system correctly handles product templates without variants, preventing unexpected errors and improving data integrity. This ensures accurate reporting for Intrastat compliance.
Original PR description
Problem: The Intrastat fields on product.template are computed without being stored. They are stored in product.product and the same values are used when computing the values on product.template. When trying to set the Intrastat fields on a product template without any product, an RPC error is raised without specifying the reason. Steps to reproduce: 1. Create a new product (product.template) 2. Add an attribute to the product with Variant Creation set to Dynamic, this will set no product variants (product.product) for the product template. 3. Try to set the Intrastat Commodity Code on the product template 4. Save the product template 5. Notice the RPC error raised without any explanation opw-6179705 Forward-Port-Of: odoo/enterprise#117856
This update corrects a previous incomplete effort to ensure consistent terminology across Odoo. It replaces instances of 'VAT' with 'Tax ID,' which is a more widely understood term, particularly in the US and other countries. This change enhances clarity and accuracy for users.
Original PR description
Similar changes were made before but were incomplete [1]. In the US and many other countries the term VAT is not understood. Use the universally understood Tax ID instead. [1] https://github.com/odoo/odoo/pull/239362 task-6231891 Forward-Port-Of: odoo/odoo#265668
This update replaces the term 'VAT' with 'Tax ID' across Odoo Enterprise, addressing a common misunderstanding in international markets like the US. This change ensures accurate and universally recognized tax identification, simplifying processes for our global clients.
Original PR description
Similar changes were made before but were incomplete [1]. In the US and many other countries the term VAT is not understood. Use the universally understood Tax ID instead. [1] https://github.com/odoo/odoo/pull/239362 task-6231891 Forward-Port-Of: odoo/enterprise#117955
This update removes a redundant CSS selector that was slowing down the application's style recalculation process. While the change didn't affect how the Kanban view looks, it significantly improved overall performance by reducing the time browsers spend evaluating styles. This results in a faster and more responsive user experience.
Original PR description
Remove the unused selector `[class*="col-"]:has` from `kanban_color_picker_field.scss`. It no longer affects the view but negatively impacts global CSS performance because the global selector `[class*="col-"]` combined with `:has` is expensive to evaluate. This caused long "Recalculate style" times reported in the selector stats. Even if it no longer affects rendering, browsers still spend time evaluating it during style recalculation, hurting performance. Removing the selector removes that cost. Steps to reproduce: 1. Open the Project app. 2. Go to Configuration > Projects. 3. Switch to Kanban view. 4. Click the "..." button on a Kanban card. 5. Inspect the color picker with the dev tools and remove the rule on a `col-6` node nothing changes, demonstrating the rule is now useless. Forward-Port-Of: odoo/odoo#266382
This update resolves a technical glitch in a test environment that was causing a tour to fail. The fix ensures the tax return journal is always visible during testing, regardless of dependencies on other modules. This prevents delays and ensures consistent test results.
Original PR description
The tour clicks a Tax Returns button rendered on the tax-return journal's kanban card on the accounting dashboard. That button only appears when show_on_dashboard is True on the journal, which is flipped by an inverse defined in the accountant module. Since account_reports does not depend on accountant, running this test on a database without accountant installed (e.g. account_reports only) leaves the journal hidden and the tour times out on the first step. To fix this we force the journal to be shown in this test rather than relying on accountant. runbot-error-242120 Forward-Port-Of: odoo/enterprise#116806
This update resolves an error that occurred when calculating benefit costs with certain employee property fields. The fix prevents using property fields as cost fields, ensuring accurate benefit calculations. A video demonstrates the issue and the solution.
Original PR description
**Steps to Reproduce:** 1. Install `hr_payroll` with demo data. 2. Open Employee (e.g; Abigail Peterson) > Payroll tab > Gear Icon > Edit Properties. 3. Add a new property for Payroll and fill in the…
**Steps to Reproduce:** 1. Install `hr_payroll` with demo data. 2. Open Employee (e.g; Abigail Peterson) > Payroll tab > Gear Icon > Edit Properties. 3. Add a new property for Payroll and fill in the value also. 4. Go to Payroll > Configuration > Benefits. 5. Create a new benefit with: Salary Structure Type: Worker Cost Field: Payroll Properties (Employee Contract) 6. Save the record. Video: https://drive.google.com/file/d/1gHRkDW5G0bURlo9_IRgCnvqpE-8Fk1xa/view?usp=drive_link **Error:** `TypeError - unsupported operand type(s) for +: 'int' and 'Property'` **Cause:** The method `_get_benefits_costs()` directly sums values using: ``` self[benefit.cost_field] ``` When the selected cost field is a property field, it returns a **fields_properties.Property** object instead of a numeric value, and this object is not directly compatible with the arithmetic sum operation. **Fix:** This commit prevents selecting property fields as cost fields from the list of supported field types. sentry-7388663038 Forward-Port-Of: odoo/enterprise#113238
This update corrects a dependency issue within the Italian reporting module (l10n_it_reports). Specifically, a new filter was added to address a conflict related to pension fund type data, ensuring accurate reporting for Italian businesses. This resolves a technical problem that could have impacted report generation.
Original PR description
Commit: 0a5657297f312cb3e5f6c3ab6a281acf71fbee3b added a filter for the field l10n_it_pension_fund_type which is defined in l10n_it_edi_withholding and not l10n_it_reports runbot-242217 Forward-Port-Of: odoo/enterprise#113185
This update fixes a minor issue where the 'Outgoing Mail Server' option was incorrectly visible in user preferences when the default external email server was set to 'False'. The change ensures that the system correctly interprets this setting as a boolean, preventing the option from appearing unnecessarily. This improves the user experience and avoids potential confusion.
Original PR description
**Steps to reproduce:**
- Go to Settings > System parameters
- Set the `base_setup.default_external_email_server` to `False`
- Go to any User > Preferences tab
- `Outgoing Mail Server` option is visible
- The choice dropdown is available if the Gmail/Outlook settings are set
**Issue:**
`has_external_mail_server` is a Boolean field computed from the `base_setup.default_external_email_server` system parameter.
After [1] it is parsed as a string with `get_str`, which means that the conversion from string to boolean will return `True` when the value is set and not null.
```py
bool('False') -> True
```
(It also seems that on saas this value is set by default)
**Fix:**
Properly parse it as a boolean using `get_bool`.
[1] https://github.com/odoo/odoo/commit/3482ba72c8cd461d5c6609f4953decc1d5a55dd8
opw-6229696
Forward-Port-Of: odoo/odoo#266490This update corrects a bug where the Email Alias helper wasn't visible in Helpdesk teams when the default external email server was disabled. The fix ensures the system correctly interprets the server setting as a boolean, preventing incorrect visibility settings. This ensures Helpdesk teams function properly regardless of the external email server configuration.
Original PR description
**Steps to reproduce:**
- Go to Settings > System parameters
- Set the `base_setup.default_external_email_server` to `False`
- Install Helpdesk app
- Go to any Helpdesk Team
- Email alias helper is not visible
**Issue:**
`has_external_mail_server` is a Boolean field computed from the `base_setup.default_external_email_server` system parameter.
After [1] it is parsed as a string with `get_str`, which means that the conversion from string to boolean will return `True` when the value is set and not null.
```py
bool('False') -> True
```
(It also seems that on saas this value is set by default)
**Fix:**
Properly parse it as a boolean using `get_bool`.
[1] https://github.com/odoo/enterprise/commit/c710031215c76a9e7ddb694d2a2787c8cca40dcd
opw-6229696
Forward-Port-Of: odoo/enterprise#118425A recent update to the l10n_be_coda module incorrectly commented out a test instead of updating it. This fix ensures that the test runs properly, verifying the functionality of the module. This resolves a minor issue impacting the accuracy of the test results.
Original PR description
Test was commented instead of updated in this commit https://github.com/odoo/enterprise/commit/f1fafe0060c221e4a268c897af30455cc3d029ef task-none Forward-Port-Of: odoo/enterprise#118428 Forward-Port-Of: odoo/enterprise#117924
This update fixes an issue where the 'Send Report' action was missing from the cog menu in the planning slot form view. This change ensures users can easily generate reports directly from the planning view, streamlining the reporting process. The fix was implemented by replicating a previous change from the Field Service module.
Original PR description
Issue: ---------------------------------------- Some actions that were in Field Service task form view app aren't anymore in planning slot form view. Steps to reproduce: ---------------------------------------- - Go to the list view of planning view and select some slots - In the cog the action "Send Report" is there - Go in the slot's form view - In the cog, the action is not there Cause: ---------------------------------------- During the merge of Field Srevice in Planning. The action was removed from the form view. Solution: ---------------------------------------- Like in [saas-19.1](https://github.com/odoo/enterprise/blob/62b11599d08afa93cb9391f0b5aee3c610a754c8/industry_fsm_report/views/project_task_views.xml#L135-L146) we add "Send report" to the cog menu in list view. opw-6227745 Forward-Port-Of: odoo/enterprise#117744
This update resolves an issue preventing the attendance management system from correctly filtering employees based on their country. A security restriction was removed to allow necessary access to the employee's country code, ensuring accurate attendance reporting. This change improves the functionality of the payroll and HR modules.
Original PR description
/hr_attendance:TestAttendanceManager.test_attendance_manager_rights uses write function defined in l10n_sa_hr_payroll_attendance which in some cases requires to read the country_code of an employee to filter. Access rights on employees blocked it from reading country_code. Added sudo on employee for reading and filtering on country_code. task-6226413 Forward-Port-Of: odoo/enterprise#117718
This update fixes a problem where generated PDF invoices were missing crucial item reference information. The change ensures that all product lines now accurately display the internal item reference, improving invoice clarity and accuracy. This resolves an issue impacting how vendor bills are presented to users.
Original PR description
Some XML vendor bills generated by external ERPs were missing the Description tag, which typically contains both the [ITEM_REF] and ITEM_NAME. As a result, product lines in the generated PDF could appear without the internal item reference. This commit ensures that the item reference is always included in the displayed product line. task-6080328 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259086
This update fixes an issue where CFDI (Mexican electronic invoice) documents were being generated with incorrect length limits for key attributes like 'Folio' and 'Serie'. The values were swapped, which caused invalid documents. This change ensures that all generated CFDI documents are compliant and accurate.
Original PR description
Issue: length limits for attributes `Folio` and `Serie` of the `<cfdi:Comprobante>` elements were swapped, which could result in generation of invalid documents. Solution: swapping the values. This should not affect anything for existing valid documents. task-6046738 Forward-Port-Of: odoo/enterprise#118452 Forward-Port-Of: odoo/enterprise#116955
This update resolves a potential issue that caused Out of Memory errors during the installation of the `sale_subscription` module on databases with many sales orders. The fix ensures that newly added fields are correctly initialized to 'null' during installation, preventing performance bottlenecks and improving the overall installation process.
Original PR description
### Description: Installing `sale_subscription` on databases with a large number of `sale.order` and `sale.order.line` can cause Out of Memory (OOM) errors. The issue comes from two stored compute fields, `last_invoiced_date` and `plan_id`. Since these depend on newly added fields, they should default to `null` during installation. ### Reference: opw-6201267 Forward-Port-Of: odoo/enterprise#118419 Forward-Port-Of: odoo/enterprise#118008
This update optimizes the performance of large spreadsheet tables, particularly in areas like the Accounting > Balances Sheets. By streamlining how the system checks styles, it reduces recalculation times during common actions like resizing windows or scrolling, leading to a smoother user experience.
Original PR description
Avoid using the :has() selector and use a specific class on the body instead to replicate the same behavior. This reduces work during the "Recalculate Style" phase (for example when hovering rows in large tables such as the Accounting > Balances Sheets). It lowers recalculation time during window resizes, heavy scrolling, and table sorting by preventing broad selector matches and limiting style checks to elements with the specific class. Forward-Port-Of: odoo/enterprise#118535
This update resolves a technical issue that prevented users from expanding depreciation report lines for assets using the 'No Depreciation' method. The fix ensures the report function works correctly for all asset types, improving data accuracy and usability. This change was made to address a reported bug.
Original PR description
When a user expands the report line of a no-depreciation asset in the depreciation schedule report, a traceback is raised. Steps to reproduce the error: - Install ``account_asset`` module with demo…
When a user expands the report line of a no-depreciation asset in the depreciation schedule report, a traceback is raised. Steps to reproduce the error: - Install ``account_asset`` module with demo data - Go to Accounting > Accounting > Assets > Create a new asset > Set Depreciation Model: No depreciation and Fixed Asset Account > Confirm - Go to Accounting > Review > Depreciation Schedule - Select the current fiscal year in filters - Expand the asset report line Traceback: ```py UnboundLocalError cannot access local variable 'period_suffix' where it is not associated with a value ``` https://github.com/odoo/enterprise/blob/5edd033ce05d65a79bc5b21ad2d1559a1af78056/account_asset/models/account_assets_report.py#L388-L390 Here, ``period_suffix`` is only assigned when the asset method is ``linear`` or ``degressive``, For assets using the ``no_depreciation`` method, the variable remains undefined, leading to the traceback when returning the depreciation rate string. sentry-7504906018
This update fixes a minor visual issue in the multi-currency popover. Previously, the display would include an awkward "on" with no date, which has now been removed to provide a cleaner and more professional user experience. This ensures consistent formatting across all currency conversions.
Original PR description
This commit fixes a formatting issue in the multi-currency popover when no currency exchange rate is available. Previously, the popover would awkwardly display the word "on" with no trailing date (e.g., "CHF 22.81 at $ 1.00 on"). The template now conditionally hides the "on" keyword when no date is present to ensure a clean UI. task-6227557 Forward-Port-Of: odoo/odoo#265022
This update fixes a visual issue in the technical settings where new link previews displayed a confusing internal record ID in the breadcrumb. Now, new previews show 'New' until saved, and saved previews display the actual URL, providing a cleaner and more user-friendly experience.
Original PR description
**Problem:** Opening a new `mail.link.preview` record from the technical view shows the internal record reference (e.g. `mail.link.preview,NewId_0x...`) in the breadcrumb instead of the standard…
**Problem:**
Opening a new `mail.link.preview` record from the technical view shows the internal record reference (e.g. `mail.link.preview,NewId_0x...`) in the breadcrumb instead of the standard "New" label.
**Steps to reproduce:**
1. Settings / Technical / Discuss / Link Previews
2. New
3. Observe the breadcrumb
**Current behavior:**
The breadcrumb displays `mail.link.preview,<id>`.
**Expected behavior:**
The breadcrumb should display "New" until the record is saved, and the source URL once saved.
**Cause of the issue:**
The model defines no `name` field and does not set `_rec_name`, so the default `_compute_display_name` falls into its fallback branch and returns `f"{record._name},{record.id}"` — exposing the technical reference in the breadcrumb both for unsaved records (`NewId_...`) and saved ones.
**Fix:**
Setting `_rec_name = 'source_url'` lets the standard display name machinery compute a meaningful label from the existing required field. Unsaved records then surface the standard "New" placeholder via the web client and saved records surface their URL, without introducing a redundant `name` field or overriding the compute.
opw-6095012
Forward-Port-Of: odoo/odoo#263577This update fixes an issue where Selection fields in dark mode sign templates appeared unreadable due to white-on-white text. The fix ensures that form controls within sign templates consistently display with appropriate contrast, regardless of the user's dark mode preference. This improves the overall user experience for sign creation.
Original PR description
**Problem:** When the user has dark mode enabled and a sign template contains a Selection field, both the displayed value and the dropdown option list are unreadable: the selected value renders…
**Problem:** When the user has dark mode enabled and a sign template contains a Selection field, both the displayed value and the dropdown option list are unreadable: the selected value renders white-on-white in the field, and clicking the dropdown shows an empty-looking popup (white options on white system menu). **Steps to reproduce:** 1. Enable dark mode in user preferences 2. Open Sign > Templates > duplicate any template 3. Add a Selection field with a few options (e.g. Low / Medium / High) 4. Save and Sign Now 5. Reach the Selection field and click it 6. Observe: the dropdown options are invisible (white on white) and, after picking one, the selected value in the field is also invisible **Cause of the issue:** The Selection sign item is rendered with a native `<select>` element inside the PDF.js iframe (`sign_items.xml`, `t-if="type == 'selection'"` branch). The iframe's stylesheet (`sign/static/src/css/iframe.css`) declares the `select` rule with `background: transparent` but no explicit `color`, and never styles `<option>` at all. When the OS or the user activates dark mode, the iframe document resolves to a `color-scheme: light dark` root, so the browser's UA stylesheet paints form controls with the dark palette (white text). The popup background stays white (`<option>` has no explicit background), so options render white-on-white. The same UA-white propagates to the displayed value of the `<select>` inside the pink-tinted sign item, which is also nearly white. **Fix:** Pinning the `<select>` text color and the `<option>` color/background to fixed light-mode values restores predictable contrast inside the iframe regardless of the surrounding color scheme. We deliberately do not rely on `color-scheme: dark` here — that would only swap which side of the contrast issue we land on (browsers don't reliably honor it for `<option>` background painting), and the sign item background (the pink dashed default style) is itself light, so dark option text on a white popup is the readable target in all themes. opw-6197638 Forward-Port-Of: odoo/enterprise#117697
This update corrects a bug in how Odoo searches for records using property fields. Previously, filters on numerical properties sometimes returned incorrect results due to a misunderstanding of boolean values in the search logic. This fix ensures that property searches work as expected, accurately filtering records based on their property values.
Original PR description
# How to reproduce - Go to the Form view of a model to which you can Add Properties (e.g. Project > Tasks) - Click on the gear icon > Add Properties - Create a property field with : - Name : X -…
# How to reproduce
- Go to the Form view of a model to which you can Add Properties
(e.g. Project > Tasks)
- Click on the gear icon > Add Properties
- Create a property field with :
- Name : X
- Field Type : Decimal
- Create two records for that model and set the value of the property to 1 & 2
- Go back and Add a custom filter with ('Properties.X', '=', 1)
# The problem
We see both records even tho we should only see one
# Cause of the issue
When doing the search, we transform the domain into the where clause of a
query. This transformation is done with the `condition_to_sql()`
function of the concerned field (`fields_properties` in our case):
https://github.com/odoo/odoo/blob/ba9e18688cc9c6e0d4da5ab60acf08d4c49b99d7/odoo/orm/fields_properties.py#L589
In this function, we manipulate a bit the condition depending on the value,
notably if the value is/contains True. To check it does, we do this :
https://github.com/odoo/odoo/blob/ba9e18688cc9c6e0d4da5ab60acf08d4c49b99d7/odoo/orm/fields_properties.py#L601
The issue is that in python, True in [1] and evaluates to True
because bool is a subset of int. This changes the condition and replaces it in
our case with ('Properties.X', '!=', 'False'), which is obviously not what
was initially asked for.
opw-6224811
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#266231
Forward-Port-Of: odoo/odoo#265835A recent issue where a specific tour (project_task_history_tour) was occasionally failing has been resolved. This fix ensures the tour consistently runs, improving the reliability of the project task history feature for users. This change was made as part of a standard bug fix process.
Original PR description
Since #237531 the tour `project_task_history_tour` seems to sometimes fail. runbot-238566 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265466
This update corrects a technical error in the Odoo website builder's product page image functionality. The previous code incorrectly referenced a function, leading to a minor issue with image uploads. This fix ensures proper functionality and a seamless user experience for adding images to product pages.
Original PR description
The patch on `ProductAddExtraImageAction.getMediaDialogProps` extracted `loadResolveFunction` instead of `loadPromiseResolveFunction`. See also: - https://github.com/odoo/odoo/pull/262870
This update corrects a technical issue that could cause CFDI invoices to be rejected by recipients. The fix ensures that Addenda nodes are created only once, adhering to strict XML standards set by the Mexican tax authority (SAT). This prevents errors and improves invoice acceptance rates.
Original PR description
Before this commit, if the `_l10n_mx_edi_cfdi_invoice_append_addendas` method was executed more than once on the same invoice, the resulting CFDI would contain multiple `<cfdi:Addenda>` nodes. This…
Before this commit, if the `_l10n_mx_edi_cfdi_invoice_append_addendas` method was executed more than once on the same invoice, the resulting CFDI would contain multiple `<cfdi:Addenda>` nodes.
This occurred because the method manually injects the new Addenda string at the end of the XML without checking if one was already present from a previous execution.
According to the SAT's Anexo 20 and the CFDI 4.0 XSD, the Addenda must be a single node and the last element of the Comprobante. Duplicating root-level nodes like `cfdi:Addenda` is a bad XML formation practice that can cause rejection by the recipient's automated systems.
This fix ensures the CFDI structure remains valid by:
1. Searching for an existing `{*}Addenda` node in the CFDI string.
2. Removing the old node before reconstructing the XML.
3. Preventing the string replacement logic from stacking multiple Addenda blocks.
This ensures that the CFDI remains clean and compliant with the official standard even if the process is triggered multiple times.
Forward-Port-Of: odoo/enterprise#109760This update fixes a bug where unexpected serial numbers were added to outgoing shipments when the quantity was set to zero. Previously, the system would automatically add available serial numbers, leading to quantity mismatches. Now, only the manually added serial numbers are correctly applied, ensuring accurate inventory tracking.
Original PR description
**Problem**: When we set the quantity of a move to zero, then add serial numbers manually, if the serial numbers are not the first ones in the list of available serial numbers, The first few…
**Problem**: When we set the quantity of a move to zero, then add serial numbers manually, if the serial numbers are not the first ones in the list of available serial numbers, The first few available serial numbers will be added to the move, which causes a mismatch of quantity and the number of serial numbers. **Before this commit:** If we have three serial number SN-001, SN-002, SN-003 created in order, and we set the quantity of the move to zero, then add SN-002 and SN-003 manually, SN-001 will be added automatically while saving. **After this commit:** Only SN-002 and SN-003 will be added to the move, which matches the quantity. **Steps to reproduce:** 1. Create a product with tracking by unique serial number, and create 3 lots SN-001, SN-002, SN-003 for this product. 2. Create a picking and add a move for this product, set the demand to 3 and quantity to 0. 3. Set the quantity to 2, and add SN-002 and SN-003 to the move, then save the picking. 4. SN-001 will be added to the move automatically, but the quantity stays at 2. opw-6121208 Forward-Port-Of: odoo/odoo#266583 Forward-Port-Of: odoo/odoo#263080
This update resolves a problem where Live Chat users couldn't access chatbot messages when using custom filters. The fix adds access permissions to the 'im_livechat_group_manager' group, allowing authorized users to view these messages. This change was triggered by a recent update to the Live Chat module.
Original PR description
**Steps to Reproduce** 1. Install the **Live Chat** module in version 18.4 or above. 2. Go to: **Settings → Users** * Open your user and change the access rights from **Live Chat / Administrator** to…
**Steps to Reproduce**
1. Install the **Live Chat** module in version 18.4 or above.
2. Go to: **Settings → Users**
* Open your user and change the access rights from **Live Chat / Administrator** to **Live Chat / User**.
* Alternatively, create a new user giving him rights of the **Live Chat / User** group.
3. Login using the Live Chat user.
4. Open the **Live Chat** application and navigate to: **Live Chat → Sessions**
5. Open any existing session. The session and its messages are accessible without any issue.
6. In the search bar, click: **Filters → Custom Filter**
7. Select the field `Chatbot Messages (chatbot_message_ids)`. You will face the below traceback.
**Issue Description:**
The issue happens because `discuss.channel` records are accessible to users having the `im_livechat_group_user` group through the Sessions menu: https://github.com/odoo/odoo/blob/459a775a066fe1465e53fc751045baed39f80118/addons/im_livechat/views/im_livechat_channel_views.xml#L310-L315
The field `chatbot_message_ids` is defined as:
https://github.com/odoo/odoo/blob/459a775a066fe1465e53fc751045baed39f80118/addons/im_livechat/models/discuss_channel.py#L165
This field points to the `chatbot.message` model, but access to that model is restricted to `im_livechat_group_manager` only:
https://github.com/odoo/odoo/blob/459a775a066fe1465e53fc751045baed39f80118/addons/im_livechat/security/ir.model.access.csv#L15
As a result, when a Live Chat user tries to use `chatbot_message_ids` in a custom filter, Odoo attempts to read `chatbot.message` records and raises an `AccessError`.
This issue started happening after the access rights changes introduced in pr : https://github.com/odoo/odoo/pull/201880
Specifically, the following ACL changes:
https://github.com/odoo/odoo/pull/201880/changes#diff-c1592d633a34db44a7cc2a527482cecc56127cbba72649e7318dcf63ccf477afR19-R20
**Solution:**
To fix this issue, added the group `im_livechat_group_manager` on the field `chatbot_message_ids` so only those user can access the field who belong to the group.
**Traceback:**
```.py
odoo.exceptions.AccessError: You are not allowed to access
'Chatbot Message' (chatbot.message) records.
This operation is allowed for the following groups:
- Live Chat/Administrator
Contact your administrator to request access if necessary.
```
opw - [6169395]
upg - [4274573]
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#266817
Forward-Port-Of: odoo/odoo#264682This update ensures that all point-of-sale orders, including those that have been invoiced, are now accurately reflected in the periodic digest emails sent to users. Previously, only un-invoiced orders were counted, leading to an incomplete view of sales activity. This change improves the accuracy of digest reports.
Original PR description
Currently in the periodic digest sent by mail only the pos orders that are not invoiced are counted. Steps to reproduce: ------------------- * On empty db (no order previously) * Create a pos order of 10$, don't invoice it * Create a pos order of 10$, invoice it * Close session * Generate the periodic digest: * Go to settings * Under Emails, find "Digest Email" * Select "Configure digest emails" * Select "Your Odoo Periodic Digest" * Make sure "Pos Sales" is ticked * Select "Send Now" * In debug: * In the settings, under Technical, select Emails > Emails * Select the Periodic Digest > Observation: In the point of sale tab, it shows only 10$ Why the fix: ------------ Previously pos orders that were invoiced were not taken into account, now they are. opw-6111304 Forward-Port-Of: odoo/odoo#262561
This update resolves an issue where users without sign permissions were unable to access records with sign request activities, resulting in an access error. The fix ensures that all users, including those without sign rights, can view sign request activities by using sudo and controlling access to activity buttons.
Original PR description
**Steps to reproduce** - Have user A with Sign admin rights and user B without Sign rights. - With user A, create a sign request activity on a record that user B can access. Send the signature…
**Steps to reproduce** - Have user A with Sign admin rights and user B without Sign rights. - With user A, create a sign request activity on a record that user B can access. Send the signature request. - With user B, try to access the record. -> AccessError when trying to fetch the chatter. **Cause** By default, users get access to all the activities associated to records they have access to (see `_search` of `mail.activity`). This is an issue since some of the fields added in `_store_activity_fields` for the sign request activity display might not be accessible for a user with access to the activity. **Change** Use `sudo` to be able to display the activity, even if the user doesn't have access to the sign request. Also, in that case, `can_write` should be `False` in order to hide the action buttons of the activity, which trigger access errors when trying to make operations on the sign request. Another related change is to create the activity for the user creating the sign request, this avoids falling back on the `user_id` of the record associated with the activity and makes sure the activity's user has access to the sign request. opw-6157455 Forward-Port-Of: odoo/enterprise#116540
This update ensures that the product unit of measure (UoM) price isn't displayed in catalogs like MRP when the overall product price is already hidden. This improves the user experience by only showing relevant pricing information, aligning with how prices are typically presented when they're unavailable. It's a minor fix to improve clarity.
Original PR description
Steps to reproduce: - Enable units of measure and packagings. - add a move in a manufacturing order. - change the unit to one that is different than the product's unit. Issue: In some catalogs (for example MRP), we don't show the price to the user. so it wouldnt make sense to show the price per product unit either. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the 'is typing' indicator incorrectly appeared in muted conversations. The change disables this indicator for muted channels, ensuring a cleaner and more accurate experience for users. This improves usability and prevents unnecessary notifications.
Original PR description
Before this PR, the "is typing" indicator could be shown on a muted conversation. This PR disables this feature for muted conversations by forcing the isTyping field to false when muted. Ideally, we should not even send the is typing notification, but that is not possible since we broadcast them to the entire channel. task-6154090 Forward-Port-Of: odoo/odoo#265879 Forward-Port-Of: odoo/odoo#265480
This update prevents the automatic generation of OIOUBL XML files for users who do not have a VAT number when using Nemhandel. Previously, this could lead to unnecessary XML creation and potential compliance issues. This change ensures that Nemhandel functionality is only available to users who require it.
Original PR description
Users with no VAT number shouldn't be able to use Nemhandel and shouldn't have a OIOUBL xml generated. task-6196225 Forward-Port-Of: odoo/odoo#266670 Forward-Port-Of: odoo/odoo#263244
This update fixes an issue where adding images to product pages in the editor mode was failing. The change updates how images are stored to align with recent Odoo updates, ensuring images are correctly saved and displayed. This improves the user experience for product customization.
Original PR description
Versions -------- - saas-19.3+ Steps ----- 1. Go to the product page in editor mode. 2. Press the "Add More" button next to "Extra Media" 3. Add an image by URL. 4. Select the new image and press…
Versions
--------
- saas-19.3+
Steps
-----
1. Go to the product page in editor mode.
2. Press the "Add More" button next to "Extra Media"
3. Add an image by URL.
4. Select the new image and press "Add".
Issue
-----
Traceback
```python
Traceback (most recent call last):
File "/data/build/odoo/odoo/http/router.py", line 432, in serve_db
return retrying(serve_func, env=request.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
File "/data/build/odoo/addons/website_sale/controllers/main.py", line 757, in add_product_media
product_product.write({"product_variant_image_ids": media_create_data})
...
File "/data/build/odoo/odoo/orm/fields_binary.py", line 84, in convert_to_cache
raise TypeError(f'{self}: use BinaryValue instead of {value.__class__.__name__}')
TypeError: product.image.image_1920: use BinaryValue instead of bytes
```
Cause
-----
When saving the image, the remote URL is fetched and the raw `bytes` are stored in the `product.image.image_1920` field. However, since commit 41fe2ebdb9cc37341362d7af829c087a5f72f9f1, raw `bytes` cannot be directly assigned to `Binary` fields.
Solution
--------
Use the new `BinaryBytes` wrapper.
See also:
- https://github.com/odoo/enterprise/pull/116273This update corrects a technical issue in the Odoo versions timeline that was causing incorrect data display. The fix ensures the timeline accurately reflects version changes by directly pushing items instead of lists, resolving a previous data processing error. This improves the overall accuracy and reliability of version tracking.
Original PR description
The push function does not take a list of items but items. So when it was pushed into the fieldNames list it would create a list with ['display_name', [...]] which is not wanted. task-6072932 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#266767 Forward-Port-Of: odoo/odoo#256130