Wednesday, August 26, 2026
17 changes · saas-19.1
Resolved issues and error corrections
Invoices created from point-of-sale orders linked to sales orders now keep the customer reference from the original sales order. This helps businesses maintain clearer traceability between customer orders and invoices, while still preserving POS reference information for consolidated invoice batches.
Original PR description
The pos_sale override of _prepare_invoice_vals left ref and invoice_origin untouched, so the SO's client_order_ref was lost on the invoice. The fix is to mirror sale.order._prepare_invoice and set both fields from the linked SO, while preserving pos_reference traceability for mixed consolidated batches. task-id: 6295629 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278035
This update simplifies a costly styling rule in the enterprise messaging interface. It helps keep the interface efficient without changing the visible user experience in any meaningful way.
Original PR description
This PR cleans up a complex selector that is quite costly without providing any striking visual value. task-6481656
This fix adjusts point-of-sale self-ordering behavior so an IoT connection warning does not appear when it is not relevant. It helps avoid confusing kiosk users and keeps the related automated test aligned with the intended experience.
Original PR description
This PR fixes the test where iot request triggers a "failed to contact your iot box on local network popup" Forward-Port-Of: odoo/enterprise#128388
Marking multiple appraisals as done from the list view now completes correctly instead of triggering an error. Completion notifications and messages are sent for each appraisal, helping HR teams process appraisal 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
UPS shipping rate checks now allow phone numbers that match UPS documentation, including shorter numbers used in some countries. This prevents valid customers, such as those with Luxembourg phone numbers, from being blocked when adding shipping rates.
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 fiscal year validation now catches cases where a newly created fiscal year fully contains an existing one. This helps prevent duplicate or conflicting accounting periods that could cause reporting or closing issues.
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
This fixes an automated Knowledge calendar walkthrough that could fail when creating or editing calendar item properties too quickly. The change makes the test steps more reliable, helping prevent false failures during quality checks without changing user-facing behavior.
Original PR description
In `knowledge_calendar_command_tour`, we were experiencing two issues 1. First, when we change the properties of a new calendar item, we were running into an issues where the tour would fail due to…
In `knowledge_calendar_command_tour`, we were experiencing two issues 1. First, when we change the properties of a new calendar item, we were running into an issues where the tour would fail due to not being able to locate the dropdown option to create a new property. This only occurs if you don't set a step delay on the tour. This happens because in the `editSelectMenuInput` helper, we first check if the dropdown is open bfore we proceed. Since the tour runs so fast, we detect that the dropdown for the first property is open, so we pass the check. However, this then closes since we've moved on to the next dropdown, and since nothing has been input into the next dropdown, the create option doesn't appear. Now, we ensure that the create option will be present before attempting to click it 2. Later in the tour, we attempt to edit the properties on a new calendar item. We previously used `edit` to edit the property name, however this resulted in the "Select a template" modal being opened, which broke the tour, since we needed to click elements behind it. Using `fill` instead to populate the text field doesn't produce this behavior, allowing the tour to proceed without error. [runbot-939647](https://runbot.odoo.com/odoo/error/939647?debug=assets) Forward-Port-Of: odoo/enterprise#128830
This fix ensures French VAT returns sent to ASPOne do not treat whitespace-only express mention text as valid content. It prevents incomplete XML submissions that could otherwise be rejected, improving reliability for businesses filing French tax reports.
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
Gantt charts using a weekly view now place tasks in the correct week based on the user's local start-of-week setting. This prevents extra empty columns and misplaced tasks for regions where the week starts on Sunday, while keeping existing behavior unchanged for standard views.
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
French VAT XML-EDI reports now handle long account holder names by splitting them into acceptable parts. This helps prevent rejected submissions when holder names exceed the official 35-character limit.
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
Copying an image that is already linked elsewhere now reuses the existing attachment instead of creating an unnecessary duplicate. This helps keep stored files cleaner and avoids redundant attachments without changing the user workflow.
Original PR description
Copying an image attachment already linked to another record could leave a redundant duplicate behind instead of reusing the existing one. opw-6463012 Forward-Port-Of: odoo/odoo#283221 Forward-Port-Of: odoo/odoo#282287
The lunch app’s automated order check now waits for the correct test product to appear after changing location. This prevents intermittent failures caused by accidentally selecting leftover demo products, especially when some vendors are unavailable.
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 testing pipeline, supporting smoother releases 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
Fixed the Field Service report walkthrough so it works whether demo worksheet data is installed or not. This prevents the automated tour from timing out and helps ensure task report previews include the worksheet section correctly.
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
This fixes how Odoo Mail identifies attachments that are not embedded in a message body. It helps ensure separate attachments are recognized reliably and displayed as expected, reducing the chance of missing or inconsistent attachment lists.
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.Appointment invitation emails now handle calendar access tokens correctly when creating public calendar links. This prevents invitation emails from failing to generate for attendees, improving reliability for appointment communications.
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
Point of Sale cash in/out receipts now print correctly when the reason text is very long. This prevents company details at the bottom of the receipt from being squeezed or mixed with the reason, improving receipt readability for stores using supported printers.
Original PR description
Steps to reproduce ------------------ 1. link an epson printer to the PoS 2. open a session and make a cash out with a long line reason 3. print the receipt -> the company info at the bottom is…
Steps to reproduce ------------------ 1. link an epson printer to the PoS 2. open a session and make a cash out with a long line reason 3. print the receipt -> the company info at the bottom is printed on 2 or 3 characters per line and the reason is printed next to it Why it's happening ------------------ The reason value is a `float: right`, and with a long reason the float takes almost all the width of the receipt. The company info, which is below the reason since `fd8845b393fc`, is a `d-flex` block, and a flex container is not allowed to overlap a float, so it only gets the width that is left next to it. Its two columns become very narrow and, as they use `text-break`, the text is cut in the middle of the words. The fix ------- From 19.2 the receipt is rendered on the server and the label and the value are in a table, 2 cells side by side, so no overlaping there. We do the same here but with flex instead of tables, since it's simpler. We also add `text-break` on it for the reasons with a very long word. ### Before <img width="618" height="876" alt="image" src="https://github.com/user-attachments/assets/1580d040-a6f0-468e-9da4-830b9a71cdac" /> ### After <img width="682" height="651" alt="image" src="https://github.com/user-attachments/assets/d2ddf293-57b0-467e-aa87-7f761121915d" /> opw-6473483 Forward-Port-Of: odoo/odoo#284203