Daily updates from Odoo
Wednesday, April 22, 2026
14 changes · 18.0
Resolved issues and error corrections
The currency rate update for mindicador.cl now uses a configurable timeout instead of a fixed 30-second limit. This helps avoid missed daily rate updates when the external service is slow, reducing gaps in currency rate records.
Original PR description
The mindicador.cl provider had a hardcoded 30s timeout on its HTTP requests. The mindicador.cl service is sometimes slow around rate publication time, causing read timeouts that make the cron silently skip currency rate creation for the day due to HTTP Timeouts, leaving permanent gaps in res.currency.rate. Make the timeout configurable through the `mindicador_api_timeout` system parameter (defaults to the previous 30s). opw-6126027 Forward-Port-Of: odoo/enterprise#114153
When converting a lead into a new contact, CRM was incorrectly copying the contact’s email, phone, and mobile number to the parent company as well. This fix keeps the company record separate, so customer details stay accurate and do not overwrite each other.
Original PR description
Steps to reproduce: 1. Install `CRM` 2. Activate leads from the settings 3. Create a lead with `Contact Name`, `Company Name` and `Email` 4. Convert this lead to an opportunity with `action` and customer set to `convert to opportunity` and `Create a new contact` 5. Now look into contact and contacts's parent company Issue: - Both created contact partner and company partner have the same email Solution: - Remove `email` from the data based on `company name` availability while creating a customer opw-5421940
This change fixes an issue where invoicing timesheet-based work could show the wrong quantity when timesheets were entered using days instead of hours. It ensures the system uses the correct base unit for conversion, so invoices reflect the actual work logged.
Original PR description
**Steps to reproduce:** 1. Install sale_timesheet. 2. Set timesheet encoding UoM to "Days". 3. Create a quotation with a timesheet-based product: - Set quantity = 1 - Set UoM to "Days" (ensure both…
**Steps to reproduce:** 1. Install sale_timesheet. 2. Set timesheet encoding UoM to "Days". 3. Create a quotation with a timesheet-based product: - Set quantity = 1 - Set UoM to "Days" (ensure both SOL and timesheet UoM are in the same category) 4. Confirm the quotation and open the "Recorded" smart button. 5. Log 1 day of timesheet. 6. Create an invoice using a timesheet period (starting from SO date). 7. Check the invoice quantity. **Issue:** The invoice quantity is incorrectly set to 8 days instead of 1. **Cause:** https://github.com/odoo/odoo/blob/426dc7d7164a95020c1435625801e291990c865c/addons/sale_timesheet/models/sale_order_line.py#L182 Since commit a1517de, the logic utilizes the **timesheet encoding UoM** as the reference unit for conversions. When the Sales Order Line (SOL) UoM and the timesheet UoM share the same category, the system calls `_compute_quantity` under the assumption that `unit_amount` is expressed in the timesheet UoM. However, `unit_amount` actually stored time in hours regardless of the encoding UoM. When the timesheet UoM is set to "Days," the system treats the raw hour value (e.g., 8.0) as if it were already in days during the conversion process, bypassing the necessary hour-to-day conversion and resulting in inflated invoice quantities. https://github.com/odoo/odoo/blob/426dc7d7164a95020c1435625801e291990c865c/addons/uom/models/uom_uom.py#L231-L232 **Solution:** Use hours as the reference unit instead of the timesheet UoM when calling `_compute_quantity`, ensuring the source unit matches the actual unit of `unit_amount`. opw-6077311 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Bills imported from Poland’s KSeF service now correctly handle both net and gross unit prices. This prevents imported vendor bills from being created with zero prices and ensures the invoice matches what the supplier reported.
Original PR description
**PROBLEM** When receiving bills from KSeF, we don't handle gross unit price and default to a price_unit of 0.0. Leading to an incorrect invoice. When generating the bill, the vendor can choose to report the net unit price (P_9A) or gross unit price (P_9B). We need to handle both cases. opw-6066027
Website menus with URLs that include spaces now correctly point to newly created pages instead of staying on a 404 page. The menu editor also warns users when a URL contains spaces, helping prevent confusion while still allowing the entry.
Original PR description
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a…
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a 404. **Steps to reproduce**: 1. Create a menu item with a URL containing spaces and no leading slash (e.g., "some url"). 2. Click the menu item -> a 404 page is displayed (expected). 3. Click "Create Page" -> the page is created and saved. 4. Click the menu item again -> it still returns a 404 (unexpected). **Issue**: During page creation, the path is slugified (e.g., "some url" -> "/some-url"). The controller then tries to link the menu to the new page by setting `page_id`. However, `pagenew()` only searches for menu URLs with a leading slash, so a menu saved as "some url" is not found when searching for "/some url". As a result, `page_id` is never set, and `_clean_url()` keeps resolving the menu to "/some url" instead of the page's actual URL "/some-url". Menus without spaces (e.g., "mypage") have the same issue where `page_id` is not set, but since `_clean_url()` prepends "/" and renders "/mypage", which matches the new page URL, the menu still resolves correctly. **Fix**: Match both URL formats (with and without leading slash) when linking a menu to a newly created page. Additionally, a warning is now shown in the menu editor when a URL contains spaces, since spaces are slugified during page creation, which could cause confusion. (Note: this is only a warning - URLs with spaces are still allowed.) task-[5095646](https://www.odoo.com/odoo/project/974/tasks/5095646) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248967
This fix prevents timesheet errors when a public holiday or time off is updated after an employee has been archived. Archived employees’ leave records are now ignored during timesheet recalculation, so holiday deletions can complete normally without affecting current operations.
Original PR description
[FIX] project_timesheet_holidays: Exclude archived employees from time-off # Description of the issue/feature this PR addresses: ## Steps to Reproduce: 1. Create a time off for Employee A (it should…
[FIX] project_timesheet_holidays: Exclude archived employees from time-off # Description of the issue/feature this PR addresses: ## Steps to Reproduce: 1. Create a time off for Employee A (it should affect the timesheets). 2. Create a new public holiday (global time off) that overlaps with Employee A’s time off. 3. Archive Employee A. 4. Delete the public holiday created in step 2. 5. An error related to timesheet generation appears. ## Expected Behavior: - The public holiday / global time off should be deleted without any error. # Desired behavior after PR is merged: ## Fix (Implemented): When regenerating timesheets due to changes in holidays or time off, leaves related to archived employees should not be taken into account. A check was added inside the `_generate_timesheets` function in `project_timesheet_holidays/models/hr_holidays.py` to exclude leaves belonging to archived employees. ## Alternative Fix (Not Implemented): Instead of filtering out leaves linked to archived employees, we could delete those leaves when an employee is archived. However, this approach is not ideal, as archived employees may be reactivated later and would still need their previously requested time off to be preserved. ## Version: This bug appears in both version 17.0 and 19.0. I assumed that it also appears in 18.0 but didn't directly test ## Task: [5474038](https://www.odoo.com/odoo/project/4105/tasks/5474038) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244203
This change adds Odoo’s partner identification to requests sent to Sendcloud. It helps Sendcloud recognize Odoo customers and keeps shipping integrations working smoothly while their older API remains in transition.
Original PR description
Sendcloud pass their api v2 to maintenance and only provide new api V3 key to the new customers. In order to make a smooth transition for the user we add the partner key, so they know that the customer are coming from odoo and they use the v2 api. Future work will be done to upgrade our module and support the v3. API key. Forward-Port-Of: odoo/enterprise#114441
This fix prevents a manufacturing order from being updated with a Bill of Materials that no longer matches the selected product. It removes a path that could lead to an error when users try to unbuild the finished product, improving reliability in manufacturing workflows.
Original PR description
Currently, an error occurs if a user changes the product in a BoM, updates the manufacturing order (MO) based on that BoM, and then attempts to unbuild the order. ## Steps to replicate: - Install…
Currently, an error occurs if a user changes the product in a BoM, updates the manufacturing order (MO) based on that BoM, and then attempts to unbuild the order.
## Steps to replicate:
- Install Manufacturing without demo data
- Settings > Enable Variants
- Create the following products:
- Car with (Red and Blue Color attributes)
- Red Paint
- Create a BoM for Car and product variant set to Red Car and have Red paint as the component.
- Create and Confirm manufacturing order for Red Car
- Click on Bill of Material > Set Paint required to 2 > Save
- Set product variant in BoM to Blue and save again.
- Go back to MO > Update BoM > Produce All
- Unbuild qty 1 > Confirm
## Observed Behavior:
ZeroDivisionError: float division by zero
## Root cause:
This issue occurs because the Update BoM button remains visible on the Manufacturing Order (MO) even after the product has been changed.
The problem starts when a user initially updates the required paint quantity from 1 to 2. At that point, the function [1] marks the BoM as outdated for all linked MOs, which makes the Update BoM button appear. However, if the user later changes the product template or variant, the BoM is still considered outdated. This incorrectly allows the user to update the MO using a BoM that no longer matches the selected product.
**Why this causes a traceback when unbuilding?**
When the user clicks Update BoM, it triggers the `action_update_bom function` [2], which calls `_link_bom`. This process recomputes several fields to align the MO with the updated BoM. One of the methods triggered during this recomputation is `_compute_move_finished_ids` [3]. Since the production is already confirmed, the logic skips adding the production to `production_with_move_finished_ids_to_unlink_ids`, meaning no new finished moves are created for that updated product.
As a result, although the MO is updated, its finished product (`move_finished_ids.product_id`) still refers to the original product (for example, Red Car), instead of the newly selected one.
Later, when the user attempts to unbuild the product, the `action_unbuild` function [4] is executed, which calls `_generate_consume_moves` [5] During this step, the system tries to compute a factor that depends on `unbuild.mo_id.quantity_produced`.
However, because the finished moves still reference the old product and do not match the MO’s current product, the computed total becomes zero at [6] This leads to a division by zero error at [5], which ultimately causes the traceback.
[1]:
https://github.com/odoo/odoo/blob/444de5354dcd70e9160a985486317a8912d53a84/addons/mrp/models/mrp_bom.py#L432-L447 [2]:
https://github.com/odoo/odoo/blob/444de5354dcd70e9160a985486317a8912d53a84/addons/mrp/models/mrp_production.py#L1044-L1048 [3]:
https://github.com/odoo/odoo/blob/444de5354dcd70e9160a985486317a8912d53a84/addons/mrp/models/mrp_production.py#L771-L800
[4]:
https://github.com/odoo/odoo/blob/97b60952d59a57aba12b048cb4da4f41d85d2ea2/addons/mrp/models/mrp_unbuild.py#L153-L164
[5]:
https://github.com/odoo/odoo/blob/444de5354dcd70e9160a985486317a8912d53a84/addons/mrp/models/mrp_unbuild.py#L225-L232 [6]:
https://github.com/odoo/odoo/blob/444de5354dcd70e9160a985486317a8912d53a84/addons/mrp/models/mrp_production.py#L641-L647
## Solution:
This change prevents users from updating a Bill of Materials (BoM) after the main product or its template has been modified, by ensuring the BoM is not marked as outdated.
This approach make sense because, once a manufacturing order (MO) is confirmed, all raw materials are physically reserved before production begins. While it makes sense to update BoM components in response to an Engineering Change Order (ECO) or last-minute specification changes, it does not make sense to allow changes to the final product itself on existing confirmed MOs. Doing so could lead to operational errors, since materials have already been procured and reserved for a specific product.
This fix ensures that if the product variant or product template is updated in the BoM, users cannot update the MO based on that BoM. This also prevents potential divide-by-zero errors when attempting to unbuild the product in the MO.
Reference commit which also suggests this behavior for the `Update BoM` button: [commit](https://github.com/odoo/odoo/commit/d7392829c769ef50456a7bc93d4482072b329463#:~:text=An%20exception%20however%3A%20if%20the%20MO%20is%20confirmed%20and%20the%20BoM%27s%20product%20was%0Achanged%2C%20the%20MO%20shouldn%27t%20have%20the%20%22Update%20BoM%22%20button%20displayed.%0AOtherwise%2C%20it%20would%20change%20the%20finished%20product%20of%20a%20confirmed%20MO.)
opw-6044754
Forward-Port-Of: odoo/odoo#255981This change prevents invoice taxes from being recalculated unnecessarily when the analytic distribution is edited on imported invoices. It helps avoid small rounding differences, keeping tax amounts consistent and more reliable for accounting users.
Original PR description
When modifying the analytic distribution on an imported invoice line, the tax synchronization mechanism recalculate taxes from scratch, causing rounding discrepancies Task id - [6030615](https://www.odoo.com/odoo/project/967/tasks/6030615) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change fixes an issue where checking available stock could fail for some users, especially when Manufacturing is installed. It keeps the original access rights intact during the calculation, avoiding permission errors in flows like online payment processing or POS operations.
Original PR description
Computing qty_available with sudo(False) drops superuser privileges, causing an AccessError on mrp.bom when the mrp module is installed. This happens because _compute_quantities_dict calls _bom_find, which performs an access check on mrp.bom that the current user (e.g. a POS session during online payment processing) may not pass. Removing sudo(False) preserves the calling environment's access rights, which is sufficient and avoids the permission error. opw-5975248 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update changes how signed PDFs are created so the original document is duplicated first, then signature overlays are added on top. This helps preserve the full PDF structure and settings, reducing the risk of losing bookmarks, metadata, or other document details during signing.
Original PR description
Instead of rebuilding the PDF by copying content, metadata, and bookmarks, we now duplicate the original document first and then apply the signature overlays. This ensures the full structure and settings are preserved without loss. task-6083291
The text editor now follows the cursor correctly when users press Enter repeatedly and move beyond the visible area. This restores the expected scrolling behavior, making long text editing smoother and preventing the cursor from seeming to disappear off screen.
Original PR description
Before this commit: we have a scrollToSelection in selection_plugin to make sure the editable scrolls when pressing "Enter" many times and out of view. After the commit: the cause of not automatically scrolling is that we prevent the default behavior of insert a line break or a paragraph. To trigger the scrolling behavior, we call scrollIntoView on the new selection's anchor node's element now. We pass the parameter "nearest" like the scrollToSelection intend to. It reverts the commits below: - https://github.com/odoo/odoo/commit/0655190e4b826e03c7def39f992ff0878eaa1334 - https://github.com/odoo/odoo/commit/def59b082071bc21b548855297691fa60c7bbe9b - https://github.com/odoo/odoo/pull/204506/changes/a6b1ff47f94b7f3f75184ebbda8d7818ede71cf8 - https://github.com/odoo/odoo/commit/21cba77761fe1561f44f365949ebc6af4d4b0a48 task-6026990 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures grouped vendor payments only include the next due installment for bills that are paid over multiple installments, instead of incorrectly taking the full remaining amount. As a result, batch payments match the expected due amounts and avoid overpaying vendors.
Original PR description
Steps to reproduce: 1- Install Accounting and make sure "Batch Payments" is enabled in settings 2- Go to [Accounting -> Vendors -> Bills] 3- Create two bills for the same vendor, ensuring one of them has multiple installments (i.e payment term with 3 installments) 4- Confirm the bills 5- In list view, select both bills and another bill from a different vendor and click on Pay 6- Select "Group Payments" and confirm the payment Description of issue: The batch payment of the first vendor has the full amount for both bills Expected behavior: The payment should consider the full amount of the first bill and the first installment only of the second bill opw-5969972
Invoices created in branch companies now recalculate product prices correctly when a fiscal position changes the tax setup. This ensures prices no longer stay inflated with tax included, which helps keep branch billing accurate and consistent.
Original PR description
When operating in a multi-company branch environment, the unit price of a product with price-included taxes is not correctly recalculated when applying a fiscal position. Steps to reproduce: - Create a tax that is included in the price (e.g., 10% incl). - Assign this tax to a product (e.g., Product A). - Create a fiscal position that maps this 10% tax to a different tax. - Create a branch (child company) of your main company. - Create an invoice in the new branch using the fiscal position and add an invoice line for Product A. Issue: The unit price of the product on the invoice line remains the full tax-included amount rather than being reduced to exclude the original 10% tax. opw-5931302 Forward-Port-Of: odoo/odoo#256897