Tuesday, January 6, 2026
26 changes · 18.0
Enhancements to existing features
This update adjusts the handling of tax exemption reasons in UBL (Universal Business Language) documents. Now, users can omit the specific tax exemption reason code when it's not required by the ubl standard. A default reason is automatically applied for appropriate tax categories, ensuring compliance and simplifying the process.
Original PR description
According to the ubl documentation the tax exemption reason code is not always required on the document. But when no exemption reason code is given, we have a default exemption reason for the appropriate tax categories. task: 5223145 Forward-Port-Of: odoo/odoo#233770
Resolved issues and error corrections
This update corrects a bug where changes made to nested website snippets (accordions and blockquotes) unintentionally affected their parent elements. The fix ensures that edits are applied only to the specific snippet being edited, improving the consistency and reliability of nested snippet configurations. This resolves a usability issue for website content editors.
Original PR description
This commit fixes some issues that occur when editing nested instances of `s_accordion` and `s_blockquote` snippets. In all cases, changes applied to a parent unintentionally propagate to nested…
This commit fixes some issues that occur when editing nested instances of `s_accordion` and `s_blockquote` snippets. In all cases, changes applied to a parent unintentionally propagate to nested snippets. **Accordion issues** How to reproduce: drop two nested `s_accordion` snippets. Then: 1. Change the outer "Style" from "boxed" to "highlight active" -> both accordion change, 2. Change the outer "Round Corner" -> both accordion change, 3. Change the outer "Icon Position" -> both accordion change. **Blockquote issues** How to reproduce: drop two nested `s_blockquote` snippets. Then: 1. Change the outer "Decoration" -> both blockquotes change, 2. Set the inner "Decoration" to "Icon" -> works only if the outer snippet has icon too, 3. Change the outer "Author Alignment" -> only the inner blockquote changes. **Cause** The above issues occur because certain `data-apply-to` and certain CSS selectors match all nested elements rather than restricting the scope only to the snippet being edited. **Fix** The relevant `data-apply-to` and CSS rules now use the child combinator `>` when needed. task-5362171
Features or functions removed from Odoo
This update removes a specific test file related to Excel files that was causing issues with our automated testing process. This test was reliant on a recent update to a supporting software library that wasn't yet available on all of our supported operating systems. Removing this test improves the reliability of our automated builds.
Original PR description
This commit removes the xslx-2025 test case. That file contains a `trash` folder and libmagic only started supporting those files with file/file@3660a2ccb77cdea0ce678d9e71fbb7aceca2adbe, this commit is notably absent from Ubuntu Jammy which is a supported OS in this Odoo version. Keeping the test makes the Runbot Distro-build CI red on Jammy which is worse than making sure we always support those (rare, arguably broken) files. 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 update corrects a visual issue with the carousel's indicator display, specifically when using 'Numbers' as the indicator style. The previous design used incorrect colors, making the numbers unreadable and misaligned. This change ensures indicators are properly sized and colored, and that the 'next' and 'previous' buttons align correctly with the carousel slides.
Original PR description
The css rules for indicators outside the carousel were not adapted for number indicators, and used the button color intended for dots and bar as background of the numbers, making them unreadable and ugly. The height of the indicators when outside influences the margin needed to align the bottom of the prev/next buttons. That caused the bottom of the next/prev buttons to not reach the bottom of the slide with "Numbers" or "Hidden" as indicators. This commit adds the necessary css rules to correctly size and colors the number indicators (and the hidden one) when positioned outside. Steps to reproduce - Add a carousel - Set "Indicators" to "Numbers" - Set "Style" to "Indicators outside" - Bug: The colors are all wrong, we cannot see the numbers - Bug: The bottom of the previous/next buttons do not reach the bottom of the carousel - Set "Indicators" to "Hidden" - Bug: The bottom of the previous/next buttons is even further from the bottom of the carousel task- 5358507
This update fixes a layout issue that occurred when tax group names were too long, preventing the tax totals component from displaying correctly. The change adds text wrapping to the tax group labels, ensuring a clean and readable interface for users.
Original PR description
When tax group names or tax-related content are too long, they break the layout of the tax totals component, causing display issues and making the interface difficult to read. This change adds the…
When tax group names or tax-related content are too long, they break the layout of the tax totals component, causing display issues and making the interface difficult to read. This change adds the Bootstrap `text-wrap` class to the tax group label to enable text wrapping, ensuring that long content is properly contained within the table cell and the layout remains intact. The `text-wrap` utility class applies `word-wrap: break-word` and `word-break: break-word`, which allows long text to wrap to multiple lines instead of overflowing and breaking the table layout. Before: <img width="1920" height="868" alt="image" src="https://github.com/user-attachments/assets/cdf770ca-a586-487e-9283-45463ef4dc0e" /> After <img width="1920" height="793" alt="image" src="https://github.com/user-attachments/assets/24b9781c-d209-4a69-824c-13a59a8c9bc7" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240658
This update fixes an issue where bank accounts created from UBL invoices were incorrectly linked to the wrong business partner. Now, the bank account holder accurately reflects the supplier for supplier invoices and the company for customer invoices, ensuring proper financial processing.
Original PR description
The bank accounts created when importing peppol invoices are linked to the wrong partner. `_import_partner_bank` is called for the UBL `PayeeFinancialAccount`, so the bank account holder must be the supplier (invoice partner) for supplier invoices (inbound) and the company for customer invoice (outbound). Before this commit the logic was reversed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a problem where the KPD category list wasn't loading correctly in the HR module. The fix aligns the module's data with the latest version used in Odoo 19, ensuring accurate reporting and data processing related to KPD categories.
Original PR description
Fixing the loading error for KPD category list, consistent with 19.0 version of the module. runbot-237639 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where Odoo incorrectly processed partner names with only one word. Previously, a single-word name would result in an empty first name field. Now, single-word names are correctly assigned to the first name, ensuring accurate partner data is displayed and used in payment processing.
Original PR description
Description of the issue/feature this PR addresses: The name splitting logic fails when the partner name contains only one word, resulting in an empty first name. Current behavior before PR: Splitting a single-word name returns an empty first name and assigns the word to the last name. Desired behavior after PR is merged: A single-word name is correctly assigned to the first name field, leaving the last name empty. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241926
This update ensures that the Belgian payroll system (l10n_be_hr_payroll) accurately reflects the latest withholding tax regulations up to 2026. The change corrects calculations related to child allowances, ensuring compliance and accurate tax deductions for employees in Belgium.
Original PR description
TaskID: 5403525 Forward-Port-Of: odoo/enterprise#103215
This update resolves an issue where 100% order discounts were not calculating to zero due to rounding discrepancies. The fix ensures that tax calculations are handled precisely for reward lines, guaranteeing accurate order totals. This improves the reliability of discount applications.
Original PR description
**Steps To Reproduce** *Ensure the currency rounding is set on 2 decimals* *Ensure the company tax is round per line and Promotions, Loyalty & Gift Card option is activated in the Settings app* - Go…
**Steps To Reproduce**
*Ensure the currency rounding is set on 2 decimals*
*Ensure the company tax is round per line and Promotions, Loyalty & Gift Card option is activated in the Settings app*
- Go to Discount & Loyalty:
- Create a new "Promotions" program with no conditional rules and a 100% discount on order reward.
- Go to Sales app:
- Create a SO for any customer;
- Add a product to create and edit on the fly:
- Change the Sales Price for $9.99;
- Change the Sales Taxes for a 19.99% one (created on the fly if required).
- Add the same product on a second order line;
- Click the "Reward" button and select the 100% discount promotion;
- See the total amount of the order at 1ct.
**Issue**
Order total is `0.001` instead of `0.00`.
**Cause**
Odoo prematurely rounds tax values when company setting is "Round per Line".
This causes `sale_loyalty` to calculate discounts using rounded inputs (e.g., `224.114` vs `224.1135`), creating a precision mismatch with the final Reward Line (calculated globally).
**Solution**
For 100% order discounts, create per-line discount entries that exactly match each
original order line. This ensures exact cancellation: Untaxed=0, Tax=0, Total=0.
opw-5097907This update fixes a visual issue where a duplicate dropdown menu appeared in social stream post management. The change ensures the existing 'social_crm' dropdown correctly integrates with the new 'social' dropdown, maintaining a consistent user experience. Additionally, the 'is_author' field was re-introduced to correctly manage button visibility for post editing and deletion.
Original PR description
Following https://github.com/odoo/enterprise/commit/c9ddf1c a new dropdown has been added to "social" to allow the edition and deletion of a social stream post. This new dropdown didn't take into account the one already existing in "social_crm" resulting in a duplicated dropdown menu. Fixing the issue by making sure the dropdown from "social_crm" is correctly extending the one from "social". As the "Create Lead" action is set above the "Edit" and "Delete" ones, making sure it's also the case for the stream post comments dropdown menu for consistency. Re-inserting the "is_author" field (removed here https://github.com/odoo/enterprise/pull/69650) in the kanban view to make sure the "Edit", "Delete" and "Create Lead" buttons visibility are correctly managed for your own posts. Task-5270180
This update resolves an issue where deleting 'Booking Fees' products in Odoo Enterprise would trigger an access error. The fix uses `sudo()` to ensure the system can always access the product template, regardless of the currently active company, preventing the error.
Original PR description
**Steps to produce:** - Install `appointment_account_payment` and `l10n_be` with demo data. - Go to product `Booking Fees` and assign company `YourCompany`. - Switch the current company to `Belgium Company`. - Try to delete any product. **Issue:** - An access error is raised when deleting a product. **Root cause:** - During product deletion, method `_unlink_except_booking_fee_product_template` is executed [1]. - If the 'Booking Fees' product is assigned to another company, the current company cannot access its record, which triggers an access error. **Solution:** - Use `sudo()` when fetching the "Booking Fees" product template so that the record can be accessed regardless of the current company. [1]: https://github.com/odoo/enterprise/blob/0ba44def7fd961e1c17aa218e1a86a48f0918371/appointment_account_payment/models/product_template.py#L9-L15 opw-5255991 ---
This update resolves an issue with the way xRechnung invoices are generated, specifically related to the 'leitweg-id' field. The fix ensures the correct identification of invoices for regulatory compliance. The change was initially missed by existing tests and has now been addressed with a new helper function and updated testing.
Original PR description
Correction of the forward port for the leitweg-id in the 'cbc:BuyerReference' field for the xRechnung invoice. The 'export_invoice_vals' function is an old helper that is not used by default anymore (but used by the tests, that is why the tests did not catch the error). I added the if statement in the corresponding new helper: '_add_invoice_header_nodes' and changed the test for it to catch the error. Related: #236333 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a validation error that prevented users from creating new leave requests due to a missing default reference leave type setting. The fix ensures the 'l10n_fr_reference_leave_type' field is correctly populated in the system's demo data, allowing for proper leave configuration. This improves the user experience and prevents errors during leave creation.
Original PR description
**Steps to reproduce:** - Install l10n_fr_hr_holidays module. - Go to Time Off > Configuration > Settings. - Company Paid Time Off field should blank. - Employee `resource_calendar_id` is not same as company's. - Create new leave > a validation error will occur. **Cause:** - The demo data for 'res.company' did not correctly set the `l10n_fr_reference_leave_type` field. - 'l10n_fr_reference_leave_type' field should be required. **Fix:** - Updated demo record to correctly assign `l10n_fr_reference_leave_type` field. - Set the `l10n_fr_reference_leave_type` field as required. Task - 5139488
This update corrects a visual inconsistency in Odoo's chatter messaging. Previously, paragraphs added in the composer didn't maintain their bottom margin when posted to the chatter, leading to mismatched spacing. This change ensures that messages displayed in the chatter match the formatting in the composer and email, improving the overall user experience.
Original PR description
Problem: When adding a paragraph in the composer and sending the message, the paragraph posted in the chatter has a `margin-bottom` of 0. Cause: Paragraphs in the chatter rendering override the default bottom margin, resulting in inconsistent spacing compared to the composer and the sent email. Solution: Update selector to only target the last `p`. Steps to reproduce: - Open the chatter composer. - Add a paragraph using "/Paragraph". - Add some text. - Send the message. - Observe that the message posted in the chatter has no bottom margin, unlike in the composer. opw-5378129 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where exporting pivot data resulted in an error when no data was provided. The system now correctly handles empty data requests by returning a standard error response, ensuring a smoother user experience. This prevents unexpected application crashes and improves data export reliability.
Original PR description
Currently an exception is generated when controlled `/web/pivot/export_xlsx' tries to export xlsx with empty data. `KeyError: 'title'` This PR resolves the issue by raising an `UnprocessableEntity` exception when empty data is provided. The resulting 422 response indicates that the server understood the request and its syntax, but cannot process it because the data is invalid. sentry-6321555617
A validation error prevented users from creating new spreadsheet templates within the Quality Control app. This change adds a default name to the template, resolving the validation issue and allowing users to successfully create and utilize these templates. This ensures consistent and reliable spreadsheet creation for quality control processes.
Original PR description
**Issue** A validation error is raised when creating a new spreadsheet template from a Quality Control Point. **Steps to reproduce** 1. Open the Quality app. 2. Go to Quality Control > Control…
**Issue** A validation error is raised when creating a new spreadsheet template from a Quality Control Point. **Steps to reproduce** 1. Open the Quality app. 2. Go to Quality Control > Control Points. 3. Click "New". 4. Set the type to "Spreadsheet". 5. Click on Spreadsheet Template > Search More. 6. Click "New". -> A validation error is raised. **Cause** In `quality_view`: https://github.com/odoo/enterprise/blob/f54585f84b0fa7a73efb3f0e14266972d510f0a6/quality_control/views/quality_views.xml#L840C17-L845C19 the `many2one_spreadsheet` widget (see [`many2one_spreadsheet_field.js`](https://github.com/odoo/enterprise/blob/f54585f84b0fa7a73efb3f0e14266972d510f0a6/spreadsheet_edition/static/src/assets/components/many2one_spreadsheet_field.js#L36)) overrides "Create and Edit" to create a new spreadsheet through `Many2XSpreadsheetAutocomplete`: https://github.com/odoo/enterprise/blob/f54585f84b0fa7a73efb3f0e14266972d510f0a6/spreadsheet_edition/static/src/assets/components/many2one_spreadsheet_field.js#L11C9-L14C51 This flow does not set a default value for the required `name` field, nor does `action_open_new_spreadsheet`:https://github.com/odoo/enterprise/blob/8365feab396679f0323e89c2f4e0c825a0b2ee7e/spreadsheet_edition/models/spreadsheet_mixin.py#L348 Since `name` is required: https://github.com/odoo/enterprise/blob/8365feab396679f0323e89c2f4e0c825a0b2ee7e/quality_control/models/quality_spreadsheet_template.py#L12 validation fails. **Solution** Provide a default value for the `name` field, using the same default as in `documents_document.py`: https://github.com/odoo/enterprise/blob/8365feab396679f0323e89c2f4e0c825a0b2ee7e/documents_spreadsheet/models/documents_document.py#L321 opw-5340710
This update prevents the accounting application from automatically contacting an external Odoo Fin server when opened. Previously, this call was made to display favorite institutions, but this fix ensures the application only accesses local data, improving performance and reducing potential external dependencies. This change is a technical fix for a minor efficiency issue.
Original PR description
The aim of this commit is making sure that the click all won't try to contact our external server odoo fin when the accounting application is opened. Indeed, the accounting application is displaying the favorite institutions for a particular country in the accounting dashboard which is doing a call to production.odoofin.com. This commit adds a mock using _request_handler to patch the call to odoo fin. runbot-error-231151 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a problem where invoice XML files generated for the Nemhandel (Denmark) localization were failing validation due to an incorrect handling of the 'PrepaidAmount' field. The fix ensures the field is only removed when its value is actually zero, resolving the validation issue and allowing invoices to be correctly processed.
Original PR description
To reproduce: create an invoice that is reconciled (typically a credit note) before Send&Print. Check the validity of the xml with a schematron => it fails due to the value of the PrepaidAmount The node PrepaidAmount gets removed because it was wrongly thought to be always empty. We now only remove it if the value is at 0. 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 update resolves an issue where the analytic distribution field in Odoo contained unexpected data types, specifically the '__update__' string, which caused errors during account ID retrieval. The fix now safely processes only strings that can be interpreted as numbers, providing a more robust and reliable analytic distribution process.
Original PR description
Issue: Before this commit, the analytic distribution field contained a mix of integers (account IDs) and strings (such as '__update__'). When attempting to retrieve the account ID, converting the '__update__' string to an integer caused an error. Fix: As a generic solution, instead of skipping only the '__update__' key—which may not be the only non-numeric string in the future—we now process only the strings that can be safely interpreted as numbers. opw-5450293
This update corrects a visual issue where the OCR label for expense documents was incorrectly displayed, causing a misalignment in the expense report grid. The fix ensures that all labels are correctly positioned, improving the user experience when using OCR functionality. This was triggered by a change in how OCR data is handled.
Original PR description
Prerequisites ------------- To test this scenario you need either OCR credits, a free trial or to use the IAP account we have in the spreadsheet. Steps To Reproduce ------------------ 1- Go to Expenses > My Expenses. 2- Upload a receipt to trigger OCR. 3- Open the expense in Normal Mode (It works fine in Debug Mode). Issue ----- "Payment Method" field is misaligned - label appears in the value column and field appears in the label column. Cause ----- The label for "ID of the request to IAP-OCR" (`extract_document_uuid`) is visible when OCR data exists, but its field is only visible in Debug Mode. This orphan label breaks the grid layout. opw-5369619
This update prevents Odoo from creating duplicate bank accounts during the bank reconciliation process. It specifically addresses the issue of duplicate account numbers on existing partners, reducing confusion and improving data accuracy. This change only impacts the reconciliation workflow and does not affect other bank account creation processes.
Original PR description
When using the bank reconciliation widget, avoid creating a new bank account on the selected partner if the same account number already exists on another active partner. This change is intentionally limited to the reconciliation flow only, to reduce noise caused by duplicate bank accounts, and does not affect other partner or bank account creation use cases. task- 5236503
This update corrects a display issue where archived recurring subscription plans were still showing up on the website product pages. The fix ensures that only active plans are considered when displaying pricing, improving the user experience and preventing outdated information from being shown to customers. This improves the accuracy of product offerings.
Original PR description
**Steps to produce:** - Install `sale_subscription,website_sale` module. - `Subscription > Configuration > Recurring Plans`. - `Archive` the `Monthly` plan. - Go to website > Shop > Open product `Car…
**Steps to produce:** - Install `sale_subscription,website_sale` module. - `Subscription > Configuration > Recurring Plans`. - `Archive` the `Monthly` plan. - Go to website > Shop > Open product `Car Leasing (SUB)`. **Issue:** - Even after archiving the Monthly recurring plan, its pricing still appears on the website product page. **Root cause:** - At [1], when searching for a suitable recurring price, the system does not filter out pricing records belonging to archived recurring plans. - As a result, inactive plans are still considered during pricing selection. **Solution:** - In this fix, we ensure that recurring plan pricing is included only if the related plan is active. - Archived plans are now ignored, preventing them from appearing on the website. [1]: https://github.com/odoo-dev/enterprise/blob/d5f1fdd6900b4794d202e6d0cd016a5c4326efd1/website_sale_subscription/models/product_template.py#L26-L37 before <img width="340" height="184" alt="recurring_plan_before" src="https://github.com/user-attachments/assets/abac39fb-5765-4bc4-aec3-87eef7135a18" /> after <img width="337" height="168" alt="recurring_plan_after" src="https://github.com/user-attachments/assets/35ee92e8-e66b-4612-add3-58b277560ea5" /> **opw-5266333** Forward-Port-Of: odoo/enterprise#100587
This update adjusts the timing for maintaining video call connections, preventing disruptions when the Odoo server experiences temporary slowdowns. By extending the ping interval, the system can now handle brief connection hiccups without dropping calls, leading to a smoother user experience. This enhancement focuses on reliability for video conferencing within Odoo.
Original PR description
Before this commit, the ping to keep rtc sessions alive was done every 30 seconds and had a 1 minute timeframe to successfully ping, which meant that missing a single ping would drop the rtc session. This commit increases the timeframe to 1 minutes and 15 seconds so that one ping can be missed. This can help preventing disconnections when the Odoo server is slow, as calls can work fine without a stable connection to the odoo server (since P2P and SFU connections are independent from Odoo once the connections are initialized). task-5177246 Forward-Port-Of: odoo/odoo#234553
This update corrects a minor issue where Odoo prioritized the contact name over the legal entity name when importing account data from XML files. Following discussions with CHKL, this change now prioritizes the legal entity name, ensuring more accurate partner identification and data processing. This improves the reliability of account creation from external invoices.
Original PR description
When we create an account.move from an XML file, Odoo first searches for an existing partner via some values fetched with `_import_retrieve_partner_vals()`. Amongst those vals, the name can be fetched from either the `Contact:Name` or the `PartyLegalEntity:RegistrationName`. Currently, the contact name is prioritized over the legal entity name. After discussion with CHKL, this should be the opposite. Discord link: https://discord.com/channels/678381219515465750/694447009679147068/1457691361959608413 Related ticket: opw-5269360 Forward-Port-Of: odoo/odoo#242037
This update removes an unnecessary step from the website tour process. Previously, a step was present that didn't perform any action, now that the core functionality has been adjusted. This change improves the clarity and efficiency of the tour.
Original PR description
Following PR [^1], the step about copying the tracker link doesn't do anything as the only actual "action" made in the custom "run()" function has been removed (sic), leaving only the mocking of the Clipboard API (which isn't called anymore, anyway). This commit removes this unused step to avoid confusion. [^1]: https://github.com/odoo/odoo/pull/170548