Tuesday, April 21, 2026
37 changes · master
Resolved issues and error corrections
The Indian withholding configuration now requires a period to be selected whenever aggregate limits are enabled. This prevents invoice creation from failing if that field was manually cleared, improving reliability for users managing withholding rules.
Original PR description
Previously, if `is_aggregate_limit` was set to True while `aggregate_period` was left empty, it would raise a traceback during invoice creation. Although `aggregate_period` has a default value, it can still be manually cleared. With this commit, `aggregate_period` is enforced as mandatory whenever `is_aggregate_limit` is enabled, preventing such errors. Forward-Port-Of: odoo/odoo#260026 Forward-Port-Of: odoo/odoo#259634
Fixes an issue where opening a channel from the Discuss channel list could show an error for users who were not members of that channel. The channel now opens as a chat window instead, helping users access conversations smoothly without interruptions.
Original PR description
Steps to reproduce:
* Open Discuss
* Go to Configuration > Notifications
* Set it to `All Messages`
* Go to Channels menu
* Click on any record (not member)
-> Traceback
This happens since [1] because it tries to read `message_unread_counter_ui` on `self_member_id` even when it is undefined.
This commit fixes the issue by opening the chat window instead.
[1]: https://github.com/odoo/odoo/pull/249755
Task-6128253
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#259640The BoM Overview no longer crashes when a company has no warehouse configured. Instead, manufacturing users see product availability as not available, allowing them to continue reviewing Bills of Materials without interruption.
Original PR description
**Steps to Reproduce:** - Install MRP module. - Create a new company and switch to it. - Create a new BoM. - Click on the "BoM Overview" smart button. **Error:** `IndexError - list index out of range` **Cause:** When a new company is created, no warehouse is automatically generated for it. If no warehouse is configured for the company, the list is empty, causing an error. **Fix:** This commit raises a redirection warning if no warehouse is linked with the company. sentry-7286332859 Forward-Port-Of: odoo/odoo#250602
Point of Sale session reports now calculate discount amounts using the taxes that apply after a fiscal position is selected. This prevents incorrect discount totals in reports when fiscal positions change taxes, improving accuracy for store reporting and reconciliation.
Original PR description
Steps: ---- - Create a fiscal position with 2 different taxes - Add a line in POS - Apply fiscal position and add line discount - Finish the order cycle - Download the session report Issue: ---- - The discount amount was calculated incorrectly in the session report Cause: ---- - The discount amount calculation used taxes before applying the fiscal position Fix: ---- - Used `tax_ids_after_fiscal_position` for tax calculation while computing the discount amount task-5421215 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259154 Forward-Port-Of: odoo/odoo#244650
This fix prevents an error when users edit a scheduled chatter message and remove an attachment. It makes the scheduled message editor more reliable by only using composer-specific functionality when it is available.
Original PR description
scheduled message editor Problem: When editing a scheduled chatter message, removing an attachment raises a traceback. Cause: `fullComposerBus` is available in the `Composer` environment but not in `ScheduledMessage`. The code assumed its presence and attempted to use it unconditionally. Solution: Check whether `fullComposerBus` exists in `env` before using it. Steps to reproduce: - Add a log note. - Open the full Composer. - Add an attachment. - Schedule the message. - Save. - Edit the scheduled message. - Remove the attachment from the attachments list. - Observe a traceback. opw-6098302 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258839
Point of Sale preparation printers now show the selected variant attribute when a combo item includes an instant variant. This helps kitchen or preparation staff see the exact item choice, reducing confusion and fulfillment mistakes.
Original PR description
Before this commit, the preparation printer did not display the attribute value for an instant variant added inside a combo choice. This occurred because the attribute value was not properly set on the variant order line. Steps to reproduce: * Create a PoS product with multiple variants. * Create a combo product with a choice containing the variants. * Configure a preparation printer. * Open a PoS session and order the combo. * The printer displays only the base product name. opw-5949132 Forward-Port-Of: odoo/odoo#256981
Invoice emails now name extra dynamic report attachments using each report’s configured Printed Report Name. This prevents confusing default filenames and keeps emailed invoice documents aligned with business naming rules.
Original PR description
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice…
When sending an invoice by email template, dynamic report attachments do not use their configured Printed Report Name. Instead, they fall back to a default naming pattern (e.g. report name + invoice number). This is due to a difference in flow: sales use the standard mail.compose.message wizard, which correctly applies each report’s print_report_name, while invoices use the dedicated account.move.send flow. In this flow, dynamic report filenames are not computed from the report itself. To fix this, the send flow is updated so _get_placeholder_mail_template_dynamic_attachments_data computes the filename from each dynamic report. When a print_report_name is defined, it is used. Otherwise, the previous fallback behavior is preserved. The fix will ensure extra dynamic reports follow their configured printed name. Steps to reproduce: 1. Go to Settings > Technical > Reporting > Reports and duplicate the standard Invoice report. 2. In the duplicated report, set a custom value in Printed Report Name (e.g. 'CUSTOM_NAME_TEST'). 3. Go to Settings > Technical > Email > Templates and open “Invoice: Sending”. 4. Add the duplicated report under Dynamic Reports. 5. Create a customer invoice and confirm it. 3. Click Send (or Send & Print) to open the email preview. Related Ticket: opw-6058716 Forward-Port-Of: odoo/odoo#259975 Forward-Port-Of: odoo/odoo#259267
The Inventory Move History screen no longer lets users edit a reference value that cannot actually be saved. This removes a confusing experience where users could make a change, save it, and then see the original value return after reopening the view.
Original PR description
### Issue before this commit: Before this commit, the Reference field displayed on stock.move.line was editable in the user interface, even if the modification made by the user was not persisted.…
### Issue before this commit: Before this commit, the Reference field displayed on stock.move.line was editable in the user interface, even if the modification made by the user was not persisted. After saving and reloading the Move History view, the original value was restored. ### Steps to reproduce the issue: 1. Go to Move history in Inventory app 2. Try to change the name of a line and save 3. If you go back to the Move history you can see that the name is not changed ### Cause of the issue: The issue was caused by a mismatch between the stock.move.line.reference field and its target field stock.move.reference. The field on stock.move.line is a related field that appears editable (readonly=False), but the underlying stock.move.reference field was not writable. As a result, user could edit the field but the modifications were ignored, preventing changes from being effectively saved. ### Reason to introduce the fix: The fix ensures that the reference field in stock.move and in stock.move.line are readonly. opw-6055708 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256434
Spreadsheet treemap charts now handle cases where the selected data filter returns no results. This prevents an error from interrupting users when they change a chart to treemap with an empty dataset.
Original PR description
Steps to reproduce: - go to any chart view - insert the chart into a spreadsheet - edit the domain such that no data matches the domain - change the chart type to "treemap" ⮕ boom SyntaxError: "undefined" is not valid JSON Task-6127130 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix keeps mail presence tests aligned between the standard Odoo version and the enterprise VOIP feature set. It prevents test expectations from relying on VOIP-only information when that feature is not available, improving reliability without changing user-facing behavior.
Original PR description
Commit [1] added expected `should_display_in_call_im_status` values to shared mail test payloads, but this field is only provided by enterprise VOIP through `has_active_call`. Strip that VOIP-only field from community expectations when `has_active_call` is unavailable, and reuse the common user-field filter for the manual IM status test payload. [1]: https://github.com/odoo/odoo/commit/600b50cc26fd4c516a0f3dcdb9a1df846dc4f56a runbot-242689
This update makes several automated point-of-sale checks more precise so they run consistently. It helps reduce false test failures, improving confidence in future changes without altering day-to-day user workflows.
Original PR description
Fix undeterministic tours by making some triggers more precise in a few steps. 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
This fixes an intermittent test failure in the Mail app related to loading additional channel members. The change improves confidence in automated checks without changing the user-facing product experience.
Original PR description
Before this commit, the `Load more button should load more members` test was sometimes failing. When the click on the "load more" button happens before the initial fetch of the members, the last member is not loaded. fixes runbot-242684 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
This fix stops custom field information from accumulating during system reloads. It helps keep the underlying application registry clean and avoids duplicated internal data that could affect stability over time.
Original PR description
When a custom (manual) field is related to a base field, it is added to `registry.field_setup_dependents`. However, these custom fields were not being cleaned up correctly, causing them to duplicate and leak during each model setup. This fix explicitly cleans these manual fields from `field_setup_dependents` inside `_add_manual_models()` when manual models are removed from the registry and the registry is being reloaded. Similar to https://github.com/odoo/odoo/pull/253377. Forward-Port-Of: odoo/odoo#259819
This fix makes required input fields show consistent border color changes when users hover over either the label or the field itself. It also improves contrast on small screens in dark mode, making required and optional fields easier to distinguish.
Original PR description
Before this commit, hovering over the label changed the input border color to a darker shade, but hovering over the input field itself did not. This inconsistency was caused by a missed revert from a previous "m3 input boxes" update. 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
Odoo now reports the actual access rule blocking a user when they open an archived record directly. This prevents misleading messages that incorrectly suggest a company access issue, helping users and support teams identify the real cause faster.
Original PR description
When accessing an archived record directly, if access is prevented by a record rule other than a multi-company global rule, the error message incorrectly reports that all rules are failing, suggesting a company issue even though it is not the actual cause. The problem is that when access is denied, the diagnostic method `_get_failing` is used to determine which rules are failing. This method performs several count queries with different rule domains. However, `active_test` is True by default, excluding archived records from the count, causing the rule evaluation to miss some records and incorrectly mark rules as failing. With this commit, `_get_failing` evaluates rules with `active_test=False`, ensuring that only actually failing rules are reported. Forward-Port-Of: odoo/odoo#259592 Forward-Port-Of: odoo/odoo#259344
The domain selector and expression editor now display numeric values using the user’s local decimal and thousands separators. This makes filters easier to read and reduces confusion, while keeping the underlying expression logic unchanged.
Original PR description
Before this commit, the domain selector (and expression editor) did not format numbers according to the localization parameters (decimal and thousands separators), while the parsing step did. After this commit, the value is displayed in the correct format to the user, while the expression remains unchanged. 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#259732 Forward-Port-Of: odoo/odoo#258287
Clicking “View Profile” from a contact mention now closes the contact popover after opening the profile page. This prevents a lingering overlay and makes the messaging experience cleaner and less confusing for users.
Original PR description
**Current behavior before PR:** Clicking on a partner mention opens the avatar card popover. When the **View Profile** button is clicked, the partner form view opens, but the popover remains visible. This happens because the popover opened via `onClickPartnerMention` uses the popover service directly, instead of the `usePopover` hook, which automatically closes the popover when the component is unmounted. **Desired behavior after PR is merged:** Clicking the **View Profile** button opens the partner form view and closes the avatar card popover. task-[6063906](https://www.odoo.com/odoo/project/1519/tasks/6063906) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259959 Forward-Port-Of: odoo/odoo#256283
The website builder now clearly shows the translation status on file names added through the file block, even when the file display has a colored alert background. This helps editors see what still needs translation and avoid missing file labels on multilingual websites.
Original PR description
Commit cbb2eb2edfeecbc21a70c1a3cba81ad0a7ac9c75 added a resource to repeat the background color of the translation state inside elements, for the cases where an element has a background color that hides the translation state. This commit uses the resource for file's names (added by typing `/file`) Steps to reproduce: - Open website builder - Type `/file` and add a file - Add a language - Open in translate mode - Bug: the translation state is not show on the file name task-6038029 Forward-Port-Of: odoo/odoo#259955 Forward-Port-Of: odoo/odoo#259902
This fixes leftover stock-related test data in the Point of Sale self-order area after stock logic was moved to a dedicated stock module. The change helps keep automated tests aligned with the new structure and reduces the risk of false test failures.
Original PR description
After moving stock logic from `point_of_sale` to `pos_stock`, every stock-related term should be moved and these ones were left out in #241368. Runbot error: 242969 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The CRM lead generation walkthrough now presents its extra guidance at the end, preventing users from being sent backward or stuck in a loop during the tour. This makes onboarding smoother when introducing lead generation, though the final success message may still appear even if lead generation cannot complete due to selections or credits.
Original PR description
The crm_iap_mine module extended the crm tour, by adding steps to introduce the lead generation feature. These steps were inserted in the middle of the tour, which caused the tour to backtrack and…
The crm_iap_mine module extended the crm tour, by adding steps to introduce the lead generation feature. These steps were inserted in the middle of the tour, which caused the tour to backtrack and loop on itself. Why? For the tour to wait for the next step, we specify the selectors it should look for. In this case, because the modal redirects to the same page (with an updated domain), we cannot specify a selector that would be unique to the new page -> the target is found before the redirect -> after the redirect happens, the tour backtracks to try and recover, causing the loop. Moving the steps to the end of the tour fixes the issue. The disadvantage of this is that no the last step of the tour is not deterministic - it can fail if the user selects a combination of countries and industries which have no valid leads (Antarctica...) or if the user doesn't have enough IAP credits. In this case, the 'Congrats' rainbowman is shown even if the generation failed. Task-5386684 Forward-Port-Of: odoo/odoo#259960 Forward-Port-Of: odoo/odoo#249733
Agents who are already participating in active live chats can now still see the live chat button and start another conversation as a visitor. This prevents blocked workflows for users who need to open additional live chat sessions while handling existing ones.
Original PR description
Previously, users who were part of active livechats as agents could not see the livechat button to start a new conversation. This change ensures the button remains visible so users can start additional livechats as a visitor. task-[5119098](https://www.odoo.com/odoo/project/1519/tasks/5119098) Forward-Port-Of: odoo/odoo#259567 Forward-Port-Of: odoo/odoo#253894
Digest reports now count connected users using the companies they are allowed to work in, not only their default company. This makes company-level user activity figures more reliable for businesses where employees operate across multiple companies.
Original PR description
**Problem:** Currently, the digest KPI for connected users checks the "company_id" field (as with all other models), but this field corresponds to "Default Company" on res.users, meaning a user can only be considered for one company when computing the digest KPI. This can cause misleading digest KPIs if users work in multiple companies, or mainly in a company that isn't their default company. **Solution:** Instead of always using the "company_id" field, we use the "company_ids" field if present on the model. opw-5404940 Forward-Port-Of: odoo/odoo#259345 Forward-Port-Of: odoo/odoo#247806
This fixes an issue where the color picker would close immediately when users tried to change the color of an inserted icon in the editor. Users can now select and preview icon colors normally, improving the editing experience for notes and other content.
Original PR description
Commit [1] did already fix this problem, but commit [2] broke it again. This commit restores the condition that was removed by [2] but adapts it slightly in order to only take into account the direct children of the node, instead of any sub-node when checking for the presence of icons. Steps to reproduce: - Go to a "To do" note - Insert an icon with /media - Select the icon - Open the color picker - Hover a color => Color picker closed right away [1]: https://github.com/odoo/odoo/commit/1adfd9b9daf09c26ad642faf411574123110b9be [2]: https://github.com/odoo/odoo/commit/85688ffd11a3a988bf32c8c923a4628a89b57f87 task-6128069 Forward-Port-Of: odoo/odoo#260167 Forward-Port-Of: odoo/odoo#259644
The online store product tag template was adjusted so it no longer depends on page data that is not always available. This prevents rendering errors in places where product tags are shown, improving reliability for shoppers and website editors.
Original PR description
A recent PR added a reference to `keep` in the template, however, this template is rendered in multiple places, and not all of them were adding `keep` to the rendering context, resulting in rendering errors. Alternatively, we could have added `keep` wherever it was missing, but that wouldn't make sense in all cases. Moreover, `keep` isn't very useful anymore on the product page (one of the places where the template was called) and will be dropped soon.
Messages now have extra blank lines removed from the start and end before they are sent. This prevents recipients from seeing unintended empty space, making Mail conversations look cleaner and more polished.
Original PR description
Trim the leading and trailing empty lines in the message body before sending it to avoid unwanted empty lines at the beginning and end of messages. task-6027013 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260185 Forward-Port-Of: odoo/odoo#259136
This change fixes an internal test setup issue in the electronic invoicing module by checking module availability before using a related security group. It helps keep automated validation reliable and prevents false test failures during development.
Original PR description
The `get_default_groups` call happens during super.setUpClass(), therefore we have not checked (yet) if the module in which the security group is in is installed, and we end up with an Exception. task-none Forward-Port-Of: odoo/odoo#260230
The upgrade helper now correctly recognizes variables used in template expressions when they are followed by a comma. This prevents unnecessary template changes during upgrades and reduces the risk of incorrect automated migrations.
Original PR description
When a variable is used as method parameter and followed by a comma it failed to be identified as being used, so the script then incorrectly moved it as a t-call parameter while it's not necessary.
In the example below, the variable `geoip_country` was not correctly identified as being used in the `t-out` statement:
```
<t t-name="website.test">
<t t-call="website.layout">
<t t-set="geoip_country" t-value="request.geoip.country_code"/>
<t t-set="all_countries" t-value="{cc.code: cc.name for cc in request.env['res.country'].search_fetch([], ['code', 'name'])}"/>
<div>Country: <t t-out="all_countries.get(geoip_country, 'BE')"/></div>
</t>
</t>
```
This commit fix used variable detection when the variable is immediately followed by a comma.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#260397
Forward-Port-Of: odoo/odoo#258838Belgian payroll contract templates now include the Dimona category, helping ensure the right reporting information is carried into employee contract versions. This reduces manual corrections and supports more accurate payroll administration for Belgian employers.
Original PR description
Forward-Port-Of: odoo/enterprise#114072
This fixes an issue where certain Gemini AI models could accidentally discard existing response settings when adding thinking-related options. The change helps keep AI outputs consistent and prevents configuration choices from being lost.
Original PR description
When using gemini-3-flash or gemini-3.1-pro models, the generationConfig dict is completely replaced by a new one that only contains the 'thinkingConfig'. This commit fixes the issue.
Fixed an issue where Timesheets Assistant suggestions from activity rules could appear as unmatched when a project was set without a specific task. These suggestions now stay linked to the configured project, making time entry recommendations clearer and easier to use.
Original PR description
Steps to Reproduce --- - Define an aw.rule with a project set without a task (false) - The rule regex matches a desktop app event (e.g. Discord window) - Open the Timesheets Assistant for the current…
Steps to Reproduce --- - Define an aw.rule with a project set without a task (false) - The rule regex matches a desktop app event (e.g. Discord window) - Open the Timesheets Assistant for the current day Current Behavior --- - The matched event has _res_model set to "project.task" and _res_id set to undefined, despite no task being configured on the rule - The suggestion appears as "Unmatched" in the assistant even though a project was correctly defined on the rule Expected Behavior --- - The matched event should have _res_model set to "project.project" and _res_id set to the rule's project_id - The suggestion should appear under the configured project Issue --- - In extractWatcherActivity(), both project_id and task_id blocks used != null as the guard condition - When task_id is false, false[0] is undefined, overwriting the correctly set _res_model i.e. "project.project" and _res_id from the project_id block with "project.task" and undefined _res_id Fix --- - Replace with a truthy check task - 6089410 Forward-Port-Of: odoo/enterprise#114172
The Timesheet Assistant now excludes calendar entries created by approved time off requests. This prevents employees from seeing vacation or leave records suggested as billable or work-related timesheet entries.
Original PR description
Steps to Reproduce:
---
1. Book a time off for any day via the Time Off app.
2. Open the Timesheets app for that same day.
3. Open the Timesheet Assistant suggestions panel.
Current Behavior:
---
The assistant surfaces the calendar event generated by the Time Off app as a
timesheet suggestion, e.g."Calendar Event - Mitchell Admin on Time Off : 1 days"
Expected Behavior:
---
Calendar events created by time off requests should not appear as
timesheet suggestions.
Issue:
---
The get_calendar_events getter in timesheet_grid_calendar fetched all calendar event
for the user without filtering by res_model, so time off meetings were included.
Fix:
---
Add ("res_model", "!=", "hr.leave") to the calendar.event search
domain.
task-6117932
Forward-Port-Of: odoo/enterprise#113789A Helpdesk filter was corrected so ticket priorities are compared using the right value type. This prevents an error that could interrupt ticket searches or views involving priority filters, helping support teams access their work reliably.
Original PR description
Use correct selection value. ``` psycopg2.errors.UndefinedFunction: operator does not exist: character varying = integer LINE 1: ..."active" IS TRUE AND "helpdesk_ticket"."priority" IN (3) AND... ```
This change removes duplicate payroll-related method definitions and keeps the intended salary contract behavior in one place. It helps reduce the risk of inconsistent payroll calculations or maintenance errors without changing the visible user workflow.
Original PR description
Some methods are defined two times without call to super. Methods defined in hr_contract_salary are moved to payroll (to replace payroll one)
Fixes an issue in Planning where clicking an empty schedule cell for a field service resource could fail because duplicate role information was being requested. This keeps the resource avatar selector working reliably without changing user-facing workflows.
Original PR description
Steps to reproduce: - Open Planning (with field service activated) - Click on an empty cell for Anita's resource This commit removes the uneccessary related field `role_ids` on the new widgets introduced in odoo/enterprise#109060, as it is already added to the field specification [here](https://github.com/odoo/enterprise/blob/master/planning/static/src/views/fields/many2many_avatar_resource/many2many_avatar_resource_field.js#L21-L29)
This fix updates Helpdesk priority filters so they use the expected value format during upgrades. It prevents upgrade failures and keeps Helpdesk ticket filtering working consistently after recent platform validation changes.
Original PR description
- After the recent changes in `fields_selection.py`, selection values are now validated strictly as strings instead of allowing integers to be converted automatically. - Because of that, domains still using integer values such as `3` can fail during upgrade and now need to use string values like `'3'`. - This works fine directly on the master branch, but it fails during the upgrade from saas-19.2 to master. - Runbot link: https://runbot.odoo.com/runbot/build/107991687 - I think it may be related to this PR: [255901](https://github.com/odoo/odoo/pull/255091) - Am I missing something here?
This fix updates the French DAS2 report sending process so attached files use the expected internal format. It helps ensure DAS2 report attachments are generated and sent reliably after a recent platform change.
Original PR description
Since 0b50021bdae54779396d75d3cddbd9eb42571553 the we should use `BinaryBytes` instead of base64 for binary attachments. This commit handles that. No task ID
This update corrects test reference files for Peruvian electronic invoicing after a rounding change in related invoice calculations. It helps keep automated checks reliable so future updates do not get blocked by outdated expected results.
Original PR description
https://github.com/odoo/odoo/commit/e79136d04c844f9a0a8c6d0532c65e0cc3a68b8f fixes unit price rounding in peppol. This PR fixes a broken test in l10n_pe_edi opw-6009771 Forward-Port-Of: odoo/enterprise#114377 Forward-Port-Of: odoo/enterprise#114159