Monday, September 21, 2026
53 changes · master
Resolved issues and error corrections
The HR contract template field is now handled correctly even when Payroll is not installed. This prevents confusion for HR users by ensuring the field remains available in standard HR setups where it is expected.
Original PR description
The field can be seen if payroll is not installed. runbot-947214 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288219
Discuss avatars now display status indicators with masks that match each icon's actual shape, rather than forcing every status into a circle. This improves visual clarity for special statuses such as on leave, homeworking, in office, and OdooBot indicators.
Original PR description
Before this commit, the mask of im status of discuss avatar was always a circle. This is ok for the most used im status "online", "away", "busy" and "offline" where icons are rounded. We have a few exceptions like: - odoobot's heart - user on leave with plane icon - user in office / homeworking with bulding / house icon This commit fixes the mask to take the shape of icon into account, so this looks like whatever the icon of im status. <img width="1808" height="1136" alt="discuss-chats-before-after" src="https://github.com/user-attachments/assets/c2a8372f-bc4d-4d08-91d4-c5ceb97e49b6" /> Forward-Port-Of: odoo/odoo#288972
Fixes an issue where hovering over a channel in the messaging menu could make it impossible to click. Users can now reliably open channels and use the messaging menu without hidden interface elements blocking their actions.
Original PR description
Before this commit, opening the messaging menu from the systray and moving the pointer over a channel could make the channel impossible to click. The invisible anchor used to position the right-click actions was rendered inside the outer dropdown, so Dropdown treated it as a submenu and added the dropdown-item class. Its full width combined with fixed positioning made it cover the UI and intercept pointer events. After this commit, the manual context menu anchor opts out of optional Dropdown styling. It can still position the right-click actions without covering channel items, and the systray test ensures that the anchor is not styled as a dropdown item. |Before|After| |-|-| |<img width="818" height="691" alt="image" src="https://github.com/user-attachments/assets/edcad7ed-fe02-499d-bf9c-112cba470100" />| <img width="773" height="663" alt="image" src="https://github.com/user-attachments/assets/ca89c8a0-034d-4807-bbc2-d4d36a171797" />| Forward-Port-Of: odoo/odoo#289476
Discuss conversations now show the correspondent's own avatar consistently across the sidebar, header, messages, and member list. This avoids confusing cases where the same person appeared with different generated avatars when they had not uploaded a photo.
Original PR description
A conversation with a correspondent showed that person with two different avatars: one in the Discuss sidebar and header, another on their messages and in the member list. The sidebar and the header read the avatar of the channel, while messages and the member list read the avatar of the correspondent. When that person had no uploaded photo, both records generated their own, and the two do not match. This commit fixes the issue by generating an avatar only for a channel and a group, and returning False for every other conversation kind, so the correspondent's own avatar is used everywhere. Related Enterprise PR: https://github.com/odoo/enterprise/pull/131716 Task-[6559693](https://www.odoo.com/odoo/project/1519/tasks/6559693) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288520
Avatar cards in the mail interface now use the same border styling as the popover that contains them. This fixes a small visual inconsistency, making the user interface look more polished and consistent.
Original PR description
This commit make the card follow the same border property than the popover that contains it. Forward-Port-Of: odoo/odoo#289526
WhatsApp conversations in Discuss now show the same contact avatar across the sidebar, header, messages, and member list. This avoids confusion when a contact has no uploaded photo and ensures users see a consistent identity throughout the conversation.
Original PR description
A conversation with a correspondent showed that person with two different avatars: one in the Discuss sidebar and header, another on their messages and in the member list. The sidebar and the header read the avatar of the channel, while messages and the member list read the avatar of the correspondent. When that person had no uploaded photo, both records generated their own, and the two do not match. This commit fixes the issue by generating an avatar only for a channel and a group, and returning False for every other conversation kind, so the correspondent's own avatar is used everywhere. Related Community PR: https://github.com/odoo/odoo/pull/288520 Task-[6559693](https://www.odoo.com/odoo/project/1519/tasks/6559693) Forward-Port-Of: odoo/enterprise#131716
Fixed a display issue where the row actions menu icon could appear with extra ellipsis text on combo product lines. This keeps sales order lines visually clean and makes the actions menu easier to recognize.
Original PR description
Steps to reproduce: - Open a sale order and add a combo product line. - Look at the row-actions column (rightmost, the "⋮" dropdown) for that line. Before the fix: - The `.o_list_section_options` cell only got its width/text-overflow override when the row also carried `.o_is_line_section` or `.o_is_line_subsection`. Any other row reusing the same cell fell back to the generic web list rule `text-overflow: ellipsis`, so the oversized "more_vert" icon glyph got clipped and rendered as "⋮ ..." instead of a clean "⋮". After the fix: - Moved the width/text-overflow override up to apply to every row inside `.o_section_and_note_list_view`, since this cell only ever holds an icon and should never truncate regardless of row type. Combo rows now render correctly with no extra sale-side changes needed. opw-6580665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289462
Tooltips now have corner rounding that matches the rest of Odoo's interface styling. This fixes a small visual inconsistency so pop-up help elements look more polished and aligned across editions.
Original PR description
We need an override of Bootstrap's default tooltip border radius because the default value assumes that the users of Bootstrap haven't also overridden the default popover border radius. Since we…
We need an override of Bootstrap's default tooltip border radius because the default value assumes that the users of Bootstrap haven't also overridden the default popover border radius. Since we have, we must also override our tooltip border radius and compute it according to our popover's styling. It follows the usual formula for computing border radii: Inner radius = Outer radius - Padding COM Before <img width="438" height="372" alt="Screenshot 2026-09-18 at 2 40 26 PM" src="https://github.com/user-attachments/assets/5faa8bd3-8048-4f4f-bb69-1082c4f7a40e" /> COM After <img width="540" height="438" alt="Screenshot 2026-09-18 at 2 39 20 PM" src="https://github.com/user-attachments/assets/58fed7bd-2fac-4a0b-8a8f-10824cce6ff6" /> ENT Before <img width="444" height="348" alt="Screenshot 2026-09-18 at 2 45 29 PM" src="https://github.com/user-attachments/assets/4d04a647-6667-474a-8a35-6c2845c362b8" /> ENT After <img width="762" height="492" alt="Screenshot 2026-09-18 at 2 46 38 PM" src="https://github.com/user-attachments/assets/bb4dade6-c497-406a-9f08-110de90d7eeb" /> Forward-Port-Of: odoo/odoo#289320
The attendance kiosk now shows the weekday in the selected company or interface language instead of always using English. This creates a more consistent localized experience for employees using kiosk mode in non-English environments.
Original PR description
Problem:
The weekday displayed in the attendance kiosk header is always shown in English, even when the comapany contact's language is changed.
This happens because `DateTime.toFormat("cccc")` uses Luxon's locale, but the `DateTime` instance is created without setting the current UI locale.
Steps to reproduce:
1. Install `hr_attendance`.
2. Change the company contact language to a language other than English (e.g. French).
3. Open the Kiosk Mode.
4. Observe that the date and UI are translated, but the weekday remains in English (e.g. "Monday" instead of "Lundi").
Fix:
Set the Luxon locale from the document language before formatting the weekday. This ensures `toFormat("cccc")` returns the weekday in the active Company contact language.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#289464
Forward-Port-Of: odoo/odoo#274655This fix prevents Chilean demo accounting setup from trying to post demo entries linked to non-Chilean partners. It helps companies and implementers load Chilean localization demo data alongside other localizations without setup failures or missing accounting examples.
Original PR description
When several localization modules are installed at once (with demo data), loading the chilean demo data fails and the chilean demo company ends up without any accounting demo data. Steps to reproduce: - Install `l10n_cl` together with the other localizations and the enterprise addons, with demo data enabled Issue: Error while loading accounting demo data ValidationError: Document types for foreign customers must be export type (codes 110, 111 or 112) or you should define the customer as an end consumer and use receipts (codes 39 or 41) Analysis: Demo methods will posts every move of the chilean company, not only the ones prepared by the module. In combination with other modules loading their own demo data it may raise the said error. Forward-Port-Of: odoo/odoo#288590
The emoji picker search field now shows its focus outline around the full search pill, including the magnifying glass icon. This makes the focused control look consistent and easier to understand when composing messages.
Original PR description
### Impacted versions 20.0, community. Enterprise sets `$input-focus-box-shadow: 0` (`web_enterprise/static/src/scss/bootstrap_overridden.scss`), so it draws no input ring at all and the misplacement…
### Impacted versions
20.0, community. Enterprise sets `$input-focus-box-shadow: 0` (`web_enterprise/static/src/scss/bootstrap_overridden.scss`), so it draws no input ring at all and the misplacement is invisible there.
### Steps to reproduce
1. Open a record with a chatter, e.g. a sales order.
2. Click **Send message**, then the emoji button.
3. The search is autofocused.
### Current behavior
The focus ring is drawn around the input rather than around the search control, so it starts after the magnifier and leaves it outside the ring.
The search is a bordered pill holding a magnifier and a deliberately borderless input:
```html
<span class="o-EmojiPicker-searchContour ... rounded-pill border bg-view">
<i class="oi ..." data-icon="search"/>
<input class="form-control border-0 flex-grow-1 rounded-pill ..."/>
</span>
```
`form-control` is on the input, so bootstrap rings the input. Measured at 1600x1000:
| | box-shadow | inset inside the pill |
|---|---|---|
| input | `0 0 0 2px, 0 0 0 4px` | left **22px**, right 1px, top 1px, bottom 1px |
| pill | `none` | |
The 22px on the left is the magnifier. The ring therefore cuts across the middle of the pill, and on the other three sides a 4px ring over a 1px inset spills past the border.
555aa438ca64 ("[IMP] mail, web: improve emoji picker UX") moved the magnifier to the left and made the pill `rounded-pill`, which is what makes this plain to see. It was already misplaced before, with the magnifier then on the right.
### Expected behavior
The ring is drawn around the whole search control, magnifier included.
### Before
<img width="1824" height="282" alt="emoji_before" src="https://github.com/user-attachments/assets/1db54ff9-e39f-46c0-8f65-ce7f5a89856f" />
### After
<img width="1824" height="282" alt="emoji_after" src="https://github.com/user-attachments/assets/92af463c-1e24-4ee5-91e5-d140e52fd593" />
<!-- drag emoji_before.png and emoji_after.png here -->
### About the fix
The ring moves onto the pill, on `:has(input:focus)`, which is what the neighbouring rule for the magnifier colour already uses in that file.
The two declarations are the pair bootstrap applies in `.form-control:focus` (`forms/_form-control.scss`), so nothing is invented and each flavour keeps deciding through its own variables. Enterprise, with `$input-focus-box-shadow: 0`, shows no ring here just as it shows none for any other input.
For reference this is how the control panel search is assembled, in `addons/web/static/src/search/search_bar/search_bar.xml`: the wrapper carries `form-control` and the input inside it is left plain, so the ring lands on the whole control. Moving `form-control` onto the pill would match that more literally, at the cost of a markup change and of bootstrap's padding and sizing landing on the pill, so the ring is relocated in css instead.
Forward-Port-Of: odoo/odoo#289438This fixes an issue where product pages could show an error if the quantity selector was disabled in the website editor. Customers can now view and use affected product pages normally, even when quantity selection is hidden.
Original PR description
When the quantity option is disabled from the website editor, the quantity input is removed from the product page. However, `_updateMinimumQuantity` was still trying to update the input, causing a JavaScript error in product page. Handle the missing quantity input before updating its dataset. Enterprise PR:https://github.com/odoo/enterprise/pull/132137 Forward-Port-Of: odoo/odoo#288452
Notebook tabs now display with the intended rounded corners from the Frost design. This fixes a visual issue where tabs appeared too square, improving consistency and polish in the user interface.
Original PR description
Previous implementation of roundness on notebook was not working well, resulting in a squarish notebook, which is not in line with new Frost design. The tabs were squared by setting `--nav-tabs-border-radius` to 0 on the tab itself, but that is the same variable the first and last tabs read to get their radius back. So they were reading 0 too. We now square the tabs with the border-radius properties directly. task-6585237 | Before | After | |--------|--------| | <img width="475" height="135" alt="Screenshot 2026-09-21 at 10 19 10" src="https://github.com/user-attachments/assets/718da69e-4c30-404a-bdf1-bdab91621542" /> | <img width="524" height="130" alt="Screenshot 2026-09-21 at 10 18 32" src="https://github.com/user-attachments/assets/ac49cdfc-5fa6-4e4c-a8fb-a0f61415b480" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289258
Point of Sale users can now remove the preselected customer filter when viewing quotations or orders. This lets them see all available records instead of being unintentionally limited to the customer selected earlier.
Original PR description
When a customer was selected before opening the quotations/orders view, a default partner filter was applied. However, the partner was also added directly to the domain. Therefore, removing the partner filter from the search bar had no effect, as the domain continued to restrict the records to that partner. We now only use the default search filter so that users can remove it and display all available quotations/orders. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6537521 Forward-Port-Of: odoo/odoo#287689
This fix prevents rental product pages from showing an error when the quantity selector has been disabled in the website editor. Customers can continue viewing and interacting with rental products normally, even when quantity selection is not displayed.
Original PR description
When the quantity option is disabled from the website editor, the quantity input is removed from the product page. However, `_updateMinimumQuantity` and `_toggleDisable` were still trying to access the input, causing a JavaScript error in the product page. Handle the missing quantity input before accessing its value or dataset. Community PR:https://github.com/odoo/odoo/pull/288452 Forward-Port-Of: odoo/enterprise#132137
This fixes how leave durations are entered when creating multiple leave records from the Gantt view. Users can now set a single duration that applies to each selected day, reducing confusion while keeping range-based entry available in the full leave form.
Original PR description
We only want to let the user encore durations in this context of multi select in the gantt. If a range is needed it's still possible in the real form view of a leave. But in a gantt it will just apply this duration for each days. task-6581959 Forward-Port-Of: odoo/enterprise#132174
A test in the AI module was corrected so it checks a generic preview link using a neutral contact record. This prevents false failures caused by behavior from another AI agent component and helps keep automated validation stable.
Original PR description
The accepted-update preview test used an AI agent and expected the self-update message provided by the ai_agentic override. This made the base AI test depend on behavior from another module. Use a contact as the updated record and assert the generic preview link. This keeps the test scoped to the behavior provided by the AI module. Fixes Runbot error 947270 Forward-Port-Of: odoo/enterprise#132321
A website shop test was made reliable by ensuring a specific sample product always appears on the first shop page. This prevents failures when demo data changes product ordering, helping keep automated checks stable.
Original PR description
The website tour expects to find 'Floating Snippets Product B' on the first shop page. However, when demo data is installed, the product is moved to the second page, causing the tour step to fail. Set the product's website_sequence to 1 so that it always appears on the first shop page, regardless of whether demo data is installed. runbot-945783 Forward-Port-Of: odoo/odoo#289471
A search option was added to the account selection wizard so users can find accounts by code, name, or description. This makes selecting the right account faster and reduces the chance of choosing the wrong record.
Original PR description
In this commit, we will add a new search view to the account.select.account.line wizard, to be able to look up record with code, name or description no task id Forward-Port-Of: odoo/enterprise#132335
This fixes a small-screen display issue where long status bar button labels could push the dropdown caret onto a separate line. The button label now wraps while the caret remains attached and aligned, making mobile and narrow layouts clearer and easier to use.
Original PR description
On small screens the status bar gathers its buttons into a split button, the first one in front and a caret opening the rest. The row they sit in wraps, so a first button long enough to fill the width sends the caret onto a line of its own, splitting the group it was meant to close. Leave the wrapping to the wide row, which has every button to place at once, and take it from the small one, where a group of two is all there is: the label wraps inside its button instead, which the group already lets it do. A caret keeping its own height then falls short of a button grown to two lines, so stretch it to the group. The group measures itself by what it holds rather than by the status bar, which a taller field beside it would otherwise lend it. task-6564150 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289433
The manufacturing order Kanban progress bar now shows draft orders with a clearer color. This makes it easier for users to spot draft manufacturing orders at a glance and avoids confusion caused by segments blending into the background.
Original PR description
Issue before this commit: ========================= The draft progress segment in the manufacturing order Kanban view is barely visible against the background. <img width="442" height="145"…
Issue before this commit: ========================= The draft progress segment in the manufacturing order Kanban view is barely visible against the background. <img width="442" height="145" alt="image" src="https://github.com/user-attachments/assets/9ba3e4ef-7b91-4c82-86ee-1fe0e47f472f" /> Steps to reproduce: =================== - Install MRP. - Create a draft manufacturing order. - Open the manufacturing orders in the Kanban view. - Observe the progress bar and notice that the segment representing the draft state is barely visible Cause of the issue: =================== In this [commit](https://github.com/odoo/odoo/pull/251475/changes#diff-3bad372563263ef117de6ed9e222008e2a27b2ea212df89f72f269066a8eacacR603) the manufacturing order Kanban progress bar was changed to represent order states. Draft orders were assigned the `light` color, which blends into the Kanban background and makes their segment barely visible. After this commit: ================== The progress segment for the draft state is clearly visible, allowing users to easily distinguish draft orders in the Kanban view. <img width="343" height="123" alt="image" src="https://github.com/user-attachments/assets/6646143f-a299-4544-b8b5-115e13ebf8c5" /> Forward-Port-Of: odoo/odoo#288925 Forward-Port-Of: odoo/odoo#288462
Online payment status updates and draft resets now follow the same broader payment method rules used when starting payments. This helps avoid valid payments being blocked or handled inconsistently after initiation.
Original PR description
Post 56e73e8d8d674e272b809ef7628b0705cbd76900, we no longer restrict payment initiation to sepa_ct payments only. This commit ensures consistency with this behavior for the payment_status_updated webhook and when resetting payments to draft. No task ID Forward-Port-Of: odoo/enterprise#132114
This fixes how seized salary amounts are categorized in Belgian payroll by restoring their link to the remuneration base. It helps ensure deductions are calculated and validated correctly on payslips.
Original PR description
The SEIZED_AMOUNT category should have the REMUNERATION_BASE as parent. This was unintentionally removed here https://github.com/odoo/enterprise/pull/119727 Forward-Port-Of: odoo/enterprise#132162
This update removes an invalid setup reference in the Danish localization module that could cause errors during Nemhandel registration. It helps keep the registration flow reliable without changing business functionality.
Original PR description
Method `_inverse_phone_number` is missing. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288637
Website administrators can now enable Product Reference Price and have the setting remain active after saving and reloading, even when Point of Sale is not installed. This prevents confusion and ensures the eCommerce pricing display option behaves as expected.
Original PR description
Toggling "Product Reference Price" in Website Settings never sticks when point_of_sale isn't installed the checkbox appears checked after Save, but reloading the page always shows it unchecked again,…
Toggling "Product Reference Price" in Website Settings never sticks when point_of_sale isn't installed the checkbox appears checked after Save, but reloading the page always shows it unchecked again, with no error. Reproduce (no point_of_sale installed): 1. Install/keep website_sale without point_of_sale. 2. Go to Website > Configuration > Settings > eCommerce. 3. Check "Product Reference Price" and click Save. 4. Reload the settings page: the box is unchecked again. Root cause: `website_show_reference_price` (the checkbox) is linked to the global `group_show_uom_price` setting via two onchange methods, and `set_values()` force-disables the website-specific value for every website whenever `group_show_uom_price` is falsy Fix: keep `group_show_uom_price` in website_sale's own Settings view so its value always round-trips with the rest of the form, independent of whether point_of_sale is installed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288560
Quotation and sales order PDFs now use the same column headers as the online portal preview. This removes confusing differences between what customers see online and what is printed or sent as a PDF, especially when line numbers are enabled.
Original PR description
Steps: - Settings > Sales > Enable the 'Line Numbers' setting - Sales > Quotations > Create a quotation with a few product lines - Open the Preview and compare it with Print > Quotation / Order…
Steps: - Settings > Sales > Enable the 'Line Numbers' setting - Sales > Quotations > Create a quotation with a few product lines - Open the Preview and compare it with Print > Quotation / Order Issue: - The same quotation shows different column headers depending on where it is viewed. On the portal preview the product and quantity columns have no header at all, while the PDF labels them 'Description' and 'Quantity'. The reverse happens on the line number column, which is labelled '#' on the preview but has a blank header on the PDF. Cause: - The sale order portal revamp replaced the visible 'Description' and 'Quantity' header text with aria-label attributes, but only in the portal template. The report template kept its labels. Likewise, the '#' header added for line numbering was only added to the portal template and never to the report. Fix: - Remove the visible 'Description' and 'Quantity' headers from the report template, keeping them as aria-label like on the portal, and add the missing '#' header, so the PDF renders the same column headers as the preview Forward-Port-Of: odoo/odoo#288486
This fixes an automated stock workflow test that could fail when the Turkish Nilvera e-dispatch add-on was installed. The change makes the test recognize the customized stock list view, improving reliability without changing user-facing stock behavior.
Original PR description
### Steps to reproduce: - Install `l10n_tr_nilvera_edispatch` (e.g. the `tr` country build) - Run `test_basic_stock_flow_with_minimal_access_rights` > The tour times out on step 6/31, "check that at…
### Steps to reproduce: - Install `l10n_tr_nilvera_edispatch` (e.g. the `tr` country build) - Run `test_basic_stock_flow_with_minimal_access_rights` > The tour times out on step 6/31, "check that at least one picking is present in the view". ### Cause of the issue: The step triggers on `.o_stock_list_view_view`, a class the web client derives from the `js_class` of `stock.vpicktree`: https://github.com/odoo/odoo/blob/71c040ae236c9487afc49559486a588f21ccb37b/addons/stock/views/stock_picking_views.xml#L66-L70 https://github.com/odoo/odoo/blob/71c040ae236c9487afc49559486a588f21ccb37b/addons/web/static/src/views/utils.js#L45-L68 `l10n_tr_nilvera_edispatch` overwrites that attribute to plug in its e-Receipt upload button, so the root carries `o_l10n_tr_edispatch_tree_view` instead and the trigger never matches: https://github.com/odoo/odoo/blob/71c040ae236c9487afc49559486a588f21ccb37b/addons/l10n_tr_nilvera_edispatch/views/stock_picking_views.xml#L4-L13 Only the class name changes: `L10nTrNilveraEdispatchListView` spreads `StockListView`, so the rendered list is identical. runbot-947260 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288404 Forward-Port-Of: odoo/odoo#288255
Product option pills in the sales configurator now keep consistent spacing when they wrap onto multiple lines. This makes longer option lists easier to read and avoids a cramped layout for users configuring products.
Original PR description
Pill-style attribute values used Bootstrap's list-inline/list-inline-item, which only sets margin-right between items. When pills wrapped onto a new line, the rows touched with no vertical gap. Fix: Switch the pill list to a flex container with gap-2, matching the spacing website_sale already uses for its own attribute-value lists, so wrapping rows get the same gap as pills on the same row. opw-6584507 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289176
Fixes an issue where users in debug mode could be taken to an individual picking form instead of returning to the previous Barcode overview after refreshing the page. This keeps navigation consistent and reduces confusion for warehouse users and testers.
Original PR description
Issue ===== When refreshing the page in a opened picking in Barcode and going back, we end up in the picking's form view. It's happen only in debug mode. How to reproduce ================ 1. Enable…
Issue ===== When refreshing the page in a opened picking in Barcode and going back, we end up in the picking's form view. It's happen only in debug mode. How to reproduce ================ 1. Enable debug mode; 2. Open Barcode app and open any picking; 3. Refresh the browser's page (F5 on desktop, swap down on mobile); 4. Click on the "<" button to go back on the previous view => Instead of ending back on the picking's kanban view, it opens the current picking's form view. Cause of the issue ================== In the `Main` component, the `_exit` method should handle this case by checking if the last breadcrumb action is a number. In such case, we don't use the breadcrumb and use the navigator's usual `history.back` because otherwise, it will open the picking's form view. That said, this code doesn't work in debug mode because it adds `?debug=assets` at the end of the URL, which means when we check if the last part of the breadcrumb's URL is a number — eg. 3 —, instead of get `3`, we get `3?debug=assets`. Fix === To fix the issue, this commit breaks the last part in two in case a `?` is in it and uses the first part only to check if it's a number or not. Forward-Port-Of: odoo/enterprise#131991
Duplicating a section now keeps the related product even when that field cannot be edited, such as after stock movements exist. This prevents copied lines from losing product information while preserving quantities and descriptions.
Original PR description
**Version: saas-19.4+** **Description of the issue/feature this PR addresses:** Duplicating a section doesn't copy the product when it's readonly. **Current behavior before PR:** Duplicated lines keep qty/description but product is empty. **Desired behavior after PR is merged:** Product is always copied when duplicating a section. Forward-Port-Of: odoo/odoo#288476
Austrian company identifiers are now validated using the business ID format instead of VAT rules. This prevents valid Austrian company registry numbers from being incorrectly rejected and improves data accuracy for company records.
Original PR description
We used to validate the company ID of Austrian company with the vat validation. This commit use the business ID verification. No-task
When the French PDP integration receives an unsupported lifecycle status, Odoo now records the actual status code instead of showing a blank value. This makes troubleshooting easier and helps support teams identify unexpected responses more quickly.
Original PR description
Currently we just log `None` in case we receive a lifecycle with an unsupported (on community side) status. After this commit we log the status code at least. task-None before fix <img width="711" height="120" alt="image" src="https://github.com/user-attachments/assets/1f939cf4-17b7-49cb-8b31-5cc594fdeadd" /> after fix <img width="700" height="116" alt="image" src="https://github.com/user-attachments/assets/1b8b3853-f2da-4426-9c49-1d135d1c7824" /> Forward-Port-Of: odoo/odoo#286429
Fixes an issue where attachments added to time off requests could disappear when supporting documents were not required for that time off type. Employees and managers can now reliably see uploaded leave attachments regardless of whether documentation is mandatory.
Original PR description
Issue: ---------------------------------------- If the option "Require Supporting Document" on the Time Off Type is unticked, then when adding an attachment on a leave it disappears. Steps to reproduce: ---------------------------------------- - Have a Time Off Type with "Require Supporting Document" unticked - Create a leave with this time off type - On the form view add an attachment through the paperclip icon - It disappears Cause: ---------------------------------------- In `_compute_attachment_is_visible()` if `work_entry_type_support_document` is `False` then `attachment_is_visible` too. `attachment_is_visible` then control whether the attachments of a leave are visible. Solution: ---------------------------------------- Remove the condition on `work_entry_type_support_document`, `attachment_is_visible` purpose is to limit the access to attachments for users unliked to the leave. opw-6542429 Forward-Port-Of: odoo/odoo#289148
This update fixes an issue where clicking at the end of text inside a button moved the cursor outside the button. Users editing website or email content can now place the cursor where expected, making button text editing smoother and less frustrating.
Original PR description
Problem: When trying to place the caret at the end of a button's content with the mouse, the caret always moves outside of the button instead of staying inside it. Cause: This happens because of the previous commit https://github.com/odoo-dev/odoo/commit/c8e93dbc806b5ea511cce695afbc9e81e30a1ca9 (which aimed to fix placing the caret after a link when at the end of a paragraph in the editable), which was not fixing the issue properly. Solution: Check if the click happens at the end of a link and the caret will move inside the link then manually place the selection after the link. Steps to reproduce: - Add a button with one character. - Try to put selection after that character. - Selection always jumps after the button. opw-6499237 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289047 Forward-Port-Of: odoo/odoo#284197
The PayPal Pay Later and P24 logos used in payment screens have been updated to match the required brand guidelines. This helps keep the checkout experience professional and compliant with payment provider requirements.
Original PR description
Commit [1] introduced the PayPal Pay Later logo and modified the P24 logo. These logos did not comply with the guidelines. This commit updates the PayPal and P24 logos to ensure compliance with the correct guidelines. [1]: https://github.com/odoo/odoo/commit/de06504773a4bc7583ee37d1ccd97aadbcfe492c task-6581412 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289136
Renames confusing Time Off approval options so they match the actual approver roles shown on employee records. This helps users understand who will be notified to approve time off and allocation requests, reducing mistakes and support questions.
Original PR description
## Issue Currently, the different options for the approval of a time off (allocation) request are the following: 1. None needed 2. By Time Off Officer 3. By Employee's Approver 4. By Employee's…
## Issue
Currently, the different options for the approval of a time off (allocation) request are the following:
1. None needed
2. By Time Off Officer
3. By Employee's Approver
4. By Employee's Approver and Time Off Officer
On the Employee's view form, in the Settings tab, the approvers are named:
1. HR Responsible
2. Time Off
The *By Time Off Officer* option does not notify the *Time Off* approver, but the *HR Responsible*, which is not clear for the users. It would be clearer to use a similar naming convention for both the Approvers on the Employee's form and the options for the approval of the time off (allocation) requests.
<img width="1878" height="592" alt="6535827" src="https://github.com/user-attachments/assets/bc7ad9bb-6b53-4553-8fc8-fb305e7c0b28" />
## Steps to reproduce
1. Install *Time Off* (`hr_holidays`)
2. For an Employee E, set an HR Responsible and a (different) Time Off approvers
3. Create a Time Off request for the Employee E
- Ensure that the selected Time Off Type has its approval method set to "By Time Off Officer"
4. **The user notified off the time off request is the HR Responsible, which is unexpected, considering that we expect an approval from the "Time Off Officer".**
## Justification
In the `_get_responsible_for_approval` method, when using the "By Time Off Officer" option (`'hr'`), it is clearly the `hr_responsible_id` (HR Responsible) who is selected as "responsible" for the approval.
https://github.com/odoo/odoo/blob/dbed91769c48768f58b6a66bff0ed6d90394de38/addons/hr_holidays/models/hr_leave.py#L1557-L1559
The exact same logic is applied for the allocation requests [here](https://github.com/odoo/odoo/blob/dbed91769c48768f58b6a66bff0ed6d90394de38/addons/hr_holidays/models/hr_leave_allocation.py#L1070-L1072).
## Targeted version
We are targeting version 19.2, as it is the version from which the `responsible_ids` field (which was clearly specifying who had to be notified for the approval of a time off request) was removed (see https://github.com/odoo/odoo/commit/d37cf89a6ff134988b4a7c001a97973cd95a2ea8).
If deemed interesting, the same modification can be backported to previous versions too.
opw-6535827
Forward-Port-Of: odoo/odoo#288890
Forward-Port-Of: odoo/odoo#287686This update fixes a manufacturing test that could fail depending on the timezone of the environment running it. It improves confidence in automated checks without changing business workflows or user-facing manufacturing features.
Original PR description
**PROBLEM**
In `test_generate_serial_button_sequence()` we generate a serial number based on the day of the year. In ir_sequence, we use the time based on the environment timezone, but in the test, we don't use any timezone. This can lead the assertion to fail, since the day of the year can differ with the timezone used.
**REPRO STEPS**
1. edit the freeze_time in the test to `freeze_time('2024-01-15T23:00:00')`
If your timezone is UTC+2, then the time according to your timezone will be `2024-01-16T01:00:00`
So, without in UTC+0, it's the 15th day of the year, but in UTC+2 it's already the 16th.
Remove the timezone in the last assertIn() (ie, remove the fix).
(if your timezone is different, adjust the freeze_time accordingly)
2. run the test and see it fails.
runbot-237780
Forward-Port-Of: odoo/odoo#285647Regular users could sometimes hit an access error when an AI chat without a custom name was shown in other workflows, such as adding an attachment to Documents. The fix lets the system safely display the AI agent name for users who already have access to the AI chat, avoiding unnecessary interruptions.
Original PR description
AI chat channels can have an empty name, in which case their display name is computed from the linked ai_agent_id. That field is restricted with fields. NO_ACCESS, so flows that read the channel display name, such as adding an AI chat attachment to Documents, could raise an access error for regular users. Compute the AI chat display name through sudo() when reading ai_agent_id, since users who can access the AI chat may safely see the agent name. task-6547727 Forward-Port-Of: odoo/enterprise#130902
An outdated background action was removed from the accounting reports working files. This prevents unwanted behavior when users refresh the page, making the experience more reliable.
Original PR description
Remove old and useless embedded action for the working files. This action is causing some undesired behaviour when refreshing the page.
The rental dashboard now displays empty cart cards with clearer background colors, making zero-value carts easier to read. Dark mode styling was also aligned with the rest of the dashboard for a more consistent user experience.
Original PR description
When a cart in the dashboard has a value of zero, its background is gray, resulting in poor contrast. This commit fixes the issue by updating the CSS. We also add CSS for dark mode to ensure consistency with all the cards in the dashboard. Forward-Port-Of: odoo/enterprise#132104
Rental pickup and return time selectors now include the business closing hour as an available option. This prevents customers from missing valid end-of-day or shift-end times when scheduling rentals online.
Original PR description
Add the "Work to" hour to the time options for both pickup and return. E.g.: Monday, from 9h to 12 and from 13h to 17h. This configuration will result in the following time options: 9:00-10:00-11:00-12:00-13:00-14:00-15:00-16:00-17:00. opw-6538617 Forward-Port-Of: odoo/enterprise#130683
Tax return attachments are now generated only once during the correct step of the return process. This prevents duplicate files from being created, reducing confusion and keeping submitted tax return records cleaner.
Original PR description
We now call _generate_locking_attachments at review and submit so it was generating two times the attachments. The fix is to always call at submit. And for the review stage we only call it when there is no submit step. Forward-Port-Of: odoo/enterprise#132193 Forward-Port-Of: odoo/enterprise#131888
This update adds safeguards so interface actions are only handled when the related screen component is ready. It reduces occasional errors in areas such as Documents, Knowledge, Work Orders, Sign, and Studio promotion dialogs, improving reliability without changing user workflows.
Original PR description
The commit [1] introduced some issues. The dom events could trigger while the component is not mounted yet. To fix this, this commit introduces a new hook `useExternalRef` which sets a signal to a given element when the current component is mounted and removes it when the component will unmount. The mix `useExternalRef` + `useListener` brings back the removed `useExternalListener` behaviour. [1]: https://github.com/odoo-dev/enterprise/commit/aa92285ee2bb0ae4e528c77b3f2a40d7412a8b5d Forward-Port-Of: odoo/enterprise#132049 Forward-Port-Of: odoo/enterprise#130111
This update corrects an issue in the HR Payroll employee view. It helps ensure employee payroll information is displayed or managed more reliably for HR teams.
Creating an onsite event from the Onsite action now uses the current user's employee record when no employee is provided. This prevents errors and ensures the new event is visible in the expected kanban view.
Original PR description
The Onsite action only sets the hr_skills_event_add_employee key in its context, without any employee. Reading default_employee_id directly then raised a KeyError. Even before that, no attendee was added, so the new event did not match the domain of the action and stayed hidden in the kanban view. We now fall back on the employee of the current user. taskid-6361432 Forward-Port-Of: odoo/odoo#288241
An unused step was removed from maintenance request creation. This cleanup does not change how requests are created, but reduces unnecessary processing and keeps the maintenance code easier to maintain.
Original PR description
The create method assigned request.maintenance_team_id to itself, a no-op that reads and writes the same value and has no effect. This line originally set the team from the equipment as a fallback when creating a request. PR #196181, while refactoring mail alias handling from equipment category to team, replaced that assignment with a self-assignment, turning it into dead code. maintenance_team_id is a required field and is already a stored compute depending on equipment_id, so it is computed correctly on create without this line. Removing it has no functional impact. Forward-Port-Of: odoo/odoo#289007 Forward-Port-Of: odoo/odoo#286132
Debit notes created from credit notes or vendor credit notes now show a clear smart button label. This helps users quickly understand the source document without confusion or missing text.
Original PR description
Issue: - The smart button was displayed without a label when a debit note was created from a credit note or vendor credit note. Fix: - Display 'Credit Note' or 'Refund' as the smart button label based on the source document. Impact: - Smart buttons now display the correct label for each debit note origin. task-6578525 Forward-Port-Of: odoo/odoo#288542
This fixes a minor display issue in Kanban views by preventing placeholder elements from receiving regular card styling. It helps keep the Kanban layout cleaner and avoids unnecessary visual styling during interactions.
Original PR description
This PR excludes `.o_kanban_ghost` elements from a kanban record selector to ensure they don't receive some style that is not necessary. task-6585469 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#289245
A failing automated test for the Time Off Gantt planning view was corrected so it works consistently when demo data changes the user's time zone. This helps keep quality checks reliable and reduces the risk of blocking future updates for reasons unrelated to customer-facing behavior.
Original PR description
- the test `test_gantt_view_duration_based_schedule_with_leaves` was failing with demo data because the unavailability depends on the user tz which changes from False without demo to Europe/Brussels with demo data task-6584290 Forward-Port-Of: odoo/enterprise#132133
This fixes a Belgian payroll calculation rule so it applies the correct employer contribution code. It helps ensure payroll results use the intended contribution and reduces the risk of incorrect payroll amounts or reporting.
Original PR description
One-line fix to use the correct contribution task-6526911 Forward-Port-Of: odoo/enterprise#132107
The online payment flow now performs its checks in the correct sequence before starting a payment action. This reduces the chance of payment attempts being blocked or handled incorrectly due to validation order issues.
Original PR description
No task ID Forward-Port-Of: odoo/enterprise#132165
When a Belgian employee leaves because a fixed-term contract has ended, the contract record is now correctly marked as fixed-term. This keeps payroll and HR history accurate and ensures the change is visible in the employee activity log.
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 Forward-Port-Of: odoo/enterprise#132110
This fix ensures product descriptions expand to the right height when edited in delivery picking forms. Users can now view and edit full product descriptions without text being partially hidden, improving accuracy during warehouse operations.
Original PR description
**Issue** The height is not correctly computed in the picking form when editing product description. **Steps to reproduce** - Create a delivery for a product - Add a description to it - Click on…
**Issue** The height is not correctly computed in the picking form when editing product description. **Steps to reproduce** - Create a delivery for a product - Add a description to it - Click on editing the description -> Observe that the description is partially hidden because the widget height is incorrectly computed **Cause** Since commit https://github.com/odoo/odoo/commit/e4f4171e1bc838840c0bd6111cd78f348b201ac2, `useProductAndLabelAutoresize` no longer assigns a height to the widget root. The corresponding widget is `MoveProductLabelField`, which extends `ProductNameAndDescriptionField`: https://github.com/odoo/odoo/blob/91b59f285248c120fe9e3e5f6b6f086ea7be2837/addons/stock/static/src/views/picking_form/stock_move_product_label.js#L5 It uses `useProductAndLabelAutoresize`: https://github.com/odoo/odoo/blob/91b59f285248c120fe9e3e5f6b6f086ea7be2837/addons/product/static/src/product_name_and_description/product_name_and_description.js#L54-L56 **Solution** Explicitly add a div around the product display and description to still use the `Autoresize` Forward-Port-Of: odoo/odoo#280243 Forward-Port-Of: odoo/odoo#271564