Friday, October 31, 2025
27 changes · 19.0
Enhancements to existing features
VoIP browser tabs now try to unregister when closed and registrations expire sooner if cleanup does not happen. This helps customers avoid hitting provider limits on active phone registrations, especially when users open multiple Odoo tabs.
Original PR description
Some providers like OnSIP allow for a limited number of registrations per user. This is a problem in Odoo because each tab opened creates a new registration for one hour. This commit mitigates the problems in two ways: - Sends an "unregister" request onbeforeunload to try to invalidate the registration upon closing the tab. - Reduces the TTL of registrations so that they get invalidated quicker in case the unregistration failed. Forward-Port-Of: odoo/enterprise#98413 Forward-Port-Of: odoo/enterprise#97963
Purchase catalog suggestions now show all recommended products on the first page when suggestions are enabled, instead of hiding some behind pagination. The change also improves performance and makes bulk adding suggestions respect the selected purchase order section.
Original PR description
Description of the issue/feature this PR addresses: Improves purchase catalog suggestions, adding a filter on products with `suggested_qty > 0` on suggestion toggle. This ensure all suggested products will be shown on the first catalog page Perf improvements on both front end (reducing number of RPCs) and backend (filtering domain as much as possible on search method). Current behavior before PR: Before, if there were more products than the paging limit, not all suggested product would be pulled to the front (couldn't order a view by a computed field.) Desired behavior after PR is merged: All suggested products are shown on first page. task#5114649 previous PR: odoo/odoo#218343 And separated all the refacto on a beanch on master: https://github.com/odoo/odoo/pull/232456 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Mass mailing now better supports older email templates during the move to Odoo 19. Users can still view legacy email content, receive clearer warnings when parts are outdated, and avoid several editing crashes.
Original PR description
This work's purpose is to prepare `mass_mailing` for the upcoming migration to Odoo 19.0. Existing mail content produced with the old editor is not upgraded, and users who end up editing such content must be informed if a snippet is not up to date. contents: - ensure that existing mail content with an obsolete mail HTML structure is properly displayed, even if the editor will not work at all, instead of showing the Theme Selector if no authorized theme is detected. - ensure that a user editing an obsolete snippet is informed and can change it to the new version - various crash fixes See commits messages for further detail. task-5134263
Resolved issues and error corrections
Fixes an error that could occur when users opened a Field Service task from the map view. The task time is now displayed using the user’s local time format without seconds, improving reliability for Field Service teams.
Original PR description
Steps: -------- - Install industry_fsm - Go to FSM app > Map Issue: -------- When opening the FSM task from the map menu, a traceback occurs. Cause: ---------- The removal of `shortTimeFormat`, as shown in the this commit. https://github.com/odoo/odoo/commit/062b14097033afc19252cf3b8bb1fc541f8c868d#diff-39c1e6808cb2412961c390a24d5e6737f2fca1ef85ba2c40e501114311f596c2L67 Fix: ---- In this commit, the time object is built to be able to format the time without any seconds and take into account the time format defined in localization. task-5220054
Corrects a rounding issue in Mexican electronic invoicing that could block global invoices with discounted lines from being validated. This helps businesses avoid rejected invoices caused by small discount calculation differences.
Original PR description
Steps to reproduce: ------------------- * Create an invoice with the following line: * Unit price: 47.25, Qty: 1, Taxes: 16%, Discount 50% * Confirm, create a global invoice > Observation: Error ```…
Steps to reproduce: ------------------- * Create an invoice with the following line: * Unit price: 47.25, Qty: 1, Taxes: 16%, Discount 50% * Confirm, create a global invoice > Observation: Error ``` Code : CFDI40108 Message : El TipoDeComprobante es I,E o N, el importe registrado en el campo no es igual al redondeo de la suma de los importes de los conceptos registrados. ``` Why the fix: ------------ The issue occurs because the `descuento` value, originally 23.625, is now being corrected to 23.615 which leads to `importe` having a value of 23.635 which round up to 23.64 and not 23.63. https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/l10n_mx_edi/models/l10n_mx_edi_document.py#L1111 https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/l10n_mx_edi/models/l10n_mx_edi_document.py#L1336 Before this commit https://github.com/odoo/enterprise/commit/39759babddc732a312ec5cd6a60a2f1819abc62c the discount value was being rounded when corrected. It would end up being evaluated to 23.62. To not bring back the issue the fixed by the mentioned commit we round the discount when generating the global invoice cfdi values. Now `importe` will have a value of 23.63 as `descuento` is rounded to 23.62. opw-5023597 Forward-Port-Of: odoo/enterprise#95982 Forward-Port-Of: odoo/enterprise#94438
Chilean electronic invoice imports no longer fail when a supplier uses a numeric currency code instead of a currency abbreviation. The system now recognizes those codes and falls back to Chilean pesos when needed, helping users import vendor bills without interruptions.
Original PR description
### Steps to reproduce: - Install "l10n_cl_edi" and switch to a Chilean company - Go in Accounting > Vendor > Bills - Import an XML with the line `<Moneda>013</Moneda>` - Traceback ### Cause: `Moneda` can be the currency name code like `USD` but also a numeric code corresponding to the currency. ### Solution: Add a dictionary linking codes to the currency names and check the dictionary if `Moneda` is numeric. Also add a fallback on `CLP` in case the value of `Moneda` fails to be translated to a currency. This avoids a traceback later when reading `vals['currency_id']`. opw-5184950 Forward-Port-Of: odoo/enterprise#98067
This update makes the bank reconciliation screen more consistent across versions and reduces confusing duplicate partner information. It also prevents users from selecting certain bank-related accounts in reconciliation models when that selection would not produce a useful result, and keeps key payment action buttons easier to access.
Original PR description
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of:…
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of: https://github.com/odoo/enterprise/commit/524a7a46a0c2888b591de7ad1a0a6d744e345f5a https://github.com/odoo/enterprise/commit/2a83c85cb2c9a7a5da3d4a8483120eeda6b2e6cb https://github.com/odoo/enterprise/commit/e3cb3ab3ec8c64297d8e97d941e0d2eea3e64667 https://github.com/odoo/enterprise/commit/fdbb93abbf831cfa2fdc75e79aa76c094d6e522a https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e [FIX] account_accountant: restrict some account in the set_account Before this commit, we could select the liquidity account or bank suspense account which could create a reco model for it that would do nothing. [FIX] account_accountant: partner_name Before this commit, when a transaction had no partner_name and some lines with the same partner. When unfolded, we had the info of the partner on the statement line and on the line itself which was a duplicate of information. This commit will change when the line is unfolded so that the partner is visible on the statement line only when there is a partner_name [FIX] account_accountant: payable and receivable button Before this commit, the payable and receivable buttons where on the top line only when the reconcile button was not there anymore. Now We decided to always have them present in secondary next to the reconcile button. no task-id Forward-Port-Of: odoo/enterprise#98325 Forward-Port-Of: odoo/enterprise#96852
OCR-processed purchase receipts are now correctly treated as purchase documents instead of sales receipts. This prevents the system from selecting sales taxes on supplier receipts, improving accounting accuracy and reducing manual corrections.
Original PR description
Since task [4776275](https://www.odoo.com/odoo/project/2068/tasks/4776275) (commit [a7e9575](https://github.com/odoo/enterprise/commit/a7e9575d4c7fccff06db8a3ec2b9315d8ac33805)), the OCR is able to automatically detect and change a vendor bill into a receipt. The calls to `is_purchase_document` should have been updated to reflect that, but they weren't. Because of this, purchase receipts were considered as sale receipts, causing multiple issues such as sale taxes being selected instead of purchase taxes. task-none
Scanning a package in the barcode app now follows the same “Allow Extra Products” setting as scanning individual items. This prevents warehouse staff from accidentally adding the wrong packaged products to deliveries when extra products are not permitted.
Original PR description
## Issue 1: "Allow Extra Products" option ignored for packages ### Steps to reproduce: - In the settings enable "Packages" - Go to Inventory > Configuration > Warehouse Management > Operation Types -…
## Issue 1: "Allow Extra Products" option ignored for packages
### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehouse Management > Operation Types
- Disable "Allow Extra Products" on the "Delivery" operation type
- Create two storable product P1, P2 and add on hand quantities
- 10 x P1 in a package PACK01
- 10 x P2 in a package PACK02
- Create and confirm a delivery for 10 unit of P1
- Open your delivery from the barcode app
- Scan PACK02
#### > The content of PACK02 is added to the delivery even thought it contains extra products.
### Cause of the issue:
The check for extra products is only applied when scanning individual products but is bypassed by package scan. To be more precise, the `barcode_allow_extra_product` option is checked in the public method `createNewLine`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L59-L80
While this method is called at new line creation when a product is scanned, scanning a package will add new lines during the `_processPackage` adn bypasses the rest of the `_processBarcode`:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_model.js#L1261-L1267
The issue being that the `__processPackage` does not check the `barcode_allow_extra_product` option and creates its new lines via the private `_createNewLine` call:
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1564-L1565
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1655-L1667
https://github.com/odoo/enterprise/blob/331442fd9cbd59d542432b2237299df9497ce241/stock_barcode/static/src/models/barcode_picking_model.js#L1671
### Fix:
Since scanning a package is expected to add all its content to the picking, and since a package can not be split among two locations, it is necessary to check in advance if any product of its content is extra and avoid any update in this case.
## Issue 2: impossibility of package line removal
-> Resolved in 19.0 see https://github.com/odoo/enterprise/commit/060f4c3e24e7add05273cfad5853884546937d0e#diff-3c84b414a086808e446ae3f90b3b803edf964c28237c153af19edda3ed05cc6bL21
### State of the art:
There is currently no option to remove a package line from the barcode. In particular, once the option `show_entire_packs`(Move Entire Packages) is enabled on a picking type, you can not remove the package line once generated by a scan.
#### Steps to reproduce:
- In the settings enable "Packages"
- Go to Inventory > Configuration > Warehoue Management > Operation Types
- Enable "Move Entire Packages" on the "Delivery" operation type
- Create a storable product and add on hand quanties:
- 10 units in package PACK01
- 10 units in package PACK02
- Create and confirm a delivery for PACK01 (in the package lines)
- Open your delivery from the barcode app
- Scan PACK02
#### > The new line associated to PACK02 can not be removed by any mean
opw-4863621
opw-5080637
Forward-Port-Of: odoo/enterprise#97497
Forward-Port-Of: odoo/enterprise#96299Users without administrator rights can now use the AI document sorting option when it is configured for their workspace. This removes an unnecessary permission barrier and helps documents be routed to the right folders more reliably.
Original PR description
Purpose: -------- Non-admin users should be able to trigger the auto-sort of their documents (since anyways they could delete and reupload their documents, which will trigger the auto-sort). - The "Sort with AI" button was missing in the topbar for non-admin users. To fix this, a boolean `ai_has_sort_prompt` is added in the search panel values (the button was shown if `ai_sort_prompt` was set, which is only accessible by users with group_system) - The display name of folders is now the folder name if the env is sudo-ed even if the user has not access this folder (these folders are valid targets if they are in the `ai_sort_prompt`, but they were inserted as "Restricted Folder" so the LLM could not decide in which folder to move the document) - Add a few sudo's so that the auto-sort action can be triggered by a non admin user Task-5144695
Budget generation no longer fails when users split a budget by analytic plan. This helps accounting teams create split budgets reliably without encountering an error during the process.
Original PR description
Currently, on creating a budget using split budget causing an error. **Steps to Reporduce:** 1) Install **account_budget module(with Demo)** 2) Navigate to **Accounting>Accounting>Analytic Budget**…
Currently, on creating a budget using split budget causing an error. **Steps to Reporduce:** 1) Install **account_budget module(with Demo)** 2) Navigate to **Accounting>Accounting>Analytic Budget** 3) Click on `Generate` set `Analytic Plan` and click on `Split` Error: `ValueError: Cannot convert budget.line.achieved_amount to SQL because it is not stored` Root Cause: since [this commit](https://github.com/odoo/odoo/pull/224667/commits/53b4670b1ad375ffc3800fc3beb97e960f229dc6), a new aggregate spec `sum_currency` was added. As a result, the code at [1] is executed for currency-aware aggregates. From the line, `self._field_to_sql(self._table, fname, query)` the ORM tries to create an SQL expression for `achieved_amount`. Because `achieved_amount` is computed `_field_to_sql` fails and error is raised. Fix: Provide a default SQL expression for computed fields on Budget Line [1]: https://github.com/odoo/odoo/blob/af668f545676f72385c52629f8498edfe22219cd/odoo/orm/models.py#L1972-L2004 Used Reference: https://github.com/odoo/odoo/blob/d42102cac8fff3967cb605a897bbb0e8690464ed/addons/crm/models/crm_lead.py#L286-L298 sentry-6917352415
This fixes issues in Email Marketing where the wrong email editor could appear when moving between mailing records, and where editor toolbars could disrupt the editing area. Users should see the correct editor consistently and have a smoother editing experience.
Original PR description
### use overlay offset for basic editor In this prior [fix], overlays spawned by the HtmlBuilder and its children have a modified offset in order to prevent the `MassMailingIframe` from unloading its…
### use overlay offset for basic editor In this prior [fix], overlays spawned by the HtmlBuilder and its children have a modified offset in order to prevent the `MassMailingIframe` from unloading its content. However the `MassMailingHtmlField` also handles a Simple Editor feature, which does not use the Builder. This feature still uses an iframe and also uses overlays (popover toolbars). This work moves the [fix] in `MassMailingIframe` so that it applies also for the Simple Editor. [fix]: https://github.com/odoo/odoo/commit/dd31e31f3cecd4d23dc90f9c88780bf3b969a294 ### ensure correct editor instance on record switch Issue: When switching from one record to another using the Form view pager, the `activeTheme` was set to the theme value of the previous record, resulting in the wrong Editor instance in some cases. How to reproduce: - Open the list view in Email Marketing - Ensure there are 2 records in the list view: - one editable with the builder (default theme) - one editable with the simple editor (basic theme) - click on the record with the simple editor - use the pager to switch to the next record Issue: - switching from simple -> builder, the builder is not instanced but it should have been - switching from builder -> simple, the builder is instanced but it should not have been Resolution: Update the active theme based on the value of the nextRecord instead of the record currently in `props`, because `this.props.record` is updated after `updateActiveTheme` is called. task-5217595
Employee working hours now display correctly when their contract or occupation starts before the employee record version date. This prevents schedules such as 24 hours per week from incorrectly showing as zero and improves workforce planning accuracy.
Original PR description
**Issue / current behavior:** When you create an employee with version date = today and set him an occupation starting in the past and then when we try to assign him a working schedule 24h/week it shows 0 working hours. **Required behavior:** It should display 24 working hours or whatever selected. **Solution:** Changed the field of available time of the week to contract_start_date from the version_start_date. task-4985887 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221912
This fix stops users from deleting a unit of measure that is still referenced by a purchase order line. It prevents purchase order confirmation errors and helps keep purchasing data consistent.
Original PR description
When a user deletes the UoM used in a purchase order line and then tries to confirm the purchase order. Steps to reproduce: --- - Install `purchase_stock` module(without demo) - Create a New PO > Add a product in Line (with UoM=Units) - Remove UoM in order line and select `Dozen` in it > Save - Settings > Units of Measure Categories > Open `Units` > Remove `Dozen` - Orders > Requests for Quotation > Open PO > `Confirm Order` Traceback: --- `ValueError: Expected singleton: uom.uom()` `AssertionError: precision_rounding must be positive, got 0.0` This error occurs because, after the UoM is deleted, the `product_uom` field becomes empty, which leads to an error. Solution: --- This commit resolves the error by restricting the deletion of a UoM when it is still in use. sentry-6746792383 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233783 Forward-Port-Of: odoo/odoo#231478
This update ensures the Appraisals app includes the required hierarchy component during upgrades. It prevents upgrade failures for databases where related hierarchy features were previously not installed or were removed.
Original PR description
In version `19.0` new hierarchy views was added to module `hr_appraisal` by this commit[^1]. But the module `web_hierarchy` is not dependency of `hr_appraisal`. When we install `hr_appraisal` it…
In version `19.0` new hierarchy views was added to module `hr_appraisal` by this commit[^1]. But the module `web_hierarchy` is not dependency of `hr_appraisal`.
When we install `hr_appraisal` it triggers the installation of `hr` because of dependency. On the other side `hr_org_chart`[^2] gets installed because of auto_install=true. So it makes `web_hierarchy` installed because of the `hr_org_chart` dependency.
If we upgrade db from `18.0` to `19.0` which `hr_appraisal` installed and `web_hierarchy` uninstalled we will get issue as `hr_appraisal` requires dependency to `web_hierarchy` because of new views.
Steps to reproduce (case 1):
1. Install `hr_appraisal` in `18.0`
2. Uninstall `web_hierarchy`
3. Upgrade to `19.0`
Steps to reproduce (case 2):
1. Install `hr_appraisal` in `16.0`
2. Uninstall `hr_org_chart`
3. Upgrade to `19.0`
In this 2nd case, the `web_hierarchy` is not existing yet and `hr_org_chart` is auto installed module, so during upgrade it will not be re-installed again.
We will get traceback like this:
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/19.0/odoo/service/server.py", line 1509, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'], reinit_modules=config['reinit'])
File "/home/odoo/src/odoo/19.0/odoo/tools/func.py", line 88, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/19.0/odoo/orm/registry.py", line 185, in new
load_modules(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 449, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 211, in load_module_graph
load_data(env, idref, mode, kind='data', package=package)
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 58, in load_data
convert_file(env, package.name, filename, idref, mode, noupdate=kind == 'demo')
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 646, in convert_file
convert_xml_import(env, module, fp, idref, mode, noupdate)
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 745, in convert_xml_import
obj.parse(doc.getroot())
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 616, in parse
self._tag_root(de)
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 570, in _tag_root
raise ParseError(msg) from None # Restart with "--log-handler odoo.tools.convert:DEBUG" for complete traceback
odoo.tools.convert.ParseError: while parsing /home/odoo/src/enterprise/19.0/hr_appraisal/views/hr_appraisal_goal_template_views.xml:71
Invalid view type: 'hierarchy'.
You might have used an invalid starting tag in the architecture.
Allowed types are: list, form, graph, pivot, calendar, kanban, search, qweb, cohort, gantt, grid, map, activity
View error context:
'-no context-'
```
[^1]: https://github.com/odoo/enterprise/commit/dbe4946218b3523bea4fb8a79be8f3fc29d8d33e
[^2]: https://github.com/odoo/odoo/blob/dec621e60794ede263222e3b5be0ebfc33ed6f40/addons/hr_org_chart/__manifest__.py#L16-L17Mexican payroll documents now include the employment subsidy section only when the payment type is actually subsidy-related. This prevents government submission failures when payslips include other non-subsidy inputs.
Original PR description
Bug: If we add other inputs to a payslip, in the CFDI, then sending to the government will fail. Cause: In the CFDI, the node 'SubsidioAlEmpleo' is present when it shouldn't. Fix: The node should be present only for other payments of code 002, 007 or 008, all related to subsidies. Task: 5224176
Nilvera e-invoice document resubmissions now resend the full XML file instead of accidentally sending an empty file after a retry. This helps prevent failed submissions and 400 errors when Turkish e-invoicing documents need to be resubmitted.
Original PR description
Resubmitting a Nilvera document reused the same XML stream, leading to an empty file on retries. The issue occurs because `requests.Session. request()` reads the BytesIO buffer, moving its cursor to the end of the file. As a result, subsequent reads return empty content. This fix wraps the XML content in a new BytesIO buffer before each submission to ensure safe recursive resubmissions and prevent 400 errors caused by empty payloads. task-5163253 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue in Point of Sale where choosing a customer after adding an online payment could leave the completed payment without the correct customer information. Businesses get more reliable order records and smoother reconciliation for online payments.
Original PR description
Before this commit, if a partner was selected after adding an online payment line, the partner was not synced after completing the online payment. opw-5098127 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233405 Forward-Port-Of: odoo/odoo#232455
Fixes an issue where running a test import with batching could cause the final import to start from the wrong point, importing only the last batch. After a successful test import, the import process now resets to the beginning so all intended records are imported.
Original PR description
Steps to reproduce ================== - Go to contacts - Click on the cog menu > Import records - Upload a csv file - Limit the batch limit to a value lower than the total number of records in the csv file - Click on the test button - Click on the Import button => Only the last batch is imported Cause of the issue ================== The start line is not reset after the test import, which can be confusing Solution ======== When the test import fully succeeds, we reset the start line opw-4916102 Forward-Port-Of: odoo/odoo#233498 Forward-Port-Of: odoo/odoo#230805
Creating a sales order from a project no longer fails when the order has no products or only non-service products. This helps users save project-related sales orders reliably without encountering an unexpected error.
Original PR description
Currently, an error occurs when creating a sale order for a project. **Steps to Reproduce:** - Install the `sale_project` module. - Go to `Project` and, in the `list view`, create a `project` and…
Currently, an error occurs when creating a sale order for a project. **Steps to Reproduce:** - Install the `sale_project` module. - Go to `Project` and, in the `list view`, create a `project` and `set a customer`. - Click the `Sales Order` button in the header. - Save the `sale order` without adding `any product` or by adding a `non-service product`. **Error:** `AttributeError: 'bool' object has no attribute 'order_id'` This error occurs, when user creating a sale order for a project without adding a service product, then service sol becomes empty [1], which raises an error here [2] when trying to access the sale order. This commit ensures that if there is no service sol, empty sol is taken in the service sol. [1]- https://github.com/odoo/odoo/blob/3121577430cdfa485af4d69792745a6f9c2ffe2f/addons/sale_project/models/sale_order.py#L272 [2]- https://github.com/odoo/odoo/blob/3121577430cdfa485af4d69792745a6f9c2ffe2f/addons/sale_project/models/sale_order.py#L276 sentry-6948584510 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents errors when users edit images that are already stored in Odoo, such as applying filters or converting formats in the website or HTML editor. The editor now reuses the existing image data when needed, so users can continue editing without unexpected server errors.
Original PR description
Description of the issue/feature this PR addresses: Issue reported[ here ](https://github.com/odoo/odoo/issues/233130) Impacted versions: 19.0 (and likely earlier stable versions: 17.0, 18.0) Steps…
Description of the issue/feature this PR addresses: Issue reported[ here ](https://github.com/odoo/odoo/issues/233130) Impacted versions: 19.0 (and likely earlier stable versions: 17.0, 18.0) Steps to reproduce: Open the Website Editor or HTML Editor (e.g., editing a website page). Insert or select an image that has been saved as an attachment (source is a /web/image/... URL, not a Base64 string). Perform an action that triggers the attachment modification logic (e.g., applying a filter, or a WebP conversion step). **Current behavior before PR:** - The client-side JavaScript correctly omits the data parameter in the RPC request to /html_editor/modify_image/<attachment_id>. - The Python modify_image controller receives data=None, and subsequent image processing fails because it expects the image content, leading to a server-side traceback (e.g., a KeyError or a failure in image manipulation libraries). **Desired behavior after PR is merged:** The modify_image controller should successfully retrieve the existing image content from the database and process the modification without error. - This controller endpoint handles modifications for existing attachments. When the client is modifying a server-stored image (sourced via /web/image/...), the client efficiently omits the image data payload. - The controller should be resilient to this behavior by retrieving the image content directly from the existing attachment record. - The fix introduces a conditional check to load the image's base64 content (attachment.datas) into the data variable if the client does not provide a new payload (data is None). - This is the most robust and performant solution, as it ensures the controller has the necessary image data without forcing the client to re-upload potentially large files --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
French VAT report submission no longer fails when users start the EDI VAT process from the tax report menu. This prevents an error during filing and lets accounting teams submit the VAT return through the expected workflow.
Original PR description
Steps to reproduce: - With a FR Company Setup - Create a bill with tax in past month - Create Tax return for past month, validate - Click "Submit", fill the required vals in wizard and 'Send VAT report' - Everything works as expected - From Accounting / Accounting / Closing / Tax Returns click Cog > EDI VAT - Fill the required vals in wizard and again 'Send VAT report' Issue: Traceback will raise `ValueError: Expected singleton: account.return()` Analysis: When opening the VAT Return wizard from Accounting / Accounting / Closing / Tax Returns the value of return record is not passed on opw-5107549
Point of Sale users can now search for products that use dynamic attributes, even before a specific variant has been created. This prevents missing products during checkout and helps staff find configurable items more reliably.
Original PR description
Before this commit, it was not possible to search a product that had a dynamic attribute configured on its template, since no product variant was created yet. opw-5188725 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233779 Forward-Port-Of: odoo/odoo#232838
This fixes Stripe payments in Point of Sale so tips added after payment are handled correctly. Businesses using POS Restaurant with Stripe can again capture payments properly and support post-payment tipping without failed or uncaptured transactions.
Original PR description
Since [^1], tip after payment has been broken for stripe as `_update_payment_line_for_tip` is no longer called anywhere. This means that all payments were put in as uncaptured and no future tipping would work. This PR fixes it by using the "new" send_payment_adjust method like ayden to guarantee the payments are properly handled. Note that this is solved by wrapping `capturePayment` into a new method `capturePaymentStripe` to keep the stable policy. A followup PR will move the data back to `capturePayment` in master with the new parameters. opw-5121568 [^1]: 9c37f42ef4e23372f5e2bdbb956b625b3a47d8e1 Forward-Port-Of: odoo/odoo#232574
Importing Indian IRN invoice JSON files now works for users who do not have access to certain company settings. This prevents an unnecessary permission error and helps invoice processing continue smoothly without granting extra company-level access.
Original PR description
When importing an IRN JSON as an invoice, users without sufficient access rights to `res.company` fields encountered an access error on `l10n_in_edi_production_env`. This commit uses `sudo()` to safely read the company’s EDI environment configuration without requiring extra permissions. Before this PR: Import failed with error: `You do not have enough rights to access the field 'l10n_in_edi_production_env' on Companies (res.company)` After this PR: Import proceeds successfully for users without `res.company` read rights. Forward-Port-Of: odoo/enterprise#98528
Portal users clicking Browse Articles from a Helpdesk help page are now sent directly to the linked Knowledge article instead of an empty Knowledge home page. This makes self-service support content easier to access and avoids a confusing dead end for customers.
Original PR description
To reproduce: ============= 1. Create a Helpdesk Team linked to a Knowledge Article 2. Access the Help page on website as a portal user 3. Click on "Browse Articles" button -> redirected to empty knowledge home portal view Problem: ======== before this commit, redirection was made through the method `redirect_to_article` which will later call `_redirect_to_portal_view` that doesn't use the `article` parameter anymore as there is a patch on the front side to handle the redirection to the articale through the router, but as the calls are server-side, the patch is not applied and the redirection fails. Solution: ========= instead of calling `redirect_to_article`, directly redirect to the article's `website_url`. opw-5114885 Forward-Port-Of: odoo/enterprise#98363
This fix helps Point of Sale sessions start correctly when extra features, such as restaurant functionality, add new local data storage needs. The system now detects missing local storage tables and updates them automatically, reducing session failures for cashiers and restaurants.
Original PR description
Currently, new IndexedDB object stores are only created during the 'onupgradeneeded' event. This event only fires if the database version is manually incremented in the code. If a new module (e.g.,…
Currently, new IndexedDB object stores are only created during the 'onupgradeneeded' event. This event only fires if the database version is manually incremented in the code. If a new module (e.g., restaurant) adds a new object store to the PoS database schema but the `dbVersion` is not bumped, the store is never created. This causes the PoS session to fail when it tries to access the missing store. This commit modifies the `databaseEventListener` to add a check inside the `onsuccess` handler. After the database opens, it compares the list of required stores (`this.dbStores`) with the list of existing stores (`this.db.objectStoreNames`). If a mismatch is detected: 1. The current database connection is closed. 2. The `dbVersion` is incremented. 3. The database connection process is re-run. This forces the `onupgradeneeded` event to trigger, which then correctly creates the missing object stores, ensuring the database schema is always up-to-date. opw-5166049 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233268