Tuesday, September 15, 2026
80 changes · master
New functionality added to Odoo
This update makes employee leave records available directly from employee information in the Time Off module. It supports related business processes, such as payroll integrations, by making leave data easier to read where needed.
Original PR description
Allows to read it (without payroll). See enterprise PR. Task-6344800
Enhancements to existing features
Pricelist setup is now cleaner and avoids creating unnecessary duplicates when configuring platform order providers. Demo pricing data for online rentals is also improved, making test and demonstration environments more consistent.
Original PR description
Improves the pricelist setup, with and without demo data. task-4826932 See also: - https://github.com/odoo/odoo/pull/265605 - https://github.com/odoo/upgrade/pull/10715
Resolved issues and error corrections
The accounting review status badge now follows read-only rules set on the field. This prevents users from editing statuses in places where the business process expects the information to remain locked.
Original PR description
enable readonly attribute on the field to be taken into consideration when using the widget account_review_state_selection_badge. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Code cleanup and technical improvements
The Point of Sale code now relies on an existing local storage mechanism for temporary order information instead of keeping a separate extra data field. This reduces duplicate storage logic and helps keep POS-related localization features easier to maintain without changing day-to-day cashier workflows.
Original PR description
Since `uiState` is also stored in `indexedDB` and can be used instead, we remove `PosOrder.extraField`. see odoo/enterprise#129862 task-6487351
Documentation and clarification updates
Mina Adel has signed the Individual Contributor License Agreement, allowing their contributions to be accepted under Odoo's legal requirements. This administrative update supports related contribution work and has no direct effect on product features or users.
Original PR description
Individual Contributor License Agreement signature for Mina Adel (minallegend@gmail.com, https://github.com/minaonlyone). Needed for odoo/enterprise#131352 (19.0). Replaces #287992, whose branch name made runbot diff it against master. Forward-Port-Of: odoo/odoo#288010
This update refreshes internal query counter expectations used to monitor Odoo performance. It helps keep automated checks aligned with current system behavior, reducing false alarms without changing day-to-day user workflows.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The fields list view no longer shows the Index column, reducing visual clutter for users reviewing field definitions. The index setting remains available in the detailed field form, so functionality is preserved while the overview is easier to scan.
Original PR description
The Index column is unnecessary in the fields list view and adds visual clutter. Remove it while keeping the property available in the field form. Follow up on: task-6507120 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Some restaurant appointment demo bookings now include notes, making sample data more realistic and easier to understand during demonstrations. This helps users and evaluators see how booking notes can appear in typical restaurant appointment scenarios.
Original PR description
Add notes to some demo bookings. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6569809
The point of sale system now separates the logic that turns receipt images into printer-ready output. This makes the same printing preparation reusable for both order changes and receipts, helping keep receipt-related features consistent and easier to maintain.
Original PR description
We extract image to epos raster xml generation to allow reusing for both order change and order receipts. see odoo/enterprise#130184
Product names now appear centered on POS product cards when no product image is available. This creates a cleaner, more balanced product grid while still allowing longer names to wrap properly without overflowing.
Original PR description
Products without an image currently display their name aligned to the top-left, which leaves awkward empty space and unbalanced product cards in the POS. Centering the text improves the visual layout, while the safe alignment ensures that longer names still wrap and display correctly without overflowing.
The web interface now uses the existing phone icon instead of keeping a duplicate call icon that looked the same. This reduces unnecessary icon assets and helps keep the interface resources cleaner without changing the user experience.
Original PR description
odoo/odoo@36bf562 added the `call` icon to the subset. However the `phone` icon was already in it and is exactly the same. + Enterprise PR: odoo/enterprise#131224
The gift card email and website presentation has been adjusted so the card image fits correctly again. This restores a previous visual asset state and prevents broken or awkward gift card layouts for customers.
Original PR description
This PR adjusts the gift card template layout to better fit the gift card image. The image had been replaced in a previous commit (f37504d5142ff8459a9620a7a80d5393569d82cb) to remove unnecessary whitespace, but this broke the layout on the website; it has therefore been restored to its original state. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The HR time off screens now use the label "Company Holidays" instead of "Closure Days". This makes the wording clearer because these dates may be official company holidays without necessarily meaning the business is closed.
Original PR description
A previous task renamed 'Public Holidays' display name into 'Closure Days' but that label can be misleading since these days are not necessarily days when the company is closed. So, to make terminology clearer, 'Closure Days' label is being changed into 'Company Holidays' to better represent its purpose. task-6524048 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The VoIP interface now uses the existing phone icon name instead of a duplicate call icon name. This keeps the interface visually unchanged while simplifying maintenance and reducing unnecessary duplication.
Original PR description
odoo/odoo@36bf562 added the call icon to the subset. However the phone icon was already in it and is exactly the same. This commit replaces the `call` icon occurences in `voip` to the `phone` icon. + Community PR: odoo/odoo#287792
Cancelled manufacturing orders remain accessible from the related sales order smart button. This helps users find and review cancelled production records directly from the sales order instead of losing that link.
Original PR description
Keep cancelled MOs linked to the SO smart button so the cancelled MO remains visible and users can access it directly from the SO. TaskID-6479345
Belgian payroll users can now mark a sickness relapse directly when managing time off in the Gantt schedule view. This makes the scheduling view consistent with the time off form and reduces extra steps for HR teams.
Original PR description
Sickness relapse was already introduced in the time off form but it couldn't be set from the gantt view. This commit adds the option to the gantt view. Task-6544579
Payroll calculation internals were adjusted to avoid automatically injecting salary rule categories into the calculation context. This helps make payroll rules clearer and more predictable, with related Belgian payroll data updated to match the new behavior.
This update adds a notes field to system views, giving teams a place to record context or guidance about view customizations. It helps administrators and implementers document changes more clearly without affecting day-to-day users.
Original PR description
Task~6571312 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
The Ecuadorian localization settings have been moved higher on the Accounting settings page. This makes key electronic invoicing configuration visible immediately when users are redirected from dashboards or warnings, reducing time spent searching or scrolling.
Original PR description
Purpose: Moving the Ecuadorian Localization section higher in the settings ensures that when a user is redirected from the Accounting Dashboard or from warnings, the relevant EDI configuration is immediately visible without scrolling. task-6571794
The worksheet template setup now labels the section as "Worksheet Fields" and adds short guidance explaining that these are the fields technicians complete. It also shows each field’s type directly in the list, making templates easier to review and configure without opening each field.
Original PR description
- Rename `Worksheets Properties` to `Worksheet Fields` and add italic muted help between the header and the properties: the fields technicians will fill out for this worksheet. - Display the type icon and label beside worksheet properties so the selected field type is visible without opening the definition. task-6542816
This change fixes a small display issue in sales orders by ensuring the Description field has the proper column label when product and description fields are stacked. It also re-enables an accounting-related test to help prevent this issue from returning.
Original PR description
This commit enables a previously skipped test that was expected to be fixed by 1e35b9a. It also adds the column name for the Description field in the stacked product and description fields in the sale app. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Return checks are now editable only when the related return's main company is active. This avoids repeated permission checks for each visible record, reducing the risk of intermittent connection issues and making the experience more reliable.
Original PR description
…company Simplify the JS logic for the return checks to make them editable only if the main company of the return is active. It used to make an access right call for each visible record, leading to some connection issue hard to reproduce.
The sales rental stock forecast icon now turns red when a product is unavailable, instead of incorrectly staying green. This helps sales users quickly spot stock availability problems on rental sale orders and avoid misleading confirmations.
Original PR description
## Issue Before This Commit: The forecasted report icon stays green instead of red for an out-of-stock product (forecast issue) on a sale order line when sale_stock_renting is installed. ## Steps to…
## Issue Before This Commit:
The forecasted report icon stays green instead of red for an
out-of-stock product (forecast issue) on a sale order line
when sale_stock_renting is installed.
## Steps to Reproduce:
- Install `sale_stock_renting`,
- Create a new sale order,
- Add an out-of-stock product to the sale order,
- Observe the forecasted report icon on the sale order line,
The icon appears green.
## Cause of the Issue:
As part of the Owl 3 migration in PR [#270478](https://github.com/odoo/odoo/pull/270478), `calcData` was
changed from a regular object to a computed value:
`this.calcData = {}` was replaced with
`calcData = computed(() => this.initCalcData())`.
The corresponding template usage was not updated and continued to
access `calcData` as a property instead of calling the computed
value. As a result, `this.calcData.forecasted_issue` evaluated to
`undefined`, preventing the `text-danger` class from being applied
when there was a forecast issue.
## With This Commit:
The template now invokes `this.calcData()` correctly, allowing
`forecasted_issue` to be evaluated and ensuring that the forecasted
report icon turns red when the product is unavailable.The AI module now skips processing content chunks that do not yet have an embedding model assigned. This prevents avoidable setup-time errors while allowing the normal scheduled process to assign the correct model later.
Original PR description
When the AI module is installed, the `embedding_model` of default agents is left empty to avoid an API call to IAP. This means that we can have embedding chunks without an embedding model set. We shouldn't try to embed those chunks as it will fail with an "Invalid embedding model" error. These chunks will automatically get a proper embedding model set when the cron that checks embedding model deprecation runs.
This fixes exports of binary file data so they use the expected base64 format again. It helps preserve compatibility with existing exports, integrations, and data handling processes that rely on that format.
Original PR description
Export base64 data like we used to do. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288195
Copying a manufacturing work order now keeps the production step name exactly as entered instead of adding “(copy)”. This avoids confusing labels on backorders and makes manufacturing steps easier to recognize.
Original PR description
Main The “name” field in `mrp.workorder` did not have an explicit `copy` attribute, so it inherited the generic behavior of any `Char` field named “name” (fields_textual.py:531-533), where the suffix helps distinguish the original from the copy. https://github.com/odoo/odoo/blob/808ed2e6d2aeba502e2e92d1343c2004745525b0/odoo/orm/fields_textual.py#L529-L534 Before: When copying a work order, the name of the production step was automatically suffixed with “(copy)”. Example: A work order with the step “Cutting” generates a backorder with steps named “Cutting (copy)”. After: The step name is copied as-is, without a suffix. Example: The backorder retains “Cutting”. [Task 6571512](https://www.odoo.com/odoo/project/966/tasks/6571512) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The U.S. accounting setup now classifies cash difference gains and cash discount gains as other income instead of regular income. This improves financial reporting accuracy by placing these gains in the more appropriate income category.
Original PR description
Switch the account type of Cash Difference Gain and Cash Discount Gain from income to income_other. task-6468767
The expense report print action now shows the clearer label "Print" instead of "Expenses Report". Printing an expense without a name no longer causes an error, improving reliability for users handling incomplete expense entries.
Original PR description
This commit fixes 2 issues 1) The expense report action label was "Expenses Report" while it should be "Print" 2) When an expense is attempted to be printed while having no name, a traceback was shown
Completed or cancelled stock transfers no longer show a secondary Validate button. This avoids confusing users with an action that is no longer needed once a transfer is finished or cancelled.
Original PR description
Issue Before This Commit: ======================== The secondary Validate button is displayed on pickings in the done or cancelled state, even though no further validation is required once a picking has reached either of these states. Steps to Reproduce: ========================= 1. Install the stock module. 2. Create a picking and validate or cancel it. 3. The secondary Validate button is still visible. Cause of the issue: ========================= A change introduced by [PR](https://github.com/odoo/odoo/pull/285240), _compute_validate_button_style to set validate_button_style to secondary for pickings in the done or cancelled state. As a result, the secondary Validate button remains visible. After This Commit: ======================== Update _compute_validate_button_style to ensure that the secondary Validate button is no longer displayed when the picking is in the done or cancelled state.
Financial reports now correctly round the Change column when users switch the report rounding unit during amount-based comparisons. This keeps comparison figures consistent with the rest of the report and avoids misleading precision in financial reviews.
Original PR description
When doing a comparison on any report in `Amount` and then changing the rounding unit results in the `Change` column not being rounded to the correct unit. steps to reproduce: 1. Open balance sheet 2. Click Comparison button 3. in Comparison click `Previous Period` and set `Comparison in` to Amount 4. Change the rounding unit of the report Expected behaviour: The change column rounds its values to the chosen rounding unit Actual behaviour: The values inside the Change column keep their original rounding
The website AI composer menu now places the “Select Elements” option after document-related attachment actions. This keeps similar document options together, making the menu easier to understand and use.
Original PR description
Before this commit, "Select Elements" tool appeared between "Attach Files" and "Add from Documents" -when Documents is installed. This change should change the ordering so both Document attachment options appear next to each other for better semantic grouping. Given the current sequences assigned for both options, a sequence value of 30 should stay below them without colliding with other options.
The appointments calendar now opens on the next upcoming booking instead of jumping to the most distant future booking. This makes it easier for staff to review imminent appointments without manually navigating back through the calendar.
Original PR description
Problem: The bookings calendar of an appointment type opens on the week of the most distant booking instead of the next one, even when a booking exists later the same day. Cause:…
Problem: The bookings calendar of an appointment type opens on the week of the most distant booking instead of the next one, even when a booking exists later the same day. Cause: `action_calendar_meetings` sets the landing date from `appointments[0].start`, where `appointments` is `self.meeting_ids.filtered_domain(domain)`. `calendar.event` is ordered on `start desc` and a one2many is read in the order of its comodel, so the first record is the furthest booking rather than the next one. The original `search([...], order='start')` was replaced by the one2many in 14b5caccc325 (odoo/enterprise#23191). Solution: Sort the filtered bookings on `start` in `action_calendar_meetings`. That method is the only place the initial date is built, and `action_calendar_event_view_request` reuses it for the gantt start date, so both entry points are covered. `calendar.event` keeps its `start desc` order, which the booking list views rely on. Steps to reproduce: - Go to Appointments. - Open the appointment type "Schedule a Demo" and click Appointments. - Click New, set the date to later today, save and go back. - Click New, set the date to one year from now, save and go back. - Go back to Appointments, reopen "Schedule a Demo" and click Appointments. - Switch to the calendar view. - Observe that the calendar opens on the week of the booking one year from now. Ticket [link](https://www.odoo.com/odoo/project.task/6480029) opw-6480029 Forward-Port-Of: odoo/enterprise#130385 Forward-Port-Of: odoo/enterprise#129000
The Send to eTransport button is now shown when a Romanian stock transfer is ready as well as when it is completed. This lets users prepare required eTransport reporting at the right stage of the delivery process instead of waiting until after completion.
Original PR description
Currently, the Send to eTransport button on `stock.picking` is only visible when picking is done. This PR fixes this behaviour and makes it visible when picking is ready or done both. task-5930984 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285429 Forward-Port-Of: odoo/odoo#257321
This fixes a setup issue in the Panama localization by ensuring the Contacts app is included when needed. It helps prevent menu or installation problems related to local administrative areas.
Original PR description
The modules anchored a dedicated "corregimiento" menu within the `contacts.menu_localisation` without depending on `contacts` module. runbot-947185
Manufacturing orders now apply their selected date to all finished product movements, preventing inconsistent inventory dates. This reduces intermittent failures and helps keep manufacturing and stock records aligned.
Original PR description
Followup to #279316, which describes this bug and fixes it incompletely, only covering zero-quantity/unconsumed moves instead of the finished ones (which get overwritten in `_post_inventory()`). This fix writes the set date value to all finished moves. This issue manifests as a heisenbug with the test `test_component_addition_to_finished_mo` nondeterministically breaking, as the fix and the test focused on the newly added component moves and didn't take the initial move into account. Task ID: [6226710](https://www.odoo.com/odoo/my-tasks/6226710) Runbot error: [945505](https://runbot.odoo.com/odoo/error/945505)
Quotation templates now correctly show price, discount, and tax columns for lines that have a description and price but no product. This prevents users from thinking saved prices were lost when reopening templates.
Original PR description
Steps to reproduce: - On a quotation, add a line with product description + unit price only. - Action menu > Save as template, to create a full quotation template. - Open that template: Price/Discount/Taxes columns are hidden on the productless line, as if the price was lost. Before this commit, `_compute_has_productless_lines` looped on `self` but read lines from `self.sale_order_template_line_ids` instead of `template.sale_order_template_line_ids`. Recomputing several templates in one batch made every template share the same aggregated result, hiding the price columns even though `price_unit` was stored correctly. After this commit, the compute reads `template.sale_order_template_line_ids`, so each template gets its own value. opw-6566552 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Quotation template names in Sales can now be shown in each user's preferred language when translations are provided. This fixes cases where template names always appeared in the original language they were entered in, improving clarity for multilingual sales teams.
Original PR description
The Template name field on `sale.order.template` was a plain Char, so it always displayed in whichever language it was typed in, regardless of the viewing user's language. Add `translate=True` so users can provide a per-language name via the standard Translate dialog. opw-6561520 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Canadian CPA payment bank records without a selected financial institution no longer trigger the institution number validation. This prevents unnecessary errors when bank details are incomplete or do not include an institution.
Original PR description
Don't apply the constraint when there is no financial institution on the bank. runbot-947001
The Timesheet Assistant now updates immediately when a timesheet date is changed from a linked task. This prevents users from seeing outdated timesheet information and avoids needing to manually refresh the page.
Original PR description
Steps to Reproduce: - Install timesheet_grid and activate Timesheet Assistant - Open a timesheet and click the task external link - Change the timesheet date from the task form and save Issue: When the timesheet date is changed from the task, the assistant still shows the old date until the page is refreshed Fix: Reload assistant timesheets after the linked task is saved and refresh or clear the selected timesheet based on the new date task-6454988 Forward-Port-Of: odoo/enterprise#131029 Forward-Port-Of: odoo/enterprise#130265
Fixes an issue where the View and Unreconcile buttons in the invoice payment popover could fail with an error. The popover now also shows payment dates in the user's localized format, improving clarity for invoice review.
Original PR description
When clicking the "View" or "Unreconcile" buttons in the payment popover of the invoice payments widget, a TypeError was raised: `TypeError: ctx.this.props._onOpenMove is not a function`. Use `useProps()` without arguments on `AccountPaymentPopOver` so that all dynamic incoming props are properly bound to `this.props`. Additionally, display `this.props.formattedDate` instead of the raw `date` string in the popover template, aligning with commit 82f6098eedd1 to ensure the date is displayed in the user's localized format. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a display issue in the Time Off calendar where icons and text in the leave details card were misaligned. The card now uses the correct styling so managers and employees can read time-off details more clearly.
Original PR description
Bug reproduction: - Install hr_holidays go to the timeoff app and then to the overview tab - Open calendar mode, click to some timeoff - Aligning of the icons and texts are not proper Bug cause: - In the other leave cards or timeoff request popups: -- there is o_hr_leave_form and inside of it there is o_inner_group -- o_inner_group keeps the icons and texts in the same row - Since modal is opened as small one and that class is not there -- for hr_leave_report_calendar_view_form -- modal-sm styling collapses grid to a single column Bug solution: - New card class o_leave_report_card that includes o_inner_group -- for hr_leave_report_calendar_view_form task-6545420 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
Fixed an issue in the HTML editor where dragging an image onto its current position could trigger an error in Chrome. This improves editing reliability by safely handling no-change drag-and-drop actions without disrupting the page content.
Original PR description
Steps to reproduce: - Insert an image as the last child of a paragraph. - Drag and drop it below or after itself. Description of the issue: - A traceback occurs. Cause: - When dropping an image below or after itself `document.caretPositionFromPoint()` computes a drop offset equal to the current node size. - The image is then removed from the DOM before being reinserted. Since it is the last child of its parent, removing it shrinks the parent, making the previously computed offset out of bounds. - Restoring the selection at that stale offset results in a traceback. Solution: - Treat dropping the image at its current position as a no-op and skip the remove/reinsert process, since it would not change the DOM. - Clamp the drop offset to the current node size before restoring the selection preventing out-of-bounds offsets. task-6435091 Forward-Port-Of: odoo/odoo#286613 Forward-Port-Of: odoo/odoo#280612
Users on tablets and other touch screens can now resize list view columns without the action being interrupted by page scrolling. This makes list views easier to adjust and use on touch-based devices.
Original PR description
Steps to reproduce ================== - Use a tablet (touch screen) - Open any list view - Try to resize a column by dragging the column header's right edge => The resize doesn't work properly: it gets interrupted an we can only move a few pixels at a time Cause of the issue ================== The resize handle relies on pointerdown/pointermove/pointerup to run and stop the drag, but nothing tells the browser to opt out of its native touch gestures. On a tablet, the drag can get hijacked as a page scroll, which fires pointercancel instead of pointerup. That event was not listened to, leaving the pointermove handler attached and the resize state stuck. Solution ======== - Set touch-action: none on the resize handle so a touch drag isn't interpreted as scrolling - Listen to pointercancel to properly stop the resize when the browser takes over the gesture anyway Forward-Port-Of: odoo/odoo#288046
This fixes an issue where AI service callbacks could fail when the system could not identify the right database from the request alone. By including the database name in callback setup, external service responses can reach the correct Odoo database more reliably.
Original PR description
IAP callbacks have no browser session and can return 404 when Odoo cannot select a single database from the hostname. Send webhook_dbname so IAP can route callbacks with the X-Odoo-Database header.
The Phone app no longer lets users start creating call flows from phone number destination selectors, which previously opened an unusable blank setup screen. Users can still create call flows from the dedicated Call Flows configuration area, ensuring setup happens in the correct place.
Original PR description
Steps to reproduce: 1. Install Phone on a fresh database. 2. Buy a phone number. 3. Open the phone number form. 4. Set the destination type to "Call Flow". 5. Open the destination selector when no call flow exists. 6. Click "Create". Before this commit, an unusable empty form opened because call flows are intended to be configured through their dedicated editor. Disable call flow creation from PBX destination selectors. Call flows can still be created from Phone > Configuration > Call Flows. task-6574014
Odoo now handles requests with overly long web addresses more gracefully, even when the server rejects them before reading request details. This avoids an internal error during the rejection process and helps keep the system response stable.
Original PR description
- When the request URI is too long, the HTTP server rejects the request before parsing the headers. As a result, `self.headers` is not available when the WebSocket compatibility code in `send_header()` and `end_headers()` is executed. - Access `self.headers` safely to avoid an AttributeError while handling the 414 response. **opw-6501275** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286806 Forward-Port-Of: odoo/odoo#285870
The commission reporting logic now uses simpler row-based identifiers instead of longer string-based IDs. This helps keep the report data cleaner and avoids unnecessary complexity without changing the business meaning of the commission reports.
Original PR description
Unlike achievement report ids, commission report ids do not need to identify source records. ROW_NUMBER() is enough to identify the grouped rows and avoids using string ids. Forward-Port-Of: odoo/enterprise#127018 Forward-Port-Of: odoo/enterprise#126851
A website shop performance test was updated to include extra checks triggered by out-of-stock product labels. This keeps automated testing accurate and helps prevent false failures while maintaining confidence in shop page performance.
Original PR description
The "Out of stock" ribbon auto-assignment resolves the first available combination of the multi-variant test product to know whether all its variants are out of stock, costing 3 extra `product_template_attribute_value` queries that were not accounted for in `TestWebsiteSalePerformanceNoPricelist`. Breaking PR: https://github.com/odoo/odoo/pull/254869
This fixes an issue that could prevent users from opening or reading Italian electronic invoices due to an access rights error. Invoice document type information is now read safely in the background, improving reliability without changing user workflows.
Original PR description
Field l10n_it_available_document_type_ids on account.move is computed and not stored, so it's not in compute_sudo by default This commit adds the compute_sudo to the field to ensure there's no access error when reading the invoice runbot-947080
OSS sales in the Spanish VAT report are now assigned to the correct Modelo 303 reporting box, casilla 123 instead of casilla 124. This helps ensure reported VAT amounts appear in the legally expected place and reduces the risk of incorrect tax filings.
Original PR description
OSS sales were being mapped to mod_303_casilla_124_balance where it should be mapped to mod_303_casilla_123_balance. These amounts must be reported values in casilla 123. This commit updates es_assec, es_common, es_full and es_pymes tax templates from 124 to 123 and updates test_country_tag_from_spain. task-6360387 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284984
This fix prevents an error in Manufacturing planning when users switch from sample data to real work orders by changing filters. It makes the transition smoother and avoids disruptive tracebacks in the work orders list view.
Original PR description
Go to Manufacturing > Planning > Workorders > Planning > list view. Sample data are displayed. Remove a filter such that real records match the domain. Tracebacks are displayed because we call…
Go to Manufacturing > Planning > Workorders > Planning > list view. Sample data are displayed. Remove a filter such that real records match the domain. Tracebacks are displayed because we call `get_duration` on records that don't exist. The `useRecordObserver` of MrpTimerField subscribes the callback to the `useSampleModel` flag and to the `record`. When the filter is removed, the model is reloaded and, atomically, both the flag and the root and updated on the model. As the flag is toggled, the callback is executed. However, the props of the MrpTimerField aren't updated yet, so the `record` used in the callback is still the old, sample, one. One could argue that there's a design flaw in the model as at some point, a `record` could contain sample data while it's model states that we're not in sample mode (`record.model.useSampleModel` is false). That's true and that's something we'll change in the future, but in master. We fix this issue with an easier patch, which consists in accessing the `useSampleModel` flag with `untrack`, i.e. to not subscribe to that flag's changes, as in that case, the component will be destroyed anyway. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288015
The online shop wishlist heart button now keeps a consistent square size in Safari. This prevents visual misalignment in product listings, giving shoppers a cleaner and more consistent browsing experience.
Original PR description
The wishlist button on the shop page is misaligned in Safari Steps to reproduce: (in Safari) 1. Install eCommerce 2. Go to the shop 3. The wishlist button (heart icon in the top right corner of each product) is misaligned Issue: The wishlist button (`.o_add_wishlist`) is positioned with `position: absolute` with only top and right offsets set (through the `o-position-absolute` mixin), leaving its width and height on `auto`. https://github.com/odoo/odoo/blob/c4de5361fb207916175332dcf6815c0814ecf09c/addons/website_sale_wishlist/static/src/scss/website_sale_wishlist.options.scss#L62-L65 In other browsers, the button resolves to a 38 x 38px square box but in Safari, it is not a square which misaligns it in the product grid. Solution: Force width and height on `.o_add_wishlist`, so the button resolves to the same box size in every browser. opw-6456552 Forward-Port-Of: odoo/odoo#287940 Forward-Port-Of: odoo/odoo#281935
Check templates now handle cases where an account filter finds no matching accounts without causing an error. This prevents interruptions when running accounting reports with restrictive or unmatched template rules.
Original PR description
When a check template has a domain on account.account that would give no result, it would throw a traceback because min cannot operate on an empty result.
Belgian payroll users can now open the Payroll Time Offs Gantt view for employees on flexible working schedules without hitting an error. The change removes duplicate payroll calendar logic now handled centrally, improving reliability without changing user workflows.
Original PR description
Steps to reproduce: - On a Belgian company, set an employee's working schedule to Flexible Hours (no calendar, hours/week set). - Open Payroll > Time Offs. Current behavior: AttributeError: 'hr.version' object has no attribute 'l10n_be_reference_calendar_id'. Expected behavior: The Gantt view loads normally task-6569832
The time off Gantt quick-add menu now follows the configured ordering of leave types instead of showing options unpredictably. This keeps common choices like paid or unpaid time off visible ahead of less frequently used options, making payroll time off entry more consistent for users.
Original PR description
The quick-add widget on the time off gantt view (in payroll) picked its displayed presets somewhat randomly. This let rarely-used types (e.g. the two work accident allocations) push more common ones (e.g. paid/unpaid time off) out of visibility. Use the work entry type's `sequence` as a sort key (use it as a tie-breaker for allocated types, and as the sole sort key for non-allocated types), so the widget reflects the configured ordering of time off types. task-6515958
Belgian payroll demo employees now have the correct work locations set, preventing setup issues in demo payroll scenarios. The warning for missing work locations was also adjusted to avoid access errors when multiple companies are involved.
Original PR description
Set work locations for Belgian demo employees and avoid multi-company access errors in the work location warning. task: 6569897
Payroll configuration now also applies to the India corporate chart of accounts template. This prevents setup errors and helps companies using that template run payroll accounting correctly.
Original PR description
A new chart template `in_sch_3` was added for corporate entities, so payroll also needs to be configured for this template. This commit configures payroll for the `in_sch_3` chart template as well. runbot error: https://runbot.odoo.com/odoo/error/947113
The demo payroll data now sets the time off allocation to match the year of the demo leave. This prevents installation errors in January or February and keeps Belgian payroll demo data usable for testing and demonstrations.
Original PR description
The "Long weekend" demo time off is placed two months in the past, while its allocation was only valid for the current calendar year. Installing demo data in January or February left the leave uncovered, raising "You do not have any allocation for this time type". Start the allocation on January 1st of the leave's own year instead. related-taskid-6519088 runbot-error-946849
The expense settings now prevent users from selecting payment methods that do not match the relevant company configuration. This reduces setup errors and helps keep expense processing data accurate.
Original PR description
Add domain to company_expense_allowed_payment_method_line_ids field to avoid selecting inconsistent data @Tecnativa TT64416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287131
This fixes a problem that could block users when setting a partner's country to Saudi Arabia after entering a Company ID. The change keeps partner record updates working smoothly and avoids an unexpected error in Saudi Arabia localization workflows.
Original PR description
Currently, an error occurs when the user sets the partner's country to Saudi Arabia. **Steps to Reproduce:** - Install the `l10n_sa` module with demo data. - Switch to `My Saudi Arabia Company`. -…
Currently, an error occurs when the user sets the partner's country to Saudi Arabia. **Steps to Reproduce:** - Install the `l10n_sa` module with demo data. - Switch to `My Saudi Arabia Company`. - Create a `partner` and click the `+` icon next to the VAT Number. - Select `Company ID`, set any `value`. - Set the partner's country to `Saudi Arabia`. `KeyError: 'OTHER'` After the [recent commit], OTHER is removed from vals [1] when at least one other EN identifier, excluding OTHER, is available. If a user selects OTHER (Company ID) as an additional identifier and then changes the partner's country to Saudi Arabia, the available additional identifier metadata is recomputed. With the [second commit], it checks whether the stored additional identifier is applicable to Saudi Arabia by looking up its metadata [2]. However, since OTHER was removed from the available additional identifier metadata because another EN identifier is available, directly accessing the metadata for OTHER raises a KeyError. This commit ensures that the additional identifier is safely accessed in the metadata. [recent commit]: https://github.com/odoo/odoo/commit/9087c2ddc1de3e9ef9431188a9b6dddbd6b58552 [second commit]: https://github.com/odoo/odoo/commit/fddf7653ba898f5db9d97ae3cd9f885c6c5c658a [1]- https://github.com/odoo/odoo/blob/1d50ff71a1edf2c4226cb2f68cf3bbe4e39485f6/odoo/addons/base/models/res_partner.py#L1423-L1425 [2]- https://github.com/odoo/odoo/blob/1d50ff71a1edf2c4226cb2f68cf3bbe4e39485f6/addons/l10n_sa/models/res_partner.py#L17-L18 sentry-7717445803 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287384
This fix removes an unnecessary language switch in a website editing test and adds a check that the editor is ready before continuing. It helps prevent intermittent test failures, improving confidence in website editing stability without changing user-facing behavior.
Original PR description
In [this commit][1] some steps were added to resolve non-deterministic errors. Just before `...clickOnEditAndWaitEditModeInTranslatedPage(),` three steps were added that switch the language back to…
In [this commit][1] some steps were added to resolve non-deterministic errors. Just before `...clickOnEditAndWaitEditModeInTranslatedPage(),` three steps were added that switch the language back to parseltongue. This is most likely since the function call implies we are on a translated page. The choice for this function was most likely due to a race condition. As the language was switched to English recently, the edit button might not have time to have switched. To recreate the race condition, remove the step added in this commit but leave the rest of the changes. Run the tour and it will hang up on the first step of `...clickOnEditAndWaitEditMode()` because the Edit button is still in "translation" mode. This commit removes the redundant language change and adds an extra step to check the Edit button is in the correct "mode" before continuing. [1]: https://github.com/odoo/odoo/commit/7f7cc9617381b1a2f61af0875e7b60ab0b7ab3a0 task-5951393 Forward-Port-Of: odoo/odoo#288035 Forward-Port-Of: odoo/odoo#286764
Payment providers now appear with installed options before uninstalled ones again. This makes payment setup clearer for users and restores the expected ordering after a recent platform ordering change.
Original PR description
Currently payment providers are displayed with uninstalled providers first, this should not be the case This behavior is caused by a recent change to ordering of selection fields with this pr: https://github.com/odoo/odoo/pull/280940 Previously, selection fields were ordered by the alphabetical value of their underlying text key. Now these are ordered by the sequence in which the options are written in the field declaration. Since `ir.module`'s state field, which is related to the `module_state` field that is used for ordering payment providers is declared in this way: https://github.com/odoo/odoo/blob/e94da89ffd32487233992385badd9f5fa2ab77ec/odoo/addons/base/models/ir_module.py#L143-L150 sorting alphabetically puts 'installed' before 'uninstalled' however sorting by declaration order sorts the other way around this commit updates payment_provider's `_order` value to match that change. opw-6511304
Odoo now correctly carries the payment reference from imported CII XML invoices into the generated vendor bill. This helps accounting teams avoid missing payment information and reduces manual corrections after invoice import.
Original PR description
### Issue before this commit: When importing a CII XML invoice containing a PaymentReference, the value is not transferred to the generated vendor bill in Odoo. ### Steps to reproduce the issue: 1. Download Accounting 2. Try to import the invoice in the ticket 3. See that in the tab other info the payment reference is not imported ### Cause of the issue: During a previous refactoring (ffbdf29a816d0ff4136488d26b55b9707fc37fc6), the helper function responsible for extracting the payment reference during the import process was omitted. ### Reason to introduce the fix: Add the missing extraction logic to ensure the payment reference is correctly retrieved from the XML and assigned to the Odoo invoice. opw-6530627 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287216
Opening the Miscellaneous tab in a Bill of Materials could show an error because the screen was looking for an outdated page element. This fix updates the view so the tab opens normally, preventing disruption for manufacturing users.
Original PR description
In this [PR](https://github.com/odoo/odoo/pull/287605), the referenced element was changed from `<a>` to `<button>`. However, the inherited view was still targeting the `<a>` element. Due to this change, the inherited view no longer targets the correct element, resulting in a traceback when accessing the Miscellaneous tab in the Bill of Materials. This PR updates the inherited view to target the appropriate `<button>` element. TaskId: 6573251
This fix restores binary field exports to use the expected base64 format, matching earlier behavior. It helps prevent compatibility issues for businesses that export files or data from Odoo and rely on those exports being readable by existing tools or integrations.
Original PR description
Export base64 data like we used to do. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Quantity-based delivery pricing rules now display cleaner names by omitting an invalid placeholder where no unit applies. This prevents confusing rule labels for users configuring shipping methods based on rules.
Original PR description
Quantity-based delivery pricing rules have no unit. The computed name formatted the empty value directly, displaying `False` in the rule name. Use an empty string when the computed variable unit is not defined. Steps to reproduce: 1. Open a delivery method configured as Based on Rules. 2. Add a pricing rule using Quantity as its condition. 3. Observe `False` after the quantity in the generated rule name. Before this commit: Quantity-based pricing rules displayed `False` as their unit. After this commit: Quantity-based pricing rules no longer display an invalid unit. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287873
This fix ensures Odoo regularly checks and closes unused database connections, even when the system is busy. It helps prevent idle connections from staying open longer than intended, improving resource management and reducing the risk of connection pool pressure.
Original PR description
Every `borrow()` used to push `_check_free_at` forward, so a busy pool never ran the periodic full idle scan. Oldest idle connections then stayed open until the pool filled. Reset the timer only when that full scan actually runs. I think it is the reason that we have to REV the code here https://github.com/odoo/odoo/pull/287008 for non-blocking connection pool Forward-Port-Of: odoo/odoo#288067
Updated the help text for the Linphone provisioning QR code in VoIP user settings. This makes phone setup guidance clearer for users and reduces confusion during configuration.
This fix makes an automated rental shop test wait for the calendar to finish updating before choosing a date. It helps prevent false test failures, improving confidence that rental pricing and checkout flows are working as expected.
Original PR description
The shop_buy_rental_stock_product tour can select a day from the previous month's grid before the date picker finishes rendering the next month. This can leave the rental period unchanged and cause the cart price assertion to fail. Wait for an animation frame after clicking "next month" before selecting a day. runbot-240903 Forward-Port-Of: odoo/enterprise#131467 Forward-Port-Of: odoo/enterprise#130822
The UAE payroll update process now restores required payroll structure data in the correct order before updating salary rules. This prevents scheduled payroll maintenance from failing when UAE payroll structures or structure types were previously deleted.
Original PR description
Currently, an error occurs when the Payroll Update Data schedule action is run. **Steps to Reproduce:** - Install the `l10n_ae_hr_payroll` module without demo data. - Create a new company with the…
Currently, an error occurs when the Payroll Update Data schedule action is run. **Steps to Reproduce:** - Install the `l10n_ae_hr_payroll` module without demo data. - Create a new company with the country set to `United Arab Emirates`. - Switch to that company. - Go to `Payroll` > `Configuration` > `salary` > `Structures`. - Delete all salary structures related to the `United Arab Emirates`. - Go to `Scheduled Actions` and run `Payroll: Update Data`. `ValueError: External ID not found in the system: l10n_ae_hr_payroll.uae_employee_payroll_structure.` After this [recent commit], hr_rule_parameter_data and hr_salary_rule_data were added to _get_data_files_to_update. If the user deletes the salary structure and then updates the data files [1], an error is raised because the structure is missing. This commit ensures that the salary structure data is updated before updating the salary rule data. It also ensures that the salary structure type data is updated beforehand, as the structure depends on it and the user can delete the structure type data. [recent commit]: https://github.com/odoo/enterprise/commit/f3316e056da817ca31fecdc04e0f8df000f0f038 [1]- https://github.com/odoo/enterprise/blob/0a0b3a50a81df062ddee5c310ce06aaa4533a8a8/l10n_ae_hr_payroll/models/hr_payslip.py#L98-L105 sentry-7496380516 Forward-Port-Of: odoo/enterprise#130654
The voice message recorder in Discuss now aligns correctly when used in AI chat. Recording action buttons have been adjusted to appear as consistent circular controls, and the download icon display has been corrected for a cleaner user experience.
Original PR description
If we start a voice message in the AI chat the `o-mail-VoiceRecorder` is vertically misaligned. Also the cancel and validate recording buttons were not perfect circles, they now match the other buttons sizes and style. task-6565360 | Before | After | |--------|--------| | <img width="782" height="641" alt="image" src="https://github.com/user-attachments/assets/6f0a73ec-7fd5-466a-a909-269c7a734087" /> | <img width="786" height="638" alt="image" src="https://github.com/user-attachments/assets/145d8d17-c9a6-4a2a-8efa-2c43288b3960" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A bug was fixed so grouped search options update correctly after recent interface changes. This helps prevent incorrect or stale search dropdown behavior for users working with grouped views.
Original PR description
See commit messages for details. - Runbot [945677](https://runbot.odoo.com/odoo/error/945677) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The point of sale settlement flow now relies on already stored interface state instead of keeping a separate extra data field on orders. This reduces duplicate stored information and helps keep the payment validation process easier to maintain without changing the cashier experience.
Original PR description
Since `uiState` is also stored in `indexedDB` and can be used instead, we remove `PosOrder.extraField`. see odoo/odoo#285668 task-6487351
This updates internal editor and in-app purchase components to use the newer component property handling expected by the underlying web framework. It helps keep these areas maintainable and better validated without changing day-to-day user workflows.
Original PR description
- https://github.com/odoo/enterprise/pull/131126 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update modernizes internal component definitions used by the HTML editor, AI-assisted media tools, website sales editor integrations, and Knowledge cover dialogs. It helps keep these areas compatible with the latest interface framework and improves validation without changing user-facing workflows.
Original PR description
- https://github.com/odoo/odoo/pull/287592 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update aligns accounting and helpdesk list views with a recent platform naming change. It is an internal cleanup that helps keep these screens compatible and maintainable, with no expected change to day-to-day user workflows.
Original PR description
This commit is the direct consequence of the rename of isCellReadonly into isFieldReadonly operated in https://github.com/odoo/odoo/pull/287378 due to the nature of stacked fields in list view. task-6564093
This pull request reorganizes and updates Odoo's internal ORM test models. It helps maintain product quality by making core automated tests easier to manage, with no expected direct change for everyday users.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The HR module now uses one shared method to determine an employee's reference working calendar, including for a specific date. This reduces duplicated logic and helps keep schedule-related behavior consistent across HR and payroll-related processes.
Original PR description
hr.employee._get_flexible_reference_calendar and hr.version._get_reference_calendar (added by hr_payroll) resolved a fallback calendar the same way. Move the logic to hr.version as the single _get_reference_calendar, accepting an optional date to resolve the employee's version on that date, and drop the now-unused employee-level hook. task-6569832
Payroll warning messages have been rewritten to be easier to understand and less distracting in the interface. This helps payroll users identify and resolve issues more quickly, especially in Belgian payroll workflows.
Original PR description
Warning messages from hr_payroll and l10n_be_hr_payroll module have been reformulating to increase clarity and lighten the UI. Task: 6523051
This update reorganizes how navigation item styling is handled in the web notebook component. It should not change what users see, but it reduces duplication and makes future interface fixes safer and easier to apply.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr