Monday, January 12, 2026
20 changes · saas-18.4
Enhancements to existing features
Belgian tax names and descriptions were refreshed to better match current wording and business usage. This helps Belgian accounting and restaurant point-of-sale users see clearer, more accurate tax information in Odoo.
Original PR description
### With this commit:- - We are updating the current tax name and its description in Belgium. - Please visit the task for more reference. task-5363874 Forward-Port-Of: odoo/odoo#242843 Forward-Port-Of: odoo/odoo#236242
The website builder now reuses a direct lookup for original snippets instead of repeatedly scanning the same list. This reduces time spent during builder operations and tests, making the experience more responsive without changing functionality.
Original PR description
__Before commit:__ The method `getOriginalSnippet` is called hundreds of times per website builder test inside the `disableUndroppableSnippets` method from `DisableSnippetsPlugin`. Each time, it recreates the same snippet array and loops through them to find one snippet by its name. This may take around 100 ms for a single website builder test. Moreover, `getOriginalSnippet` loops through `snippetStructures`, which includes the custom snippets. This is unnecessary, since snippet names are equal to the value of `data-snippet`, which is always copied from the base snippet when a custom one is created. __Fix:__ Create an object for which the snippet `name` values are the keys and each value is the first snippet having this `name`. This allows `getOriginalSnippet` to retrieve a snippet in `O(1)` instead of `O(n)` and reduces total time spent in this function to virtually nothing. task-5269391
Resolved issues and error corrections
The HTML editor now avoids error popups when pasted content is fully removed during cleanup, such as pasting an empty line break. It also handles rare cases where the current text selection points to content that is no longer available, improving editing reliability.
Original PR description
During an `DomPlugin.insert`, the inserted content is added. Then some transformations are applied to clean up, including the removal of some nodes which are inventoried into `candidatesForRemoval`,…
During an `DomPlugin.insert`, the inserted content is added. Then some transformations are applied to clean up, including the removal of some nodes which are inventoried into `candidatesForRemoval`, and some specific `<br>` nodes. Ultimately, the selection is set after the last inserted node. In some cases, none of the inserted content remains after the clean up. When this happens, the selection is being set after the last inserted node, which is not part of the DOM anymore, and therefore leads to an error. This commit prevents this from happening by detecting when all inserted content was actually already removed. Steps to reproduce: - In a plain web page, copy a <br> into the clipboard - In an editor, put a character on a line - Paste => An error popup was displayed task-5429909 [FIX] html_editor: avoid failing when selection nodes are disconnected This commit addresses a traceback that was spotted but for which the actual scenario remains undetermined. The only possible way this traceback may occur is if nodes inside a selection are disconnected. The test added by this commit produces the same traceback as the observed one. task-5429909 Forward-Port-Of: odoo/odoo#242941 Forward-Port-Of: odoo/odoo#242488
Replacing a styled image with another type of media now removes image-specific formatting such as width or rotation. This prevents icons, documents, or other media from appearing incorrectly after replacement, giving users cleaner and more predictable editor results.
Original PR description
**Current behavior before PR:** - When an image had styles applied to it (such as transform or width) and was replaced with another media type like an icon or document, those styles were incorrectly carried over to the replaced media. **Desired behavior after PR is merged:** - Since transform and width styles are meant to apply only to images, they are now removed when an image is replaced with other media types. task-5373362 Forward-Port-Of: odoo/odoo#240284 Forward-Port-Of: odoo/odoo#238319
This fix prevents an error when Razorpay is configured without a key secret, which can happen in valid account-based setups. Users should no longer encounter a payment provider crash from missing optional Razorpay credentials.
Original PR description
An error is triggered at line [1] when the code attempts to encode `secret(self.razorpay_key_secret)`, as the value of `self.razorpay_key_secret` is `False`. Error: `AttributeError:'bool' object has no attribute 'encode'` This issue may occur if the user has not set the `Razorpay Key Secret (razorpay_key_secret)` in the Razorpay credentials within the Odoo Razorpay configuration. See constraint at [2] `razorpay_key_id` or `razorpay_key_secret` is not required when we have `razorpay_account_id`. This commit will fix the above issue by early return as `None` when `secret(razorpay_key_secret)` is `False`. [1]: https://github.com/odoo/odoo/blob/b0797f7b4b00bea74529a7137df2a293524558ff/addons/payment_razorpay/models/payment_provider.py#L250-L254 [2]: https://github.com/odoo/odoo/blob/b0797f7b4b00bea74529a7137df2a293524558ff/addons/payment_razorpay/models/payment_provider.py#L63-L75 sentry-6767571136
This change fixes an unstable automated check for the website editor sidebar behavior. It reduces false failures caused by timing issues, helping teams trust test results and keep website updates moving smoothly.
Original PR description
Tour added in this [commit] was previously failing, and the earlier [fix] only reduced the frequency of failures. However, it still occasionally fails due to race conditions of the iframe becoming ready and the moment the builder opens the 'Block' tab after the iframe has been reloaded. This commit aims to fix it. [commit]: https://github.com/odoo/odoo/commit/a5455bf [fix]: https://github.com/odoo/odoo/commit/0a9522792cc0e18a895c0589f34977123d091d1a runbot-234504
This fixes how returned bank information is handled in Accounting so it is not exposed or processed with elevated access unnecessarily. The change helps keep normal access rules intact while preserving expected bank statement behavior.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242899 Forward-Port-Of: odoo/odoo#242771
The point of sale combo configurator now keeps product cards evenly sized and aligned when product names are long. This makes the popup look cleaner and easier to scan for cashiers selecting combo items.
Original PR description
Before this commit: ================= Product cards with long names caused a slight vertical misalignment in the combo configurator popup, resulting in inconsistent card sizes within the grid. After this commit: ================== Ensure all product cards remain uniformly aligned and maintain consistent dimensions in the combo configurator popup, even when product names are long. Task:5447320 Forward-Port-Of: odoo/odoo#243089 Forward-Port-Of: odoo/odoo#241720
This fix improves the reliability of automated tests for the HTML editor by preventing simulated arrow key actions from moving the cursor twice. It helps reduce false test failures and supports more stable quality checks without changing end-user behavior.
Original PR description
The `simulateArrowKeyPress` method used in hoot tests performs both an actual `press` and modifies the selection. However, in some cases, the `press` already updates the selection because of our own listeners, which leads to a selection similar to performing the action twice. This commit avoids this by making sure the default `press` did not get prevented by our own custom listeners before modifying the selection. task-5438683 Forward-Port-Of: odoo/odoo#241604
Refunded point-of-sale orders now keep the selected product variant attributes from the original sale. This ensures staff and customers see the correct product details on refund order lines and receipts, reducing confusion during returns.
Original PR description
**Steps to reproduce:** - Make an order with a product that has variants and chose whatever in the popup - Pay for that order, then refund it - The attribute is not shown on the orderline anymore - The attribute is not shown on the receipt either **Why the fix:** When making a refund, we are actually making a new order, so we need to move the data from the old order to the new refund order. During this transit, the *attribute_value_ids* was forgotten on the moving lines, so the attributes were lost. We now give the old attributes to the new line. opw-5393332 Forward-Port-Of: odoo/odoo#240602
Fixed an issue where delivery order descriptions and delivery slip PDFs could show the product name twice for products with custom free-text attributes. This keeps warehouse and customer-facing documents clearer and avoids confusion during order fulfillment.
Original PR description
**Steps to reproduce:** * Install the **stock** and **sale_management** modules. * Go to *Inventory > Configuration > Attributes* and create a new attribute. * Set *Variant Creation Mode* to *Never*.…
**Steps to reproduce:**
* Install the **stock** and **sale_management** modules.
* Go to *Inventory > Configuration > Attributes* and create a new
attribute.
* Set *Variant Creation Mode* to *Never*.
* Add a single attribute value and enable *Free text* on it.
* Create a product using this attribute and select the value for which
*free text* is enabled.
* Create a Sale Order for this product.
* Open the sale order line pop-up and enter custom text in the *Text* field.
* Confirm the sale order.
* Open the generated Delivery Order.
**Observed behavior:**
The product name appears **twice** in the stock move description.
The same duplication appears in the **Delivery Slip** PDF report.
**Cause:**
https://github.com/odoo/odoo/blob/452800a9fd56539c04bed5dcf4525afb9b8ad28e/addons/sale_stock/models/stock.py#L31-L32
In `_compute_description_picking`, the description is built as description + variant description.
Since Odoo already uses the product name as the base description and avoids rendering
it twice only when the name equals the description, concatenating the variant description
breaks this logic and results in the product name being repeated.
---
<details>
<summary>Click here to see the results:</summary>
Before:
<img src="https://github.com/user-attachments/assets/2f76fcc9-c71d-4c3d-a80a-06391e5d863c" />
After:
<img src="https://github.com/user-attachments/assets/78eb7905-8ce6-42b9-aed3-ac1452b74dc1"/>
</details>
---
opw-5382353
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe Project list now shows each next milestone with its deadline when Sales Project features are enabled. This makes milestone tracking clearer for users reviewing projects at a glance.
Original PR description
**Steps to Reproduce:** - Install the Sale Project module. - Navigate to the Project module. - Enable Project Stages. - Go to the Project list view. - Observe that the Next Milestone does not display the deadline along with the milestone name. **Issue:** The milestone display name is incomplete and does not include the deadline date. **Cause:** The context overridden in sale project did not pass the required context, cause the display_name computation did not add deadline to the display name. **Fix:** Passed the appropriate context in the action context to ensure the display name is correctly computed and displayed with its deadline. Task: 5255295 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243189 Forward-Port-Of: odoo/odoo#241853
This fixes an incorrect aggregation in a French localization tax report field. The correction helps ensure the reported total in box 15_1 is calculated accurately for French accounting reports.
Original PR description
During this commit: https://github.com/odoo/odoo/commit/869f80b466ec2246f27e11fa823eb32ac664fb01 we made a mistake in the box 15_1. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243099 Forward-Port-Of: odoo/odoo#243013
A web test was updated so it waits for the page display to finish refreshing before checking results. This reduces random test failures and helps keep the release process stable without changing customer-facing behavior.
Original PR description
In this commit, we add a missing await for an animation frame in an embedded action test. This ensures that the test waits for the DOM to update properly before proceeding, preventing potential flakiness in the test execution. runbot error~237752 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243240
This update corrects a display issue where archived recurring plans continued to show up as pricing options on product pages. The fix ensures that archived plans are no longer considered during pricing selection, providing a cleaner and more accurate presentation of available plans to customers. This improves the user experience and prevents confusion.
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/enterprise/blob/25edaac85f8fd1699bb78163b01efb966e7fb680/sale_subscription/models/sale_subscription_pricing.py#L78-L79 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#103428 Forward-Port-Of: odoo/enterprise#100587
This update corrects a calculation error in the Belgian payroll module (l10n_be_hr_payroll) related to employment bonuses. The changes ensure that bonus calculations accurately reflect payments up to March 2026, aligning with updated Belgian tax regulations. This update maintains accurate financial reporting for businesses using this module.
Original PR description
Forward-Port-Of: odoo/enterprise#103820
This update corrects a calculation error in the Belgian payroll module (l10n_be_hr_payroll) related to the 3000 deduction. The change ensures the deduction accurately reflects tax regulations up to the year 2026, improving payroll accuracy for Belgian users. This fix addresses a previously identified discrepancy.
Original PR description
Forward-Port-Of: odoo/enterprise#103824
This update fixes an issue where the ‘Next Milestone’ display in the Project list view was missing the milestone deadline. The fix ensures that milestone names now accurately include the deadline, providing users with clearer project timelines. This improves the usability of the Industry FSM module.
Original PR description
**Steps to Reproduce:** - Install the Industry FSM module. - Navigate to Project Configuration. - Enable Milestones. - Go to the Project list view. - Observe that the Next Milestone does not display the deadline along with the milestone name. **Issue:** The milestone display name is incomplete and does not include the deadline date. **Cause:** The required context was not passed in the action, so the display_name computation did not add the deadline to the milestone name. **Fix:** Pass the appropriate context in the action to correctly compute and display the name along with its deadline. Task: 5255295 Forward-Port-Of: odoo/enterprise#103895 Forward-Port-Of: odoo/enterprise#103160
This update fixes a bug in the invoice import process within Odoo Enterprise v18.4. Previously, the wrong company's purchase tax could be applied when invoices were processed, particularly through automated cron jobs. This change ensures that the correct tax is selected based on the company setting, improving invoice accuracy and compliance.
Original PR description
In v18.4, the invoice import has been refactored with these 2 PRs: - [189979](https://github.com/odoo/odoo/pull/189979) - [75327](https://github.com/odoo/enterprise/pull/75327) This introduced a small bug where, in a multi-company setup, an `account.tax` could be selected from the wrong company when `_fetch_mail()` was called from the cron `Mail: Fetchmail Service` or if the method was called manually from the wrong company. Ticket: opw-5375785
This update fixes an issue where public channels in Odoo were incorrectly configured, defaulting to an internal user instead of being publicly accessible. The change sets the `group_public_id` to `None` to ensure channels are correctly designated as public, improving channel visibility and collaboration.
Original PR description
Since #206619, the fixed test has used a wrong value for `group_public_id`, as if it's not set, the default is `Internal User`. This change sets it to `None` to make the channel public. Forward-Port-Of: odoo/odoo#243237