Wednesday, September 2, 2026
63 changes · master
Enhancements to existing features
The Timesheets app now directs users to Odoo's newer Timesheets Assistant browser extension instead of the older Activity Watch extension. This helps users find the recommended tool for tracking work activity and completing timesheets more smoothly.
Original PR description
Before this commit, the links pointing to the browser extension of Activity Watch. However, a new extension called Timesheets Assistant has been published by Odoo to improve the Activity watch extension. This commit replaces the links pointed to the browser extension to set the links for Timesheets Assistant browser extension. task-6470304 Forward-Port-Of: odoo/enterprise#129883
Status buttons now show clearer visual feedback for hover, pressed, open, and current states. This makes workflow progress indicators easier to understand and avoids confusing highlights after a user clicks a step.
Original PR description
- requires https://github.com/odoo/enterprise/pull/130030 The statusbar buttons painted `:hover` and `:focus` alike, so a button stayed highlighted after being clicked. That rule is also more…
- requires https://github.com/odoo/enterprise/pull/130030 The statusbar buttons painted `:hover` and `:focus` alike, so a button stayed highlighted after being clicked. That rule is also more specific than Bootstrap's `.btn:first-child:active` and `.btn.show`, so it kept winning the cascade while the cursor was on the button: the pressed state only appeared once the pointer left it, and an open `...` dropdown read as merely hovered. Restrict the rule to `:hover`, and give `:active` and `.show` a declaration of their own on a dedicated `--o-statusbar-background-pressed` token. The current step was painted through the `disabled` attribute, which tied its look to the button being disabled and forced anything restyling the bar to go through `--btn-disabled-bg`. Paint it from its own `.o_arrow_button_current` class instead, declared last so it outranks the states above, and leave `:disabled` with nothing but the muted color of the steps that are not the current one. The three backgrounds are no longer declared on `.o_statusbar_status`: they are read where they are used, with the `btn-secondary` design map as a fallback. An edition or a component can now set `--o-statusbar-background-hover`, `-pressed` or `-current` on the bar without having to reach into these rules. The hr timeline only overrode these states to compensate for a hover as dark as the selected version: the reviewed web states cover it, so the override goes away. task-6518027 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The page navigation control now uses the standard button group style already used in similar Odoo toolbars. This reduces duplicated styling and keeps the control panel visually aligned, with only a minor interface consistency impact for users.
Original PR description
The pageSwitcher shipped its own SCSS duplicating the `o_switcher` meta-component from web_enterprise: same padding, background, border and radius, same `--btn-*` overrides. Drop it and let the pageSwitcher render as a regular `btn-group`, like the gantt and calendar toolbars. The pageSwitcher sits next to the view switcher, which `o_switcher` makes taller than a standard button, so stretch `.o_cp_pager` to keep the control panel row on a single height. No effect in community or on mobile, where nothing in that row is taller than a button. The group header pageSwitcher no longer has a wrapper to cancel out, so its reset in `list_renderer.scss` goes away too. task-6518267 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Project To-Do onboarding flow now shows refreshed screenshots that better match the current product experience. This helps new users follow setup guidance more easily and reduces confusion during onboarding.
Original PR description
Update the screenshots of the onboarding to-do --- task-6443670
This update lets Odoo modules choose where editor placeholder text appears instead of forcing it into the default content block. It keeps the existing behavior by default while reducing extra customization work for modules that need placeholders in places such as titles.
Original PR description
Before the placeholder was tied to the default block, so a module that wanted it somewhere else (like a title) had to rewrite the whole plugin. This commit lets a module register its own target instead, keeping the current behavior when nothing overrides it. task-4496371 requires: https://github.com/odoo/enterprise/pull/116529 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Status bars in Enterprise now use clearer visual states for hover, press, and the current step. This reduces confusion by making it easier to see which step is selected in both light and dark mode.
Original PR description
- requires https://github.com/odoo/odoo/pull/285945 The statusbar now reads its hover, pressed and current backgrounds from `--o-statusbar-background-hover`, `-pressed` and `-current`, falling back to the `btn-secondary` design map when nothing declares them. Enterprise had no statusbar stylesheet, so the bar was left with those fallbacks: the hover was as dark as the current step, which made the bar look like it had two selections, and the pressed state was hard to tell apart from either. Declare the three tokens on the gray scale instead, each state a step apart, with the hover and pressed hints kept translucent so they stay lighter than the current step. Dark mode gets its own values: the scale reads the other way round there, so the same three tokens move up a step to stay visible on a dark bar. task-6518027
This update makes India payroll Form 138 setup clearer and more reliable by improving date handling, file naming, and employee filtering. It also prevents accidental creation of responsible person records from settings, helping keep configuration data cleaner.
Original PR description
this PR - removes custom `format_date` by using `odoo.tools.format_date` - adds a placeholder for filename in Form 138 form view (because the default value was `false`) - uses employee's `country_code` to filter in the settings rather than employee's parter's `country_code` (to save the headache) - also restricts on-the-fly creation of `responsible_person` in settings. [Task #6522078](https://www.odoo.com/odoo/project/1251/tasks/6522078)
The accounting reports interface has been updated to use a safer shared mechanism for its button bar. This is an internal improvement that should help keep report actions reliable without changing day-to-day user workflows.
Original PR description
Following odoo/odoo@324ab8b5080fc35367b2e7a63d33e3fa0674a2e1, usePlugin can now be safely used.
The Point of Sale dashboard graph now uses tighter spacing in its card to better match the accounting dashboard design. This is a small visual polish change that makes dashboards feel more consistent across Odoo.
Original PR description
We removed the padding on the left, right and bottom of the graph in the kanban card. task-6488005
This update improves how Sign and VoIP look up internal records, aligning them with a faster shared approach used elsewhere in Odoo. Business users may see small performance gains in related activity, call history, and softphone interactions, with no change to features or workflows.
Original PR description
Enterprise counterpart of "[PERF] mail: speed up a record lookup by local id", which explains the why.
Object.values(Model.records) -> Model.records.values()
https://github.com/odoo/odoo/pull/285358The demo worksheet for device installation and maintenance now looks more realistic, with shorter labels and a clearer two-column layout. Some sample interventions also include completed worksheet details, helping customers better understand how the feature can support real field service work.
Original PR description
This commit reworks the "Device Installation and Maintenance" worksheet template to display its fields in two columns using separators, and shortens the labels so the demo represents a realistic use case and customers can see themselves using the feature. It also fills in the worksheet of some interventions in the demo data. task-6455863
The attachment tab is now visible when creating or editing a work order operation, even before the operation has been saved. This removes an extra save step and makes it easier for users to add relevant documents at the right time.
Original PR description
Attachment tab is not visible if work order operation is not set. This commit makes sure it is always visible, so there is no need to save the operation beforehand task-6392087
The mail module now formats warranty information in a standard JSON format before sending it to the warranty server. This helps ensure the server can reliably read the information and reduces the risk of processing errors.
Original PR description
Format the publisher warranty message using json.dumps() instead of Python's native str() representation. This ensures serializeid JSON serialization for the payload sent to the warranty server. Forward-Port-Of: odoo/odoo#285632 Forward-Port-Of: odoo/odoo#283139
This update prepares the sales discount wizard so its discount values can be reused by subscription-related workflows. It helps keep discount handling more consistent across sales processes, with minimal direct impact on day-to-day users.
Original PR description
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
Belgian payroll employee types are now consistently assigned to Belgium, reducing the risk of incomplete or inconsistent employee setup data. The update also aligns seasonal employee type records with the shared HR definition to avoid duplicate configuration.
Original PR description
Some employee types from the Belgian localization do not have the country id set to Belgium. This commit sets all default employee type country_id to Belgium. The field country_id for hr.employee.type is now required, without enforcing NOT NULL constrain at the sql table level. Instead a constrain is used on the server side and an attribute on the frontend xml to mimic the same behavior. The goal is to ensure data integrity. New sql constrains only applied to a l10n would cause issue in case of an install/uninstall of that same l10n. Additionally, a standalone record for seasonal employee existed in the l10n, along with one hr/. This commits reuse the parent one in hr/ and deletes the standalone record. task: 6511484
The Helpdesk team card layout has been adjusted so the email alias lines up neatly with the team name. This small visual improvement makes the Helpdesk settings screen look cleaner and easier to scan.
Original PR description
In this commit, we remove the margin before the mail alias, ensuring aligment within the helpdesk team card. task-6416578
The test suite now checks the most recent document in the same order users see it in the interface. This reduces confusing test behavior and helps prevent false failures when internal data ordering changes.
Original PR description
Because of missing `sorted()`, we were asserting the last document using the cache order and not the order in which they are in the UI. That brings confusion when reading the code and leads to failing tests if, for some reason, the cache is refreshed.
Payroll payment reports now use a shared way to choose the right export format for each country. This reduces repeated code across local payroll modules, making future updates easier and lowering the risk of inconsistent payment report behavior.
Original PR description
* = l10n_{ae, au, ch, hk, in, sa, us}_hr_payroll, hr_payroll_account_iso2002
Currently, the `action_payslip_payment_report` method in `hr.payroll` and the `action_payment_report` method in `hr.payroll.run` are overridden across multiple localization modules to modify default_export_format.
This results in code duplication, higher maintenance effort, and a risk of conflicts or inconsistencies, since the same method is repeatedly overridden in different localizations just to update a single context value.
This commit will improve the current code by introduce the helper methods `_get_payslip_export_format (hr.payslip)` and `_get_payslip_run_export_format (hr.payslip.run)` to compute `default_export_format`.
This allows Allows localizations to override only these methods instead of full report actions, reducing duplication and avoiding conflicts.
sentry-7391832811This update aligns Odoo Enterprise spreadsheet features with the latest spreadsheet engine changes. It improves reliability for spreadsheet comments, pivots, surveys, and sales field synchronization without introducing major user-facing changes.
Original PR description
See https://github.com/odoo/odoo/pull/285929
Resolved issues and error corrections
This fix prevents time off categories that are not meant to be selectable, such as Attendance, from appearing when users create time off or allocation records. It also avoids confusing balance text being shown for those unavailable categories, helping HR and payroll users choose only valid time off options.
Original PR description
Steps to reproduce: 1. Go to Payroll > Time Off (or Time Off > Management > Allocations). 2. Create a new record or select a cell. 3. Select a time type that has `time_off_selectable` set to False (e.g. Attendance). 4. Observe that the time type is available in selection and appends "(0/0 hours)" to its display name. Cause: - `_compute_display_name` on `hr.work.entry.type` checked `requires_allocation` without verifying if `time_off_selectable` was True. - Selection domains in `hr.leave`, `hr.leave.allocation`, and batch generation wizards did not filter out non-selectable time off types. Solution: - Check `time_off_selectable` alongside `requires_allocation` in `hr.work.entry.type._compute_display_name`. - Enforce `time_off_selectable = True` in selection domains across `hr.leave`, `hr.leave.allocation`, `hr.leave.allocation.generate.multi.wizard`, and `hr.leave.generate.multi.wizard`. Task: 6518178
Features or functions removed from Odoo
An unused local test script was removed from the HTML editor area after being committed by mistake. This cleanup has no expected effect on users or business workflows, but keeps the codebase tidier and avoids confusion for future maintenance.
Original PR description
Remove test_range.js, which was accidentally committed in 27e585796fe1243fc3487c3e236ba704ebcb976f. It’s only a local jsdom test script, isn’t used anywhere. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Code cleanup and technical improvements
This cleanup removes two unused files from the Point of Sale module. It helps keep the codebase simpler and easier to maintain, with no expected change for users.
Original PR description
This commit removes the following unused files: - `static/lib/waitfont.js` - `static/src/app/utils/debug.js` --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Polish bank account verification now handles batches where some partners are missing tax or bank details without causing an error. This keeps verification usable for mixed partner lists and avoids interruptions during routine checks.
Original PR description
When we check for multiple partners with some valid and some being incomplete (no vat or no bank account), a traceback is raised This was due to a bracket accessor, changed into a get in this commit. no-task Forward-Port-Of: odoo/odoo#285898 Forward-Port-Of: odoo/odoo#285631
This fix keeps a temporary accounting setting from being reused longer than intended during invoice and payment processing. It mainly improves reliability in automated tests and complex transaction flows, with little expected day-to-day impact for users.
Original PR description
This commits stop this context key to be leaked beyond necessary. In practice it's rarely an issue because the browser will do separate rpc calls with a clean context each time. It is particularily a problem while running some tests where everything happens in the transaction. task-none
This fix prevents a rare crash when Intrastat reporting logic is run in company access situations outside the standard user interface. It helps keep Danish, Lithuanian, and Swedish Intrastat processes stable for future customizations or edge-case setups.
Original PR description
Due to some trouble with tests, we found that in some cases, this function is called on the root company, and if the user does not have the access rights to read data from the company (users with system rights have them by default), it will cause a crash. This situation is not possible with the standard UI, but we fix it in case it becomes possible in a future version or customization. Forward-Port-Of: odoo/enterprise#129083 Forward-Port-Of: odoo/enterprise#128217
This update prevents an internal invoice synchronization setting from remaining active longer than intended. It reduces the risk of incorrect behavior in accounting workflows, especially during automated tests or multi-step processing in the same session.
Original PR description
… of `skip_invoice_sync` This commits stop this context key to be leaked beyond necessary. In practice it's rarely an issue because the browser will do separate rpc calls with a clean context each time. It is particularily a problem while running some tests where everything happens in the transaction. task-none
This fix makes sure recent changes to internal reference records are saved before they are read by a direct database lookup. It prevents Odoo from using outdated configuration values in this specific workflow, improving reliability for module data handling.
Original PR description
Steps to Reproduce: - write on ir.model.data to modify noupdate. - _lookup_xmlids still returns the old noupdate value. Example: In [1]: imd = self.env['ir.model.data'] In [2]: xml_id =…
Steps to Reproduce:
- write on ir.model.data to modify noupdate.
- _lookup_xmlids still returns the old noupdate value.
Example:
In [1]: imd = self.env['ir.model.data']
In [2]: xml_id = self.env['ir.model.data'].search([], limit=1)
In [3]: imd._lookup_xmlids([xml_id.complete_name], self.env[xml_id.model])
Out[3]: [(18603, 'auth_signup', 'action_send_password_reset_instructions', 'ir.actions.server', 149, False, 149)]
In [4]: xml_id.write({'noupdate': not xml_id.noupdate})
Out[4]: True
In [5]: imd._lookup_xmlids([xml_id.complete_name], self.env[xml_id.model])
Out[5]: [(18603, 'auth_signup', 'action_send_password_reset_instructions', 'ir.actions.server', 149, False, 149)]
In [6]: imd.flush_model()
In [7]: imd._lookup_xmlids([xml_id.complete_name], self.env[xml_id.model])
Out[7]: [(18603, 'auth_signup', 'action_send_password_reset_instructions', 'ir.actions.server', 149, True, 149)]
Issue:
- _lookup_xmlids is returning values from ir.model.data executing an SQL query w/o flushing.
Fix:
- Add flushing in _lookup_xmlids.
Forward-Port-Of: odoo/odoo#262791Swiss payroll employee records will no longer log unnecessary history entries when pension mutation records are refreshed. This reduces chatter clutter, especially during frequent automated updates, making important employee history easier to review.
Original PR description
Calling `_create_or_update_snapshot` after writing on an employee recomputes `lpp_mutations`, deleting and recreating the linked records. Because `lpp_mutations` was tracked, every `write` on an employee generated unhelpful chatter entries, cluttering important history. This was especially noisy during frequent writes in hourly crons. Disable field tracking on `lpp_mutations` to improve chatter clarity and overall user experience. opw-6285407 --- Forward-Port-Of: odoo/enterprise#129628 Forward-Port-Of: odoo/enterprise#128033
This fixes an issue in the French PDP registration process where the system referenced outdated field names. The correction helps prevent registration failures after the related routing fields were renamed.
Original PR description
The fields have been renamed in routing_... --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285619
The Tax Excl./Tax Incl. toggle badge no longer shows an unwanted outline when users hover, click, or focus on it. This keeps sales, purchase, and accounting forms looking consistent and avoids a small visual distraction during order entry.
Original PR description
The "Tax Excl."/"Tax Incl." toggle badge showed an unwanted outline in two cases: - On real keyboard/click focus, Bootstrap draws its default focus ring. - On plain mouse hover, useNavigation adds a "focus" class. Also, sale.order and purchase.order views were never given the `tax_mode_badge` class, so the account.scss fix silently never applied to them at all. Forward-Port-Of: odoo/odoo#283798
This fix updates a Belgian payroll attendance test so it remains reliable when demo employee data changes the company's worker count. It helps avoid false payroll test failures while preserving confidence that payslip calculations continue to run correctly.
Original PR description
The FFE employer contribution rate depends on the company's current worker count. Additional demo employees installed on runbot can move the company across the applicable threshold and change the expected payslip amounts. This commit update the test expectations according to the computed worker count. [error-939674](https://runbot.odoo.com/odoo/error/939674) Forward-Port-Of: odoo/enterprise#130025 Forward-Port-Of: odoo/enterprise#126887
This fix ensures alerts in the Point of Sale restaurant appointment flow are dismissed after a table is assigned to a booking. It prevents lingering warning messages that could confuse staff during booking and table management.
Original PR description
Steps to reproduce: ==================== - In `pos_restaurant_appointment`, try to reassign a table to a booking. - An alert is shown. - Assign a table to the booking. Issue: ====== - The alert is not dismissed. Cause: ====== - In `pos_alert_plugin`, `dismiss` is updated instead of `_dismiss`. Fix: ==== - Update `_dismiss` instead of `dismiss`. task-6522926 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The salary simulation flow now keeps the employee's job information available when benefits are configured. This prevents an error that previously blocked users from validating a salary simulation from an employee record.
Original PR description
Steps to reproduce: - Go to an employee form. - Click on the salary simulation button. - Click on the configure benefits button. - UserError: "Missing required fields: Employee Job". Reason: `employee_job_id` was missing from the calculator form view XML, causing the field to be empty when validating the simulation. Solution: Add `employee_job_id` as an invisible field in the form view. Task-6497089
Spreadsheet thumbnail previews now load correctly after a change in how file data is returned. This helps users recognize and select the right spreadsheet from the document selector without broken or missing previews.
Original PR description
Binary fields now return a POJO `{filename, content}` rather than a simple string, but the code to display spreadsheet thumbnails wasn't adapted.
Task: [6522764](https://www.odoo.com/web#id=6522764&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)This fixes a timing issue where the reply box could stay open because suggestion popups reopened after being dismissed. Users get more reliable keyboard behavior when closing replies or popups in the Mail app, especially under slower server conditions.
Original PR description
Two independent causes made "reply: discard on pressing escape" red, one commit each. "[FIX] mail: wait for the mention suggestions before Escape" is the one that fixes the reported failure, and it holds on every branch: the test presses Escape while the mention fetch is in flight, and the suggestions arriving from the server re-open the list that Escape closed, so the re-opened list takes the second Escape and the reply is never discarded. The test now waits for the fetched suggestions before pressing Escape. "[FIX] mail: keep the suggestion list closed on a re-render" backports "[FIX] mail: keep composer suggestion list closed on unrelated re-render", which entered at 19.0 and never came down. Here NavigableList is re-opened on every patch, so opening the emoji picker after Escape brings the dismissed list back, and it then steals the Escape meant for the picker. https://runbot.odoo.com/odoo/error/946314 Forward-Port-Of: odoo/odoo#286041 Forward-Port-Of: odoo/odoo#284725
Fixed an issue where creating a new group in a grouped list view could cause an error when totals or aggregates were shown. This helps users continue data entry smoothly without interruptions in views such as CRM lists.
Original PR description
Adding a new group on a grouped list view with aggregates gives a traceback. This comes from `getFieldCurrencies` and `computeAggregates` which didn't guard for group with no currency aggregates (like a newly created group). Steps to reproduce: - open a list view (CRM) - group by a m2o (Contact) - click on 'Add a Contact' - press Enter => Traceback Forward-Port-Of: odoo/odoo#285920 Forward-Port-Of: odoo/odoo#285325
Users will no longer see an unnecessary warning notification when a pasted internal link cannot generate a preview, such as when the URL contains a typo. The issue is still recorded in the browser console, reducing distraction while keeping diagnostic information available.
Original PR description
When an internal link preview is missing, a notification is displayed to inform the user that the link is likely wrong. This commit logs this information in the console instead of showing it as a notification. Steps to reproduce: - Go to a To-do note - Create a link - Paste the current URL but introduce a typo in "to-do" => A notification was displayed. task-6317849
The website shop builder now shows a brush icon for the products design button instead of a less clear design services icon. This restores a more familiar visual cue, helping users recognize the design action more easily.
Original PR description
The products design button was previously `fa-paint-brush`. It was replaced by the `design_services` Material Symbols instead of the more similar `brush`. This commit changes it back to a brush. task-6377407
This fixes an issue where manufacturing-related accounting entries could be created in an unpredictable order during subcontracting receipt processing. The change makes results more consistent and helps avoid occasional test or reporting inconsistencies caused by identical dates and document names.
Original PR description
The search order on account move line depends on date, move name and id. This search result order can be non deterministic because, when creating account move line from stock valuation, it depends on…
The search order on account move line depends on date, move name and id. This search result order can be non deterministic because, when creating account move line from stock valuation, it depends on the order from a set, but sets are unordered. **Step to reproduce** Run [test_subcontracting_purchase_bill](https://github.com/odoo/odoo/blob/13b2781978b0edad0df0800404276919b767e32b/addons/mrp_subcontracting_purchase/tests/test_mrp_subcontracting_purchase.py#L268) in: Single app, community, with demo data. **Observation** * The search: When doing the search since we didn't specify any order, the search from account.move.line will ordered by: https://github.com/odoo/odoo/blob/3dd41395e2e4205fa477eb474d4a4dba0a976154/addons/account/models/account_move_line.py#L23 https://github.com/odoo/odoo/blob/3dd41395e2e4205fa477eb474d4a4dba0a976154/addons/account/models/account_move_line.py#L1664 Since, for the components the date and move name are the same it will only depend on the aml ids: * `Account.move.line` creation: When it validate the receipt (`button_validate`) https://github.com/odoo/odoo/blob/869c750f978b1b00a4a04bd61226f0e20d2e7729/addons/mrp_subcontracting_purchase/tests/test_mrp_subcontracting_purchase.py#L296 It will mark as done the picking (`_action_done`) and the productions (`button_mark_done`) linked to this picking. https://github.com/odoo/odoo/blob/869c750f978b1b00a4a04bd61226f0e20d2e7729/addons/stock/models/stock_picking.py#L1429 https://github.com/odoo/odoo/blob/869c750f978b1b00a4a04bd61226f0e20d2e7729/addons/mrp_subcontracting/models/stock_picking.py#L49 Modify the inventory accordingly (`_post_inventory`) https://github.com/odoo/odoo/blob/869c750f978b1b00a4a04bd61226f0e20d2e7729/addons/mrp/models/mrp_production.py#L2231 while inside of `_post_inventory`, it will process all the production moves, for this it will divided them in set to process them by batch: https://github.com/odoo/odoo/blob/f0e58b9324af18d0cf0264aec2886d098e997f03/addons/mrp/models/mrp_production.py#L1904-L1911 From this set, it will create the `account.move.line`: It retrieve the actual stock move with the browse, and call `_action_done`, from where the stock valuation layer will create the `account.move.line`. https://github.com/odoo/odoo/blob/f0e58b9324af18d0cf0264aec2886d098e997f03/addons/mrp/models/mrp_production.py#L1913 https://github.com/odoo/odoo/blob/f0e58b9324af18d0cf0264aec2886d098e997f03/addons/stock_account/models/stock_move.py#L187 The issue arise because a set read order is non deterministic. runbot-939794 Forward-Port-Of: odoo/odoo#279396
This fix removes Italian eInvoicing fields that were mistakenly shown in the Point of Sale partner form. It keeps the Italian PoS setup aligned with its supported scope, avoiding confusing or unavailable invoicing options for users.
Original PR description
The PoS has a dedicated "simplified" partner form view since 19.2. We had to fix in stable the fields that were missing (typically needed for eInvoicing) in the simplified view by completely overriding the simplified view with the old one. In master, we added the fields back to the simplified view. When doing so, we mistakenly re-added Italian eInvoice fields to the l10n_it_pos module, while this one is not supporting eInvoicing in PoS, only printers, and not even depending on l10n_it_edi that holds the field. This commit removes the extension of the simplified view that was not necessary. Note: added in the same version, no need to handle migration. Related: https://github.com/odoo/enterprise/pull/119316 runbot-946594
Planning shifts will now only show missing-role warnings for human resources, not material resources. This reduces unnecessary alerts when shifts include equipment or other non-human resources that are still valid for the work.
Original PR description
Currently, the warning stating that the resources selected on the shift don't have the required role might be triggered too easily. Human and material resources will likely have different roles due to their different nature. However, a shift can only have a single role, which will usually be the one required for the human resources, while the shift itself may be assigned to a mix of human and material resources. As a result, the warning will often be triggered for material resources even though they are valid for the shift, which could create noise for users. With this PR, the warning is only triggered for human resources Task-6467213
Payroll users can now remove or change payslip period dates without triggering an unexpected error. This keeps payslip creation and editing stable when employee contract dates are present.
Original PR description
Currently, an error occurs when the user removes the payslip period. **Steps to Reproduce:** - Install the `hr_payroll` module. - Go to `Employees` and create an `employee`, or use an existing one. -…
Currently, an error occurs when the user removes the payslip period. **Steps to Reproduce:** - Install the `hr_payroll` module. - Go to `Employees` and create an `employee`, or use an existing one. - Make sure the `employee's version` has a `contract start date`. - Go to `Payroll` > `Payslips` > `Payslips` and create a payslip. - Select that `employee` on the payslip, then remove the `payslip start date`. `TypeError: '<=' not supported between instances of 'datetime.date' and 'bool'` After the [recent commit], which computes the version from the payslip period without allowing it to be overridden, when the user selects an employee whose version has a contract start date, it checks whether the version overlaps with the payslip period [1]. However, since the payslip dates have not yet been set, it raises an error. This commit ensures that the check for the version overlapping with the payslip period is skipped if the payslip does not have both a start and end date. It also makes the method depend on date_to, because if the user changes the payslip end date, it should recheck whether the version overlaps with the payslip period. [recent commit]: https://github.com/odoo/enterprise/commit/569ce2af32477d410b79e98ca72729385042619b [1]- https://github.com/odoo/enterprise/blob/8a66d7beabe6f9b28000ef12725f3a9937d5d1ee/hr_payroll/models/hr_payslip.py#L1716-L1725 sentry-7632216317 Forward-Port-Of: odoo/enterprise#126515
This update registers the Greek e-invoicing module with the translation system. It ensures the module can receive and manage translations properly, improving localization support for Greek users.
Original PR description
Commit https://github.com/odoo/odoo/commit/45bd522dde7a67194e14a40d66944a2e34d1f79d introudced a new module without it's related `weblate.json` entry. This commit fixes this omission. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285570
The Point of Sale flow now hides quotations that have already been settled, so staff cannot accidentally select and settle the same quotation again. This helps avoid duplicate processing and reduces correction work for sales teams.
Original PR description
Once a quotation is settled, opening the quotation list should not allow selecting it again. This commits updates the domain to prevent it. task-6479356 Forward-Port-Of: odoo/odoo#284768
This fix prevents the guided tour feature from crashing when a tour that was previously started is no longer available in the database. Users, including free trial users, should now see the tour handled gracefully instead of encountering an error.
Original PR description
get_tour_json_by_name returned an empty array instead of False when no tour matched. TourService.getTour then skipped its `!tour` guard and crashed reading `tour.steps.length` on that string. Issue spotted on free trials 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#286059
This update makes an internal automated test for the web reference field run consistently, even when there is a small network delay. It helps reduce false failures in Odoo's validation pipeline without changing customer-facing behavior.
Original PR description
The test is non-deterministic and fails with the runbot error:
found 0 elements instead of 1:
0 matching ".ui-autocomplete .ui-menu-item:nth-child(2)"
if there is even a 100ms network delay. clear() dispatches input events, but without flushing the timers, the dropdown state at the time of click(".o_field_reference input") can be out of sync causing no menu items to render and failing the test.
This change makes the sequence deterministic without changing the assertions:
1. runAllTimers() clears the timers and allows the clear of the input to fully go through.
2. click(".o_form_view") unfocus the input so the next click of the input refocuses and triggers the menu opening.
3. checking contains on the dropdown children ensures the menu items can render before click.
runbot error: 940222
Forward-Port-Of: odoo/odoo#286055This fixes a dependency issue in the Indian stock localization so related stock and accounting data is available when the app is tested or installed on its own. It helps prevent broken screens in e-waybill stock workflows and improves installation reliability without changing user-facing features.
Original PR description
The view 'l10n_in_ewaybill_stock.view_picking_form_inherit_ewaybill' is broken in single-app tests because it depends on stock.picking:country_code. That field is provided by module 'stock_account' through auto_install relationship. 'stock_account' auto_installs with 'stock' and 'account' installed. This condition exists on stable so it's safe to add this dependency. The dependency is added to l10n_in_stock because it seemed like the logical place where 'account' and 'stock' functionality comes together. [l10n_in_ewaybill_stock] ──[depends]──> [l10n_in_stock] [l10n_in_stock] ──[depends]──> [stock] [l10n_in_stock] ──[depends]──> [l10n_in] ──[depends]──> [account_tax_python] ──[depends]──> [account] REF Runbot: https://runbot.odoo.com/odoo/error/945482 Forward-Port-Of: odoo/odoo#284990
This fixes an issue where applying a color to a selected part of formatted text could color extra nearby text by mistake. Users can now apply text colors more precisely, avoiding unwanted formatting in website or content editing.
Original PR description
Problem: When applying color on a selection that spans across partially selected inline elements (e.g. `<p><b>a[b</b>c]d</p>`), container elements whose contents are not fully selected (such as…
Problem: When applying color on a selection that spans across partially selected inline elements (e.g. `<p><b>a[b</b>c]d</p>`), container elements whose contents are not fully selected (such as `<b>`) were included in `targetedNodes`. This caused improper color formatting/nesting on partially selected elements. Cause: In `ColorPlugin._applyColor()`, `targetedNodes` were filtered by checking `isNodeEditable(node)` and `nodeName !== "T"`, but did not check whether the contents of `node` were fully selected (`areNodeContentsFullySelected(node)`). As a result, partially selected ancestor elements were included in `targetedNodes`. Solution: Filter `targetedNodes` in `_applyColor()` using `this.dependencies.selection.areNodeContentsFullySelected(node)` to ensure only fully selected nodes are targeted when applying colors. Steps to reproduce: 1. Open html_editor. 2. Insert content: `<p><b>ab</b>cd</p>`. 3. Select `b` inside `<b>` and `c` inside `<p>` (`<p><b>a[b</b>c]d</p>`). 4. Apply text color (e.g. red). 5. Observe "ab" and "c" was colored instead of just "b" and "c". task-6456443 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285658 Forward-Port-Of: odoo/odoo#281462
Fixed the Turkish reports journal form so the return from sales account appears in the correct place with the right label. This prevents confusion when users review or configure journal accounts.
Original PR description
The journal form renders `default_account_id` as six standalone labels followed by two `nolabel="1"` fields, one for bank, cash and credit journals and one for sale, purchase and general ones. The xpath matched the first of those two fields, so the return from sales account was inserted between them. Its own label then landed in the middle of the label run, shifting the group grid: both labels rendered side by side with their values underneath, each next to the wrong caption. Anchor on the second field instead, so the new field follows the whole label and field run. Task-6438412 Forward-Port-Of: odoo/enterprise#129532 Forward-Port-Of: odoo/enterprise#128083
Updating suggested products could fail when an unpublished product belonged to an eCommerce category. This fix prevents the error by safely handling cases where no published products are available, allowing staff to update suggestions without interruption.
Original PR description
Currently, an error occurs when the user tries to update suggested products. **Steps to Reproduce:** - Install the `website_sale` module. - Go to `Settings` and enable `Automate suggested products`…
Currently, an error occurs when the user tries to update suggested products.
**Steps to Reproduce:**
- Install the `website_sale` module.
- Go to `Settings` and enable `Automate suggested products` under the `eCommerce` section.
- Go to `Website` > `eCommerce` > `Products` > `Products`.
- Create a `product` and, in the `eCommerce` tab, add a `category`.
- Make sure the `product` is `not published`.
- On the `product`, click the `gear icon` and select `Update suggested products`.
`ValueError: TypeError('unsupported operand types in: product.template() | None') while evaluating 'records.action_update_suggested_products()'`
When the user updates suggested products, the system updates the product's suggested
products - optional, accessory, and alternative products [1]. While updating the alternative
products [2], the system tries to find products based on the categories and attributes shared
with the current product [3]. When retrieving products from the current product's category,
it gets None [4] because the products linked to that category are unpublished and are
therefore excluded by the domain [5]. Later, using this None value raise the error.
This commit ensures that when accessing a missing key in the category dictionary, then it falls
back to an empty product recordset.
[1]: https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L346
[2]: https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L384-L386
[3]: https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L471-L483
[4]- https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L482
[5]- https://github.com/odoo/odoo/blob/21e3310a3eba2ce915b33cf10ee4c14bdda7aad4/addons/website_sale/models/product_template.py#L445-L456
sentry-7660509183
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#281487This fix makes an internal website performance test consistent during parallel test runs. It prevents unrelated demo data from changing the test conditions, helping keep automated validation reliable without affecting normal users.
Original PR description
# Before this commit: The image controller performance test expects the admin partner to be unpublished. In parallel test runs, the website_partner demo data publishes the admin partner, causing the…
# Before this commit:
The image controller performance test expects the admin partner to be
unpublished. In parallel test runs, the website_partner demo data
publishes the admin partner, causing the test to follow a different
code path and fail.
However, during parallel test execution, the website_partner module
installs its demo data, which updates the admin partner:
```
<record id="base.partner_admin" model="res.partner">
<field name="is_published">True</field>
</record>
```
As a result, user_admin.website_published becomes True.
# After this commit:
The test explicitly restores the required precondition by setting the
admin partner's is_published value to False before executing the
performance check.
As a result, the image controller always follows the expected
"unpublished" code path, making the test deterministic regardless of
whether website_partner or any other module with demo data has already
been installed during parallel testing.
Runbot-241102
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#278550This fix prevents an error when loading sample work order data after a specific working schedule has been deleted. The system now uses a safe default schedule instead, helping users test or set up Shop Floor without interruption.
Original PR description
Currently, an error occurs when loading the sample data in the Shop Floor. **Steps to Reproduce:** - Install the `mrp_workorder` module. - Go to `Employees` > `Configuration` > `Working Schedules`. -…
Currently, an error occurs when loading the sample data in the Shop Floor. **Steps to Reproduce:** - Install the `mrp_workorder` module. - Go to `Employees` > `Configuration` > `Working Schedules`. - Delete the `Work Center 40 hours/week` record. - Go to `Settings` > `Users & Companies` > `Groups`. - Open the `Manage Work Order Operation` group and add the `Administrator` to the `users` list. - Open the `Shop Floor`. If the `Activate your Work Center` dialog appears, click it and then click `Configure Later`. - Click `Load Samples`. `ValueError: External ID not found in the system: mrp.mrp_workcenter_calendar` After the [recent commit], the sample work center uses the `Work Center 40 hours/week` working schedule instead of `Standard 40 hours/week`. As a result, if the `Work Center 40 hours/week` record is deleted, loading the sample data raises the error [1]. This commit ensures that when the Work Center 40 hours/week calendar is not available, it falls back to `Standard 40 hours/week`, restoring the previous behavior [2]. This fallback is required because `resource_calendar_id` is mandatory from the view perspective, even though it is not required at the model level. If it is left empty, the form displays a missing required field. The `Standard 40 hours/week` calendar is always available because it is linked to the main company [3] and its `resource_calendar_id` field uses `ondelete='restrict'` [4], preventing it from being deleted. [recent commit]: https://github.com/odoo/enterprise/commit/336d721f7b353473fe5e07c29ce14ed77a88fb98 [1]- https://github.com/odoo/enterprise/blob/c0045ec3cf94650d66192a4ca3e0dc3c17daa5bd/mrp_workorder/models/mrp_production.py#L213-L216 [2]- https://github.com/odoo/enterprise/blob/51c1e74e90e510d59aad78820e2c29e821ba2854/mrp_workorder/models/mrp_production.py#L214-L217 [3]: https://github.com/odoo/odoo/blob/4c4219a7d9d51f703b15e83ab755faf1f2c8a71d/addons/resource/data/resource_data.xml#L10-L12 [4]: https://github.com/odoo/odoo/blob/4c4219a7d9d51f703b15e83ab755faf1f2c8a71d/addons/resource/models/res_company.py#L12-L13 sentry-7651161729 Forward-Port-Of: odoo/enterprise#126859
Pasting a copied URL over an existing selected link in the editor no longer causes an error. This helps users edit linked text more reliably without interruptions or lost work.
Original PR description
Steps to reproduce the issue: - Create a link in editor. - Copy another URL. - Select entire link. - Pasting copied link throws traceback. This issue happens after merging commit [1] where…
Steps to reproduce the issue:
- Create a link in editor.
- Copy another URL.
- Select entire link.
- Pasting copied link throws traceback.
This issue happens after merging commit [1] where `normalize_processors` callback returns nothing. After merging commit [2] each processor must return the original root if no processing is needed or processing is in place.
As a result, when this.processThrough("normalize_processors", container) is called from the `insert` method, the next processor in the chain uses `this.editable` as its default argument and removes the FEFF node, which is the anchor node. Later calling closestBlock(selection.anchorNode) returns null, resulting in the traceback. This PR aims to fix the traceback by returning the `root` in processor.
[1]: https://github.com/odoo/odoo/commit/be77a9a2003e09f4621d0ff774bf8749b326d037
[2]: https://github.com/odoo/odoo/commit/17d58d2fdf8da3a69c731fc5ea0d90b95e28efd6
task-6456004
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#283185This update corrects how the translation mode test module applies and removes its internal patches. It helps keep test behavior isolated so other environments or tenants are not affected after the module is uninstalled.
Original PR description
Fix patch for test_translation_mode Patch tools in a compatible way which will work for other tenants. Patch tools in a compatible way which will work after uninstallation. python code translation is not patchable by design. 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#285538
Opening the Field Service section from a helpdesk ticket preview no longer triggers an error after completed interventions are planned. This keeps customers and staff able to view intervention information reliably from the portal preview.
Original PR description
*=helpdesk_planning_field_service{,_sale_timesheet} Steps to reproduce: ------------------------- 1. Install helpdesk_planning_field_service_sale_timesheet with demo data. 2. Open a helpdesk team…
*=helpdesk_planning_field_service{,_sale_timesheet}
Steps to reproduce:
-------------------------
1. Install helpdesk_planning_field_service_sale_timesheet with demo data.
2. Open a helpdesk team (e.g., Customer Care) and enable field service planning.
3. Create a new ticket in Customer Care, plan two interventions, and mark them as completed.
4. Click the cog menu of the helpdesk ticket and click Preview.
5. In preview mode, click **Field Service** in the left sidebar.
Issue:
---------
A traceback occurs:
```python
File "/home/odoo/odoo/community/odoo/addons/base/models/ir_qweb.py", line 875, in _render_iterall
raise QWebError(qweb_error_info) from error
odoo.addons.base.models.ir_qweb.QWebError: Error while rendering the template:
KeyError: 'format_datetime'
Template: planning_field_service.portal_my_field_service_report_list
Reference: 866
Path: /t/t/t[3]/t/tbody/t/tr/td[1]/a/t
Element: <t t-out="format_datetime(intervention.start_datetime, dt_format='MMM d, YYYY')"/>
```
Cause:
---------
https://github.com/odoo/enterprise/blob/28637781cd3ffc4c3dc0c2016dd5d6051793f641/helpdesk_planning_field_service/controllers/portal.py#L59-L63
After this 6857d1a, date formatting was changed to use `format_datetime`, and [planning_field_service](https://github.com/odoo/enterprise/blob/28637781cd3ffc4c3dc0c2016dd5d6051793f641/planning_field_service/controllers/portal.py#L42) was updated accordingly. However, `helpdesk_planning_field_service` was not updated to pass `format_datetime` in the template values, causing a **KeyError** when opening the field service intervention list.
Solution:
-----------
Pass `format_datetime` in the template values, following the same approach used in `planning_field_service`.
opw-6467400
Forward-Port-Of: odoo/enterprise#129227
Forward-Port-Of: odoo/enterprise#128519The website shop search bar placeholder will now appear in the visitor's selected website language instead of always showing "Search" in English. This improves the multilingual shopping experience and avoids confusing non-English customers.
Original PR description
Problem: The search bar placeholder text is not being translated. Steps to reproduce: 1. Install e-Commerce 2. Go to Website > Configuration and add another language for the website 3. Go to Website > Shop 4. See how the search bar placeholder text is "Search" instead of being in the website's language Cause: The text was not extracted for translation because it is set inside `t-value=`. To be available for extraction, it should either be set inside `t-valuef.translate=` or should be the data content between the tags. opw-6486429 Forward-Port-Of: odoo/odoo#285011
The web client code was cleaned up by removing an outdated internal hook that is no longer used in the main codebase. This reduces maintenance overhead while keeping a temporary compatibility path for spreadsheet-related code that still depends on the older behavior.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update simplifies how Odoo's messaging and live chat features handle certain internally calculated records. It should reduce unnecessary processing behind the scenes while preserving existing user-facing behavior in discussions, calls, and website chat.
Original PR description
Before this commit, twenty-four relations derive a record from a compute option: the model runs it, links the result and settles the pair at the end of the update cycle, while no inverse is declared, no one writes them and no one reads them as a stored value. This commit declares them with this.computed(), which holds the value in an owl computed of its own, without a relation and an update cycle around it. A compute that returned an object literal inserts its record itself, as a computed has no relation to do it for it, and correspondent keeps calling computeCorrespondent() so that the im_livechat override still takes effect.
This update reorganizes how Mail and Live Chat remember browser-stored preferences, such as chat or composer settings. It reduces duplicated background handling and helps ensure these saved preferences are tracked and cleaned up more consistently without changing the user experience.
Original PR description
Before this commit, a field kept in the browser local storage is declared with an option, fields.Attr(default, { localStorage: true }), and the model core carries everything that makes it work: a compute reading the entry, an onUpdate writing it back, a map of entries per record, a map from storage key to record and field per store, and a storage listener writing into the records.
This commit declares it on the record, as the other declarations that add a behaviour to a field:
before: compact = fields.Attr(false, { localStorage: true });
after: compact = this.localStorage(false);
The value follows its entry through two onChange observers of the record itself, so the model core keeps nothing about local storage. The record listens for the storage events of its own key and drops the listener with itself.
https://github.com/odoo/enterprise/pull/129818This change reorganizes how AI channel prompts are stored locally in Discuss conversations. It is an internal cleanup that should make the feature easier to maintain without changing the user experience.
Original PR description
Enterprise counterpart of "[REF] mail: declare a local storage field on the record", which explains the shape. The channel prompts are the only enterprise field kept in the local storage, and their onUpdate becomes an onChange next to the declaration. https://github.com/odoo/odoo/pull/285620
The mass mailing editor was updated to use newer underlying platform mechanisms as part of the Owl 3 migration. This helps keep the email marketing experience maintainable and compatible without introducing expected functional changes for users.
Original PR description
As part of the Owl 3 migration, replace onWillUpdateProps and useRecordObserver hook with the appropriate Owl 3 alternatives. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update renames an internal setting used by mail and live chat actions so its purpose is clearer to developers. It does not change customer-facing behavior, but it helps reduce confusion and future maintenance risk in messaging features.
Original PR description
This naming is confusing, action.dropdown signals that the action will open a dropdown menu while props.dropdown signals to render the action as a dropdown element.
This update removes an outdated internal developer helper from several Odoo Enterprise screens. It helps keep the interface code aligned with the newer framework, reducing future maintenance risk without changing day-to-day user workflows.
Original PR description
- https://github.com/odoo/odoo/pull/285708 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr