Thursday, April 16, 2026
19 changes · 19.0
Enhancements to existing features
The send wizard now only preselects Peppol sending when the company is actually registered on Peppol, not just when Peppol is available in its country. This prevents users from being guided toward an option they may not be able to use, reducing confusion during invoice sending.
Original PR description
Previously, the send wizard would automatically enable the send "by Peppol" option whenever Peppol was available for the company's country. This behavior was misleading, as it didn't check whether the company was actually registered on Peppol. This commit ensures the option is only enabled for companies that are registered on Peppol. task-6044073 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258731 Forward-Port-Of: odoo/odoo#254671
This update enhances the process of updating German Point of Sale certification transactions by ensuring order updates are processed sequentially. Additionally, unnecessary ZIP and address validation checks on the user interface have been removed, streamlining the user experience. This change improves order consistency and reduces complexity.
Original PR description
In this commit: ------------------- - We have added logic to execute API calls using a mutex for order updates (such as line updates and removals). This ensures that each update is processed (sequentially), allowing us to properly track and maintain order consistency. - We removed the ZIP and address validation on the UI since the backend already assigns default values if they are missing. So, there’s no need to restrict the user on the UI. task:5941742 Forward-Port-Of: odoo/enterprise#113809 Forward-Port-Of: odoo/enterprise#108694
Resolved issues and error corrections
The purchase and sales dashboard “To Pay” totals now include receipts, matching the list users see when they click into the section. This prevents mismatched counts and amounts, giving teams a more accurate view of outstanding payments.
Original PR description
- The "To Pay" section in the purchase/sales dashboard was only considering invoices(`in_invoice` and out_invoice) and refunds(`in_refund` and `out_refund`) when computing the number and amounts to pay. - However, the corresponding action view includes receipts (`in_receipt` and `out_receipt`), leading to an inconsistency where the dashboard count and amount did not match the records shown after clicking. - This commit updates the dashboard query to also include receipts, ensuring consistency between the displayed metrics of the coreesponding purchase/sales dashboard and the action view. Related PR: https://github.com/odoo/enterprise/pull/111142 taskID-6040828 Forward-Port-Of: odoo/odoo#259245 Forward-Port-Of: odoo/odoo#254295
This fix updates the online store website builder to use Odoo's newer shared system for managing footer layout options. It helps keep footer customization working reliably and makes future website extensions easier to support.
Original PR description
In [1], footer templates were refactored to use a centralized resource provider for better extensibility. This commit aligns `website_sale` with the new pattern by registering its footer options via the `footer_templates_providers` resource instead of directly extending `website.FooterTemplateOption` in XML. [1]: https://github.com/odoo/odoo/commit/ea25e015a6935216c15612b28cbf824fb7f29c21
Demo mode now includes the missing mock response data for Peppol and Danish Nemhandel flows. This prevents demo users from seeing errors when trying these electronic invoicing features, making demonstrations and evaluations smoother.
Original PR description
With the recent addition of responses in Peppol and Nemhandel, we forgot to adapt the mocking data for demo flows, which resulted in tracebacks in demo mode. Forward-Port-Of: odoo/odoo#258655
This fix avoids changing existing account links when tax group data is reloaded. It helps prevent setup reloads from failing when account purposes and tax group references no longer match, improving reliability for accounting localization updates.
Original PR description
Upon chart reload, accounts will not be updated (except for tax_ids), but tax groups are. If a tax group was changed to relate to a different account and this account was re-purposed (e.g.…
Upon chart reload, accounts will not be updated (except for tax_ids), but tax groups are. If a tax group was changed to relate to a different account and this account was re-purposed (e.g. account_type changed from an incompatible to a compatible type, the fact that the account is not updated will trigger constraints in the tax group when it is written. IOW, if the purpose of an account is not changed, its use should not be changed either. E.g.: 1f4710deb206736cd71580d8fd95552d9b7c8014 changed the value of `tax_payable_account_id` on tax group `tax_group_cofins_incl_goods` to `account_template_202011005` and the same commit changed the value of `account_type` on `account_template_202011005` from `liability_non_current` to `liability_payable`, triggering `_constrains_payable_receivable_account` (in 19.2: https://github.com/odoo/odoo/blob/e00dd21880c3c4e5c22d65567c700e02541f7259/addons/account/models/account_tax.py#L68). So here, we skip the update of relations to accounts on tax groups, if the account already exists. Forward-Port-Of: odoo/odoo#259160
Fixed broken image paths in website call-to-action snippets so they load correctly no matter where visitors are on the site. This prevents missing visuals on deeper pages such as product pages and keeps marketing sections looking as intended.
Original PR description
This commit fixes two missing leading slashes in the "src" attribute of two "img" tags in `s_cta_mockups`. The browser resolves links differently based on leading slashes. Before this commit, the lack of leading slahses caused the snippet to not display properly on deeper pages (for example, "/shop/product-name"). task-6103616 Forward-Port-Of: odoo/odoo#258985 Forward-Port-Of: odoo/odoo#258879
Automated test retries now start with a fresh test state each time, preventing leftover data from one attempt from causing confusing failures in later attempts. This improves the reliability of Odoo's internal test process and helps teams trust test results during development.
Original PR description
The autoretry don't recreate the test instance meaning that some pollution can remain there breaking the next test with a strange error. This pr recreates the test instance for each retry to avoid this kind of issue, and move the retry mechanism to the suite level. The core part of the fix is `test = test.__class__(test._testMethodName) # re-create the test to reset its state` While on it, moving the retry mechanism in the test suite since it makes more sense and allow a better control on what is retried or not since we don't rely on inheritance, and avoid dirty code with super(test) call to recreate the instance and execute it again. The tests needs to be adapted since the retry attribute is now in the loop, but we can have a quite reliable way to know if we are in a retry or not using inspect.
This fixes a mismatch where a warehouse could appear to have manufacturing resupply enabled even when the required manufacturing rules no longer existed. Business users will see more reliable warehouse settings, reducing confusion and preventing incorrect planning assumptions.
Original PR description
The compute and the inverse function for manufacture to ressuply could result in an inconcistencies. For example if you don't have any rule to manufacture for a warehouse (they have been deleted). Then you could set manufacture to ressuply on the warehouse but the inverse function will do nothing and the field in cache will be set to True but the compute should set it to False.
Point of Sale now keeps the original payment date for orders captured while offline when they are later loaded. This prevents historical payments from being incorrectly shown as paid on the current date, improving accuracy for reporting and reconciliation.
Original PR description
Before this commit, saved orders that were captured offline, would have their payment_date overridden to the current date when they were loaded in the POS. opw-6117966 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Messages now automatically remove extra blank lines at the beginning and end before they are sent. This prevents conversations from showing unwanted empty space, making messages look cleaner and more professional for users.
Original PR description
Trim the leading and trailing empty lines in the message body before sending it to avoid unwanted empty lines at the beginning and end of messages. task-6027013 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Luxembourg tax report now shows amounts for tax grid 226 with the correct positive sign. This prevents misleading negative values in the report and helps businesses review their VAT figures accurately.
Original PR description
Steps to reproduce: - Install `l10n_lu` module - Switch to `LU Company` - Create a invoice and in journal items use tax grid `226` - Open the Tax Report and check the line `226 - Supplies carried out within the scope of the special arrangement of art. 56sexies` - The value appears negative instead of positive. Cause: This issue is caused by the major tax revamp introduced in version 19 [commit]. The credited amount is currently displayed as a negative value, which is incorrect, it should be shown as positive. Solution: To resolve this issue, the formula has been modified from `226` to `-226`. [commit]: https://github.com/odoo/odoo/commit/17a6117ed88c29b5bc4db0c872bcdbc109a7d98b#diff-3441c5d05315ec0562923797f973eae66488452a6772d23e198998c1890aa06c opw-6050665
This update resolves an issue where lunchtime shifts were incorrectly calculated when an employee's time zone differed from the calendar time zone. The fix ensures accurate lunch time tracking and corrects the reset of work entries when time zone discrepancies exist, improving the reliability of employee time data.
Original PR description
- Correct lunch time shift if employee tz differs from calendar tz - Correct reset of WE if employee tz differs from calendar tz Task: 6072325
This update ensures that transaction dates pulled from Codabox are always within the correct timeframe. Previously, incorrect date ranges could occur, but this fix now uses the latest statement or statement line date, guaranteeing accurate reporting. This improves the reliability of financial data.
Original PR description
To fetch transactions from iap, we have to give a date from. Before this commit, it was possible to have a date from prior the lock date which is not supposed to happen. This commit will do the max between the lock date the last date of either the statement or the statement line. task-6019584 Forward-Port-Of: odoo/enterprise#110010
This update fixes an error in how Odoo calculates the available capacity for appointments booked through Google Reserve. Previously, the system reserved the full party size for each resource, leading to overbooking. This change ensures accurate capacity allocation, preventing scheduling conflicts and improving appointment management.
Original PR description
The current logic inside the appointment google reserve controller to compute reserved and used capacity per resource was incorrect. It was reserving the full party size for each resource instead of properly computing how much spots we are reserving for each. The code was fixed and a test was adapted for proper coverage. Task-6120016 Forward-Port-Of: odoo/enterprise#113908 Forward-Port-Of: odoo/enterprise#113805
This update resolves an issue preventing the generation of session reports in the CO company setting. Previously, generating the report would result in an error. The fix corrects a data access problem, allowing users to successfully generate and review their POS session reports.
Original PR description
Currently when trying to generate the session report a traceback appears. Steps to reproduce: ------------------- * Install l10n_co_edi_pos * Switch to CO company * Open pos session * Make a sale * Close register * Generate session report > Traceback Why the fix: ------------ We get the sale details with: https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L429-L430 Where the config ids given to `get_sale_details` are given here https://github.com/odoo/odoo/blob/0ce5baf2918960591284eb494d82dfef07043af0/addons/point_of_sale/models/report_sale_details.py#L413-L414 From there we can't access any field from a list of number. opw-6049484 Forward-Port-Of: odoo/enterprise#111627
This update resolves an issue where the 'Create a Payslip' button was unresponsive when no payslips existed in the W2 report. The fix corrects a technical error in the system's code that prevented the button from functioning properly. This ensures users can consistently generate W2 reports.
Original PR description
1.Install l10n_us_hr_payroll 2 Navigate to Payroll>Reporting>W2 Report. 3.Open/Create W2 form and try to add payslip by clicking "Add a line". 4."Create a payslip" button appears if their are no valid payslips. 5.Click it, it won't work! Root cause: - `onAdd` bind was missing in the controller - Renderer applied an additional `.bind(...)`, breaking the callback Fix: - Pass a dedicated `createNewPayslip` action from controller - Remove double binding in renderer - Forward callback directly to helper component task-[5928770](https://www.odoo.com/odoo/project/1251/tasks/5928770) Forward-Port-Of: odoo/enterprise#111735
This update resolves an issue that prevented Odoo from importing LinkedIn accounts when the LinkedIn image data was missing a key field. The change ensures the import process doesn't crash and successfully connects more LinkedIn accounts by gracefully handling missing image URLs.
Original PR description
When importing a LinkedIn account, Odoo fetches the image metadata of the organization page and expects each returned image to contain `downloadUrl`. For some LinkedIn accounts this key is missing from the image response, which makes the callback crash with `KeyError: 'downloadUrl'` and prevents the account from being connected. LinkedIn's current Images API documentation describes `downloadUrl` as an optional field, so the import flow should not assume it is always present. This patch skips image entries without `downloadUrl` instead of crashing. opw-6099244
This update resolves a previous issue where invoice settlement would fail if the commercial partner information wasn't fully loaded. The change streamlines the process by directly using the partner ID from the invoice data, preventing errors and ensuring smooth invoice settlement. This improves the reliability of the Point of Sale module.
Original PR description
Before this commit, it was possible that commercial_partner_id was not loaded, which caused an error when settling an invoice. This commit fixes the issue by avoiding the need to load the full partner record. Since only the partner ID is required to load the account move, it is now read directly from the raw data, which already includes the ID. opw-6023150 Forward-Port-Of: odoo/enterprise#111957