Wednesday, September 24, 2025
21 changes · 19.0
Enhancements to existing features
Users can now open the activity scheduling wizard from the command palette anywhere in Odoo, using the new Alt+Shift+A shortcut. This makes it faster to create personal follow-ups, and when used on a relevant form it automatically links the activity to the current record.
Original PR description
Task: task-5065655
Call invitations and welcome-page previews now use a shared setup flow for camera, microphone, blur, and permission handling. Invitations are more compact and show clearer context, including who is calling and which channel the invite is for.
Original PR description
Backport of https://github.com/odoo/odoo/pull/227998 The welcome page and the call invitation both provide a way to preview the camera before entering a call. However, they have several issues: - The…
Backport of https://github.com/odoo/odoo/pull/227998 The welcome page and the call invitation both provide a way to preview the camera before entering a call. However, they have several issues: - The call invitation does not provide a way to configure call settings. - Both views are missing the blur setting. - Each handles audio/video streams separately, which increases maintenance costs and leads to incomplete flows (e.g. missing warnings when permissions are denied). - Neither relies on the call actions: the logic is duplicated and must be updated every time the call view is improved. In addition, the call invitation takes up a lot of space and does not provide useful information such as the channel the user was invited to. This commit improves both views by factoring out the setup logic into its own component, which is also responsible for handling video and audio streams. At the same time, it reworks the call invitation to take up less space, allow configuring the call, and display additional information such as who is calling and on which channel. task-5090396
Resolved issues and error corrections
The Mexican electronic invoicing flow now handles customer legal names entered with accents when creating invoices from the self-invoicing portal. This prevents avoidable invoice stamping failures when government records store the same names without accents.
Original PR description
Currently, the self-invoicing portal lets client request an invoice after making a purchase in PoS. A form allows them to enter their personal informations such as their name. Many of them enter their name with accents, however the government has all the names without any accents which causes errors when trying to match the requesting party with their legal name during the stamping process of the CFDI. task-4952174 Forward-Port-Of: odoo/enterprise#95207
Product images on website sales pages now keep their original quality instead of being compressed to a lower setting. This improves the visual presentation of products, especially where image detail matters for customer confidence and purchasing decisions.
Original PR description
Product image quality was set to 75% not good enough in some cases. So it increased to 100% to keep the original quality of the image. opw-5094063 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Accounting reports page no longer crashes when users load more lines in a Follow-Up Report with many invoices. This improves reliability for customers reviewing large partner statements or follow-up details.
Original PR description
**Steps to reproduce:** 1. Install the Accounting module. 2. For partner X, create minimum 90 invoices for `See more/Load more` option into page. 3. In the partner form view, click the Customer…
**Steps to reproduce:**
1. Install the Accounting module.
2. For partner X, create minimum 90 invoices for `See more/Load more` option into page.
3. In the partner form view, click the Customer Statement smart button.
4. Change the Report Type from Customer Statement to Follow-Up Report.
5. In the report, click `See more` in the dropdown → traceback occurs.
**NOTE**
- You can easily create invoices using this cron job to generate 90 invoices.
```py
for i in range(90):
invoice = env['account.move'].create({
'move_type': 'out_invoice',
'partner_id': 10,
'company_id': env.company.id,
'invoice_line_ids': [(0, 0, {
'product_id': 16,
'quantity': 1,
'price_unit': 100.0,
})],
})
invoice.action_post()
```
**Issue:**
`UncaughtPromiseError > OwlError
Uncaught Promise > Got duplicate key in t-foreach: ~account.report~17|~res.partner~42|Due~~
Occured`
- A traceback occurs due to a duplicate key error.
**Cause:** https://github.com/odoo/enterprise/blob/459e8ddaf6f67a556d35bf00e0fbb68eb1500a94/account_reports/static/src/components/account_report/account_report.xml#L72-L73
- In account_report.xml component uses line.id as a key.
<img width="781" height="176" alt="image" src="https://github.com/user-attachments/assets/57bf36ea-6890-45ef-8414-5522d71ece7b" />
- When expanding `See more` headings like `Overdue` are rendered again with the same ID causing a duplicate key error.
<img width="754" height="194" alt="image" src="https://github.com/user-attachments/assets/0eba65e0-0bf2-4f64-a997-27a25e5de5fe" />
**Solution:**
- Use the `line_index` instead of `line.id` as the key, ensuring a unique key for every line and preventing the traceback.
**opw - 5083894**
Forward-Port-Of: odoo/enterprise#95103This update refreshes Odoo’s spreadsheet component and fixes several small user-facing issues. Users should see more reliable spreadsheet sorting and cleaner chart and carousel visuals, improving day-to-day reporting and dashboard presentation.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/87b774dfa [REL] 19.0.4 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/87b774dfa [REL] 19.0.4 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/c84edcb45 [FIX] Sort: Allow to sort array formula that do not spread [Task: 5033192](https://www.odoo.com/odoo/2328/tasks/5033192) https://github.com/odoo/o-spreadsheet/commit/0e823e20a [FIX] Carousel: the sidepanel cogwheel has a weird look [Task: 5090177](https://www.odoo.com/odoo/2328/tasks/5090177) https://github.com/odoo/o-spreadsheet/commit/b2aec82f2 [FIX] charts: truncate radar chart labels correctly [Task: 5078858](https://www.odoo.com/odoo/2328/tasks/5078858) https://github.com/odoo/o-spreadsheet/commit/b1f21db41 [FIX] carousel: missing color for empty carousel header [Task: 5082459](https://www.odoo.com/odoo/2328/tasks/5082459) https://github.com/odoo/o-spreadsheet/commit/13482eefd [IMP] test: improve `expect.toHaveStyle` jest matcher [Task: 5059476](https://www.odoo.com/odoo/2328/tasks/5059476) 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: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@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>
This update prevents crashes for public website visitors using older Safari versions by adding missing browser support needed for translation caching. Visitors on Safari before version 17 should now be able to load pages normally instead of encountering failures at launch.
Original PR description
Safari < 17 (09/2023) doesn't support Set.difference. This function is used in our indexeddb wrapper, which runs also in the frontend, even for public (non logged-in) users, to fetch and cache translations. As a consequence, those people have a crash at each page launch. Safari 17 being recent enough for public users, we add a polyfill (for frontend only). 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#228120
Odoo now handles printer setup errors more gracefully when the system cannot add a printer, such as on read-only devices or when a printer name is invalid. Instead of stopping the printer interface, the error is logged and printing services can continue running.
Original PR description
Before this commit, if CUPS raised an error when adding a printer in the `supported()` method of the printer driver, the exception would not be caught causing the printer interface to stop. This can happen for example if the filesystem is read-only or the printer has an invalid name. After this commit, we catch any CUPS errors and log them, allowing the printer interface to continue running. We also enter write mode before adding the printer to prevent any read-only errors. task-5086036 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227307 Forward-Port-Of: odoo/odoo#227121
Fixes an issue that could block sending certain Colombian customer invoices when a debit-note-related operation type was selected without a linked reference invoice. This prevents an error during the send process and helps users complete DIAN invoice delivery smoothly.
Original PR description
Currently, an error occurs when the operation type (CO) is "Nota Débito que referencia una factura electrónica" and, after confirmation, the user attempts to send the mail. **Steps to Reproduce:** -…
Currently, an error occurs when the operation type (CO) is "Nota Débito que referencia una factura electrónica" and, after confirmation, the user attempts to send the mail. **Steps to Reproduce:** - Install Accounting and l10n_co_dian modules. - Switch company to "CO Company". - Create new customer invoice. (e.g; Operation Type (CO) = Nota Débito que referencia una factura electrónica) - Click on "Send" button. Ensure DIAN is selected in template and then send it. - Error occurs. **Error:** AttributeError - 'bool' object has no attribute 'isoformat' **Cause:** The issue happens because debit_origin_id is not set, which makes reference_invoice equal to None, leading to an error. - [1] In pervious versions, the operation type could not be modified because it was read-only field. From saas-18.4, it became a stored field. Therefore, without debit note, the operation type cannot be changed directly. In this case, the condition at [2] fails, and the method returns None. **Fix:** This commit ensures that a value is only returned if a reference invoice exists; otherwise, it returns None. [1] - https://github.com/odoo/enterprise/blob/8c0217e4e38903783ab7d70ca3eec1c1e3de03de/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L730 [2] - https://github.com/odoo/enterprise/blob/b67a58ffd70952a06b7dd56a54782c433ff673fb/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L1495-L1496 sentry-6810908763 Forward-Port-Of: odoo/enterprise#92714
Italian XML invoices marked as TD01 are now kept as the correct document type when imported as vendor bills. This prevents purchase invoices from being mislabeled as TD05, improving compliance accuracy and reducing manual corrections.
Original PR description
**Issue** When importing an XML invoice of document type TD01, it is incorrectly assigned type TD05 after processing. **Steps to Reproduce** 1. Install Accounting, l10n_it and l10n_it_edi 2. Go to…
**Issue**
When importing an XML invoice of document type TD01, it is incorrectly assigned type TD05 after processing.
**Steps to Reproduce**
1. Install Accounting, l10n_it and l10n_it_edi
2. Go to Accounting > Vendors > Vendor Bills
3. Upload an XML invoice with TD01 as the document type
4. Upon confirming the bill, observe that the document type is incorrectly set to TD05
**Root Cause**
The document type matching logic fails to assign TD01 because the uploaded invoice has move_type = in_invoice, while TD01 was only configured to match out_invoice. https://github.com/odoo-dev/odoo/blob/7436e8cee2f605c6d5d559cb410e7a3dc8f372b9/addons/l10n_it_edi/models/account_move.py#L886-L891
**Fix**
According to Italian e-invoicing specifications, TD01 applies to both sales and purchase invoices ("Fatture di vendita" and "Fatture d’acquisto"). To reflect this, in_invoice is now added to the list of supported move_types for TD01, allowing correct detection during XML import.
opw-4931438
Forward-Port-Of: odoo/odoo#219310Pasting tables from sources such as Google Docs now works more reliably in Odoo editors. Tables remain visible and empty cells are prepared correctly, reducing manual cleanup for users creating website or rich-text content.
Original PR description
### Steps to Reproduce: - Go to the website. - Copy a table from Google Docs. - Paste the table into the editor. - Observe that the table is not visible because some required classes are missing. - Notice that there is no base container inside the empty `<td>` elements. ### Description of the issue/feature this PR addresses: - When content is pasted from other source (e.g., Google Docs inside iframe), attribute nodes coming from another JavaScript context do not match the `Attr` prototype of the current context. ### Desired behavior after PR is merged: - Use `item.nodeType === Node.ATTRIBUTE_NODE` instead of `instanceof Attr` to detect attribute nodes. - Insert a base container into empty `<td>` elements when pasting tables from external sources. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227378
Spreadsheet imports now correctly handle values that look like dates when they belong in text fields, preventing failed imports and confusing error messages. This helps users re-import exported records, such as pricelist rules, without manual cleanup when date-like values appear in names or other text fields.
Original PR description
*: test_import_export ### Steps to reproduce: - Go to Sales/Prodcuts/Pricelists - Create a new pricelist with a rule with a set Valid Period - Export that record adding the Pricelist Rule/Start Date…
*: test_import_export ### Steps to reproduce: - Go to Sales/Prodcuts/Pricelists - Create a new pricelist with a rule with a set Valid Period - Export that record adding the Pricelist Rule/Start Date (item_ids/date_start) as XLSX format - Delete the record and test the import the XLSX file #### Uncaught Promise: > Invalid props for component 'ImportDataColumnError' :'resultNames' is undefined (should be a array) ### Cause of the Issue: The issue is raised by the error message: https://github.com/odoo/odoo/blob/32bdff8bc603a03038d3f9e38463809883319305/addons/base_import/models/base_import.py#L1428-L1432 which is not properly handled by the `ImportDataColumnError` component. However, in the present situation, the issue is just that this error message itself should not be raised in the first place. #### Details: Since commit 630b2683d3aad203b0bbf7d2d63b88cd4d3bd9d7, date and datetime formatted cells in spreadsheets are no longer Char field. Instead, they are imported as date and datetime objects. This was intended to allow importing columns with mixed encodings (e.g., some values stored as strings, others as dates in the spreadsheet). However, a side effect of this change is that if a char-type field contains values that a spreadsheet interprets as dates or datetimes, the import fails. For example, an account move name "21/12/2025" may be interpreted as a date. Attempting to perform a join on this string expected value causes a traceback here: https://github.com/odoo/odoo/blob/32bdff8bc603a03038d3f9e38463809883319305/addons/base_import/models/base_import.py#L1628-L1632 To address this discrepancy, commit 91dca74b3e395c8ee410db18784990ba3a6a7e6e introduced a check raising an error if the imported field type is not appropriate to carry a `date/datetime` value. This fix has two major issues: 1) It still does not handle the above use case correctly—it remains impossible to import "21/12/2025" as a record name. 2) (The present issue) It does not properly check the type of related fields. For example, a field like "company_id/partner_id/membership_start" is not considered as an allowed date field. The current check on allowed date fields being overly simplistic: https://github.com/odoo/odoo/blob/32bdff8bc603a03038d3f9e38463809883319305/addons/base_import/models/base_import.py#L1416-L1421 ### Fix: We propose reverting commit 91dca74b3e395c8ee410db18784990ba3a6a7e6e. And instead of recursively computing the related model and the appropriate types of related fields (including property-type relational fields), we will simply stringify values when they are written into char-like fields (e.g., char or text). Note: this may also require an adjustment in master for the html type. opw-4935423 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226807
The Point of Sale now blocks changes to a product when that same product is already in the current order. This helps avoid inconsistent product details in active carts and reduces checkout errors for staff.
Original PR description
- Prevent update of product via POS when the product is already in the current order (to avoid leading to inconcistent data on this product for the current order). task-id: 4943650 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219209
The Indian reporting document summary is no longer recreated every time a user opens it, preventing accidental loss of existing summary data. The summary card also correctly avoids showing a missing-data label when the document summary already exists.
Original PR description
Issue: - Document summary was regenerated every time the user clicked on the document summary card. - This caused data loss for already existing summaries and unnecessary restart of the process. - 'Missing' tag appeared in document summary even when data was present. - Additionally, record_name was passed in _check_suite_in_gstr1_report, but as a computed field it never worked as intended. Fix: - Adjusted logic so the document summary is generated only when empty. - Subsequent clicks now reuse the existing summary instead of regenerating it. - No missing tag appears if document summary exists. - Replaced record_name with record_model to ensure correct record count and computed record name.
This fix restores one-time payment options in Swiss payroll and prevents salary attachments from appearing where they should not. It helps payroll teams keep the employee payroll interface accurate and focused on relevant compensation items.
Original PR description
- Reintroduce one time payments - Blacklist salary attachments
Fixes the website editor so hovering over selectable options, such as blog post authors or contact records, previews the change before it is applied. This restores expected preview behavior and makes editing website content more reliable for users.
Original PR description
### [FIX] html_builder, website: pass `isPreviewing` to action with colors With the commit 4448303436fd2d5afe235263e13a9d5daa2d14e1, the `apply` method of actions should receive an argument…
### [FIX] html_builder, website: pass `isPreviewing` to action with colors With the commit 4448303436fd2d5afe235263e13a9d5daa2d14e1, the `apply` method of actions should receive an argument `isPreviewing`. This has not been done for `BuilderColorPicker`. This commit adds the argument `isPreviewing` when calling `apply` in `BuilderColoPicker`. task-4367641 ### [FIX] html_builder, *: make options with BuilderMany2One previewable *: web, website With the initial [website builder refactor], the options based on `BuilderMany2One` were not previewable (they were in the previous builder). This commit brings back that behaviour. To do so it adds props to `SelectMenu` and options to `Navigator` to receive the information needed for the preview Steps to reproduce: - On `/blog`, open website builder - Click on the author of a blog post - In the sidebar, click on "Contact" to open the dropdown - Hover other authors than the current one - Bug: the hovered author is not previewed in the dom (like in was in the previous builder) [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641 Forward-Port-Of: odoo/odoo#223369
Date, datetime, and date range fields now correctly apply values provided by the system, even when the value matches the field's original value. This prevents forms from showing a manually typed date when business logic has enforced a specific date, improving data accuracy and user confidence.
Original PR description
This commit allows date (i.e. date, datetime & daterange) fields to apply a value from the props (e.g. coming from an `onchange`), even if that value is the same as the initial one. Before this commit, it was not possible due to the fact that the date service responsible for the reactivity of the field was updating the input in an incorrect order, causing the field to display the 'input' value, and not the one enforced by the props. Task 4978896 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#227102 Forward-Port-Of: odoo/odoo#225841
Fixed an issue that could prevent users from opening the Inventory Valuation menu when a company did not have a valuation account configured. The report now handles the missing account safely, avoiding an error screen and keeping inventory valuation accessible.
Original PR description
Issue before this commit: ========================= Currently, when opening the Inventory Valuation menu without setting a Valuation Account in the settings, the system raises the error: `Cannot read…
Issue before this commit: ========================= Currently, when opening the Inventory Valuation menu without setting a Valuation Account in the settings, the system raises the error: `Cannot read properties of undefined (reading 'display_name').` Steps to Reproduce: ========================= - Install the account and stock_account modules. - Switch to another company where the default Valuation Account is not set. - Create a warehouse and a product with a cost. - Create and validate a receipt for that product. - Open the Inventory Valuation menu → traceback occurs. Cause of the issue: ========================= In this [PR](https://github.com/odoo/odoo/pull/224479), a new valuation report was added. At the [mentioned line](https://github.com/odoo/odoo/pull/224479/files#diff-8afed36c6f80919b83630d39c78510289ec8fecc632735d26824a84a517a1b7dR60), it's assumes the account always exists and attempts to access display_name directly, leading to the error. With This Commit: ========================= We ensure that display_name is only accessed if the account exists, preventing the traceback.
Czech VAT return entries without a partner VAT number are now placed in section A5 regardless of invoice amount. Entries under special VAT regimes for travel services and margin schemes are also consistently reported in A5, helping businesses produce compliant Czech VAT filings.
Original PR description
Before this commit, the l10n_cz VAT return report classified entries in section A4 if their total amount exceeded 10,000 CZK, and in section A5 if the amount was 10,000 CZK or less. - In l10n_cz, create an invoice with a cz partner without vat, over 10000. - In tax return the entry will be in section A4. With this commit: - Entries with no partner VAT number are now always classified under A5, regardless of the total amount. - Entries using a special VAT regime (l10n_cz_scheme_code), corresponding to Section 89 – travel services and Section 90 – margin scheme) are also always classified under A5, regardless of the amount. opw-4953787 Forward-Port-Of: odoo/enterprise#92833
The website shop sitemap now avoids a memory-heavy loading behavior when handling very large product catalogs. This helps prevent server crashes caused by search engines or other crawlers requesting the sitemap, improving availability for online stores.
Original PR description
### Issue Server crashes with MemoryErrors when a database has a large product catalogs. ### Solution This commit disables the prefetcher to avoid MemoryErrors when generating the sitemap for large product catalogs as web crawlers would continously crash the server when requesting the sitemap. ### References opw-5001680 opw-4955333 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228078 Forward-Port-Of: odoo/odoo#223054
Customers can now change product options on website product pages even when some option combinations are excluded. The unavailable choices still look unavailable, but they no longer block shoppers from switching to another valid variant.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Create a product with attributes A & B; 2. for attribute A, create values A1 & A2; 3. for attribute B, create values B1 & B2; 4. add an attribute exclusion on A1 for B2; 5. add an attribute exclusion on A2 for B1; 6. open the product's website page. Issue ----- It's impossible to change attributes. Cause ----- Commit bbb2d98d9ab97 prevents selecting impossible combinations, as a consequence, it's impossible change product variants whose attributes exclude each other. Solution -------- Do not add the `disabled` attribute for excluded attributes, but maintaining the visual cues. Suggestion for future [IMP]: disable attributes as they were defined, without also disabling their inverse, e.g. if A1 is selected, disable B2, but don't disable A2 because B1 is selected. opw-5019677 opw-5050472 Forward-Port-Of: odoo/odoo#226612