Thursday, November 27, 2025
19 changes · saas-18.2
New functionality added to Odoo
This update adds new automated tests for the 'get_contacts' function within the VoIP module. These tests ensure the function consistently and accurately retrieves contact information, improving the reliability of VoIP interactions. This enhancement contributes to a more stable and dependable Odoo Enterprise experience.
Original PR description
Task-4646694 Forward-Port-Of: odoo/enterprise#100622 Forward-Port-Of: odoo/enterprise#99884
Enhancements to existing features
The wording for the Prices setting tooltip in Accounting configuration has been updated to more accurately explain when the setting becomes locked. This helps users understand that the restriction starts after a journal entry is created, not only after an invoice.
Original PR description
This commit improves the tooltip of the Prices setting in configuration. The old tooltip "This setting cannot be changed after an invoice is created." is changed to "This setting locks once a journal entry is created." task-5354382 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237093
Resolved issues and error corrections
Hungarian electronic invoices will no longer include the optional region field in address details. This avoids sending an incorrect county name where the tax authority expects a specific province code, reducing the risk of invoice validation issues.
Original PR description
Purpose: According to documentation, in region tag in address details, we need to send that county's province code as per the ISO 3166-2 alpha 2 standard. E.g. 'HU-BU'. But we were sending state's name E.g. 'Budapest'. But since region tag is not mandatory for edi, we choose not to send that. Before this commit: In region tag, state's name was sent. After this commit: We stopped sending region tag. EDI Documentation(page-87): https://onlineszamla.nav.gov.hu/files/container/download/2025.10.09.%20EN_Online%20Invoice%20System%203.0%20Interface%20Specification%20.pdf task-5270199 Forward-Port-Of: odoo/odoo#236218
Accounting test infrastructure now includes shared helpers to compare, update, and organize XML test files more reliably. This reduces duplicated developer work and helps keep accounting XML validations consistent across future updates.
Original PR description
> This is a backport of the merged https://github.com/odoo/odoo/pull/235565 - with a couple of improvements & adaptations to the test files. This commit adds helpers and improves on the way we assert…
> This is a backport of the merged https://github.com/odoo/odoo/pull/235565 - with a couple of improvements & adaptations to the test files. This commit adds helpers and improves on the way we assert XML files in `AccountTestInvoicingCommon` and all accounting test that extend from it. From now on, all accounting test code that assert an XML tree/string to an XML file should call the `assert_xml` helper, and design their test file name/location/etc. around this framework. This approach has a few major benefits: Assert / Save XML When testing XML files, we often need to perform create/read/update operations on the asserted XML to make sure it corresponds to the most updated/intended data. Previously, to save something to an XML, a developer would need to write their own local helpers to save the XML in the right directory. This was cumbersome and error-prone, so we decided to design a helper that allows developer to immediately save AND/OR update the asserted XML: to save/update an XML, we can simply add `SAVE_XML` as an additional test tags. Better test naming and optional subfolder management To better organize test files, the `assert_xml` method allows us to write just the test key name (without `.xml`), and the framework will automatically get the XML to assert/save from the `test_files` directory. An optional `subfolder` parameter is also added to allow writing to specific subfolder within `test_files`. Better `___ignore___` management in assertion XMLs Sometimes, we want to ignore a few XML node that are not relevant, or have content that are not deterministic (changes on every test run). To handle this, previously, developers would need to modify the assertion XML content by hand or write their own local script to do so. With this new framework, we just need to add an `ignore_schema.xml` file somewhere in the `test_files` directory. If put inside a subfolder, it will be applied with more priority towards the XML that are put on that specific subfolder. Save "pure" XML (before applying `___ignore___`) in temporary folder When calling `SAVE_XML`, before applying the ignore patches, the XML will be saved in a temporary folder (same folder as the screenshots for tours), so that developers can use them in external tests in the future, and for any other saving reasons. In addition, this commit also: - add `extra_tags` helper to save all the common tags for EDIs, for a better way to enable `EXTERNAL_MODE` testing inspired by `l10n_mx_edi` - convert some non-assert XML test helpers into a class method - canonicalize the XML to ensure consistency of the generated test files following the C14N Version 2 standard. (Deterministic namespaces location, sorted attributes, etc.) task-4891206 Forward-Port-Of: odoo/odoo#237285
This update simplifies the process of customizing sign templates within Odoo. A new method allows developers to more easily modify or add fields, making it simpler to adapt templates for different business needs. This change improves flexibility and reduces the effort required for template adjustments.
Original PR description
Introduced a dedicated _getTemplateFields() method to make easier to override or extend the fields in patches. Forward-Port-Of: odoo/enterprise#95722
The Contacts form now shows the expected “Company Name...” hint when creating an individual contact. This makes the field’s purpose clearer and helps users enter contact details correctly.
Original PR description
### Steps to reproduce: - Go to Contacts > Contacts > New - Change it to "individual" type #### > The "parent_id" field should have a place holder "Company Name..." ### Cause of the issue: The…
### Steps to reproduce: - Go to Contacts > Contacts > New - Change it to "individual" type #### > The "parent_id" field should have a place holder "Company Name..." ### Cause of the issue: The `parent_id` field of the res.partner form uses the `res_partner_many2one` widget: https://github.com/odoo/odoo/blob/58b888992f80a58fecdb92e23fea0050f2178faf/odoo/addons/base/views/res_partner_views.xml#L164-L166 and is therefore relying on the `PartnerAutoCompleteMany2XField`. However, this template tries to recover its placeholder from the `placeholder` attribute of the Component: https://github.com/odoo/odoo/blob/58b888992f80a58fecdb92e23fea0050f2178faf/addons/partner_autocomplete/static/src/xml/partner_autocomplete.xml#L41-L50 even thought this attribute is not defined and the placeholder should be recovered from its props: https://github.com/odoo/odoo/blob/60e0529b98098b019ade09aad97cc6e359bc0755/addons/web/static/src/views/fields/relational_utils.xml#L35-L38 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236941
The demo self-ordering kiosk now uses the correct payment setting from the start. This prevents customers from unexpectedly skipping the payment screen during kiosk demo flows.
Original PR description
The field `self_ordering_pay_after` should always be `each` when the `self_ordering_mode` is set to `kiosk`. This is enforced in the `write` method. However, the demo kiosk is created with a `self_ordering_pay_after` value of `meal`, until the `write` method is run. This results in behaviour such as the payment screen being skipped when it is not expected to. This commit sets the correct `self_ordering_pay_after` value of `each` when creating the demo kiosk. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237521
The customer invoice page now keeps mobile table columns aligned when the Due Date column is hidden. This prevents invoice amounts and other details from appearing under the wrong headings on phones, reducing confusion for portal users.
Original PR description
****Behavior:****
When switching to phone view, the 'Due Date' column name dissapears but the values stay, which causes every further column of the table to have the wrong title.
The removal of the Due Date column is intended, the issue happens beacause the 't-att-class' specifying the condition to make values red was overriding the initial 'class' specifying the behavior in phone view.
**Steps to reproduce:**
- Create an Invoice for the current user
- Go to Website -> User -> My Account -> Your Invoices
- switch to phone view (reduce to less than 768px if not initially the case)
- You'll see the 'Due Date' column name dissapear and the value shift to the next column name ('Amount Due')
opw-5239794
Forward-Port-Of: odoo/odoo#235474The course search results dropdown on the website now appears below the search box instead of covering it. This makes finding courses from the homepage clearer and easier for visitors.
Original PR description
Scenario: go to homepage > Courses > one "View all" > type in search Result: dropdown with result is shown over the search input Issue: search form is in flex layout, but the dropdown is displayed in absolute so it is outside of flex flow and is positionned at the top-right of the form container. History: - before bootstrap 4 (odoo 15): the search form had a flex layout, but bootstrap dropdown used "top:100%" so were positionned at the bottom of it. - as of bootstrap 5 (odoo 16): the form kept a flex layout, but bootstrap dropdown now used "position: absolute" with unset top putting them below the search item in a block container, but over it in a flex layout. Fix: when the search bar is displayed, display it as block. opw-4735257 Forward-Port-Of: odoo/odoo#206909
Tasks created from sales orders now receive allocated hours based on the ordered quantity for manually tracked service products. This prevents project teams from seeing new tasks with zero planned hours, improving planning accuracy immediately after order confirmation.
Original PR description
To reproduce: ============= - Create service product with `service_tracking = task_in_project` and `service_type = manual` - Create a SO with this product and set quantity on the line - Confirm the SO - check the created task, allocated hours is 0.0 instead of the quantity of the SO line Problem: ======== When creating tasks from SO lines, allocated hours is initialized to 0 then computed based on the SOL quantity except when the product's service_type is 'milestones' or 'manual'. Solution: ========= Following the logic in `write` method of `sale.order.line`, the allocated hours should be set to the SOL quantity. opw-5153467 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234524
Website search results now automatically move users back to the last available page when their current page number is too high after filtering. This prevents empty result screens when matching records exist, making website listings clearer and less confusing.
Original PR description
Scenario: - enable website_studio - go to contact -> open studio -> website - add a listing and open it on website - go to page 2 and search a specific terms with less than 20 results Result: we see "5 results" in the search bar, but no result are shown and the pager is hidden. Cause: the pager is hidden since there is only one page, and we are currently displaying the records of page 2 that do not exist. Fix: if we detect that we are on a page over the last page, redirect to the last page. Eg. if there is 2 pages and we are in page 500, redirect to page 2. opw-5008556 Forward-Port-Of: odoo/odoo#236600 Forward-Port-Of: odoo/odoo#223447
This update resolves an issue that caused payslips to fail to generate due to missing data within the system. The fix ensures that the system gracefully handles potentially absent keys when retrieving payroll information, improving the reliability of payslip generation. This prevents disruptions to payroll processing.
Original PR description
Bug: When generating payslips, there is a traceback with keyerror. Cause: We were getting info from a dict but keys could be not present. Fix: Use get instead, with a default value. Forward-Port-Of: odoo/enterprise#99245
This update fixes an issue where credit notes (resulting in negative amounts) weren't being included in the XBRL export of the EC Sales List report. The change ensures that all non-zero amounts, including negative ones, are now correctly generated for the report, improving data accuracy for VAT reporting.
Original PR description
To replicate: 1. Install l10n_nl_reports_sbr_icp 2. Create an european partner with a VAT number 3. Create a credit note for this partner 4. Go to Accounting > Reporting > EC Sales List 5. The negative line appears in the report 6. Click on XBRL to export the report The negative line is not included in the exported report Only non-negative positive lines are added to the report in `_generate_codes_values()`. This commit changes that to include non-zero values. opw-5220622 Forward-Port-Of: odoo/enterprise#100009
This update fixes an issue where the PDF report title for DIAN support documents was incorrectly displayed after the document was stamped by the DIAN. The change adjusts the report naming logic to ensure the correct 'Documento Soporte' title is consistently used, regardless of DIAN acceptance.
Original PR description
Steps: - Create and confirm a vendor bill with 'DIAN Support Documents' journal - Print the PDF — it display 'Documento Soporte' as document title - Send the document to the DIAN and print it again -> the returned PDF with the DIAN stamp now shows 'Factura Electrónica de Venta', it should still be 'Documento Soporte' Cause: In `AccountMove._get_name_invoice_report` we return the name of the report depending on specific conditions, but the order of the conditions prevent to get the right report name as soon as the document has been accepted by DIAN. Fix: Modifying the order of the condition, to redirect to the right report, even when the support document has been accepted by DIAN opw-5119858 Forward-Port-Of: odoo/enterprise#99028
This update resolves an issue where users wouldn't see signed documents after a request was completed. The fix ensures that both the requester and signer automatically receive 'view' access rights to the signed document, preventing access restrictions and improving document visibility.
Original PR description
To reproduce: ============= - as a User U with Admin rights on Documents (not Sys Admin) - create a folder at the root of the company - create a Sign Request template using this folder as signed document folder - send the Sign Request to another user O and sign it with that user O - go to Documents app with user U and check the folder where the signed document should be - the signed document is not there Problem: ======== when creating signed documents, the access rights for the requester are not set, causing the requester to not see the signed document Solution: ========= give `view` access right on signed documents to both the requester and the signer if they don't already have `edit` access right on it or ownership opw-[5087233](https://www.odoo.com/web#id=5087233&view_type=form&model=project.task) Forward-Port-Of: odoo/enterprise#97132
This update resolves a previous issue where installing the UK Construction Industry Scheme (l10n_uk_reports_cis) would trigger an error due to duplicate account codes. The fix ensures the scheme correctly handles companies with branches, allowing for successful installation and reporting.
Original PR description
Before this commit: Steps 1) Create a UK localization company 2) Create a branch for that company 3) Try to install UK - Construction Industry Scheme (l10n_uk_reports_cis) => A Validation Error is raised with the message `Account codes must be unique. You can't create accounts with these duplicate codes: 220001, 220101, 220201`, This occurs because the `_l10n_uk_reports_cis_post_init()` method is creating accounts for each UK company even if they aren't root companies (branch). After this commit: UK - Construction Industry Scheme (l10n_uk_reports_cis) is installed successfully with UK companies that have branches. opw-5326079 Forward-Port-Of: odoo/enterprise#99901
This update resolves a technical issue that was causing a traceback when accessing the Documents app on mobile devices. The problem stemmed from an adaptation oversight during the forward port of a recent update. This fix ensures a stable and functional experience for users accessing the Documents app.
Original PR description
Steps to reproduce =================== 1. Toggle mobile view. 2. Open documents app. List prop is replaced by groupByField here https://github.com/odoo/odoo/pull/189109/commits/b5e821f0383caf6126a0d3c915cb4bccc8345b2b in 18.2. Here https://github.com/odoo/enterprise/pull/90647, we missed adapting the code in the forward port. Task-5363758
This update corrects a labeling issue within Odoo's document access rights settings. Previously, labels were unclear, now they clearly indicate the associated user groups providing access. This ensures better clarity and easier management of document permissions.
Original PR description
This commit fix the label of documents access rights which now shows a helper for each documents res.groups. Task-5186096 Forward-Port-Of: odoo/enterprise#98890
This update corrects a calculation error in rental order quantity tracking, specifically when returns are processed within linked pickings. The previous issue resulted in incorrect inventory counts for rental products. This fix ensures accurate tracking of product quantities during rental transactions.
Original PR description
Steps to reproduce: - Enable multi-step & Rental transfers - Set warehouse to 2 steps reception/delivery - Create a rental order for a product with a qty of 5 - Process the PICK - Change the quantity in the rental order to 3 and save - Change the quantity back to 5 and save again Issue: The Rental IN picking has now a `product_uom_qty` of 1. This is due to a wrong computation of incoming/outgoing moves when there are returns (e.g. here a return PICK) in the linked pickings. opw-5028794 Forward-Port-Of: odoo/enterprise#98473