Friday, June 13, 2025
21 changes · 18.0
Enhancements to existing features
The Journal Audit Excel export now includes an extra sheet listing the filters and options used when the report was generated. This makes exported reports easier to review, share, and audit because recipients can see the exact criteria behind the data.
Original PR description
In this commit: --- - Adds a new worksheet to the XLSX export of the Journal Audit report, summarizing all filters and options active at the time of export. - This feature was already available for other accounting reports but was missing in the Journal Audit report. --- task-4859786
Resolved issues and error corrections
Fixes an issue where image transformation controls could stay visible after a user deleted an image in the editor. This prevents confusing leftover controls and keeps the editing experience consistent, including in Chrome.
Original PR description
### Steps to reproduce: - Insert an image into the editor. - Open the Transformation controls for the image. - Press the `Backspace` key to delete the image. - The transformation overlay remains…
### Steps to reproduce: - Insert an image into the editor. - Open the Transformation controls for the image. - Press the `Backspace` key to delete the image. - The transformation overlay remains visible after the image is removed. ### Description of the issue/feature this PR addresses: - In commit [1](https://github.com/odoo/odoo/commit/85698bf4f591fc9280f054b9a255a7d5ff4d1fe2), the `image_transform_button` component unmounted before `selectionchange` event could fire. As a result, event listener was removed, and the transform container was not closed when the image was deleted. Desired behavior after PR is merged: - The `selectionchange` listener is now attached within the `image_transformation` component. - A `keydown` listener is also added to explicitly handle Backspace and Delete keys, addressing the case where Chrome does not trigger `selectionchange` on image deletion. task-4831728 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Miscellaneous changes
Currently, we prevent user to register payment for invoices belonging to different branches. With this commit, when trying to register payments for two invoices belonging to different branches, we register it as parent company. Steps: - Have a main company with 2 branch - Create and confirm one invoice for each branch - Select both branches in company selector - From the invoice list view, select the 2 invoices - Try to register payment -> Error: "You can't create payments for entries belongin
Original PR description
Currently, we prevent user to register payment for invoices belonging to different branches. With this commit, when trying to register payments for two invoices belonging to different branches, we register it as parent company. Steps: - Have a main company with 2 branch - Create and confirm one invoice for each branch - Select both branches in company selector - From the invoice list view, select the 2 invoices - Try to register payment -> Error: "You can't create payments for entries belonging to different branches." opw-4563936 Forward-Port-Of: odoo/odoo#212686
Manufacturing worksheets will no longer allow videos in the description area when those videos cannot be shown in the Shop Floor interface. This prevents users from adding content that would later disappear, keeping shop floor instructions consistent and reliable.
Original PR description
Problem: Videos added in the operation worksheet are not visible on the Shop Floor interface. Cause: `embedded_components`, such as video iframes, are only supported within the HTML editor context and cannot be rendered elsewhere. This results in the video being silently dropped. Solution: Introduce a `disableVideo` flag for the `note` field in worksheet views. This avoids embedding unsupported video content and ensures the interface remains consistent. Steps to reproduce: 1. Go to Manufacturing > Operations > Worksheet. 2. Add a video in the worksheet's description field. 3. Create a Manufacturing Order (MO) for a product using this operation. 4. Confirm the MO and open it in the Shop Floor interface. 5. Open the worksheet tab. → The video is missing (not rendered). opw-4783722 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Studio exports no longer fail when a website uses a theme and the view has not been changed in Studio. This lets users complete exports reliably without needing to make unnecessary edits first.
Original PR description
**Before this commit:** - If the user had a website with a theme, then exporting from `Studio Export` would fail if no changes were made to the view via `web_studio`. **After this commit:** - The export now completes successfully, even when there are no changes made in the view through `web_studio`. task-4815179
This update corrects a test configuration problem in the Swedish point-of-sale localization that was causing automated validation to fail. It helps keep quality checks running reliably without changing business functionality for users.
Original PR description
In this commit: ------------ - We are fixing the unknown key "test" runbot error. runbot error-226611
This fix aligns the Italian point of sale tax calculation logic between the system backend and the browser interface. It helps avoid inconsistent tax rounding behavior during POS transactions, reducing the risk of incorrect totals or reporting differences.
Original PR description
rounding_method is there on the python code but not js-side.
The VIES summary report no longer crashes when integer rounding is enabled. This ensures users can open and review the report with rounded amounts as expected, improving reliability for tax reporting workflows.
Original PR description
When we enable the integer rounding option on this report, a traceback is raised at the report opening. It happens because integer rounding didn't support a groupby when a custom engine is used. opw-4688616
This commit introduces a hook filter method that allows to filter the amls taken into account in _get_invoiced_lot_values (verify the quantity of serial product previously delivered). PR enterprise: odoo/enterprise#81656 Ticket [link](https://www.odoo.com/odoo/project/49/tasks/4644031) opw-4644031 Forward-Port-Of: odoo/odoo#202262
Original PR description
This commit introduces a hook filter method that allows to filter the amls taken into account in _get_invoiced_lot_values (verify the quantity of serial product previously delivered). PR enterprise: odoo/enterprise#81656 Ticket [link](https://www.odoo.com/odoo/project/49/tasks/4644031) opw-4644031 Forward-Port-Of: odoo/odoo#202262
### Description: Adds a new computed `has_worksheet` field to avoid out of memory issues in Shop Floor. ### Reference: opw-4784076 Forward-Port-Of: odoo/odoo#211505
Original PR description
### Description: Adds a new computed `has_worksheet` field to avoid out of memory issues in Shop Floor. ### Reference: opw-4784076 Forward-Port-Of: odoo/odoo#211505
Description of the issue/feature this PR addresses: allowedFns is used to validate functions permitted for use in evaluate. However, it is not currently exported, so other modules cannot create new functions. Current behavior before PR: Other modules can inherit and add new functions. 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#214106
Original PR description
Description of the issue/feature this PR addresses: allowedFns is used to validate functions permitted for use in evaluate. However, it is not currently exported, so other modules cannot create new functions. Current behavior before PR: Other modules can inherit and add new functions. 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#214106
the tour was failing because the phone number was not set in the website configuration, which is required for the add to cart snippet tour to pass because it checks the phone number in the billing address form page which is required to be filled in order to proceed with the tour and confirm order is on the next page which is not reached so the tour was failing due to timeout build_error-160894 Forward-Port-Of: odoo/odoo#213178
Original PR description
the tour was failing because the phone number was not set in the website configuration, which is required for the add to cart snippet tour to pass because it checks the phone number in the billing address form page which is required to be filled in order to proceed with the tour and confirm order is on the next page which is not reached so the tour was failing due to timeout build_error-160894 Forward-Port-Of: odoo/odoo#213178
Setting the opacity to the empty string leads to max opacity but is seen as "/" in the builder because no options corresponds to this value. And the "None" option is not that, which is confusing. Setting a known value for the opacity shows the correct choice for the option Steps to reproduce: - In a database with demo data, go to `/event` - Go to "An unpublished event" - Open editor - Bug: "Filter Intensity" shows "/" Backport of 94cc1cbd2d8ed23fd243515ad215ea91bac46068 task-4367641
Original PR description
Setting the opacity to the empty string leads to max opacity but is seen as "/" in the builder because no options corresponds to this value. And the "None" option is not that, which is confusing. Setting a known value for the opacity shows the correct choice for the option Steps to reproduce: - In a database with demo data, go to `/event` - Go to "An unpublished event" - Open editor - Bug: "Filter Intensity" shows "/" Backport of 94cc1cbd2d8ed23fd243515ad215ea91bac46068 task-4367641 Forward-Port-Of: odoo/odoo#212836 Forward-Port-Of: odoo/odoo#212530
**Steps to reproduce:** - Install the modules `l10n_sg` and `l10n_sg_ubl_pint`. - Create an invoice. - On the form view of the partner you chose. Under the `Accounting` tab, set `eInvoice format` as PINT singapore. - On the invoice, for `currency_id`, use a currency other than SGD. - Download the invoice in the 'PINT Singapore' format. **Issue:** The invoice is not downloaded and it throws a traceback. **Cause:** The method '_get_additional_document_reference_list' returns a list of
Original PR description
**Steps to reproduce:** - Install the modules `l10n_sg` and `l10n_sg_ubl_pint`. - Create an invoice. - On the form view of the partner you chose. Under the `Accounting` tab, set `eInvoice format` as PINT singapore. - On the invoice, for `currency_id`, use a currency other than SGD. - Download the invoice in the 'PINT Singapore' format. **Issue:** The invoice is not downloaded and it throws a traceback. **Cause:** The method '_get_additional_document_reference_list' returns a list of dictionnaries within another list, while the XML is expecting a list of dictionnaries. **Solution:** Remove the append method. opw-4799363 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212754
If a currency not supported by AsiaPay is selected during payment, the system will crash, resulting in a KeyError. In the `const.py` file at [1], we have already defined the `CURRENCY_MAPPING`. Therefore, if a currency is chosen that is not included in the `CURRENCY_MAPPING`, it will cause a crash during the payment process. [1] https://github.com/odoo/odoo/blob/bcaafd941c1b4cae65a71900858894556805762e/addons/payment_asiapay/const.py#L19-L42 **Steps to produce:-** 1. Install `eCommerce`.
Original PR description
If a currency not supported by AsiaPay is selected during payment, the system will crash, resulting in a KeyError. In the `const.py` file at [1], we have already defined the `CURRENCY_MAPPING`.…
If a currency not supported by AsiaPay is selected during payment, the system will crash, resulting in a KeyError. In the `const.py` file at [1], we have already defined the `CURRENCY_MAPPING`. Therefore, if a currency is chosen that is not included in the `CURRENCY_MAPPING`, it will cause a crash during the payment process. [1] https://github.com/odoo/odoo/blob/bcaafd941c1b4cae65a71900858894556805762e/addons/payment_asiapay/const.py#L19-L42 **Steps to produce:-** 1. Install `eCommerce`. 2. Set up the `AsiaPay` payment provider, and in the configuration, set the Currencies as `EGP`. 3. Now, go to `Website > Shop` and add the product to the cart. 4. Try to make the `payment` for the cart using `AsiaPay`. **Error:-** `KeyError: 'EGP'` **Solution:-** - This commit adds a constraint that ensures only currencies defined in `CURRENCY_MAPPING` (from `const.py`) can be selected for the AsiaPay payment provider. If any unsupported currencies are selected, a ValidationError is raised listing the invalid entries. **Sentry - 6665716944** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#213496
When scrapping a tracked product without a lot and without a picking_type_id, `stock.move.line._action_done` raises a UserError requiring a lot/serial number. This happens because the method checks for the absence of both `picking_type_id`, `is_inventory`, and `lot_id`, assuming a lot is always mandatory outside inventory and picking flows. However, scrap operations may occur outside these flows and should not necessarily require a lot, especially when triggered programmatically (e.g. via
Original PR description
When scrapping a tracked product without a lot and without a picking_type_id, `stock.move.line._action_done` raises a UserError requiring a lot/serial number. This happens because the method checks…
When scrapping a tracked product without a lot and without a picking_type_id, `stock.move.line._action_done` raises a UserError requiring a lot/serial number. This happens because the method checks for the absence of both `picking_type_id`, `is_inventory`, and `lot_id`, assuming a lot is always mandatory outside inventory and picking flows. However, scrap operations may occur outside these flows and should not necessarily require a lot, especially when triggered programmatically (e.g. via API or automation), bypassing the form view validation. This commit updates the condition in `_action_done()` to check the context key `is_scrap`, which is already passed in `do_scrap()` via `move.with_context(is_scrap=True)._action_done()`. This allows tracked products to be scrapped without a lot in valid scenarios, without misleadingly assigning a `picking_type_id` to the move. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212404 Forward-Port-Of: odoo/odoo#206900
Global purpose is to make mail/view controller more resilient by improving redirections when not having access to the record. Notably * correctly route internal users to discuss, portal users to /my and unlogged users to login; * keep original mail/view route when performing redirection after login so that we try the routing again; * fix various issues in redirect computation, such as lost access token parameter or partial reconstruction of URLs; Improve test coverage.
Original PR description
Global purpose is to make mail/view controller more resilient by improving redirections when not having access to the record. Notably * correctly route internal users to discuss, portal users to /my and unlogged users to login; * keep original mail/view route when performing redirection after login so that we try the routing again; * fix various issues in redirect computation, such as lost access token parameter or partial reconstruction of URLs; Improve test coverage. Task-4685166 Forward-Port-Of: odoo/odoo#213750 Forward-Port-Of: odoo/odoo#212545
In uruguayan companies, if the field "Lock Posted Entries with Hash" is checked, the user can not validate electronic invoices in DGI. In this PR we are hiding the field in electronic uruguayan journals to prevent the user to check that field accidentally and generate inconsistencies with electronic invoicing. Forward-Port-Of: odoo/enterprise#85392
Original PR description
In uruguayan companies, if the field "Lock Posted Entries with Hash" is checked, the user can not validate electronic invoices in DGI. In this PR we are hiding the field in electronic uruguayan journals to prevent the user to check that field accidentally and generate inconsistencies with electronic invoicing. Forward-Port-Of: odoo/enterprise#85392
### Description: When opening Shop Floor, the frontend will fetch all the worksheets linked to the displayed MOs. This causes the ORM to load all the attachments at the same time, which can create a Memory Error(OOM). ### Fix: The only reason why it is retrieved at the opening of the view is to check if the workorders have a worksheet. If it is, then the worksheet is loaded again when needed (i.e. when button is clicked to display it). This means that we can avoid unnecessarily preloadi
Original PR description
### Description: When opening Shop Floor, the frontend will fetch all the worksheets linked to the displayed MOs. This causes the ORM to load all the attachments at the same time, which can create a Memory Error(OOM). ### Fix: The only reason why it is retrieved at the opening of the view is to check if the workorders have a worksheet. If it is, then the worksheet is loaded again when needed (i.e. when button is clicked to display it). This means that we can avoid unnecessarily preloading all documents by adding a compute that will tell us if the workorders have one or not. ### Benchmark: | N° of worksheet | Before | After | |-----------------|--------|-------| | 29 | 3.36s | 1.2s | | 144 | OOM | 1.2s | ### Reference: opw-4784076 Forward-Port-Of: odoo/enterprise#86318
- Create a product with tracking by serial numbers then set a lot and serial number on the product - Activate the option Display Lots & Serial Numbers on Invoices in the Inventory settings - Create a sale order with the test product and confirm it - Create the invoice and send the cfdi report - Request a cancel and select the reason 01 Document issued with errors (with related document) . On the CFDI PDF report of the new invoice, there are no lines for lots and serial numbers—they are not
Original PR description
- Create a product with tracking by serial numbers then set a lot and serial number on the product - Activate the option Display Lots & Serial Numbers on Invoices in the Inventory settings - Create a…
- Create a product with tracking by serial numbers then set a lot and serial number on the product - Activate the option Display Lots & Serial Numbers on Invoices in the Inventory settings - Create a sale order with the test product and confirm it - Create the invoice and send the cfdi report - Request a cancel and select the reason 01 Document issued with errors (with related document) . On the CFDI PDF report of the new invoice, there are no lines for lots and serial numbers—they are not printed. The report uses the _get_invoiced_lot_values method from sale_stock to retrieve serial numbers. This method is first called when sending the CFDI for the parent invoice. However, when it is called for the child invoice, the method checks the quantity of the serial product, which is now depleted. This commit introduces a hook that allows to filter the amls taken into account in get_invoiced_lot_values. In l10n_mx_edi, we do not take the amls from the parent invoice after a cfdi cancellation. community PR: https://github.com/odoo/odoo/pull/202262 opw-4644031 Forward-Port-Of: odoo/enterprise#81656
**Current behavior:** A user who can otherwise use the entire mps can not add 'rows' to the view (i.e., write on `ResCompany` `mrp_mps` fields). **Expected behavior:** Can add rows to the MPS. **Steps to reproduce:** 1. Install `mrp_mps` with demo data 2. Edit "Demo" user access rights so they only have the mrp manager group 3. Open MPS -> click `Rows` dropdown (under search bar) and add/remove one -> access error **Cause of the issue:** Field is on `ResCompany` and the MPS us
Original PR description
**Current behavior:** A user who can otherwise use the entire mps can not add 'rows' to the view (i.e., write on `ResCompany` `mrp_mps` fields). **Expected behavior:** Can add rows to the MPS. **Steps to reproduce:** 1. Install `mrp_mps` with demo data 2. Edit "Demo" user access rights so they only have the mrp manager group 3. Open MPS -> click `Rows` dropdown (under search bar) and add/remove one -> access error **Cause of the issue:** Field is on `ResCompany` and the MPS user can't write to that model. **Fix:** Permit writes on `ResCompany` `mrp_mps` fields if they are on an mps field and the user has the mrp manager group. opw-4591655 Forward-Port-Of: odoo/enterprise#80881