Friday, August 21, 2026
56 changes · master
Resolved issues and error corrections
This fixes a timing issue on mobile where selecting an item in a modal could target the wrong popup and cause a crash. It makes the affected flow more reliable for users and helps keep automated user journey tests stable.
Original PR description
…tour Scope kanban selection triggers to the active modal to avoid a race with Owl's async modal state, and make Many2XAutocomplete's onClose null-safe against a crash the race was masking. runbot-error-id~939488 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#279300
This change restores expected internal metadata for a Point of Sale popup so automated tests no longer fail unnecessarily. It does not change cashier workflows or business functionality, but helps keep the Point of Sale module stable during validation.
Original PR description
### Issue: In 19.3, the following hoot tests fail with a RunBot error: - "called at right time (when canceling order)" - "called at right time (when canceling order never sent to blackbox)" - "called…
### Issue:
In 19.3, the following hoot tests fail with a RunBot error:
- "called at right time (when canceling order)"
- "called at right time (when canceling order never sent to blackbox)"
- "called at right time (when canceling a combo order)"
### Cause:
Commit 0dfd71b9f4 removed `close` from `ControlButtonsPopup` as the Dialog patch now handles closing via `this.data.close()` With no remaining props to declare, `static props` was removed entirely
Without `static props`, Owl skips all prop validation but emits: "Component 'ControlButtonsPopup' does not have a
static props description"
`mountWithCleanup` forces `warnIfNoStaticProps` to `true` in hoot tests, causing the tests to fail
`close` is declared as optional since `dialog_service.js` always injects it via `subProps: markRaw({ ...props, close })` at runtime, but the component no longer uses it directly
### Steps to reproduce:
- Install `l10n_be_pos_blackbox`
- Enable Developer mode
- Open the JS test UI
- Run one of the failing tests
runbot-941231
Forward-Port-Of: odoo/odoo#277790The website setup flow now handles missing theme snippet templates more safely, so one unavailable snippet does not break the whole configurator. This improves reliability for website setup and strengthens the related automated checks.
Original PR description
Fix for the runbot nightly error 944444. bug: The website configurator crashed entirely if one theme snippet's template was missing, instead of just skipping that snippet. steps: Only visible while running `test_01_configurator_translation` fix: Catch MissingError, alongside ValueError, when generating and rendering configurator snippet content. task-6325919 Forward-Port-Of: odoo/odoo#278609
This change makes an automated web test more reliable by allowing extra time for an uploaded image to appear. It helps reduce random test failures during high system load, supporting smoother development and release validation without changing end-user behavior.
Original PR description
Before this commit, this image field test sometimes failed because it could not find the image that had just been uploaded. Similarly to [1], we increase the waitFor timeout to 1s. Indeed, uploading an image can take time, and with high CPU usage, it could happen that the default 200ms delay wasn't enough. [1] https://github.com/odoo/odoo/pull/168196 runbot error-242406 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#281200
The live chat statistics cards now use the full available screen width on mobile devices. This removes awkward empty space and gives users a cleaner, more consistent view when managing live chat from a phone.
Original PR description
Previously, the live chat statistics section did not use the available width on mobile devices, leaving unnecessary empty space and resulting in an awkward layout. This PR makes the statistics cards take the full available width on mobile, providing a cleaner and more consistent interface. <table> <tr> <th>Before</th> <th>After</th> </tr> <tr> <td> <img width="372" height="805" alt="image" src="https://github.com/user-attachments/assets/6934927b-f744-4c93-b63e-1f49ecd33004" /> </td> <td> <img width="382" height="734" alt="image" src="https://github.com/user-attachments/assets/24f8b7e4-9fe7-4fa0-bf64-5d7917623830" /> </td> </tr> </table> --- Task ID - 6372787 Forward-Port-Of: odoo/odoo#274945
The hidden avatar count badge now expands properly when the number reaches double digits, such as '+10'. This keeps agent or user counts readable in Live Chat and other screens using avatar lists.
Original PR description
Problem: When using the many2many_avatar_user widget (such as in the Live Chat app), the badge displaying the number of hidden tags overflows if the count reaches double digits (e.g., "+10"). This…
Problem: When using the many2many_avatar_user widget (such as in the Live Chat app), the badge displaying the number of hidden tags overflows if the count reaches double digits (e.g., "+10"). This causes the text to get cut off, making the exact number unreadable. Solution: This commit updates the badge container to properly accommodate larger numbers. The text now fits entirely within the badge without overflowing, ensuring the hidden tag count remains fully readable. Steps to reproduce (runbot v19.3): 1. Open the Live Chat app (or any view using the many2many_avatar_user widget). 2. Add enough agents to a session so the remaining count hits double digits (10 or more). 3. Observe that the badge showing the remaining agent count (e.g., "+10") overflows the badge container, cutting off the text and making it unreadable. opw-6453976 <img width="2655" height="1111" alt="avatar_tag_193_before" src="https://github.com/user-attachments/assets/9c31007d-5300-4bb7-a703-01a13b5bdd10" /> <img width="2655" height="1112" alt="avatar_tag_193_after" src="https://github.com/user-attachments/assets/7b2a4074-3738-4a6c-9649-f6652601f3f3" /> Forward-Port-Of: odoo/odoo#281570
The point of sale customer display now hides the company logo whenever a background image or QR code is shown. This keeps the screen cleaner and prevents the logo from overlapping more important customer-facing content.
Original PR description
Before this commit: --- The company logo is displayed above the background on the customer display. After this commit: --- The company logo is displayed only when there is no background or QR code to display. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281749 Forward-Port-Of: odoo/odoo#281406
The portal now decides whether to show the payment methods card using the same rules as the saved payment methods page. This prevents customers from seeing a card that leads to no available payment methods, or missing access when methods are actually available.
Original PR description
Commit bcfeed4b24f51 introduce `ResPartner._get_payment_tokens` method to determine which tokens are available for a specific partner, in case that method is overridden in some way, the portal card will not be visible/hidden correctly. This commit, use that method to align the portal card visibility with the tokens that will effectively be shown on the `/my/payment_method` page. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283173
The product catalog now handles long unit of measure names more gracefully when adding products to sales orders. This prevents text from being cut off, making product quantities and units easier to read for users working with customized unit names.
Original PR description
Steps to produce: --- - Install `sales` module. - Go to Settings and enable `Units of Measure and Packaging`. - Set a long name for `units` UoM. - Create a Sale Order and add a product via the…
Steps to produce: --- - Install `sales` module. - Go to Settings and enable `Units of Measure and Packaging`. - Set a long name for `units` UoM. - Create a Sale Order and add a product via the catalog. Issue: --- - Long UoM names are not fully visible in the catalog view. Root cause: --- - The outer `<div>` has `d-flex` but lacks `w-100`, causing it to overflow its container. Solution: --- - Added `w-100` to the outer `<div>` to prevent overflow. - Adjusted the quantity selector layout for better visibility. Before: --- <img width="388" height="141" alt="image" src="https://github.com/user-attachments/assets/dafae08a-3c9d-4163-8894-daa2e4d26f62" /> After: --- <img width="382" height="154" alt="image" src="https://github.com/user-attachments/assets/abd6f034-be4b-49bf-be9c-c9779de0f30d" /> Enterprise PR: https://github.com/odoo/enterprise/pull/121139 opw-6253382 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282821 Forward-Port-Of: odoo/odoo#267118
When settling a sales order in Point of Sale, extra product attribute add-ons are now preserved on the resulting POS order line. This prevents missing add-on details and helps keep customer orders accurate at checkout.
Original PR description
Before this commit: --- - When a sale order line contained extra attribute addons, those values were not transferred to the POS order line while settling the sales order. After this commit: --- - Preserved extra attribute addons when creating POS order lines from SO. task-6204583 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282160 Forward-Port-Of: odoo/odoo#276143
Point of Sale sample products now load required product attribute information first, preventing an error when setting up sample data after attributes were changed. This helps businesses create demo shops or registers more reliably without manual troubleshooting.
Original PR description
## Steps to Reproduce: 1. Install the **PoS** and **Sales** modules without demo data. 2. Settings > Enable **Variants**. 3. Sales > Products > Attributes > Delete "**Brand**" attribute. 4. Create a **Clothes Shop** and open the register. 5. Load the **Sample** products. ## Error: `ParseError - while parsing /home/odoo/src/odoo/saas-19.4/addons/product/data/product_attribute_demo.xml:5, somewhere inside...` ## Cause: The `product_attribute_demo.xml` file references attributes that do not exist when the demo data is loaded, which raises an error. Before 19.4, the attributes were defined in the same file. After this commit https://github.com/odoo/odoo/commit/56942bcf34785e869c7648cf100c8818c5da0b6d, the attributes are defined separately in the `product_attribute_data.xml` file. ## Fix: This commit loads the data file before, ensure the referenced attributes are available when the demo file is processed. sentry-7640019804 Forward-Port-Of: odoo/odoo#281461
The HTML editor now prevents users from opening the dynamic field selector when no target model has been selected, showing a clear notification instead. It also handles outdated or invalid saved field selections more safely, reducing interruptions and avoiding editor crashes when templates or model choices change.
Original PR description
The dynamic field editor assumes that an `Applies To` model is always selected and that existing dynamic fields are always valid for the current model. As a result, trying to insert or edit a dynamic field without selecting a model raised an error. Editing an existing dynamic field after changing the selected model could also crash the field selector when the stored field path was no longer valid. Show a notification when users try to insert or edit a dynamic field without selecting a model, and handle invalid field paths when initializing the field selector to avoid UI crashes. Task-6365420 Forward-Port-Of: odoo/odoo#278544
Clicking a related field in the HTML editor now inserts its readable name by default instead of its internal ID. This makes generated placeholders more useful for users, while still allowing the ID to be selected when needed.
Original PR description
Before this commit: when clicking a field having sub fields (canFollowRelationFor is true), we just return this field's id, which is not very useful in most cases. After this commit: We created subclass of DynamicPlaceholderPopover, EditorDynamicPlaceholderPopover, which uses EditorModelFieldSelectorPopover. We use the display name of the followable field by default and if the user really want the id, they may choose the id subfield. We also show the followable field's name as the default placeholder instead of "Display name". task-6265223 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed a minor display issue where some form view button icons could include an unintended “undefined” styling label in the page markup. This keeps the interface markup cleaner and avoids possible styling confusion without changing user workflows.
Original PR description
The `iconClass` prop of `ViewButton` was declared optional with no default value, so it resolved to `undefined` whenever a button arch had an `icon` but no `icon_class` attribute — which is the case…
The `iconClass` prop of `ViewButton` was declared optional with no default value, so it resolved to `undefined` whenever a button arch had an `icon` but no `icon_class` attribute — which is the case for the large majority of stat buttons. The template concatenates that prop into the icon's class string: `this.icon.class + ... + ' ' + this.props.iconClass` so `undefined` was stringified and rendered literally, producing `class="o_button_icon oi undefined"` on the icon element. Give the prop an empty-string default, consistent with `className` in the same props definition. This also covers the components spreading `viewButtonProps` (MultiRecordViewButton, and the Studio button variants in enterprise). Only form views were affected: list and kanban buttons go through `getButtonInfo` in views/utils.js, which already falls back to `""`. Introduced by: https://github.com/odoo/odoo/commit/c5a40a608280017ae9ea8f9e9e1c59f778d629ae task-6485741 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an incorrect styling reference that made titles appear at the wrong size in the website theme preset preview. This helps users see a more accurate preview when choosing or configuring a website theme.
Original PR description
When the conflict of the forward port [1] was resolved, an error was introduced when the class `fs-4` was replaced by `fs-h4`. This commit fixes the class. [1] https://github.com/odoo/odoo/pull/279324 Forward-Port-Of: odoo/odoo#281995
The attendance kiosk no longer loads a presence status component that is not used in that view. This keeps the kiosk experience leaner and avoids unnecessary background resource loading without changing visible functionality.
Original PR description
This commit removes the hr_attendance_presence_status.js file from the kiosk bundle, as it is not needed in the kiosk view and can cause unnecessary loading of resources. task-6468972 Forward-Port-Of: odoo/odoo#282987 Forward-Port-Of: odoo/odoo#282410
Kiosk receipts no longer show the table tracker number twice. This keeps customer receipts clearer and avoids confusion for staff and guests using self-ordering.
Original PR description
This removes the duplicate table tracker number on the receipt when ordering on kiosk. There is already a floating_order_name field that shows the table tracker number on the receipt when ordering on kiosk. task-6439063 Forward-Port-Of: odoo/odoo#280309
This fixes automated checks so Point of Sale sales are validated correctly whether or not stock features are installed. It helps avoid false test failures and keeps invoicing and delivery behavior verified in the right modules.
Original PR description
`test_settle_order_with_different_uom` asserted that settling a sale order line sold in dozens sets `qty_delivered` to 1.0 on the sale order line. That only holds when `pos_sale_stock` is installed: it is its `_prepare_qty_delivered` override that reports the quantities sold in the PoS as delivered, converted back into the unit of the sale order line. `pos_sale` alone only feeds `qty_invoiced`, and since `point_of_sale` does not depend on `stock`, `sale_stock` is not installed either, so `qty_delivered_method` stays 'manual' and the field remains 0.0. Assert `qty_invoiced` instead, which covers the same unit conversion with the modules `pos_sale` actually depends on, and move the `qty_delivered` check to `pos_sale_stock`, where the delivery is created. It is added as its own test since the tests inherited from `TestPoSSale` are not collected by the `pos_sale_stock` suite. runbot-946054 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When shoppers sort product listings after applying filters, those filters now remain in place instead of being cleared. This makes browsing more consistent and helps customers refine products without repeating their selections.
Original PR description
Before this commit, changing the sort order after applying shop filters would clear the active filters because the sort links were not updated with the current query parameters. This commit ensures that the sort controls preserve the active filters when changing the sort order. task-6422290
Mega menu layouts now avoid using heading styles where they do not represent real page structure. This keeps the same visual appearance while improving accessibility and helping search engines better understand website pages.
Original PR description
### Issue: Mega menu templates were using heading tags purely for visual styling. This introduces an incorrect document outline, as these elements do not represent actual content hierarchy. It can negatively impact SEO and accessibility. ### Fix: Avoid using heading tags in mega menu templates for visual styling. Use existing CSS classes to preserve the appearance. task-[6116253](https://www.odoo.com/odoo/project/974/tasks/6116253) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The link preview popover now makes the magic wand edit control easier to click and gives clearer hover feedback. This improves accessibility and usability for users editing links, including in dark mode.
Original PR description
According to accessibility recommendations, the magic wand icon link inside the link preview popover is too small. This commit makes it clickable on an area of 24px x 24px, and adds the missing effect to provide feedback on hover. task-6373506 Forward-Port-Of: odoo/odoo#283050 Forward-Port-Of: odoo/odoo#276929
Spreadsheet pivot side panels now reflect changed row, column, or measure order immediately. This prevents a brief display of outdated information, making pivot configuration feel smoother and more reliable for users.
Original PR description
Current behavior before PR: - The runtime definition was rebuilt only after load() resolved. - When the row/column/measure order changed without an RPC reload, the side panel kept reading the stale runtime definition. - This caused the side panel to briefly show the old order before updating to the new one. Desired behavior after PR is merged: - Rebuild the runtime definition synchronously in onDefinitionChange. - The side panel now reflects the new order immediately after coreDefinition is updated. Task: [6427932](https://www.odoo.com/odoo/project/2328/tasks/6427932) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The online shop now avoids showing an extra blank space when a product has no unit of measure label. This creates a cleaner, more polished product availability display for shoppers while preserving unit labels when they are available.
Original PR description
Remove duplicated space when there is no uom_name. Activate the UOM feature in tests to display the uom_name. Following [PR274085](https://github.com/odoo/odoo/pull/274085) where uom_name became conditional. runbot-241108
The record selector now keeps its dropdown indicator from changing the field width when users hover or focus it. Clicking the indicator also opens suggestions as expected, making report filters feel more reliable and easier to use.
Original PR description
Steps to reproduce: - Install Accounting. - Open Reporting > Balance Sheet. - Open the Comparison filter. - Hover the "Percentage of" record selector. - The dropdown width shifts when the caret appears. - Clicking directly on the caret does not open the suggestions. RecordSelector and MultiRecordSelector only displayed their caret on hover/focus, which causes a small layout shift. The caret also acts as a dead click target instead of opening the autocomplete dropdown. Reserve space for the caret in the input, render it without affecting layout width, and make it ignore pointer events so clicking it behaves like clicking the input. task-[6268556](https://www.odoo.com/odoo/project/967/tasks/6268556) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website editor now shows dynamic snippet filter names in the editor user's preferred language instead of the website's default language. This avoids confusion for editors working on multilingual websites where the public site language differs from their own interface language.
Original PR description
Steps to reproduce: 1. In an `en_US` database, install the Arabic (`ar_001`) language and set it as the website's default language. 2. Add a `blog.post` dynamic snippet to a page and select it. 3. Open the snippet options. 4. Notice that the Filter dropdown is displayed in Arabic instead of English. The RPC fetching the available snippet filters targets the `website=True` `/website/snippet/options_filters` route. During the request initialization, website routes inherit the frontend request language (see: `frontend_pre_dispatch()`), so the ORM context lang is set to the website language. As a result, translated fields such as name are read in that language. Force `request.env.user.lang` in the context when fetching the filters since their names should be displayed in the editor's preferred language. task-5979540 Forward-Port-Of: odoo/odoo#282804 Forward-Port-Of: odoo/odoo#275390
This fix prevents Odoo IoT printer handling from trying to cancel a print job that CUPS has already cancelled. It reduces unnecessary printer errors and avoids follow-up failures when tracking cancelled jobs.
Original PR description
Before this commit, if the status of a CUPS job was checked when that job was already cancelled, we would treat it as a generic error and then try to cancel the job again. This would result in an error from CUPS ('client-error-not-possible'). There would then be a secondary exception caused by trying to remove the job ID from the list a second time in the exception handler.
After this commit, we avoid trying to cancel the job again. We also use a set instead of a list to keep track of the job IDs, which prevents duplicates and allows us to discard IDs without causing an error if they are already removed.
sentry-IOT-1J
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#283227Self-order now more reliably checks that combo items belong to the correct parent combo line. This prevents incorrect combo selections from being accepted, helping orders stay accurate for customers and staff.
Original PR description
Be sure that combo product of the current line belong to its combo parent line. Forward-Port-Of: odoo/odoo#283284 Forward-Port-Of: odoo/odoo#281741
A leftover “Request Appraisals” action that caused an error has been removed. Employees can still request appraisals in bulk using the existing “Launch Campaign” option, avoiding confusion and failed workflows.
Original PR description
#### Description of the issue/feature this PR addresses: The "Request Appraisals" server action on hr.employee calls model._create_multi_appraisals(), a method that no longer exists. Running it…
#### Description of the issue/feature this PR addresses: The "Request Appraisals" server action on hr.employee calls model._create_multi_appraisals(), a method that no longer exists. Running it raises AttributeError: 'hr.employee' object has no attribute '_create_multi_appraisals'. #### Current behavior before PR: Commit 8845eb2ac29 replaced the multi-appraisal flow with hr.appraisal.campaign.wizard: it deleted _create_multi_appraisals and repointed the employee list header button to action_open_appraisal_campaign_wizard, but left the action_create_multi_appraisals record in hr_appraisal/views/hr_employee_views.xml. Its code is now the only reference to the deleted method, so the action crashes whenever it is run. #### Desired behavior after PR is merged: The dangling action is gone. Requesting appraisals for several employees at once is done with the "Launch Campaign" button already present in the Employees list view; action_open_appraisal_campaign_wizard reads active_ids when active_model is hr.employee and pre-fills the selected employees. Nothing references the removed xml id, and the record is not noupdate, so _process_end removes it from existing databases on update; no migration script is required. Verified on a 19.0 database: with the orphan record loaded, updating hr_appraisal with this change deletes it. opw-6408609 Forward-Port-Of: odoo/enterprise#127983 Forward-Port-Of: odoo/enterprise#125630
This fix prevents errors when Odoo displays names for multiple salary attachments at the same time. Payroll users can view salary attachment records more reliably without unexpected crashes.
Original PR description
Currently, an error occurs when the display name is computed for multiple salary attachments. `ValueError: Expected singleton: hr.employee(58, 56)` After [recent commit], when computing the display name, the employee's display name is accessed through multiple attachment records at once. This results in accessing the display name of multiple employees simultaneously, which raises a singleton error. This commit ensures that the employee is accessed from each individual attachment record when computing the display name. [recent commit]: https://github.com/odoo/enterprise/commit/d9648ef695903113d6ed2f40cd4fcfdd68221fa8 [1]- https://github.com/odoo/enterprise/blob/d913de3097d06e723a08d24907024f83769b1fb8/hr_payroll/models/hr_salary_attachment.py#L150-L153 sentry-7665634830 Forward-Port-Of: odoo/enterprise#127765
Employees opening a contract offer will now see Yes/No benefit options, such as medical insurance, correctly pre-selected when the benefit is already included. This prevents confusion during offer review and helps ensure the salary package shown matches the actual contract offer.
Original PR description
Issue: When an employee opens the salary configurator for a contract offer, optional benefits configured with Yes/No radio choices (such as Medical Insurance) fail to pre-select 'Yes' even when the benefit is already included in the offer. Steps to Reproduce: 1. Go to Salary Configurator and open a contract offer that has an active benefit 2. Observe that 'Yes' is not selected for the benefit on initial load. Fix: Ensure that when a contract offer includes a benefit, the salary configurator automatically defaults the radio selection to `Yes`. task-6392064 Forward-Port-Of: odoo/enterprise#127544
Goal templates in Appraisals will now be created without automatically assigning an employee. This ensures templates appear correctly in the goal template library and can be reused as intended.
Original PR description
Steps to reproduce: - Go to Appraisals > Configuration > Goals > Library and create a goal template. - Or open an employee goal and click "Save as Template". - The created goal template is not visible in the goal template list view. Reason: An employee was set by default on new goal templates upon creation. Solution: Do not assign a default employee when creating a goal template. Task-6443339 Forward-Port-Of: odoo/enterprise#126816
Sendcloud return labels now avoid printing the customer's house number twice in the origin address. This keeps return shipping labels clearer and reduces confusion for customers and warehouse teams processing returns.
Original PR description
Issue ----- On return labels, the house number of the origin address (so the customer) is printed twice. Steps to reproduce ----- - Setup sendcloud - Select a return service - Enable "Generate Return Label" - Create a delivery using sendcloud - Validate the delviery > The return label has the house number printed twice Cause ----- For the origin address shown on labels, Sendcloud prints both the address line and the house number. There doesn't seem to be any parsing made on the address line to extract the house number. For the WH -> Customer label, the "from" address is taken directly from the Sendcloud account's configuration. For the Customer -> WH return, we provide it in the `from_` fields of the request. Note that, when including the house number on the address line in Sendcloud, the issue is also present. ----- Ticket: opw-6405054 Forward-Port-Of: odoo/enterprise#127855 Forward-Port-Of: odoo/enterprise#126250
Approval rules in Studio now handle empty rule conditions consistently, avoiding ambiguity about which records should be affected. This helps ensure approvals apply as intended and reduces the risk of incorrect approval requirements.
Original PR description
Before this commit, there was an ambiguity with the usage of filtered_domain ie ``` self.assertTrue(record.filtered_domain(False)) self.assertFalse(record.filtered_domain(Domain(False))) ``` This is because in that case the API of filtered_domain was not respected After this commit, there is no ambiguity as we cast to a Domain the value we obtain from the rule: - False or None: all records should be impacted by the rule => Domain(True) - otherwise, let the domain do its job opw-6431607 Forward-Port-Of: odoo/enterprise#128160 Forward-Port-Of: odoo/enterprise#127676
The vehicle salary tab now shows the Benefit In Kind amount with the correct yearly label instead of a monthly one. The label placement was also adjusted so it appears neatly beside the value, improving clarity without changing any payroll calculations or data.
Original PR description
The Benefit In Kind (BIK) amount on the vehicle model salary tab was labelled "/ month" while the underlying value is yearly, mismatching the other fields (CO2 fee, Cost, Total Cost) correctly suffixed. The unit label div was also missing the o_hr_narrow_field class used everywhere else in the module, so the unit label stretched to the far right of the row instead of sitting next to the value. Purely visual fix, no behavior or data change. task-6428222 Forward-Port-Of: odoo/enterprise#127652
This fixes an internal automated test that could fail when Field Service Planning was checked together with another planning-related module. The change keeps the test focused on the intended screen behavior and helps maintain more reliable release validation without changing user-facing functionality.
Original PR description
On runbot, the `test_onchange_break_time_after_removing_dates` test was failing during the "all" build due to the `planning_slot_check_datetimes_set_or_plannable_slot` SQL constraint introduced by the sale_planning module. The test previously used `odoo.tests.Form` as a context manager, which implicitly triggered a database save and flushed the dateless test shift to PostgreSQL. Can resolved this by instantiating the Form in memory to validate the frontend `@api.depends` logic without triggering the cross-module database constraint. runbot-6463625 Forward-Port-Of: odoo/enterprise#127859
When Planning billing is enabled with Field Service, the system now automatically selects the expected default project. This prevents setup confusion and helps ensure billable planning work is linked to the right project from the start.
Original PR description
Steps to reproduce: - 1. Create a new database and install Planning and Field Service. 2. Open the Planning settings and enable Billing. Issue: - Billing is enabled but no default project is selected. Cause: - The default of `res.company.planning_project_id` references the module's own `fsm_project` xmlid, but it is evaluated before the module's data files are loaded. The ref resolves to nothing and no value is written. Fix: - Set the project in the post-init hook, once the data files are loaded. task-6460106 Forward-Port-Of: odoo/enterprise#127656
The Timesheet Assistant now recognizes time spent in spreadsheets and suggests it as "Working in Spreadsheet" instead of grouping it under Documents. This helps users review and submit timesheets with clearer, more accurate activity suggestions.
Original PR description
## Behavior Before the Commit When a user spent time working in a spreadsheet, the Timesheet Assistant grouped this time under "Working in Documents". This occurred because "Spreadsheet" is a module rather than an application, and the Assistant only creates suggestions for applications. As a result, it attempted to fall back to an application and frequently defaulted to the "Documents" application. ## New Expected Behavior After this Commit: When a user spends time in a spreadsheet, the Timesheet Assistant now generates a "Working in Spreadsheet" suggestion. This is enabled by a dedicated list of non‑application modules that allows specific modules to be recognized even when they are not applications. task-[6438536](https://www.odoo.com/odoo/project/4105/tasks/6438536) Forward-Port-Of: odoo/enterprise#128038 Forward-Port-Of: odoo/enterprise#126390
Database neutralization for TikTok Shop data now keeps each shop record uniquely identifiable while removing real shop references. This prevents cleanup failures when multiple active TikTok shops exist, making test or sanitized database preparation more reliable.
Original PR description
Steps to produce: --- - Install sale_tiktok module. - Create two active tiktok.shop records. - Run the database neutralization command. Issue: --- - Neutralization fails with a PostgreSQL error:…
Steps to produce: --- - Install sale_tiktok module. - Create two active tiktok.shop records. - Run the database neutralization command. Issue: --- - Neutralization fails with a PostgreSQL error: ```py duplicate key value violates unique constraint tiktok_shop_unique_active_shop` DETAIL: Key (tiktok_shop_ref)=(1) already exists. ``` Root cause: --- - At [1], we are setting `tiktok_shop_ref = 1` for all `tiktok_shop` records. Because `tiktok_shop` enforces a partial unique constraint on `tiktok_shop_ref` for active shops [2], setting the same reference value `1` on multiple active shops violates this constraint. Solution: --- - Update sql to assign a row-unique string to each shop. This strips the real shop reference while maintaining uniqueness across active shop records so neutralization completes cleanly. [1]https://github.com/odoo/enterprise/blob/85754b0354b76da8b4d87a3a81dd19679ed35d15/sale_tiktok/data/neutralize.sql#L1-L8 [2]https://github.com/odoo/enterprise/blob/85754b0354b76da8b4d87a3a81dd19679ed35d15/sale_tiktok/models/tiktok_shop.py#L136-L139 opw-6451715 --- Forward-Port-Of: odoo/enterprise#127532
This fix prevents errors when sales planning data is grouped by customer in setups where the customer field is not stored directly. Businesses get more reliable planning reports, especially when viewing sales order related planning information without the Field Service configuration that stores this field.
Original PR description
Before this commit, #122034 converted the related non-stored `partner_id` field in `planning.slot` into a compute non-stored field with a search method, the problem is that field was used as groupby inside a read_group which causes a traceback since the field is no longer reachable in SQL. This commit alters the groupby in problematic _read_group methods to use partner_id field when it is stored (when field service is installed) otherwise the groupby should be `sale_order_id.partner_id`. Forward-Port-Of: odoo/enterprise#128540
Indian payroll contract validation now shows the wage period that matches the employee contract instead of always referring to a monthly wage. This reduces confusion when allowance totals exceed the wage for contracts using a different pay schedule.
Original PR description
**Steps to reproduce:** - Create an indian employee. - Put total allowance `(basic salary + HRA + standard ALW + Perf bonus + travel ALW) > wage` - We will get validation error in employee stating that allowance sum can't be greater than wage. **Before:** - We were always showing monthly wage in the validation error, which was confusing to the end user. **After:** - We will use field `version.shedule_pay` to show dynamic validation error message. Task: [6449791](https://www.odoo.com/odoo/project/1251/tasks/6449791) Forward-Port-Of: odoo/enterprise#127477
The product catalog opened from Field Service tasks now gives more space to the unit of measure column. This makes item details easier to read and keeps the Enterprise interface aligned with the related Community update.
Original PR description
Steps to produce: --- - Install `Field service` module. - Create a task and open it. - From the task open the catalog from smart button. Update the Product Catalog UI to match the Community PR changes. community PR: https://github.com/odoo/odoo/pull/267118 opw-6253382 --- Forward-Port-Of: odoo/enterprise#128146 Forward-Port-Of: odoo/enterprise#121139
A test for tax return navigation was updated to work with the latest page layout. This helps keep automated checks reliable so issues in tax return access are caught before release.
Original PR description
Description of the issue this commit addresses: Commit 18a9f995ec52d655803aa436e6367bd8bbb353be added layout wrappers around return cards. The tour still expected kanban records to be direct children so it could not find the DUMMY_TAX return. --- Desired behavior after this commit is merged: This commit changes the selector so the tour can open the tax return with the new layout. --- runbot-[945519](https://runbot.odoo.com/odoo/error/945519)
Mexican payroll processing now handles companies that do not have a tax ID set without crashing. This keeps payslip checks running reliably and avoids blocking payroll work because of an optional company field.
Original PR description
`res.company.vat` is not required and can be `False`. Guard the `len()` call so `_issue_mx_warnings` doesn't crash on payslips for companies without a VAT set.
```py
File "/home/odoo/src/enterprise/saas-19.3/hr_payroll/models/hr_payslip.py", line 1936, in _compute_issues
issues = generate_issue(slip, context)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-19.3/l10n_mx_hr_payroll_account_edi/models/hr_payslip.py", line 235, in _issue_mx_warnings
if not slip.company_id.l10n_mx_curp and slip._l10n_mx_is_curp_needed():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/enterprise/saas-19.3/l10n_mx_hr_payroll_account_edi/models/hr_payslip.py", line 325, in _l10n_mx_is_curp_needed
or len(self.company_id.vat) == 13
^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: object of type 'bool' has no len()
```
Forward-Port-Of: odoo/enterprise#128216This fix adds a required customer scheme identifier to SEPA direct debit payment files. It helps ensure files are accepted by banks that require this field, such as Nordea in Sweden, reducing payment processing failures.
Original PR description
We are missing a SchmeNm node in the InitgPty node. This is mandatory for Nordea in Sweden at least. Such as: ```xml <SchmeNm> <Cd>CUST</Cd> </SchmeNm> ``` task-6385960 Forward-Port-Of: odoo/enterprise#124693
This fixes an internal automated test for account reports by using the correct mock PDF generation step. It helps keep report validation reliable without requiring the real PDF engine during testing, reducing false failures in the release process.
Original PR description
Description of the issue this commit addresses: Commit d3b4294a56a5ead3f5ea60714eccdba586f72ef0 changed `_run_wkhtmltopdf` into a subprocess wrapper. A later FW, 64f46c270e062df94d4ce37e3065b3e0a0ba68db, did not account for that change and continued mocking the method with PDF bytes. When the wkhtmltopdf path is reached, reading from those bytes crashes. --- Desired behavior after this commit is merged: This commit mocks `_run_pdf_engine_without_processing`, whose contract is to return PDF bytes, so the tour can validate without invoking a real PDF engine. --- runbot-[944189](https://runbot.odoo.com/odoo/error/944189) Forward-Port-Of: odoo/enterprise#126634
A typo was corrected in the tax unit filter within accounting reports. This improves the clarity and professionalism of the reporting interface without changing functionality.
Original PR description
https://github.com/odoo/enterprise/pull/112607/changes/a96b12df4c9de580041d9f9421441de0b7bc7b2e The typo is coming from this commit. Task-no task
Several guided onboarding flows were corrected so automated walkthroughs work reliably in robot mode. This helps keep appointment scheduling, expense scanning, payroll, and subscription setup guidance stable and reduces the risk of broken first-use experiences.
Original PR description
… fix onboarding tours for robot mode Fix the JS tours of appointment_tour, hr_expense_extract_tour, payroll_tours and sale_subscription_tour, uncovered by adding them to web_tour's onboarding tours test (community-side commit): - appointment_tour: clipboard-close dialog, gantt cell/button selectors, missing attendee/name selection, sample-data-mode interactions. - hr_expense_extract_tour: wrong CSS classes, an obsolete manual receipt-selection step, and menu navigation. - sale_subscription_tour: missing product/customer/plan selections, wrong field name, and a dirty-form-on-save race after selecting the recurring plan.
This change makes Belgian payroll configuration tests use a fixed date so results stay consistent over time. It helps prevent false test failures and supports more reliable payroll maintenance without changing user-facing behavior.
Original PR description
Runbot: 945950
This fix updates internal test setup for VoIP sales and subscription features so required records are created with the right permissions. It helps keep automated checks reliable after a recent change to test user access, reducing false failures in validation pipelines.
Original PR description
With commit https://github.com/odoo/enterprise/commit/a452ee4de2927327b56ae6922f395482e3dbd50f, now test methods run as a dedicated `_test_user` whose groups are limited to the ones defined by `_test_user_groups`. As a result, tests may lack the required groups when setting up their own data. To solve, we create data with sudo(). failing runbot: runbot-945764 runbot-945763
The Project Gantt view no longer shows misleading progress bars on individual task rows when tasks are grouped by assignee in sparse mode. Instead, task rows show allocated hours, making workload information clearer and avoiding incorrect visual cues.
Original PR description
## Current behavior: In the task gantt view grouped by assignees and displayed in sparse mode, task leaf rows reuse the row progress bar and display a misleading visual indicator on each task. ## Expected behavior: It would make more sense to not display anything for the progress bar of each task, rather display the allocated_hours per task ## Steps to reproduce: 1. Open Project tasks in Gantt view 2. Group by Assignees 3. Enable sparse display so each task appears on its own row 4. Notice that task rows show a progress bar that is not meaningful for the task itself ## Cause of the issue: Each task rows currently hasno meaningful progress-bar semantics, bu they still inherit the generic row progress-bar rendering ## Fix: Override the task gantt renderer to hide progress bars, and only show `allocated_hours` for each task opw-6352260 Forward-Port-Of: odoo/enterprise#124618
A minor issue in the Sign app was fixed to prevent the system from trying to use a missing logging component. This helps avoid unnecessary errors during document signing operations and supports smoother reliability.
Original PR description
See https://github.com/odoo/enterprise/pull/121960 Forward-Port-Of: odoo/enterprise#128748
Updating spreadsheet pivots now keeps the details side panel stable instead of briefly showing an invalid model message. This improves the user experience by preventing confusing flickers while pivot data refreshes.
Original PR description
Current behavior before PR: - Updating a pivot caused the side panel to flicker. - The panel briefly showed an 'invalid model' error. - Owl 3 rendered the panel while the pivot data was still reloading, exposing its transient loading state. Desired behavior after PR is merged: - Fetch the model validity and label once in the onWillStart hook. - Updates now render correctly without flickering. Task: [6427932](https://www.odoo.com/odoo/project/2328/tasks/6427932)
This fixes extra spacing in rental product availability messages when the unit of measure is not shown. The change keeps the online shop display tidy and updates tests to cover the intended unit display behavior.
Original PR description
Remove duplicated space when there is no uom_name. Activate the UOM feature in tests to display the uom_name. Following [PR274085](https://github.com/odoo/odoo/pull/274085) where uom_name became conditional. runbot-241108
This fixes an error that could occur when simulating Belgian payroll ONSS data after payroll configuration versioning was introduced. The system now uses the current payroll settings version instead of outdated company-level settings, helping payroll workflows continue reliably.
Original PR description
With the launch of payroll config versioning, fields were moved from res.company to its versions, this file was trying to reference a field directly from the company instead of its current settings version Task-6485680
Payroll payment files for Swiss Revolut accounts now include the beneficiary name where required. This helps avoid payment processing issues and supports smoother salary payments through Swiss payroll workflows.
Original PR description
Forward-Port-Of: odoo/enterprise#126632
Users can now move through return items in the kanban view with the up and down arrow keys without triggering an error. This makes reviewing and selecting returns smoother and prevents an interruption in the accounting workflow.
Original PR description
In returns kanban view, a traceback occurs when pressing down. Fix this by adding the support for up/down keyboard navigation for returns selection. task-6281033 Forward-Port-Of: odoo/enterprise#128308 Forward-Port-Of: odoo/enterprise#125164