Daily updates from Odoo
Friday, July 24, 2026
24 changes · master
Enhancements to existing features
The Chile and Mexico e-invoicing checkout flows now pass the current order into checkout step preparation. This helps ensure category-based extra checkout steps are applied correctly for localized online sales.
Original PR description
Pass `order` to `_get_checkout_step_values` in l10n-specific checkout controllers to support the extra-step category restriction. Community PR: https://github.com/odoo/odoo/pull/258042
This update adjusts how product tags are managed in the AI website sales tools after related product page changes. It helps keep product editing and website product options working reliably as the underlying layout evolves.
Original PR description
**Purpose:** The template for the parent view "product.product_template_form_view" was modified with the product tags moving to another page. Then the field "l10n_pe_edi_tariff_fraction" cannot depend on the product tags position anymore. Task-5215982 See also: - https://github.com/odoo/odoo/pull/237565
Localized bank account details are now shown in a more consistent position across several country-specific modules. This keeps important banking and partner information grouped logically, making forms easier to review and maintain.
Original PR description
Since we have partner_id now on top of holder_name, we want to anchor localization specific fields on top of partner_id instead of holder_name. task-6275796
Resolved issues and error corrections
This update standardizes how Odoo decides whether a database save can happen during key accounting, localization, and social workflows. It helps prevent unintended saves during tests or sensitive actions such as bank statement imports, reducing the risk of inconsistent results or failed processes.
Original PR description
…flag The aim of this commit is to allow forbidding a commit in specific condition and uniformize the way we check if a commit can be done. Context: There are a few places where checking the module.current_test flag isn't enough. For example, some test monkey patch it for specific reason and some business flow like the import of a csv of bank statement can't afford a commit. task-id: None
This fix moves the express mention to the correct section of the French VAT report file sent to Aspone. It helps ensure submitted VAT declarations follow the expected format and are less likely to be rejected or mishandled.
Original PR description
in this commit: https://github.com/odoo/enterprise/commit/93c1a4fe15d1f09e4c3df3a5db0e06006121c027 we added a way to have an express mention in the xml sent to aspone. But we placed it in the "T-IDENTIF" zone, but this zone doesn't accept express mention. It should be located in the form it self. task-6253745 Forward-Port-Of: odoo/enterprise#124471 Forward-Port-Of: odoo/enterprise#123235
When a spreadsheet cannot be opened because its underlying model fails to load, Odoo now stops the follow-up synchronization step that depended on that missing data. Users still receive the intended error notification, but avoid an additional technical crash message.
Original PR description
Current behavior before PR: - In 4204ceb, model creation errors were caught and a notification was shown to the user. - However, syncSheetFromRouter() was still called afterward. Since it relies on model getters, it raise a traceback when no model existed. Desired behavior after PR is merged: - Call syncSheetFromRouter() only after the model has been created successfully. - This prevents accessing model getters when model creation fails and avoids the resulting traceback. Task: [6355245](https://www.odoo.com/odoo/project/2328/tasks/6355245) Forward-Port-Of: odoo/enterprise#124961 Forward-Port-Of: odoo/enterprise#122650
The appointment link copy confirmation now appears only after the copy action has actually been attempted. This prevents automated appointment CRM flows from moving ahead too early, making related tests and user interactions more reliable.
Original PR description
Prior to this commit, the success notification for copying an appointment link to the clipboard was triggered synchronously, while the actual `navigator.clipboard.writeText` execution was deferred inside a `setTimeout`. This caused a race condition (depending on the browser's cpu load) during tours (e.g., `appointment_crm_meeting_tour`). The tour would proceed and restore the mocked clipboard object (`oldWriteText`) before the deferred `setTimeout` block had a chance to execute. This commit fixes the issue by moving the notification logic inside the `setTimeout` callback. The tour is also updated to wait explicitly for the success notification before cleaning up the clipboard mock and proceeding to discard the slots. runbot-241004 Forward-Port-Of: odoo/enterprise#124439
Odoo now places certificates from emSigner correctly in signed PDF documents after recent changes on the emSigner side. This prevents visibly misaligned certificates and helps keep signed documents professional and readable.
Original PR description
Before: - Certificate added by emSigner was misaligned in the signed PDF after recent UI changes. After: - Updated coordinates to ensure the emSigner certificate is properly aligned and displayed correctly in Odoo. task-6105264 Forward-Port-Of: odoo/enterprise#113402
Businesses can once again add comments when submitting Belgian VAT return XML files. This restores a previously available option that had been removed by mistake, helping teams include required context with filings.
Original PR description
This feature had been mistakenly removed. Forward-Port-Of: odoo/enterprise#124865
Shop Floor now places manufacturing orders with scheduled work ahead of orders that have no planned start time. This makes the work center view match the standard work order list and helps teams focus on jobs that are ready to proceed.
Original PR description
## Problem In shop floor, MOs with unplanned work orders get sorted before MOs that have planned operations, which contradicts the normal nulls last sorting for work orders. ## Solution We will…
## Problem In shop floor, MOs with unplanned work orders get sorted before MOs that have planned operations, which contradicts the normal nulls last sorting for work orders. ## Solution We will update the sorting logic in the MrpDisplay component to more gracefully handle falsy date_start values, sorting them to the end. ## Steps to reproduce (runbot 19) 1. Create 2 MOs with an operation (work order) involving a work center, we'll call them A and B. 2. Open Shop Floor and open the work center that the MOs' work orders belong to, and note they are ordered A, B (this is fine, neither are planned so the precedence falls back to id 3. Go back to MO B and plan it. This should give it precedence in Shop Floor 4. Under the work center in Shop Floor, note that the MOs are still ordered A, B, despite B's work order having a start date and A's work order not having one To further motivate this being unintended, you can go to Manufacturing > Operations > Work Orders, and you'll see MO B's work order sitting at the top of the list. opw-6303323 Forward-Port-Of: odoo/enterprise#123983 Forward-Port-Of: odoo/enterprise#121693
This fix keeps embedded views aligned correctly when they appear at the top of a Knowledge article. It prevents a visual spacing issue caused by editor selection placeholders, preserving the intended layout for users editing Knowledge content.
Original PR description
This commit updates the embedded view top-alignment selector to account for selection placeholders introduced by https://github.com/odoo/odoo/commit/edf7f7bb0c62978640c181eccb4934855d5d872d. This preserves the intended top-alignment behavior when an embedded view is the first editable element in the knowledge editor. Task-5951196 Forward-Port-Of: odoo/enterprise#125080
This fix prevents the report editor from continuing to run after its display frame has been removed. It reduces crashes and test failures during report preview or editing, making the Studio report editing experience more reliable.
Original PR description
In the ReportEditorIframe component, the iframe may be removed at some point, to be replaced by another one. The problem is that the editor is destroyed only when the new iframe is loaded, so there…
In the ReportEditorIframe component, the iframe may be removed at some point, to be replaced by another one. The problem is that the editor is destroyed only when the new iframe is loaded, so there is a period of time in which the previous editor is alive, but the iframe is destroyed. It can causes issues with plugins, which assumes that we have a valid editable zone. For example, here is a common traceback:
test_print_preview (odoo.addons.web_studio.tests.test_report_editor.TestReportEditorUIUnit.test_print_preview)
Error received after termination: TypeError: Cannot read properties of null (reading 'getComputedStyle')
at http://127.0.0.1:8069/web/assets/e9a3359/web.assets_web.min.js:16264:290
at Array.filter (<anonymous>)
at ToolbarPlugin.getFilteredTargetedNodes (http://127.0.0.1:8069/web/assets/e9a3359/web.assets_web.min.js:16264:201)
at ToolbarPlugin._updateToolbar (http://127.0.0.1:8069/web/assets/e9a3359/web.assets_web.min.js:16259:83)
at http://127.0.0.1:8069/web/assets/e9a3359/web.assets_web.min.js:5325:117
The fix is to subscibe to the removal of the iframe, and destroy immediately the editor.Shopee order lines now show the SKU for the specific product variant instead of the general product template when variants are used. This makes order details clearer for sales and fulfillment teams and reduces confusion when reviewing Shopee orders.
Original PR description
Currently, _prepare_order_lines_values resolves SKU as `item_sku or model_sku`. Shopee always sends item_sku (product.template SKU), so when a listing has variants the order line description shows the template SKU ([item_sku]) even though the correct variant is linked via `model_sku`. task_id: 6335110 Forward-Port-Of: odoo/enterprise#124428 Forward-Port-Of: odoo/enterprise#124031
This fixes how the point-of-sale barcode lookup feature checks whether a user may create new products. The permission is now evaluated immediately and consistently, helping avoid incorrect product creation options appearing during POS workflows.
Original PR description
Replace the asynchronous `allowProductCreation` method with the `hasProductCreationAccess` getter to evaluate product creation permissions synchronously and ensure consistent behavior. Task-6361787 Related PR: https://github.com/odoo/odoo/pull/274420 Forward-Port-Of: odoo/enterprise#125237 Forward-Port-Of: odoo/enterprise#123073
AI tool failures caused by invalid automated inputs are now logged without long error tracebacks, reducing noise in system logs. Detailed traceback information remains available in debug logs for teams that need to investigate issues.
Original PR description
Tool failures from bad LLM arguments were logged at ERROR level with a full traceback, polluting the logs. I have changed the logger to log error not exception so we get rid of the traceback error added another debug logger to show the traceback also task-6250418 Forward-Port-Of: odoo/enterprise#124241 Forward-Port-Of: odoo/enterprise#120281
The asset Related Entries button is now labeled Related Items and opens directly as a list instead of leading users into an unhelpful journal item form. This makes reviewing the accounting items linked to an asset simpler and less confusing.
Original PR description
If you create an asset and confirm it, you can see the Related Entries using the smart button Related Entries. The list view that opens is clickable, but it opens a quite useless form view of the Journal Items. - Rename breadcrumb button to Related Items - Make it behave like action_account_moves_all, to not open form view Ticket: [6385260](https://www.odoo.com/odoo/project/967/tasks/6385260) Forward-Port-Of: odoo/enterprise#124672
This fixes an issue where companies using the Peru localization could be blocked from creating certificates when the Chile localization was also installed. The Chile-specific serial number requirement now applies only where appropriate, preventing unnecessary setup errors for other Latin American localizations.
Original PR description
With a l10n_pe company and having a l10n_cl company installed: - Try to create a certificate in the settings, there is a missing field error. The template certificate_certificate_view_form have a required subject_serial_number field in l10n_cl but it shouldn't in other latam localization. opw-6274126 Forward-Port-Of: odoo/enterprise#120211
The draft button in Uruguay electronic invoicing now returns a valid response when called remotely. This prevents an error that could interrupt users or integrations when resetting an invoice to draft.
Original PR description
Calling the method in RPC causes an error: ``` TypeError: cannot marshal None unless allow_none is enabled ``` Forward-Port-Of: odoo/enterprise#125285 Forward-Port-Of: odoo/enterprise#124653
Automated barcode tests for scrap operations were adjusted so entered quantities are kept correctly during screen updates. This reduces random test failures and helps keep inventory and manufacturing barcode workflows stable.
Original PR description
These barcode scrap tours randomly trigger "You can only enter positive quantities." on runbot: the quantity set with a raw input.value is dropped when the field re-renders before the scrap is saved, so it scraps 0. Dispatching an input event keeps the typed value. error-238911 Forward-Port-Of: odoo/enterprise#124952
This fixes how the French VAT report fills the BA zone so it uses the required free-text field format instead of a numeric value. The change helps ensure generated VAT reports comply with the expected French reporting structure and reduces filing errors.
Original PR description
The value inside the BA zone needs to be a "TexteLibre1" and not a value no task id Forward-Port-Of: odoo/enterprise#125335
The timesheet percentage now stays current as users add, edit, or remove timesheet entries. This avoids confusion from outdated percentages remaining visible until the page is reloaded.
Original PR description
Issue: The percentage is only updated after reloading the page. Cause: The percentage computation is performed inside `loadTimesheets`, which is only called when the timesheets are loaded. Fix: Move the percentage computation into a helper function and invoke it whenever a timesheet is added, updated, or removed. task-6401186 Forward-Port-Of: odoo/enterprise#125312 Forward-Port-Of: odoo/enterprise#125074
Users can now rename Studio fields with labels written in Arabic or other non-Latin scripts without triggering an invalid field name error. This prevents a confusing failure when creating or editing fields for multilingual users, while keeping the existing technical field name when a safe new one cannot be generated.
Original PR description
Steps: - Install web_studio - Add any field (example char field) to any view - Rename it in arabic, example `السَّلَامُ عَلَيْكُمْ` - Error Custom field names cannot contain double underscores Webclient (view_editor_model) escape every non-alphabetic chars, so new label value contains nothing but a space which will be replaced by a _ this new label value will be concatenated to `x_studio_`. Resulting to the string `x_studio__`. A solution should be to prevent changing the technical name if the new label value (escaped) is empty. opw-6311027 Forward-Port-Of: odoo/enterprise#125299 Forward-Port-Of: odoo/enterprise#121343
The My Planning calendar now visually marks draft planning entries with the expected hatched style. This helps users quickly distinguish draft plans from confirmed ones and reduces confusion when reviewing schedules.
Original PR description
Issue: Calendar entries appear plain even when they should appear hatched. (ex. while in draft status) Steps to reproduce: If you create any planning and set it to draft. Then go to Planning > Planning > My Planning, the newly created plan should be in hatched but it becomes plain. Cause: In the view planning.slot.my.calendar there was missing the element that causes the views to become hatched when in draft status. Solution: Added said element. opw-6260055 Forward-Port-Of: odoo/enterprise#119153
Code cleanup and technical improvements
This change updates several Odoo Enterprise apps to work with the newer web interface framework. It is mainly an internal compatibility cleanup that helps keep fields, widgets, and patched components working reliably without changing business workflows.
Original PR description
Owl 3 turns a component's `props` into an instance field built by `useProps(schema)`, so the static `SomeComponent.props` attribute no longer resolves. The web components whose schema was read from here now export it as a const, so spread that const instead:
static props = { ...Many2OneField.props }
props = useProps({ ...many2OneFieldProps })
The owl2 descriptors used by the overriding components are translated to the new `t.*` schema at the same time, and subclasses that only re-declared the parent schema without adding anything simply drop their declaration and inherit it.
Patches that used to extend a component's props through `patch(Comp, {props})` now extend the exported schema directly, since patching the static attribute no longer has any effect.