Wednesday, August 26, 2026
24 changes · saas-19.2
Enhancements to existing features
The Indian localization stock demo data now includes a warehouse for the Indian demo company. This makes testing and demonstrations involving e-way bills easier because teams no longer need to create a warehouse manually.
Original PR description
Following the task-4034713, we used to create warehouse for all company but after this task we only create warehouse for the main company while testing for Indian Demo company considering the ewaybills it's annoying to create a new warehouse for Devs and POs and even for Demos After this commit, we will create demo warehouse for the Indian demo company Task [link](https://www.odoo.com/odoo/project.task/4034713) task-4034713 Forward-Port-Of: odoo/odoo#283797
Resolved issues and error corrections
A small error in the accounting report protection list has been corrected. This ensures two important accounting reports are properly protected from deletion, helping prevent accidental removal of standard documents.
Original PR description
On `ir.actions.report` we want to block the unlinking of specific reports in odoo. However, when the list was created a comma was missed between `action_account_original_vendor_bill` and `account_invoice_without_payment` which means we were actually protecting against people unlinking `action_account_original_vendor_billaccount_invoice_without_payment`. Adding in that comma will allow these two records to be properly protected. task-none Forward-Port-Of: odoo/odoo#283323
This update improves the error message shown when sending a French e-invoicing credit note fails during EDI document generation. Users now receive clearer guidance, reducing confusion and making the issue easier to understand.
Original PR description
Steps to reproduce: - Install `l10n_fr_pdp` module > Switch to `FR Company` - Activate `French e-invoicing` (Demo mode) - Create a New `Credit Note` with `FR Customer` > Send Issue: The system currently displays a confusing error message during EDI document generation. We are making the error message clearer and more user-friendly. opw-6412521 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284189
The mail meeting test flow now closes the camera permission prompt before entering a guest name. This prevents an intermittent blockage that could cause automated checks to fail, helping keep releases stable.
Original PR description
Before this commit, discuss.meeting_view_public_tour failed on runbot at the step typing the guest name: "It is not allowed to do action on an element that's below a modal." This happens because the welcome page opens the camera permission dialog as soon as navigator.permissions.query answers "prompt", and that answer comes at no fixed moment. The tour types the name first and closes the dialog only on the next step, so a dialog already open covers the input. This commit closes the dialog before typing the name. https://runbot.odoo.com/odoo/error/946301
General customer notes added at checkout are once again printed on point-of-sale receipts. This ensures staff and customers see important order-level instructions even when the note is not tied to a specific product line.
Original PR description
## Steps to reproduce: - Go to the pos, click a product - Click the product again to unselect the line - Go to the 3 dots -> customer note - Enter a customer note, pay for the order - Try and print the receipt -> The customer note is not displayed ## Why the fix: Since the receipt REF, the general customer note was not displayed on the ticket anymore, but in was in earlier versions. When making a customer note without a selected line, we make a general one, which is not attached to a product line, so it was never displayed. We now display the general customer note if it exists, after having displayed all lines, as we did before 19.2. opw-6483621
This fix makes the ordering of journal filter groups consistent, preventing random test failures caused by groups sharing the same default order value. It helps keep accounting report validation stable without changing business functionality.
Original PR description
The journal groups created in the test share the default sequence (10), so _get_journal_groups' order='sequence' has no tiebreaker and it may be returned in any order, making the assertions randomly fail. Assign an incrementing sequence per created group so the order is deterministic. runbot-941251
The barcode manufacturing scrap test now waits for the product quantity field to be ready before entering a value. This prevents valid scrap operations from being rejected as zero quantity, improving confidence in automated checks for inventory workflows.
Original PR description
Selecting the product in the scrap form triggers a `stock.move` onchange. The quantity step only waited for the input to exist, not for that onchange to be applied, so the value could be written while it was still in flight and be reset to 0 by its response. It was also assigned directly on the input, without any event, so the field was never flagged as dirty. The scrap was then recorded with a quantity of 0 and `action_scrap` rejected it with "You can only enter positive quantities.". Wait for the quantity input to hold its post-onchange value before typing, and dispatch an input event, like the other scrap tours already do. error-238911
Website editors can now change a custom button's text color without accidentally removing its gradient background. This preserves the intended page design and avoids extra rework when styling buttons.
Original PR description
Steps to Reproduce : 1. Go to Website → Edit Mode 2. Add a snippet with button 3. Click on button and change its type to : " Custom" 4. Apply the gradient type color in fill color option 5. Apply any…
Steps to Reproduce : 1. Go to Website → Edit Mode 2. Add a snippet with button 3. Click on button and change its type to : " Custom" 4. Apply the gradient type color in fill color option 5. Apply any color in text color option 6. You will notice that the gradient type color in fill color option is removed. Problem: Since [this commit][1] new button style options have been added to the sidebar. If one changes the style of a button to custom, changes the background to gradient, and tries to change the text color, the background gradient is removed. Cause: Whenever a gradient is added either to text or as a background, it is applied as a background image. In the case of a text gradient, an additional class, `text-gradient`, is applied for correct styling. Once a change to either color or background/fill is applied that is not a gradient color change, the background image of the element would be reset to nothing. This is the result of [this line][2] from a [previous commit][3]. In the case of a button, this meant changing the font color would reset the background. That is not the desired outcome. The flaw was only discovered once new options were added to change non-text/font elements' backgrounds to gradient. Solution: An additional check has been added to see if the element being edited is text. If so, and it's a gradient style being changed, we remove the background image. Otherwise it is kept so that the button case from above is resolved. [1]: https://github.com/odoo/odoo/commit/2bf1db001b195480b963b338583c170aa1c009a3 [2]: https://github.com/odoo/odoo/blob/8e0845712f462ecfafd2176406dcbafc869a5564/addons/html_editor/static/src/main/font/color_plugin.js#L575 [3]: https://github.com/odoo/odoo/commit/8e0845712f462ecfafd2176406dcbafc869a5564 task-6247134
French VAT XML submissions now automatically split long account holder names to meet the official 35-character field limit. This helps prevent electronic filing rejections caused by names that are too long.
Original PR description
The XSD for XML-EDI does not allow strings longer than 35 for TitulaireDesignation This commit splits the holder name in 2 parts when it is more than 35 characters task-6476440 Forward-Port-Of: odoo/enterprise#129091 Forward-Port-Of: odoo/enterprise#128239
Sales email templates now use separate complete sentences for quotations and orders. This helps translators adapt grammar correctly in each language, making customer-facing messages sound more natural and professional.
Original PR description
The quotation and pro forma email templates inserted either "quotation" or "order" into shared translatable text. In French, for example, "devis" is masculine while "commande" is feminine, so the surrounding articles and adjectives cannot agree with both terms. Define a complete sentence for each document state so translators can translate the surrounding grammar independently. opw-6445304 Forward-Port-Of: odoo/odoo#283901 Forward-Port-Of: odoo/odoo#283229
The website test flow now waits until a page record is properly selected before attempting to delete it. This reduces random automated test failures, helping keep website-related changes more stable and reliable.
Original PR description
Fix the random tour failure by making sure the record is selected before trying to delete it. runbot-944542
This fixes how Odoo Mail identifies extra attachments in messages so the system reliably treats them as attachment records. It helps ensure messages with inline images only show the remaining non-inline files in the attachment list.
Original PR description
Before this commit, `extra_body_attachment_ids` is declared with `fields.Attr("ir.attachment", { compute() })`, while its compute returns the records of `attachment_ids` that the body does not inline. The model name is therefore the default of an attr field, and only a read inside an update cycle answers that string, as the compute runs on the first read outside one. No reader of the field does that today.
This commit declares the field as the `fields.Many("ir.attachment")` its compute returns, so that the declaration matches the value before the first compute as well as after.
Note that the added test asserts that a message inlining one of its two images lists only the other one, which nothing covered so far. It passes without this change.
Forward-Port-Of: odoo/odoo#284445The German tax report export now keeps decimal cents for the Kz83 amount instead of rounding it down to a whole number. This helps ensure submitted tax XML reports show accurate monetary values, such as 26.40 rather than 26.00.
Original PR description
Description of the issue this commit addresses: The German tax report XML casts Kz83 to an integer before formatting it. This truncates decimal values, causing amounts such as 26.40 to become 26.00. --- Desired behavior after this commit is merged: This commit preserves the Kz83 decimal value and formats it with two decimal places in the German tax report XML. --- task-6414439 Forward-Port-Of: odoo/enterprise#125607
Fixes an error that could occur when users selected several appraisals and marked them as done from the list view. Each appraisal now gets its completion message and notification correctly, so HR teams can process batches without interruption.
Original PR description
Steps to reproduce: - select multiple appraisals and try to mark as done from list view. Issue: - The completion notification uses an appraisal variable assigned by a previous loop, raising an UnboundLocalError. Furthermore, message_notify() requires a singleton. Fix: - notify and post the completion message for each appraisal explicitly. task-6479018 Forward-Port-Of: odoo/enterprise#128207
This fix closes a gap that allowed a newly created fiscal year to fully contain an existing fiscal year without being flagged as overlapping. It helps keep accounting periods accurate and prevents inconsistent fiscal year setup.
Original PR description
Before this commit: - The current constraint for overlap check allows if we define a new, larger fiscal year that completely swallows an existing smaller one (e.g., creating Aug 2025 - Nov 2026 when Sept 2025 - Oct 2026 already exists). After this commit: - The constrain domain was changed to consider the above missed case. no task Forward-Port-Of: odoo/enterprise#128942
Gantt charts using a weekly view now place tasks in the correct week based on the user's localization, such as weeks starting on Sunday. This prevents tasks from appearing in an extra incorrect column and keeps scheduling views accurate for localized workflows.
Original PR description
In Gantt views, for a given focus date, the appropriate time interval is displayed by finding its start and end date, based on the scale. For example, if I focus on 18 may 2026 with a month scale,…
In Gantt views, for a given focus date, the appropriate time interval is displayed by finding its start and end date, based on the scale. For example, if I focus on 18 may 2026 with a month scale, then the whole month of may is displayed. The behaviour was as expected in standard code, because all localisations agree on the beginning of the available scales (day, month, year). In custom code, however, some customer requires to see the gantt charts with a weekly scale. The differences in start of the week based on the localisations and the inconsistencies of use of localStartOf breaks the view. For example, if the localization has the start of the week on a sunday, and a task on the first column starts on a sunday as well, it will get assigned to column before (because it considers sunday as the last day of the previous week). The column before the first column does not exist, so one empty column is created to put the task in it. This commit fixes these inconsistencies so that GanttRenderer behaves as expected with weekly scales, without changing the standard behaviour. Tests are written to check both that the task is assigned to the proper localized week (starting on Sunday) and column (1, not 0). Forward-Port-Of: odoo/enterprise#118625
This fix ensures French VAT reports do not treat whitespace-only express mention reasons as valid content. It prevents incomplete XML submissions to ASPOne, reducing filing errors for businesses using French tax reporting.
Original PR description
While sending the tax return to ASPOne, before adding the BC zone we are checking that BA zone won't be empty as if BC is completed there must be the BA zone in the xml file. The problem is that when we have only whitespaces, the condition will be respected but later on due to cleanup_xml_node(), the BA zone will not be rendered in the xml but BC will and it leads to an error This commit checks that express_mention_reason fields is not empty or not only whitespaces task-6476440 Forward-Port-Of: odoo/enterprise#128242
Appointment invitation emails now generate public calendar links without triggering permission errors. This ensures invitees can reliably receive and open their calendar invitations.
Original PR description
Since calendar attendee access tokens are restricted to system users, appointment mail templates must sudo token reads when generating public calendar links. This follows the same pattern as the calendar mail templates and avoids an AccessError when rendering attendee invitation emails. ref: https://github.com/odoo/enterprise/commit/88a3cca752a5f726cd0260b485fc93f65a268cf8 Forward-Port-Of: odoo/enterprise#128959
The partner website templates were adjusted to match a newer required format in Odoo. This prevents display or loading issues for partnership pages after recent platform changes.
Original PR description
Since odoo/odoo@95edcd9c7025, the new t-call syntax (passing variable as parameter) is mandatory, so update templates accordingly. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
UPS shipping rate checks now follow UPS rules for phone numbers, allowing valid shorter numbers used in countries such as Luxembourg. This prevents customers or staff from being blocked when requesting UPS shipping rates with legitimate phone numbers under 10 digits.
Original PR description
**Steps to reproduce:** - Create a contact with a phone number that has 9 characters - Setup an UPS carrier, a configuration that works is UPS Saver as Service Type and UPS Package/customer supplied…
**Steps to reproduce:** - Create a contact with a phone number that has 9 characters - Setup an UPS carrier, a configuration that works is UPS Saver as Service Type and UPS Package/customer supplied as a package type - Create a quotation, put the created contact as a client - Try adding a shipping and getting the rates - An User Error appears, the phone number is too short **Why the fix:** Before this commit, any phone number that was less than 10 characters would raise an User Error, but some countries, such as Luxembourg, use phone numbers that are nine characters long or even less. If we check the official UPS documentation (https://developer.ups.com/tag/Shipping?loc=en_EN#operation/Shipment), we can see in the Ship_to/Phone section, that the phone number should be a number between 1 and 15, not saying it should be 10 characters or more. <img width="495" height="473" alt="image" src="https://github.com/user-attachments/assets/fed82987-ffb8-4b84-b282-6c3d3b4f304e" /> After this commit, we adapt the way we prevent the user from inputing phone numbers to fit the official UPS documentation. opw-6307577 Forward-Port-Of: odoo/enterprise#128632 Forward-Port-Of: odoo/enterprise#122831
The field service tour now correctly handles both standard and demo worksheet layouts before entering worksheet information. This prevents demo-data test runs from timing out and helps ensure task reports include the worksheet section as expected.
Original PR description
The FSM tour needs to wait until the worksheet view is fully loaded before filling it. Otherwise, the tour may continue too early and the worksheet is not saved properly, causing the worksheet…
The FSM tour needs to wait until the worksheet view is fully loaded before filling it. Otherwise, the tour may continue too early and the worksheet is not saved properly, causing the worksheet section to be missing when previewing the task report. A synchronization step was added for this purpose by waiting for `x_comments`, the default HTML field of a worksheet. (Related: https://github.com/odoo/enterprise/pull/116918) However, the demo Device Installation and Maintenance worksheet replaces the generated form view and does not render `x_comments`. It renders the `x_description` text field instead, causing the tour to time out when demo data is installed. To fix the discrepancy, we need to wait for the editable field of either worksheet variant directly. When the default worksheet is used, fill the `x_comments` HTML editor. When the demo worksheet is used, fill the `x_description` textarea instead. This keeps the synchronization needed to avoid the worksheet loading race while allowing the tour to run with and without demo data. [error-939242](https://runbot.odoo.com/odoo/error/939242) Forward-Port-Of: odoo/enterprise#128245
The lunch ordering test now waits for the intended test product to appear after changing location before placing an order. This prevents intermittent failures caused by outdated demo products still showing during reloads, making validation of the Lunch app more dependable.
Original PR description
The lunch order tour selects `Farm 1` before ordering a product. However, it only waits for the location input to be updated before clicking the first kanban record. With demo data installed, a product from the previous location can still be displayed while the product model is being reloaded. The tour can therefore order a demo product instead of the product created by the test. This notably fails during weekends when the corresponding demo vendor is unavailable. To fix we need to wait for the product created by the test before clicking it. Besides selecting the intended product, this also ensures that the product reload following the location change has completed. [error-181572 ](https://runbot.odoo.com/odoo/error/181572) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281753
This update stabilizes an automated website test related to closing popups. It helps reduce false failures in the development pipeline, making releases smoother without changing customer-facing behavior.
Original PR description
The test `undoing something on a target outside s_popup closes it` had a few fails in CI: the `fa-eye-slash` was not set as expected. This commit adds a `waitSidebarUpdated` call just before to ensure owl has no pending rendering when checking the eye. The fix is similar to aaf0f54d1feda60becb0bfbad578b366715c0172 which is about a similar failure in another test. runbot-938967 Forward-Port-Of: odoo/odoo#284381
The salary configurator now handles cases where no company bike is configured, instead of showing an error when the bike option is selected. This helps recruiters and HR teams continue preparing offers smoothly even when bike fleet data is missing.
Original PR description
Steps to Reproduce: - install l10n_be_hr_contract_salary module. - make sure that there is no model with vehicle type bike in fleet. - create an offer in recruitment. - open salary configurator. - click on company bike checkbox. Issue: - traceback occurs when enabling the company bike option without a configured bike. Reason: - the company bike depreciated cost value is empty when no bike is available, but the code tries to split it into bike options and vehicle ID resulting in a traceback. Solution: - Use the condition to check if the company bike depreciated cost is available before spliting the value. - Set the depreciated cost to 0 when no bike is selected. task-6468987 Forward-Port-Of: odoo/enterprise#127898