Thursday, June 25, 2026
24 changes · saas-19.3
Enhancements to existing features
This update introduces a new automated process that runs every Sunday to reset configuration settings related to development tools (devtools). This ensures that features temporarily disabled for production environments are automatically re-enabled before the weekly update on Monday, streamlining the update process.
Original PR description
We add a new cron to re enable disabled features by unsetting devtools keys in configuration. This cron is meant to run every sunday at the end of the day, right before the monday update. Forward-Port-Of: odoo/odoo#270306
Resolved issues and error corrections
This change removes an unnecessary price check from the Peru POS refund test tour. It matters because the tour could fail when the POS configuration currency differed from the company currency, even though the price was not relevant to the workflow being tested.
Original PR description
Before this commit, the tour was checking the price of an article which was not the good one since the currency of the config was not the same as the company one. This commit removes the check of the price which is not even relevant for the tour.
The self-invoicing URL shown on point-of-sale receipts is now generated correctly instead of appearing as an invalid link. This helps customers access their invoice request page without confusion or extra support.
Original PR description
Before this commit: ------------------------- - The self-invoicing URL on the receipt was displayed as `undefined/pos/ticket`. After this commit: ------------------------- - The self-invoicing URL is now generated correctly and displayed properly on the receipt. Task-6271261 Forward-Port-Of: odoo/odoo#271762 Forward-Port-Of: odoo/odoo#270052
This change makes a website test tour wait for the correct element before starting a drag-and-drop action. It prevents occasional test failures caused by the tour acting on the wrong target, improving reliability of website testing.
Original PR description
The tour `conditional_visibility_4` has non-deterministic failure, that appears to be caused by the `drag_and_drop` step dragging the element that was the target before the click of the previous step. This commit adds a step to ensure the target is the expected element before the "drag" step starts. runbot-242425 Forward-Port-Of: odoo/odoo#271760
The Mozambique demo company now uses a valid NUIT number. This prevents validation errors when newer standard number checks are applied, helping demo data load correctly and avoiding build failures.
Original PR description
Newer versions of stdnum (2.2) also test the number for MZ We did not have a valid NUIT number in the MZ demo company. Runbot error: https://runbot.odoo.com/runbot/build/114118067 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 Forward-Port-Of: odoo/odoo#271398 Forward-Port-Of: odoo/odoo#271299
This update fixes an issue where rental prices weren't correctly formatted on the website, appearing without the necessary slash separator. The fix ensures that rental prices and durations are displayed clearly and accurately, improving the user experience for customers renting products. This resolves a visual inconsistency.
Original PR description
Steps to produce: --- - Install the `Rental and eCommerce `modules. - Create a rental product and configure a rental price for it. - Add an optional product from the Sales tab. - Publish the product…
Steps to produce: --- - Install the `Rental and eCommerce `modules. - Create a rental product and configure a rental price for it. - Add an optional product from the Sales tab. - Publish the product on the website. - Open the product page on the website and click` Add to Cart`. Issue: --- - In the product configurator, the rental price is displayed without the `/` separator between the price and the rental duration period. Cause: --- - The string used to generate the rental duration label does not include the `/` separator. Fix: --- - Add the missing `/` separator to the rental duration label so that rental prices are displayed correctly. Before: --- <img width="974" height="185" alt="image" src="https://github.com/user-attachments/assets/64a88a60-bcc0-4657-97fd-584da57d0aff" /> After: --- <img width="967" height="188" alt="image" src="https://github.com/user-attachments/assets/b4d50019-1db4-4817-a8ce-446cc3c55df4" /> opw-6293015 Forward-Port-Of: odoo/enterprise#121246 Forward-Port-Of: odoo/enterprise#120223
This update fixes an issue where customer addresses in the Field Service kanban view would be cut off and displayed incorrectly due to a design element that didn't properly constrain the address width. The fix ensures that long customer addresses now fit neatly within the kanban card, improving readability and usability. This improves the visual presentation of customer information.
Original PR description
Steps to reproduce: - 1. Open the Field Service planning view in kanban. 2. Make sure a shift's customer has a long address (long street lines). 3. Look at that shift's card in the kanban view. Issue: - The customer address overflows the card and is clipped at its right edge instead of staying within the card boundaries. Cause: - The customer is rendered with the `many2one` widget and `show_address`, which marks each address line `text-truncate`. Truncation only works inside a width-bounded container, but the field root `.o_field_many2one` is an inline-flex item with the default `min-width: auto`, so it grows to fit the longest address line instead of shrinking to the card. As a result, `text-truncate` never engages and the address spills past the card. Fix: - Add the `min-w-0` class to the partner field so the flex item shrinks to the available card width. task-6272209 Forward-Port-Of: odoo/enterprise#119248
This update fixes an issue where the sandwich rule incorrectly excluded public holidays from leave calculations. Now, when 'Include Public Holidays as Working Day' is selected, the system accurately determines the correct leave duration, including weekend days as part of the calculation. A new test case has been added to ensure this fix works as expected.
Original PR description
Problem: When a time off type is configured with "Include Public Holidays as Working Day", the sandwich rule was still treating public holidays as non-working days. This caused the sandwiched weekend days to not be included in the leave duration. Example: Employee applies leave from May 15 (Friday, Public Holiday) to May 18 (Monday). Expected duration is 4 days since May 15 is a working day and May 16-17 (weekend) should be sandwiched. Instead, only 1 day was calculated. Fix: Now when "Include Public Holidays as Working Day" is enabled, the correct number of days are calculated in the sandwich rule. Also added a test case to verify that public holidays are correctly treated as working days during sandwich rule evaluation. Task-4570118 Forward-Port-Of: odoo/odoo#271261 Forward-Port-Of: odoo/odoo#266624
This update ensures the Clickall tool, used for automated accounting dashboard testing, correctly handles the new version 2 (v2) of Odoo Fin's favorite institutions endpoint. By adding a mock, we prevent the tool from making direct requests to production servers, maintaining a safe and isolated testing environment.
Original PR description
This commit follows up on [1] by extending the Odoo Fin request mock to cover the new version 2 (v2) favorite institutions endpoint. Previously, a mock was introduced to prevent the Clickall tool from making real external HTTP requests to `production.odoofin.com` when displaying the accounting dashboard. This update ensures that the newly introduced v2 URL is also safely intercepted, keeping the automated tests fully isolated from production servers. runbot-234936 [1] : https://github.com/odoo/odoo/commit/c6451015f1b01c3e1defe4a576989fd4bfdf2cdb Forward-Port-Of: odoo/odoo#271804
This update fixes a previous issue where commission losses were incorrectly calculated for employees on long-term sickness or partial incapacity leave. The change ensures that these employees are not subject to commission deductions, aligning with standard payroll practices. This update improves accuracy and fairness in commission calculations for a specific employee group.
Original PR description
Partial incapacity and long term sickness are not elligible to loss on commissions. Forward-Port-Of: odoo/enterprise#121514
This change optimizes the automated posting of invoices by preventing the cron job from repeatedly rescheduling entire batches when individual invoices fail to post. Previously, a batch failure triggered thousands of unnecessary retries. Now, failed invoices are simply marked as unpostable, reducing system load and improving performance.
Original PR description
Before this change, cron jobs triggering `_autopost_draft_entries` would gracefully handle batch-level failures by logging the error and retry one by one. As a result, `_process_job`, with success 0 done and remaining number, marked the cron run as partially completed and triggered `_reschedule_asap`. When a batch contained only problematic records, the cron job could be rescheduled thousands of times per day. With this change, if a move in the batch fails to post, we set its `auto_post` to `no`, together with the existing message-posting logic in the chatter, to prevent repeated retries for failed records. Related ticket: opw-6303194 opw-5364851 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271509
This update fixes a visual bug where outdated cluster bubbles remained visible on the company map after zooming or panning. The issue stemmed from a technical error in how the map library handled removing old cluster icons. This change ensures that clusters are properly updated and removed, providing a cleaner and more accurate map display for users.
Original PR description
Steps to reproduce: =================== 1. Install website_customer, set a Google Maps API key and publish a few companies with coordinates 2. Open /customers 3. Open the map and zoom in a few times…
Steps to reproduce: =================== 1. Install website_customer, set a Google Maps API key and publish a few companies with coordinates 2. Open /customers 3. Open the map and zoom in a few times => stale blue cluster bubbles remain on the map Cause: ====== On the partner map, zooming or panning left old cluster bubbles behind: the blue count icons piled up and never disappeared, even at the closest zoom level. `ClusterIcon` is meant to be a google.maps.OverlayView. The bundled `markerclusterer.js` wires that up by copying every enumerable https://github.com/odoo/odoo/blob/aed1619c34b1f65bd9a3d155fe76a82d404ef5e7/addons/website_google_map/static/src/lib/markerclusterer.js#L213-L221 OverlayView.prototype member onto ClusterIcon.prototype. Google Maps now ships its own OverlayView.prototype.remove, and that copy overwrites ClusterIcon's own `remove()` with it, As a result, when a cluster icon is removed, `ClusterIcon.remove()` is never executed. Consequently, `ClusterIcon.prototype.onRemove()` is not triggered, the cluster icon's DOM element is never detached from the map, https://github.com/odoo/odoo/blob/aed1619c34b1f65bd9a3d155fe76a82d404ef5e7/addons/website_google_map/static/src/lib/markerclusterer.js#L1167 and stale cluster bubbles accumulate after every redraw, zoom, or pan operation. Solution: ========= Inherit from OverlayView through the prototype chain instead of copying it, so ClusterIcon's own remove() is kept and actually detaches the icon. opw-6128531 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270733
This update resolves a problem where the Italian POS fiscal printer would intermittently stop printing orders due to unsupported characters in product or payment method names. The fix replaces these characters with spaces, ensuring complete and accurate printing of fiscal receipts, as outlined in official EPSON documentation.
Original PR description
Steps to reproduce: - Setup an Italian fiscal printer - Modify the name of a product to use the non-blocking space character "\ "; - In the POS, create an order with the product. Error: the fiscal device will stop midway in the printing process and return an incomplete response to the frontend. The issue can also be reproduce if the character is included in the payment method name or the POS config name. Solution: When formating the xml command, replace all non-supported character by a space character. The non-supported character list is provided by the official [EPSON fiscal printer documentation](https://support.epson.net/setupnavi/?PINF=bsmanual&OSC=WS&LG2=EN&MKN=FP-90III%20RT) in the document "ePOS Fiscal Print Solution Development Guide". Other: Rename the file "dispaly_text.xml" to "display_text.xml". [opw-6244089](https://www.odoo.com/odoo/project/49/tasks/6244089) Forward-Port-Of: odoo/enterprise#121538 Forward-Port-Of: odoo/enterprise#120169
This update resolves an issue where attendees received duplicate emails when rescheduling meetings. The fix prevents a nested calendar event write, which was causing the original and subsequent updates to trigger multiple notifications. This ensures attendees only receive one notification for meeting date changes.
Original PR description
Steps to reproduce: 1. Install CRM, Calendar, and Contacts. 2. Create a contact with an email address you can receive emails on. 3. Configure an outgoing email server. 4. Open a CRM lead and create a…
Steps to reproduce: 1. Install CRM, Calendar, and Contacts. 2. Create a contact with an email address you can receive emails on. 3. Configure an outgoing email server. 4. Open a CRM lead and create a meeting activity using the calendar. 5. Add the created contact as an attendee of the meeting. 6. Return to the lead and click the Reschedule button on the activity. 7. Select the same meeting and change its start date to a future date. Issue: - Attendees receive the meeting date-change email twice. Root cause: - When a calendar event linked to an activity is rescheduled, the event write syncs the new start date to the related activity through `_sync_activities`. That activity write was not marked as calendar-originated after commit https://github.com/odoo/odoo/commit/bc090486bd7810b1b0af1bae398255a2d6615f09, so `mail.activity.write` treated the updated deadline as an activity-originated change and wrote back to the same calendar event. https://github.com/odoo/odoo/blob/8cbb0fe91a35fcdb4a7e4e1a7e8afe40b1691f11/addons/calendar/models/calendar_event.py#L779 https://github.com/odoo/odoo/blob/8cbb0fe91a35fcdb4a7e4e1a7e8afe40b1691f11/addons/calendar/models/mail_activity.py#L24-L33 - This created a nested calendar event write. Both the nested write and the original write then triggered attendee date-change notifications, resulting in duplicate emails. Solution: - Pass the existing `calendar_event_meeting_update` context flag when syncing calendar event changes to linked activities. This prevents the activity sync from writing back to the event while preserving activity-to-event rescheduling. opw-6209956 Forward-Port-Of: odoo/odoo#269950 Forward-Port-Of: odoo/odoo#266675
This update fixes a display issue in the Helpdesk module where ticket labels in list and form views didn't match the labels shown in the Kanban view. The fix removes outdated label fields from the views, ensuring all ticket views show the correct, up-to-date state selections.
Original PR description
Steps to reproduce: ------------------------ 1. Install Helpdesk 2. Go to All Tickets and check the kanban state selection value 3. Go to Settings > Field Selection and search for kanban_state in…
Steps to reproduce:
------------------------
1. Install Helpdesk
2. Go to All Tickets and check the kanban state selection value
3. Go to Settings > Field Selection and search for kanban_state in `helpdesk.ticket` model
4. Change one of the state selection values (e.g., "Ready" to "Testing Ready")
5. Go back and check the state selection value in list and form views
Current behavior:
-----------------------
Kanban view correctly shows the updated label (e.g., "Testing Ready"),
but list and form views still display the old default value (e.g., "Ready").
Root cause:
---------------
The [state_selection](https://github.com/odoo/odoo/blob/c09cefdb0ed68b1b7367b77b18a5ee5d66c94900/addons/web/static/src/views/fields/state_selection/state_selection_field.js#L57-L65) widget uses `legend_${state}` field values when available.
Since list and form views included these legend fields, the widget resolved labels from them
instead of the actual selection values, causing inconsistent display.
Fix:
-----
Remove `legend_normal`, `legend_blocked`, and `legend_done` fields from the list and form views,
So the widget falls back to the real selection labels, consistent with how the kanban view behaves.
Reference commit: https://github.com/odoo/enterprise/commit/65f3b88254e3a66e2c5dcb5142d30f6b1996d999
opw-6238765
Forward-Port-Of: odoo/enterprise#119707This update resolves an issue where users without fleet access could not import UBL invoices referencing vehicles. Now, users with vendor bill import permissions can successfully import UBL invoices containing vehicle references, improving data import flexibility. This ensures accurate recording of transactions regardless of user access rights.
Original PR description
When a user has no rights to access the fleet models but is allowed to import vendor bills, he should be able to import a bill (UBL) with referenced vehicle(s) inside. task-6289956 Forward-Port-Of: odoo/odoo#269447
This update resolves a bug where JSON data couldn't be displayed when clicked in the l10n_in_edi module. The issue stemmed from a change in how binary fields handle data, requiring a conversion to the correct binary format. Now, JSON data is correctly displayed.
Original PR description
**Description of the issue this PR addresses:** This issue was introduced after the refactoring of binary fields [odoo/odoo#244421](https://github.com/odoo/odoo/pull/244421) ,where Binary fields now expect proper binary data and treat string values as base64. The JSON data was passed as a string to a binary field. After the BinaryValue change, this string was treated as base64, which caused a decoding error. **Before this Commit:** Clicking the JSON button resulted in an error: `binascii.Error: Only base64 data is allowed` Due to this, the JSON data could not be viewed. **After this Commit:** JSON data is now converted into the correct binary format using Odoo’s binary handling `(odoo.tools.Binary)` and it displays correctly. [Related Commit](https://github.com/odoo/odoo/commit/41fe2ebdb9cc37341362d7af829c087a5f72f9f1#diff-d3b35dffff8313ee07a08bceb336f03d6130bf001e3b0daa32b098cefcf95c3b) [Full Error Details ](https://pastebin.com/v12sD2vf)
This update resolves a technical issue that could cause errors in the planning module when start and end dates are not specified. By adding a check, the system now avoids attempting planning operations when this critical information is missing, ensuring smoother and more reliable planning processes. This improves the overall stability of the Enterprise version.
Original PR description
Add a guarding condition to the auto-plan or send behavior to avoid doing those operations when no start/end dates are defined --- Task-6312650
This update resolves a potential issue during Odoo upgrades where errors could occur when rules were being processed. The fix prevents errors when fields needed for rule evaluation aren't immediately available, ensuring smoother and more reliable upgrades. This improves the overall stability of the Odoo system.
Original PR description
In a [recent fix], the `_get_all_rules()` method was changed to skip the models that are not yet loaded (during upgrades). However, some rules can be added to an existing model by another module. In that case, the rule is processed even though the fields used in that rule are not yet loaded. This leads to a traceback during upgrades because `optimize()` is trying to access those fields. This commit adds the rule without pre-evaluating it if an `ValueError` is raised during the optimization step. [recent fix]: https://github.com/odoo/odoo/pull/267676
This update resolves a bug in the testing process for SEPA Direct Debit payments. The test was failing because the payment status was incorrectly identified as 'reconciled' instead of 'paid'. This change ensures the payment is validated only when it's in the correct 'paid' state, improving test reliability.
Original PR description
The `test_expiry` test creates a payment via the `pay_with_mandate` method. Depending on eg. the installed modules, the resulting payment ends up either `paid` or `reconciled`. Afterwards, the test tries to validate the payment, which requires that it not be in the `reconciled` state. This causes an error linked below. This PR adds a condition to ensure the payment is in the `paid` state before attempting to validate it. Error: https://runbot.odoo.com/odoo/error/240557 Forward-Port-Of: odoo/enterprise#112224
This update fixes a minor issue within the Odoo composer tool that prevented users from correctly placing the cursor at the end of lines when adding mentions. The fix adds a special character to ensure proper browser handling of text editing, improving the user experience. This ensures users can accurately format their messages.
Original PR description
### Purpose of this PR: - Inserting a mention in the composer results in a paragraph ending with a bare `<a>` element and no trailing text node. This causes the browser to mishandle the End key, moving the caret to the start of the next paragraph instead of the end of the current line. - Fix by appending a \uFEFF (zero-width no-break space) text node. task-6295924 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#271802 Forward-Port-Of: odoo/odoo#269699
This update fixes a potential issue where changes to knowledge articles (sharing, favorites, editing) weren't reliably applied. The update ensures the correct article is loaded before any modifications are made, enhancing the user experience and data consistency. This improves the reliability of the knowledge base.
Original PR description
With this commit, We ensure we're in the correct article before making any changes (share, add to favorites, edit) using `waitUntil`. We've added a `checkArticle` function to ensure the article is in the correct place in the menu. runbot-error-id~234645 Forward-Port-Of: odoo/enterprise#110642 Forward-Port-Of: odoo/enterprise#110123
This update fixes a temporary access error users experienced when switching between companies within a payroll payrun. The change ensures a smoother transition by verifying access permissions before loading the payrun data, preventing brief errors and redirecting users back to the payrun list.
Original PR description
Steps to reproduce: 1- Open a payrun 2- Switch companies Issue: You get an access error for a moment and then get redirected to payrun list view Cause: When switching companies, the payrun reloads but since it is in the context of a different company, you get an access error. Solution: First check in js before fetching that you have access to the payrun, if not, redirect to the list view instead. Task-6008140
This update ensures that all members of a tax unit, not just the main company, have read access to tax return checks. This allows for quicker identification and resolution of issues causing failures in tax reporting, improving overall data accuracy and efficiency.
Original PR description
Before this commit: Tax Unit Members other than main company have read access to tax returns but don't have read access to tax return checks. After this commit: Tax Unit members other than main company are given read access to tax return checks also, so they can fix checks failing because of them. task-5951364 Forward-Port-Of: odoo/enterprise#113118