Friday, September 18, 2026
59 changes · master
New functionality added to Odoo
This update adds guidance for Odoo skill documentation to use simple ASCII punctuation in comments, messages, and related prose. It also cleans up existing guideline text so translators and reviewers see fewer near-duplicate strings caused only by special punctuation.
Original PR description
**Description of the issue/feature this PR addresses:** The skill library has no guideline about the prose written alongside the code: comments, docstrings, user-facing strings and commit messages.…
**Description of the issue/feature this PR addresses:** The skill library has no guideline about the prose written alongside the code: comments, docstrings, user-facing strings and commit messages. Em dashes keep appearing there. They are absent from the keyboard layouts the codebase is written with, so in practice they arrive by copy-paste or from a generation tool; they cannot be typed back by a reviewer who greps for a comment; and two variants of a translatable literal that differ only in the dash are two terms to translate. The skill files themselves carried 65 of them, plus 4 ellipsis characters. **Current behavior before PR:** - An agent writing or reviewing an addon has no rule on punctuation in comments, docstrings, user-facing strings or commit messages. - The guideline files use the em dash heavily, so an agent reading them picks up the habit from the material that is supposed to correct it. **Desired behavior after PR is merged:** - `odoo-guidelines/guidelines/comments.md` holds one section, registered in the skill table so it is read when a comment, a docstring, a user-facing string or a commit message is written: "Plain ASCII punctuation in comments and messages" states the rule, gives a bad/good example, explains why, and carves out the exceptions (content that is data rather than prose, and stable branches, where fixing punctuation is a cosmetic change and rewording a translatable term breaks its translations). - The guideline files follow their own rule: the 65 em dashes and the 4 ellipsis characters are rewritten as a comma, a colon, a semicolon, parentheses or a new sentence, one by one rather than by a blind substitution. The only occurrences left are in `comments.md`, where the character is the subject of the rule and of its "bad" example. - No guidance changes meaning: the cleanup is punctuation only, so it can be reviewed by reading the word diff (`git show --word-diff=plain`). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288034
Enhancements to existing features
Odoo now prevents other workers from loading system registry data while it is being modified. This reduces the risk of inconsistent behavior during internal updates and helps keep multi-worker environments more reliable.
Original PR description
Before modifying a registry, `will_change_registry` is called. During the first call, lock registry loading so that no other worker can load the registry while it's being modified. This is similar to locking during updating of modules. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
When editing an online store product with variants, tags now attach to the variant currently shown on the page instead of the default one loaded first. This prevents saved tags from disappearing after reload and keeps product editing consistent for shop managers.
Original PR description
Versions -------- - master Steps ----- 1. Install eCommerce. 2. Open a product with variants on the shop and enter Edit. 3. Pick another variant, then add a tag in the Tags row and save. Issue ----- The tag lands on the variant the page was loaded with instead of the one being displayed. After reload it is absent from the page, and the editor no longer offers it. Cause ----- `ProductVariantOption` reads `data-product-variant-id`, which is rendered server side for the default variant and never refreshed on combination change. Solution -------- Read `[data-product-id]` inside `.js_product` instead, which follows the displayed combination. opw-testing-day-v20 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288328
Features or functions removed from Odoo
This change removes obsolete internal code related to unit-of-measure rounding in the Purchase and Sales apps. It has no expected impact on daily workflows, but helps keep the system easier to maintain and reduces technical clutter.
Original PR description
With this commit, remove unused method definitions related to UoM rounding. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Code cleanup and technical improvements
The HR Work Entry module now uses one shared setup for displaying work entry type badges and labels. This reduces duplicated code and makes future maintenance easier without changing the business workflow.
Original PR description
Unify the work entry type rendering logic to eliminate duplicate files and code: - Remove redundant `work_entry_type_badge_field.js` and `work_entry_type_badge_field.xml`. - Extend the `hr_work_entry.WorkEntryType` QWeb template to accept an optional `label` parameter, enabling it to render either a standalone color pill or a pill with an adjacent label. - Move `WorkEntryTypeBadgeField` into `work_entry_type_field.js` to keep all related field registrations in a single component directory. - Update `hr_work_entry.WorkEntryTypeBadgeField` and `hr_work_entry.Many2OneWorkEntryTypeField` templates to call the unified sub-template with their respective data. Task:6578031 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Accounting users can now use a keyboard shortcut to validate and post an opening entry from the setup wizard. This reduces clicks during initial accounting setup and helps users complete the process more efficiently.
Original PR description
No task ID
The mail chat composer now has a fully rounded, pill-shaped input when shown on one line. The chat window corners were adjusted to match, giving conversations a more consistent and polished appearance.
Original PR description
Round the composer input to a full pill on a single line. The chat window radius follows so both look consistent. <img width="820" height="718" alt="composer-rounded-comparison" src="https://github.com/user-attachments/assets/23132111-3976-4064-abdb-c7cddae06876" /> Forward-Port-Of: odoo/odoo#287094
The working schedules list now displays calendar names vertically aligned with the rest of each row. This small visual improvement makes the list easier to scan and gives the scheduling screen a cleaner, more consistent appearance.
Original PR description
Add a class `o_resource_calendar_list` for the working schedules list view to align the list rows in the middle. Before the PR: <img width="1908" height="597" alt="image" src="https://github.com/user-attachments/assets/19445c28-3e28-4d5b-a12f-f6c1701c01a7" /> After the PR: <img width="1390" height="262" alt="image" src="https://github.com/user-attachments/assets/fb50f6ca-6193-4c5e-9a30-8cd47873f01f" /> task-6562529
The PDF quote builder layout is now more consistent and easier to scan. Buttons align with their section titles, multiple buttons fit neatly side by side, and redundant product label text has been removed.
Original PR description
Before this commit, an unnecessary margin on the quote builder buttons left them out of line with their section titles, and those titles didn't match the sections used everywhere else in other tab views. The `Product >` prefix was also redundant, as the product name alone already says what the section is. This commit removes the margin, spaces the buttons so several can sit side by side, aligns the titles with the usual form section style, and drops the `Product >` prefix. task-6528393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288523
Odoo now installs related country-specific apps when another app for the same single country has already been installed, even if no company is set up in that country. This reduces unexpected missing add-ons, avoids recurring cleanup work, and preserves country metadata used in the Apps screen.
Original PR description
Currently a module with `countries` in the manifest is only installed in case a company with a matching country exists. This commit relaxes the constraint: In case we have already installed a module…
Currently a module with `countries` in the manifest is only installed in case a company with a matching country exists. This commit relaxes the constraint: In case we have already installed a module "from that country" we still install the module. For this we only consider modules that have a single country set in the manifest. (To avoid installing "generic" modules with multiple countries that we do not want.) The current behavior may cause unexpected behavior in case a module is manually installed in case such a company does not exist. (This i.e. causes issues with the runbot tests from time to time) Consider the following case: `l10n_XX`: `countries: ['XX']` `l10n_XX_reports`: `countries: ['XX']` In case we manually install `l10n_XX` but no company has country `XX`. Then we would not install `l10n_XX_reports`. The current workaround is to just not set the `countries` in dependecies but only in the "root" modules. But this requires knowledge of this problem. So it is sometimes not done. So currently we have to do "cleanup" PRs from time to time. Another issue with the workaround is that the `countries` also gives additional metainformation about the module that is lost. E.g. the `countries` info is used to display flag icons for the module in the `Apps` application. task-None
The Open Kiosk button in the self-ordering point of sale dashboard has been separated into its own reusable component. This makes it easier for other modules to customize or extend the button without changing the core dashboard behavior.
Original PR description
To allow overrides in other modules, the “Open Kiosk” button has been extracted into its own widget. 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 update clarifies how hierarchy-related search options in Odoo's core data engine are described. It helps developers and implementers better understand these options, reducing confusion when configuring or extending business logic.
Original PR description
task-4280696 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
India company settings now show “Unregistered” as a placeholder when no GST registration type is selected. This helps users understand that an empty value means the company is unregistered, reducing confusion during setup.
Original PR description
As `l10n_in_gst_registration_type` is left empty for unregistered companies, add an `Unregistered` placeholder so users can understand that an empty value means the company is unregistered. This improves the user experience when configuring the GST registration type. Forward-Port-Of: odoo/odoo#288837
The calendar side panel has been reorganized so the activity filter appears as the last item among calendar filters. This makes it easier for users to find after the addition of multiple calendar filters.
Original PR description
Following the introduction of multicalendars (odoo/odoo#261571), the "My Calendars" filters have been added to the calendar sidepanel. The activity filter is now a bit lost in the panel. Moving it as last item of the calendar filters. Task-6573460 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288527
The Calendar app now includes a reusable default reminder that can support appointment scheduling. It also replaces a confusing empty attendee label with the clearer wording "Unassigned," making calendar records easier to understand.
Original PR description
This PR adds a calendar.alarm. This one is required as default alarm for the appointment types. To avoid creating a new data file and updating the manifest, this change is not done appointment but in calendar as it can already be useful in that app. To avoid a technical label, this PR replaces the default falsy label of CalendarEvent.partner_ids, which is "Undefined Attendee", by "Unassigned". Enterprise PR: https://github.com/odoo/enterprise/pull/131840 Task-6576867 Forward-Port-Of: odoo/odoo#288801
The Sales dashboard no longer adds an extra Sales Orders filter when users click the To Deliver or To Invoice cards. This makes the displayed filters match the selected dashboard card more clearly, without changing the orders included in the results.
Original PR description
Steps to produce: --- - Install sales module with demo data. - Go to quotations > Click on `To deliver` or `To invoice` filter. For the `To deliver` and `To invoice` button, the `Sales Orders` filter is redundant. There is no need to have it. Remove the Sales Orders filter when clicking the To Deliver and To Invoice dashboard cards. Both filters already only return confirmed sales orders, making the additional Sales Orders filter redundant. This creates a 1:1 mapping between each dashboard card and its displayed search filter. opw-6574937 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288744
Secondary buttons now keep a consistent border appearance on hover, while disabled buttons use the same style with reduced opacity. Stat buttons also follow the regular secondary hover behavior, giving users a more consistent interface across forms.
Original PR description
The secondary buttons border no longer darkens on hover, and their disabled design now repeats the regular style with an opacity, like the other variants. The stat buttons were forced to the view background color on hover, they now get the regular btn-outline-secondary hover. task-6562366 Forward-Port-Of: odoo/enterprise#131275
This update ensures the Wise profile identifier is saved after related Wise connection settings are updated. This helps keep direct deposit configuration consistent and reduces setup issues for U.S. payroll payments.
Original PR description
The wise_profile_identifier is reset after writing on wise_api_key or wise_environment, so assign it after the first 2 values.
The appointment calendar side panel now behaves consistently when editing an appointment type. This removes a visual flicker and prevents activity items from appearing when their filter is not shown, making the experience clearer for users.
Original PR description
Previously the activity filter was removed from the sidepanel when an appointment type was in edition. This introduced a side panel flicker when toggling the edition mode. Also, the activity events were still being displayed in the calendar which doesn't make any sense. Make the activity display consistent with its filter state by removing the "showActivityFilter" override. Task-6573460 Forward-Port-Of: odoo/enterprise#131720
The Belgian payroll module now uses the latest officially indexed economic unemployment bonus rates. This helps ensure payslip calculations reflect current legal compensation amounts for affected employees.
Original PR description
Update the economic_unemployment_bonus parameter values to reflect the official rate indexation. task-6541797
The HTML editor now avoids offering heading or paragraph style changes when the change would modify protected form content. This helps preserve website form structure and prevents accidental layout or content corruption while editing descriptions.
Original PR description
If a node is a `p` (or `h1`, ...) and is inside a node marked with `contenteditable=false`, but has `contenteditable=true` itself, the command to change tag (`/h1`, ...) are available and replace the `p` node (thus mutating its parent, which is `contenteditable=false`) This commit modifies the "retagging safe" condition to add the "parent is content editable" next to the existing "the node is removable" task-6573954 (extracted from https://github.com/odoo/odoo/pull/274082) Forward-Port-Of: odoo/odoo#288234
Clicking informational extra text in a many2one field no longer focuses the field or opens the dropdown. This makes it easier for users to select or copy that text without triggering an unwanted menu.
Original PR description
Clicking on the informative extra text of a many2one field would focus the field and open the dropdown, making it inconvenient for the user to simply select or copy the text. This commit prevents the many2one dropdown from opening when the user clicks on the extra lines. Task-6538439 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289016 Forward-Port-Of: odoo/odoo#288019
The Subscribed Newsletters card now uses its own dedicated illustration instead of reusing the Email Marketing app icon. This makes the portal card grid look more consistent and polished for users.
Original PR description
Before this commit, the Subscribed Newsletters card reused the Email Marketing app icon and was the only non-illustration in the grid. This commit updates the icon to a dedicated illustration. task-6225760 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288945
This fixes employee counting so staff linked only to portal accounts are not treated as internal employees with users. It improves HR reporting accuracy when portal users were assigned to employee records by mistake.
Original PR description
For employees without user count, we should only consider internal users, so exclude employees where a portal user was assigned by mistake. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288580
A typo in stock settings validation was corrected so the relevant configuration check works as intended. This helps prevent incorrect validation behavior when users adjust inventory settings.
Original PR description
Forward-Port-Of: odoo/odoo#289150
This update fixes the rounded corner styling on side areas of kanban cards in Products and Point of Sale categories. It improves visual consistency so cards look cleaner and more polished across these screens.
Original PR description
*: point_of_sale This commit applies the appropriate border-radius adjustments to the <aside/> elements in the related kanban cards. task-6573555 Requires: -…
*: point_of_sale This commit applies the appropriate border-radius adjustments to the <aside/> elements in the related kanban cards. task-6573555 Requires: - https://github.com/odoo/enterprise/pull/132125 In `pos.category.kanban` | Before | After | |--------|--------| | <img width="385" height="203" alt="Screenshot 2026-09-18 at 11 10 40" src="https://github.com/user-attachments/assets/67537bf4-0aff-4b94-909f-59c7cf60cb96" /> | <img width="389" height="201" alt="Screenshot 2026-09-18 at 11 10 38" src="https://github.com/user-attachments/assets/a9682a97-2fc2-4104-ae5f-794b267273b0" /> | In `Product.template.product.kanban` and `Product Kanban` | Before | After | |--------|--------| | <img width="380" height="102" alt="Screenshot 2026-09-18 at 11 13 59" src="https://github.com/user-attachments/assets/6a437efe-d1fd-483b-9f48-35e625dae5d1" /> | <img width="383" height="102" alt="Screenshot 2026-09-18 at 11 14 05" src="https://github.com/user-attachments/assets/bce0285c-2a06-484a-9592-dfde2a908d0d" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289138
This fixes a display issue where time off allocation warnings could show the remaining balance using the request's unit instead of the time off type's unit. Business users now see consistent and accurate remaining time information when allocations and requests use different units.
Original PR description
When the unit of measure of a time off type doesn't match the unit of a request -approved and based on an allocation-, the time remaining on the allocation incorrectly holds the unit of the request rather than the time-off type. It thus displays inconsistent information. The dependency of the computation is now set to `work_entry_type_id.unit_of_measure` rather than `work_entry_type_request_unit` to correctly reflect the remaining duration of the allocated time. task-id: 6545527
Invoices that have already been sent through PEPPOL can no longer be selected for sending again. This prevents accidental duplicate sends and makes the interface clearer by showing why the option is unavailable.
Original PR description
If the invoice is already sent through PEPPOL, the checkbox for sending the invoice should then be readonly and unchecked. Currently is correctly unchecked but not readonly. We fix it by copying what French localization (`l10n_fr_pdp`) does already, giving a reason for disabling. <img width="1359" height="948" alt="immagine" src="https://github.com/user-attachments/assets/6f91ab34-8989-487e-8cd9-96dafee7bcb5" /> . Pad: https://pad.odoo.com/p/accountingv20 pad-accountingv20 Forward-Port-Of: odoo/odoo#288898
Fixed an issue in the API documentation where opening a related field link in a new tab could show the original model instead of the related model. This makes navigation in developer documentation more reliable and avoids confusion when reviewing model relationships.
Original PR description
Steps to reproduce: * open api_doc * select a model (eg: project.task) * middle click on a many2one field (eg: stage_id) Observed behavior: The new tab is opened on the base model (project.task) instead of the comodel (project.task.type). This commit fixes the issue by using `t-att-href` to point to the correct model and `preventDefault` to avoid a full reload when clicking on a m2o. Forward-Port-Of: odoo/odoo#288558
Long-pressing an order line in Point of Sale no longer resets a manually adjusted price back to the product's default price. This helps cashiers keep intended pricing changes intact when interacting with existing order lines.
Original PR description
Long-pressing an order line recomputed its price and reset it to the product's original price. Preserve the existing price when the product is neither configurable nor part of a combo. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6570304 Forward-Port-Of: odoo/odoo#288053
This fixes a small internal issue where a broken message format caused the wrong kind of error during export identifier checks. The change helps developers and support teams see the intended validation error, making troubleshooting clearer without changing normal user workflows.
Original PR description
The format was broken. `'{}:{}' % it` → `TypeError` instead of `AssertionError`.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#288836
Forward-Port-Of: odoo/odoo#288610This fix prevents users from accidentally triggering repeated delete requests for the same email or chat attachment when clicking quickly or using a slow connection. It avoids unnecessary error messages and keeps the attachment removal experience smoother in Discuss and messaging flows.
Original PR description
**Steps to reproduce:** - Open Discuss app - Open any conversation - Setup the browser with throttled connection (e.g. Slow 4G) - Select multiple files to attach but don't send the message - While…
**Steps to reproduce:**
- Open Discuss app
- Open any conversation
- Setup the browser with throttled connection (e.g. Slow 4G)
- Select multiple files to attach but don't send the message
- While some are loading, double click the delete button of one of the loaded attachment preview
- Traceback will appear: `404 Not Found`
**Issue:**
On click the delete button triggers a deletion request on `/mail/attachment/delete`.
Repeatedly clicking the delete button before the first request was completed (and the `AttachmentList` get updated) but after the attachment was deleted, will cause a `404 Not Found` due to the `raise NotFound()` which was added by [1] in `mail_attachment_delete`.
```py
attachment = request.env["ir.attachment"].browse(int(attachment_id)).exists()
if not attachment or not attachment._has_attachments_ownership([access_token]):
request.env.user._bus_send("ir.attachment/delete", {"id": attachment_id})
raise NotFound()
```
**Fix:**
Prevent concurrent deletion requests for the same attachment by keeping track of attachments currently being deleted.
[1] https://github.com/odoo/odoo/commit/50f45dd436b97027cb1461410efeee7057dad4e8#
opw-6499125
Forward-Port-Of: odoo/odoo#288884
Forward-Port-Of: odoo/odoo#285060Delivery slips now show the name of an outer package clearly when one package is placed inside another. This makes shipping documents easier to read and helps warehouse and delivery teams identify packaging details without confusion.
Original PR description
Before this PR:- ================= When a pack is put inside another pack, the delivery slip displays the outer pack, but its name is unreadable. <img width="975" height="300" alt="image" src="https://github.com/user-attachments/assets/abaf0c1c-1fb7-449a-87d4-ec7ed6988f88" /> After this PR:- ================= Make the outer pack name readable on the delivery slip. <img width="983" height="312" alt="image" src="https://github.com/user-attachments/assets/a271c27d-da3c-4a3d-b56a-8a860886f895" /> Enterprise PR:- odoo/enterprise#131741 Forward-Port-Of: odoo/odoo#288498
Sale orders now show the correct line number when a product line is added after a section. This prevents confusing or duplicated numbering in sales documents, helping users review order lines more reliably.
Original PR description
Steps to reproduce: 1. Open a sale order. 2. Add a section. 3. Add a line after the section. Issue: The line number of the line after the section is incorrect. Cause: The line number counter is incremented twice for section lines. Fix: Increment the counter on the order line itself instead of the pseudo-elements, ensuring the counter is incremented only once per line. Forward-Port-Of: odoo/odoo#288491
Warehouse transfers can now be automatically placed into a batch even when the batch limit is set to one. This fixes a configuration where automatic batching was enabled but no batch was created, helping teams rely on consistent warehouse processing rules.
Original PR description
Issue Before This Commit: ======================== When automatic batch creation is enabled and the maximum number of pickings per batch (batch_max_pickings) is set to 1, no batch is created for the picking. Steps to Reproduce: ========================= 1: Install the stock module. 2: Enable automatic batch creation. 3: Set the maximum number of pickings to 1 and enable Group by Contact on an operation type. 4: Create a transfer for that operation type. 5: Observe that no batch is created for the picking. Cause of the issue: ========================= In _is_auto_batchable, the condition returns False when batch_max_pickings is set to 1, preventing the picking from being automatically batched. After This Commit: ======================== Update _is_auto_batchable to allow automatic batching when batch_max_pickings is specified and is greater than or equal to 1. Forward-Port-Of: odoo/odoo#288295
Users who leave a Discuss call themselves will no longer see a misleading message saying the server disconnected them. This reduces confusion while still warning users when a call really ends unexpectedly from the server side.
Original PR description
Before this commit, manually leaving a Discuss call showed the warning meant for a server-initiated disconnection. Steps to reproduce: 1. Join a call in a Discuss channel. 2. Click Disconnect. 3. Observe "Disconnected from the call by the server". This happened because the server ended the RTC session and the session/ended bus notification reached the browser before the leave_call RPC response, while the local session was still active. This commit fixes the issue by marking the RTC service as leaving for the duration of the RPC and ignoring the corresponding local-session deletion. Unexpected server-side session endings still show the warning. <img width="499" height="175" alt="Screenshot 2026-09-11 at 01 14 46" src="https://github.com/user-attachments/assets/f3cfbfb3-5c25-4139-9a0a-1a558399d73f" /> Forward-Port-Of: odoo/odoo#287754
Equity contact cards now use the standard card width instead of a custom narrow layout. This prevents cards from being squeezed on medium-sized screens, making titles and key information easier to read.
Original PR description
Before this commit, the cards forced --KanbanRecord-width to 18vw, squashing them on medium screens (+ titles often truncated) This commit drops the override for default width, and swaps the hardcoded padding and graph margins for the --Card-padding-* variables they were mirroring by hand. | Current | This commit | |--------|--------| | <img width="1064" height="485" alt="image" src="https://github.com/user-attachments/assets/a8631b23-c231-45e7-8b83-da74e0081a42" /> | <img width="1064" height="485" alt="image" src="https://github.com/user-attachments/assets/43d469e9-f889-4e59-a4c1-173863706d69" /> | task-6578400 Forward-Port-Of: odoo/enterprise#131908
The marketing automation setting that controls global reply cancellation is now stored at the campaign level instead of on individual activities. This better matches how campaigns are managed and prepares the system for upcoming related functionality without changing day-to-day user workflows.
Original PR description
Currently, global reply cancel option is stored at activity level. However it makes more sense at campaign level. This commit adds relevant field on campaign model *à l'arrache* due to opportunity window to change DB scheme in stable. Feature is coming soonish. Forward-Port-Of: odoo/enterprise#132011
When helpdesk tickets are merged, related timesheets now use the same sales order item as the merged destination ticket. This prevents inconsistent billing or service tracking information after tickets with different sales items are combined.
Original PR description
Currently when you merge helpdesk tickets with differing sale order items, the sales order item listed on the timesheets of the source ticket is not updated to match the destination ticket's sales order item. This PR ensures uniformity bugfix-6473396 Forward-Port-Of: odoo/enterprise#131155 Forward-Port-Of: odoo/enterprise#129060
This fix adjusts the rounded corners and spacing on kanban cards in AI Agents, Referrals, and ESG database configuration views. The change makes cards display more consistently and avoids visual issues when side panels appear on either side of a card.
Original PR description
*: hr_referral, esg This PR applies the appropriate border-radius adjustments to the <aside/> elements in the related kanban cards. About ESG, the default Kanban card only supports an aside on the…
*: hr_referral, esg This PR applies the appropriate border-radius adjustments to the <aside/> elements in the related kanban cards. About ESG, the default Kanban card only supports an aside on the left. However, in the Database Kanban view, the aside is positioned on the right, which causes issues with the card border radius and margins. This PR adds module-specific customizations to handle this case. task-6573555 Requires: - https://github.com/odoo/odoo/pull/289138 In `ai.agent.kanban` | Before | After | |--------|--------| | <img width="389" height="220" alt="Screenshot 2026-09-18 at 11 17 22" src="https://github.com/user-attachments/assets/f887d40e-8b61-498f-9f24-dd6601721993" /> | <img width="387" height="222" alt="Screenshot 2026-09-18 at 11 17 28" src="https://github.com/user-attachments/assets/f013f743-a249-40de-9d85-6e78ce626f28" /> | In `hr.referral.reward.employee.referral.backend.kanban` | Before | After | |--------|--------| | <img width="386" height="136" alt="Screenshot 2026-09-18 at 11 19 36" src="https://github.com/user-attachments/assets/e853a646-1288-4c1a-806e-147edc9774f0" /> | <img width="384" height="129" alt="Screenshot 2026-09-18 at 11 19 25" src="https://github.com/user-attachments/assets/cc4f0137-e402-4486-8f5a-7af54ca8fd99" /> | In `hr.referral.reward.employee.referral.backend.kanban` | Before | After | |--------|--------| | <img width="386" height="136" alt="Screenshot 2026-09-18 at 11 19 36" src="https://github.com/user-attachments/assets/e853a646-1288-4c1a-806e-147edc9774f0" /> | <img width="384" height="129" alt="Screenshot 2026-09-18 at 11 19 25" src="https://github.com/user-attachments/assets/cc4f0137-e402-4486-8f5a-7af54ca8fd99" /> | In ESG/Configuration/Databases | Before | After | |--------|--------| | <img width="386" height="167" alt="Screenshot 2026-09-18 at 11 20 57" src="https://github.com/user-attachments/assets/acfe0958-95ae-4e80-903e-8590a1804a06" /> | <img width="390" height="180" alt="Screenshot 2026-09-18 at 11 21 00" src="https://github.com/user-attachments/assets/a2c33ec5-84e8-4119-8625-f8411a7b609a" /> | Forward-Port-Of: odoo/enterprise#132125
Asset depreciation models based on rates are now named by the time it takes to fully depreciate an asset, making them easier to understand. The change also fixes translated labels by removing an English-only plural ending that could break names in other languages.
Original PR description
This commit does 2 things: 1. Rate-based models were named after their rate, e.g. "2.78% per Month". Now they are named after the duration it takes to fully depreciate the asset. For example "2.78% per Month" now reads "36 Month". A helper function was added to handle the rounding of the method number. 2. Also the plural 's' that was appended to the duration was removed. It was added onto the end of the translated period label, so it produced broken names in every language other than English. task-6498452 Forward-Port-Of: odoo/enterprise#129366
This fixes an intermittent automated check that sometimes clicked the wrong navigation link before an accounting report had fully opened. The change makes the test wait for the report to load first, improving reliability of quality checks without changing user-facing behavior.
Original PR description
The issue appeared 1 every 3 run, the reason was because it didn't wait the report to be opened and clicked on the breadcrumb. So it clicked the breadcrumb of the return and not the one of the report. The fix is to add a step in between checking the report is loaded. Runbot error: https://runbot.odoo.com/odoo/error/944180 Forward-Port-Of: odoo/enterprise#130961 Forward-Port-Of: odoo/enterprise#130807
The Canadian Balance Sheet now displays correctly when using the horizontal split view. Assets are separated from equity and liabilities as intended, making the report easier to read and reducing confusion for Canadian accounting users.
Original PR description
The Canadian Balance Sheet "split horizontally" feature was broken during the refactor [1]. This commit - fixes the correct split between the Assets on the right and the Equity and Liabilities on the left, - remove the redundant split=right on child of aforementioned category. [1]: https://github.com/odoo/enterprise/pull/114127 task-none (DSH finding) **before** <img width="1903" height="861" alt="image" src="https://github.com/user-attachments/assets/58ee1ab8-5ca4-4d80-9567-5588d70b3f64" /> **after** <img width="1916" height="881" alt="image" src="https://github.com/user-attachments/assets/894358cd-d18a-4039-a468-65c7cabb20cf" /> Forward-Port-Of: odoo/enterprise#131933
This fixes an issue in Odoo Studio where removing an element could leave nearby text behind in the generated customization. Users now get cleaner, more accurate layout changes when editing views that mix text and elements.
Original PR description
Have an arch like ``` <div> <br /> TEXT <span /> </div> ``` Now remove the block `TEXT <span />` Before this commit, the resulting inheriting arch was just `<xpath expr="//span" position="replace" />` So the `TEXT` was not removed After this commit, the `TEXT` is removed along with the following span opw-6524957 Forward-Port-Of: odoo/enterprise#131812 Forward-Port-Of: odoo/enterprise#131717
Creating an appointment from the calendar now keeps the exact time slot selected by the user. This prevents bookings from being resized to the default appointment duration, improving scheduling accuracy.
Original PR description
When creating an event from the calendar view of an appointment type, the duration of the event was set to the duration of the appointment, therefore bypassing the slot we drew. This commit fixes this behavior by giving the priority to the end date of the drawed slot. Task-6412432 Forward-Port-Of: odoo/enterprise#130171
This fix ensures AI-generated pivot reports correctly understand grouped date or interval columns. It prevents report display issues by converting the AI response into the format expected by the reporting view.
Original PR description
The AI backend returns column groupbys as a list containing both strings and dictionaries with interval information. While this format is used to preserve the interval metadata, the pivot model expects `colGroupBys` to be a flat list of strings. This commit updates the view patch to flatten dictionary entries into their corresponding `<field>:<interval>` strings before assigning them to the pivot model metadata, ensuring the format matches the pivot model's expectations. task-6377810 Forward-Port-Of: odoo/enterprise#129515
The automated test for rental product availability now uses the same rental dates when comparing reserved stock with what appears on the product page. This prevents misleading test failures and helps keep online stock availability checks reliable.
Original PR description
`test_website_availability_while_continuing_selling` ensures the display of units left on product page is coherent with the stock available. For this, the test creates a rental order with default dates based on now. This fix ensures the same dates are used on the product page so that we compute the quantity left on the same dates. Failing since PR: https://github.com/odoo/enterprise/pull/106988 runbot-241108 Forward-Port-Of: odoo/enterprise#131763
This fix prevents Belgian salary contract setup data from being accidentally removed when optional linked fields are deleted. It also moves a holiday-related record to the correct Belgian salary contract module, helping payroll and salary package data load reliably.
Original PR description
res_field_id was set as ondelete='cascade', deleting record and causing the error "Cannot update missing record". res_field_id being optional, it also did not make sense to have it ondelete="cascade". For the same reason, cost_res_field_id was also corrected. double_holiday record not required in data for l10n_be_hr_payroll but required in l10n_be_hr_contract_salary. task-6254030
This fixes a Belgian payroll rule so the employer contribution uses the correct contribution code. It helps ensure payroll calculations and related reporting are accurate for affected employees.
Original PR description
Small modification referenced in the task. task-6526911
This update improves text readability in Barcode and Master Production Schedule screens by using a lighter background style in affected areas. Users should find labels and information easier to read, reducing visual strain during daily operations.
Original PR description
Before this PR: ================ In several places, text is difficult to read due to the `bg-secondary` class used for styling. <img width="350" height="200" alt="image"…
Before this PR: ================ In several places, text is difficult to read due to the `bg-secondary` class used for styling. <img width="350" height="200" alt="image" src="https://github.com/user-attachments/assets/5d24038e-a63c-457a-a457-91bc75dc615b" /> <img width="350" height="200" alt="image" src="https://github.com/user-attachments/assets/30e78d9d-af1b-4281-bf52-57292ac9dd9f" /> <img width="350" height="200" alt="image" src="https://github.com/user-attachments/assets/45501029-2810-4907-82d0-6356c690e3db" /> After this PR: =============== Replace the `bg-secondary` class with `bg-300` in the affected places, providing better contrast between the text and its background and improving readability across the Barcode and MPS views. <img width="350" height="200" alt="image" src="https://github.com/user-attachments/assets/dc9e242b-1f60-42d3-8e58-b8a4f2b6fc2f" /> <img width="350" height="200" alt="image" src="https://github.com/user-attachments/assets/d8c8ffa0-51b5-4b72-b092-e21b9dd56088" /> <img width="350" height="200" alt="image" src="https://github.com/user-attachments/assets/c3dbfebb-b348-4dee-8933-76acef8e1636" /> Community PR:- odoo/odoo#288498 Forward-Port-Of: odoo/enterprise#131741
This fixes Turkish Nilvera e-invoices so foreign-currency amounts written in words use fully Turkish currency subunit labels. It prevents mixed-language invoice notes, helping keep e-invoices compliant and clearer for customers.
Original PR description
### Issue before this commit: When generating a Nilvera e-invoice in a foreign currency (e.g., EUR), the amount written in words inside the <cbc:Note> tag contained a mix of languages. While the…
### Issue before this commit: When generating a Nilvera e-invoice in a foreign currency (e.g., EUR), the amount written in words inside the <cbc:Note> tag contained a mix of languages. While the numbers were correctly translated to Turkish, the currency subunit label was fetched using the customer's language. This resulted in a partially translated string (like "... SIFIR CENTS") instead of the expected fully Turkish text (like "... SIFIR SENT"). ### Steps to reproduce the issue: 1. Download Accounting and l10n_tr_nilvera_einvoice 2. Create an API KEY: https://docs.google.com/document/d/1EUzvTBnSm9-VwIfBsX299MHGXIVys-uijnsJ1fpz7vI/edit?tab=t.0#heading=h.e6i8a29lff5t 3. Go to a turkish client on the Accounting tab and click on 'Verify' for the Nilvera status 4. Go to currencies and activate EUR (be sure there is also the translation for currency subunit) 5. Go to invoices, create one for the Turkish customer you already verified setting the currency as EUR and send it with Nilvera 6. See that current output is <cbc:Note>YALNIZ : BEŞYÜZDÖRT EUR SIFIR CENTS</cbc:Note> (Turkish numbers with English subunit) but the expected output is <cbc:Note>YALNIZ : BEŞYÜZDÖRT EUR SIFIR SENT</cbc:Note> (Fully Turkish text) ### Cause of the issue: The issue occurs because the currency_subunit_label field is not translated but fetched using the language of the customer in the invoice. ### Reason to introduce the fix: To ensure that the amount in words inside the <cbc:Note> tag is completely formatted in Turkish, complying with Nilvera and local e-invoicing requirements, regardless of the customer language. opw-6523794 Forward-Port-Of: odoo/enterprise#131873
When an employee's working schedule is changed, the related leave allocation message now shows the correct contract name and explains what changed. This makes payroll and HR records easier to understand and audit.
Original PR description
When modifying an employee's working schedule via the wizard, the logged chatter message on the leave allocation incorrectly evaluated the contract name to "False" and lacked details on the changes made. This PR fixes the problem by calculating and logging the necessary details regarding the changes. Forward-Port-Of: odoo/enterprise#131956
Belgian employee departures marked as fixed term now automatically update the related contract version to reflect that status. This keeps HR records accurate and ensures the change is visible in the employee history for easier follow-up.
Original PR description
Set the `fixed_term` boolean field to True on the employee contract version whenever a Belgian departure with the 'Fixed Term' reason is processed. Changes are properly tracked in the employee's chatter. To test: 1. Create a Belgian employee with a contract start and end date. 2. Click on 'End of Collaboration'. 3. Select 'Fixed Term' as the end reason and confirm. 4. Check the employee chatter to verify that 'Fixed Term' is set to True (No -> Yes). Task: 6528392
The Indian asset demo data now includes the required model information for asset variants. This prevents installation from being blocked when demo data is loaded, improving reliability for setup and testing.
Original PR description
Asset variants require a model, which was missing from the demo data and blocking installation. This fix updates the demo data and renames the methods to preserve the correct order of execution. task-6580608 ref - https://github.com/odoo/enterprise/commit/3f59a1c4c1c84d5864f68f394589cd46b305f208 Forward-Port-Of: odoo/enterprise#131950
Odoo removed an unused way of loading chat channels that was no longer called by the interface. The messaging menu already loads the same channels through its normal route, so this cleanup reduces obsolete code and test coverage without changing expected user behavior.
Original PR description
Nothing fetches `channels_as_member`: its client side fetcher was never called, and the messaging menu loads its channels through its own load more route. Remove the handler, that dead fetcher, the loading template it was the only condition of, the mock server counterpart and the performance test. The livechat tests covering it now use the messaging menu load more route, which returns the same channels. https://github.com/odoo/enterprise/pull/131187 Forward-Port-Of: odoo/odoo#287753
An internal messaging performance test was removed because the related check changed in the main Odoo codebase. This keeps the enterprise test suite aligned and prevents test import errors, with no direct impact on end users.
Original PR description
The `channels_as_member` performance test is removed in odoo, adjusting its query count now raises an AttributeError at import. https://github.com/odoo/odoo/pull/287753 Forward-Port-Of: odoo/enterprise#131187
This update modernizes internal component definitions used across Odoo apps such as Accounting, HR, Mass Mailing, Resource, SMS, Survey, and Web. It improves consistency and validation behind the scenes, helping keep the platform maintainable without changing day-to-day user workflows.
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 Forward-Port-Of: odoo/odoo#288771
This change removes an obsolete internal setting from the manufacturing work order area. It has no expected impact on daily operations, but it keeps the codebase cleaner and easier to maintain.
Original PR description
Context key hide_unpicked is added with commit cd0ef28d39069857caf0ddb027b9f7415330afce The only place that use the context key was mrp_workorder/views/stock_move_views.xml which was removed in f86a4d39c8c2366fa30fda36bd0de2a086f14aad. This commit removes the unused key.
This update modernizes several user interface components by replacing an older internal configuration pattern with the current validation approach. It helps keep the affected apps maintainable and aligned with the platform framework, with no expected change for end users.
Original PR description
Replaced deprecated uses of `static props` with calls to `useProps()`, providing actual props validation for Owl components.
Whenever possible, also removed "empty" props definition, being either:
- `static props = ["*"]` with no use of `this.props`;
- `static props = {}`.
Forward-Port-Of: odoo/enterprise#131904