Daily updates from Odoo
Thursday, June 25, 2026
5 changes · 17.0
Resolved issues and error corrections
This update adjusts how manufacturing work order time is calculated so all time loss types are kept in the total. It helps avoid confusing or incomplete time tracking in cases where delays or interruptions were previously left out.
Original PR description
This commit amend this previous fix 08ef4947fe2e3edb990b544a9b9c67c861d3b01b that make the duration of workorder time respect the overlaps. However we decided to exclude some time loss types in the computation. This will surely broke some cases and can be misunderstood. This will be reworked correctly later. 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
This fix adds validation to the Company SIA Code so it must be exactly 5 characters for Italian Ri.Ba. exports. This prevents batch payment validation from failing with an error when the code is entered with the wrong length.
Original PR description
Currently, the sia_code field on res.company lacks length validation. For Italian Ri.Ba (CBI) exports, this field MUST be exactly 5 characters. If a user enters more (e.g., during initial setup), the Batch Payment validation (specifically the XML file generation) crashes with a traceback. Steps to Reproduce: - Set Company SIA Code to 6+ characters - Create multiple payments with Ri.Ba. method - Create a Ri.Ba Batch Payment - Click 'Validate' Ticket [link](https://www.odoo.com/odoo/project.task/6031062) opw-6031062
This update resolves a technical issue where the Intrastat report generation would fail when a company record lacked a country ID. The fix ensures a safer fallback mechanism in the SQL query, preventing errors and improving report reliability. This ensures accurate reporting for all companies.
Original PR description
When there is no `country_id` on the company we get `False`. The generated query then fail at: ``` ... CASE WHEN (code.country_id IS NULL OR code.country_id = false) THEN code.code ELSE NULL END AS commodity_code, ... ``` with: ``` ERROR: operator does not exist: integer = boolean LINE 12: ... WHEN (code.country_id IS NULL OR code.country_id = false) T... ```
This update fixes an issue where recurring subscription revenue was incorrectly displayed as 'To Invoice' even after invoices were fully processed. The change ensures that invoiced amounts are accurately deducted from revenue calculations, providing a more precise view of subscription income. This improves financial reporting accuracy.
Original PR description
**Steps to reproduce:** - Create a Sale Order for a service product with a recurring plan - Confirm it - Go to the Project Dashboard and observe MRR shown under "To Invoice" - Create an invoice for the subscription and post it - Go back to the dashboard **Issue:** Even after fully invoicing a subscription, its value is still shown under `to_invoice` in the revenues section. **Fix:** The profitability computation was not deducting the already invoiced amount from the total expected revenue. We now subtract the `amount_invoiced` from `amount_to_invoice`, ensuring that fully invoiced subscriptions no longer appear under `to_invoice`. task- 4797525
This update resolves an issue where creating and modifying contact records with blog posts would sometimes cause an error. The fix ensures that website URL calculations are skipped for temporary blog posts, preventing the system from attempting to generate URLs for records that don't yet have a permanent ID. This improves the stability and reliability of the contact form.
Original PR description
Steps to reproduce: 1. Install Blog, Contacts, and Studio 2. Open Contact form page and a new page with many2many field "Blog Post" 3. Save and create a contact record with email and a blog post. 4. Save and try to modify the email. Issue: `ValueError: Cannot slug non-existent record` Cause: - Since[1] Invisible fields also trigger `onchange` and compute methods during view processing. In this flow, `blog.post` records can be handled as transient `NewId` records. `_compute_website_url` was calling `slug(blog_post)` unconditionally, but `slug()` only accepts persisted records with a real id. Thus ValueError Solution: - Skip the website URL computation for non-persisted blog posts. - backport of https://github.com/odoo/odoo/commit/62ced8ac646fc781da24346f12c5dc9b9a0c592d [1] - https://github.com/odoo/odoo/commit/db63cb770365be1f81ba051fe6ca5a246dbc9036 opw-6175092