Wednesday, September 9, 2026
74 changes · master
Enhancements to existing features
Financial reports can now prioritize key summary lines before limiting how many details are shown. This helps ensure important lines such as initial balances remain visible when users expand reports like the General Ledger or Partner Ledger.
Original PR description
This key allows defining a sort function on custom groupbys that will be used to reorder the grouping keys returned by this groupby when calling _expand_unfoldable_line_with_groupby, before the load_more_limit is used to limit the number of groupby results that will actually generate lines. Thanks to this, we can rely on a custom groupby to compute initial balances as a dedicated snapshotted engine summed with another in an aggregation, and still have the guarantee the "initial balance" groupby line will be returned as the first result (we needed that while refactoring General Ledger and Partner Ledger, so that they can benefit from snapshots). Without it, it was possible the "initial balance" line got cut by the load_more.
Chilean electronic invoicing now supports branches that operate under the same legal entity as their parent company. Branches can share official folio ranges and certificates, roll over to new ranges correctly, and receive incoming documents routed to the right branch.
Original PR description
A branch is the same legal entity as its parent: it shares its RUT, SII registration and certificate, and issues folios out of the ranges the SII granted that RUT. CAFs, folio counters and the localization config were scoped to a single company, so branches could not issue at all. Resolve the legal entity a company issues under and read it wherever a DTE states the issuer, draw folios from the first range still in use so branches sharing a range continue one series and a spent range rolls over to the next, and route incoming documents to the branch named in `CdgIntRecep`. A company ever granted a range of its own never falls back on the one above it, so a branch out of folios is asked for a new CAF instead of consuming its parent's. upgrade: odoo/upgrade#10893 task-6218881
This update improves the email sending experience by clearly warning users about invalid addresses, failed deliveries, and required Gmail or Outlook settings. It also makes resending, replying, forwarding, and signature handling more reliable and easier to understand.
Original PR description
- Add a toast notification when an invalid email address is entered while sending a message. Previously, nothing happened, which could confuse users. - Make the smtp_user field required when…
- Add a toast notification when an invalid email address is entered while sending a message. Previously, nothing happened, which could confuse users. - Make the smtp_user field required when smtp_authentication is set to gmail or outlook. - Add a cancel icon when email delivery fails instead of only changing the icon color. This improves accessibility for colorblind users. - Add hover text to the email delivery failure icon to clearly indicate the failure. - Add a Send Again action that opens the composer with the same message and recipients as the original email. - Include the user's signature by default in the message body when the composition mode is mass_mail. Previously, the signature was missing in this mode. - Restructure the composer body for Reply All and Forward actions in the following order: 1 Message 2 Signature 3 Quoted/mentioned content - Make the delimiter `-- <br>` not editable in the signature block to prevent user from breaking its structure. Previously, text typed there used to end up inside the signature container, where it was hidden behind the collapsed ellipsis in the chatter. - Rebuild the signature layout after each edit so the "--" line and the signature itself always stay in separate blocks. Editing around the delimiter, such as deleting a line, could leave the signature in a broken state. Task-6321967
Update notifications now include counts for light users, giving businesses a clearer view of user types during update checks. This helps administrators better understand licensing or user composition information alongside existing update details.
Original PR description
This commit add the light users counts to the update notification. Task-Id: 6388209 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale can now record daily session closing entries in a dedicated journal while keeping customer invoices in the usual sales journal. This helps businesses meet localization and e-invoicing requirements where closing entries must be separated for compliance or reporting.
Original PR description
Multiple l10n require edi with a daily pos closing journal different from the default journal. task-id: 6446274 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The SMS sending flow is now closer to the email composer, with clearer recipient styling, better character count feedback, easier template use, and support for scheduling SMS messages. This helps users prepare, reuse, and send SMS communications with more confidence and less friction.
Original PR description
This PR implements a series of UI/UX improvements for the SMS module. The goal is to align the SMS sending flow with the Mail composer experience and provide better feedback during account registration. See sub commits for more details. task-6178288
The Bank Reconciliation Summary now gives finance teams a fuller view by showing both reconciled and unreconciled bank activity, including partially reconciled items. It also adds clearer balance checks, line-level warnings, and a period-based layout so users can more easily spot mismatches between bank balances and the general ledger.
Original PR description
- Structure of the report would be like below:- - Bank Account Name - Opening Bank Balance - Reconciled Transactions - Reconciled Receipts - Reconciled Payments - Unreconciled Transactions -…
- Structure of the report would be like below:-
- Bank Account Name
- Opening Bank Balance
- Reconciled Transactions
- Reconciled Receipts
- Reconciled Payments
- Unreconciled Transactions
- Unreconciled Receipts
- Unreconciled Payments
- Misc. operations
- Calculated Ending Bank Balance
- Ending General Ledger Balance
- Outstanding Receipts/Payments
- Outstanding Receipts
- Outstanding Payments
- The main change in the report is that report now shows both reconciled and
unreconciled transactions. (Before this commit it displayed only unreconciled
transactions.)
- Reconciled transactions will report reconciled amount of the transaction and
Unreconciled transactions will report residual amount of the transaction.
So partially reconciled transaction will appear twice in the report.
- Opening bank balance = last statement before period's starting balance
+ that statement's transactions before period
+ transactions without statement before period
- If we don't find any transactions before period, then we'll look for period's
first statement and take its starting balance as opening bank balance.
- Opening bank balance will redirect to transactions used in above calculation.
- If opening or calculated ending bank balance mismatches with GL balance as of
that day, an error icon with warning message tooltip will be added on that
respective lines and that error icon will redirect to General Ledger.
- Similar warning icon will be added on Misc. Operations line if there are any
misc operations and that icon redirects to that misc entries.
- Before this commit misc entries line only reported total balance and that
balance redirected user to misc entries, but with this commit that misc entries
are now added in this report itself like transactions and redirect on misc
balance has been removed.
- A new warning at top of the report has been added for transactions without
statement and warnings for GL mismatch and misc entries have been moved from
there to related report line.
- Change reconciliation report name from `Bank Matching` to
`Bank Reconciliation Summary`.
- Replace the current date selection with period selection, with previous month
selected by default.
- Enable `Add totals below sections` setting for this report.
- Remove journal groups from report options, as this report is mainly about Bank
Journal from which this report was opened.
- Remove `Currency` column from the report as `Amount Currency` column's amounts
will be already formatted with their respective currencies.
- Remove red color from negative amounts, as they are just outgoing payments
and by looking at red color user will assume that there is something wrong with
that payments.
- Opening balance, ending balance and GL balance lines will be always visible
even if filter `Hide lines at 0` is applied. Same logic is applied for misc
entries but only if we have misc entries.
UPGRADE PR: https://github.com/odoo/upgrade/pull/10951
[task-4638579](https://www.odoo.com/odoo/project/967/tasks/4638579)This update removes an obsolete option from the Bulgarian SAF-T file attachment error wizard. It keeps the tax reporting workflow aligned with recent validation changes and reduces unnecessary internal complexity, with no expected impact on everyday users.
Original PR description
bypass_failing_tests has been removed from the definition of the tax return action_validate since 19.4. Thus the file_attachment_error_wizard no longer needs to hold that value. This commit removes it in master. Related: odoo/upgrade/pull/11272 Related: odoo/enterprise/pull/118326
Timesheets can now record time spent in Google Chat even when no specific chat participant is selected. This helps ensure more complete and accurate time tracking for work done through Google Chat.
Original PR description
This commit's purpose is to add a new rule to be able to record the time spend on google chat when no specific chatter is selected. task - 6455607
Before this commit, ts assistant was didn't have any rules to detect the usage of Zoom After this commit, ts assistant should come with pre-build rule to track Zoom use in both web and application form. task-[6518921](https://www.odoo.com/odoo/project/4105/tasks/6518921)
Original PR description
Before this commit, ts assistant was didn't have any rules to detect the usage of Zoom After this commit, ts assistant should come with pre-build rule to track Zoom use in both web and application form. task-[6518921](https://www.odoo.com/odoo/project/4105/tasks/6518921)
Changes to a stock transfer's effective date will now be recorded in the chatter when the transfer is unlocked. This improves traceability by making date adjustments visible in the transfer history for audits and follow-up.
Original PR description
Effective date is allowed to be changed if transfer is unlocked. But if it is changed, it is not reflected in chatter, which leads to poor tracebility. This commit adds tracking for the field. task-6116292 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
Singapore localization now includes Peppol e-invoicing support in preparation for upcoming national requirements. The change adds Singapore-specific document registration and identifier handling while keeping public registration disabled until required verification steps are ready.
Original PR description
Singapore will mandate e-invoicing over Peppol for all businesses in the coming years, so Peppol is part of the Singapore localization rather than an optional add-on. Make l10n_sg depend on…
Singapore will mandate e-invoicing over Peppol for all businesses in the coming years, so Peppol is part of the Singapore localization rather than an optional add-on. Make l10n_sg depend on account_peppol accordingly. SG is deliberately left out of PEPPOL_DEFAULT_COUNTRIES, and of the countries of the account_peppol manifest, for the time being. We do not want anyone registering before the KYC step is deployed on the access point. Adding SG to both is all that will be left to enable it. Declare the SG-specific Peppol document types so that they are registered on the access point: SG PINT from l10n_sg_ubl_pint, and BIS Billing International 3.0 from l10n_sg, the latter being needed to keep receiving invoices sent in the legacy InvoiceNow format. Registration happens through account_peppol's auto register services cron, triggered from the post-init hook of both modules on installation, and also when an SG company (EAS 0195) first transitions to receiver state. The matching uninstall hooks deregister the services again. Accept the participant identifiers under which the SGNIC SMP registers Singapore participants for Peppol scheme 0195: 'SGUEN' and 'SGUXN' followed by a UEN, along with the 'SGTST'/'SGGST' test identifiers and the 'XXUID' universal identifiers. Also hide the participation role setting for SG companies, as the role is not selectable there. task-5024393
This update strengthens Odoo's internal linting so developers can detect methods that claim to extend parent behavior when no parent method exists. It also removes or relocates unused code across several apps, reducing maintenance risk without introducing major user-facing changes.
Original PR description
Find all methods in the MRO that call `super` but don't exist in the parent class. Check `__override` value on methods. There is a simple default we can use: `__code__.co_names` contains "super" if `super(...)` is used in the function. That may flag manual calls to other methods that the current once, but setting the override flag on the function can whitelist it. task-2922186 https://github.com/odoo/enterprise/pull/130760 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves the website builder interface so common editing actions are easier to understand and use. It makes color selection clearer, keeps controls properly aligned in different languages, improves warnings for theme and page changes, and polishes several visual elements.
Original PR description
Improve the UI of the builder by fixing some issues and standardize options layout task-6259086
The web interface now separates status bar styling from unrelated switcher styling. This reduces the risk of visual conflicts and helps keep the user interface consistent as different navigation controls evolve.
Original PR description
`.o_switcher` is not related to this component and is now problematic, as we have specific slide styling for the view switcher. The design should be better separated and more clearly split into distinct parts. task-6546246 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves the visual clarity of buttons in Odoo forms by keeping borders fully visible when users hover over or focus on them. It also makes the focus indicator in the "More" dropdown more consistent, supporting easier navigation and better usability.
Original PR description
Prior to this commit, the button border could be partially obscured when the button was hovered or focused. This commit ensures that the entire border remains visible in these states. This commit…
Prior to this commit, the button border could be partially obscured when the button was hovered or focused. This commit ensures that the entire border remains visible in these states. This commit also reviews the focus ring for buttons within the "More" dropdown to ensure it remains consistent and clearly visible. task-6528444 Requires: - https://github.com/odoo/enterprise/pull/130674 | Before | After | |--------|--------| | <img width="305" height="120" alt="Screenshot 2026-09-08 at 11 47 42" src="https://github.com/user-attachments/assets/6374fcb1-cf48-46f3-b467-64dbff1b2011" /> | <img width="297" height="113" alt="Screenshot 2026-09-08 at 11 48 05" src="https://github.com/user-attachments/assets/face6b7a-28ab-4308-ae78-3689c45da948" /> | | <img width="443" height="122" alt="Screenshot 2026-09-08 at 11 47 47" src="https://github.com/user-attachments/assets/4db5ac90-226e-44e3-8185-5f14b205476d" /> | <img width="484" height="119" alt="Screenshot 2026-09-08 at 11 48 06" src="https://github.com/user-attachments/assets/8d2a5ff3-ff4a-4947-b5d9-7a4277548b3e" /> | | <img width="268" height="219" alt="Screenshot 2026-09-08 at 11 46 18" src="https://github.com/user-attachments/assets/e5dbbe3d-d0e7-440e-a61e-53574f0d8896" /> | <img width="327" height="235" alt="Screenshot 2026-09-08 at 11 46 11" src="https://github.com/user-attachments/assets/632ceefc-9135-43f9-b404-fc18f9f4187c" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now send pending Indian e-invoices directly from the invoice list opened from the dashboard. This reduces extra navigation and makes it easier to complete e-invoicing tasks from the pending items view.
Original PR description
Currently, users can see the number of pending E-invoices on the dashboard, but cannot easily send them from the resulting list. This commit adds a "Send" button to the invoice list view, allowing users to easily proceed with creating E-invoices. The dashboard action is also updated to open this specific list view. task-6545498
Users selecting a working schedule can now see visual indicators and a preview of daily hours before choosing. This helps teams pick the right calendar more confidently and reduces mistakes when configuring work schedules.
Original PR description
Add visual indicators and a preview of each working schedule's daily hours, to better inform the selection of calendars. Task ID: 6348656
Selection highlights now slide consistently across more switcher controls, not just the main view switcher. This makes navigation feel more polished and avoids distracting overshoot in larger button groups.
Original PR description
The travelling indicator was painted for the view switcher only, which is handed its button count and its active index by the control panel. Paint it for every `.o_switcher`: `:has()` on the group reads both from the buttons themselves, one rule per position, up to three buttons. `@starting-style` stays on the view switcher alone. It is needed where the group is rebuilt between the two states, and everywhere else the group survives the change, so the move starts from the position already painted. Two groups are left out. '.o_statusbar_status' wraps each step in a div and marks the current one with a class of its own, so neither number can be read off the group. '.o-mail-ActionList-group' holds toggles that can all be off, and with no active button the layer would sit on the first one as if it were selected.
Buttons in form statistic areas now use a consistent background color across normal and hover states. Dark mode colors were also adjusted so hover feedback is easier to see, improving visual clarity for users.
Original PR description
This commit ensures that all `oe_stat_button` elements use the same background color in both their default and hover states. This commit also fine-tunes the colors for dark mode to make the hover…
This commit ensures that all `oe_stat_button` elements use the same background color in both their default and hover states. This commit also fine-tunes the colors for dark mode to make the hover state more visible. task-6528444 Requires: - https://github.com/odoo/odoo/pull/286952 | Before | After | |--------|--------| | <img width="239" height="78" alt="Screenshot 2026-09-08 at 14 44 47" src="https://github.com/user-attachments/assets/e9a87f3f-598d-447a-a992-7458fe4baaf8" /> | <img width="199" height="90" alt="Screenshot 2026-09-08 at 14 44 13" src="https://github.com/user-attachments/assets/8de5ab01-08c4-43ac-96a8-5e1fa53e0dc8" /> | | <img width="223" height="71" alt="Screenshot 2026-09-08 at 14 45 01" src="https://github.com/user-attachments/assets/8bf329cb-a73a-425c-a619-d66d2e96ccc3" /> | <img width="247" height="92" alt="Screenshot 2026-09-08 at 14 43 10" src="https://github.com/user-attachments/assets/e55435d9-b54e-479d-8ba1-efccb665e9c1" /> | | <img width="231" height="81" alt="Screenshot 2026-09-08 at 14 44 36" src="https://github.com/user-attachments/assets/024bd44d-4c91-468a-9575-defe97c6dbb8" /> | <img width="228" height="79" alt="Screenshot 2026-09-08 at 14 44 27" src="https://github.com/user-attachments/assets/a0d7c009-5a36-478a-868e-335b1609b8d2" /> | | <img width="234" height="324" alt="Screenshot 2026-09-08 at 14 45 07" src="https://github.com/user-attachments/assets/fb9ef801-78eb-483c-912f-3b51a84c4c6c" /> | <img width="278" height="361" alt="Screenshot 2026-09-08 at 14 43 04" src="https://github.com/user-attachments/assets/9a982250-2b67-40e3-850a-9102ce187f0f" /> |
Belgian payroll users now get clearer visual cues and daily-hour previews when choosing employee working schedules. This helps HR teams compare schedules more easily and select the right calendar with greater confidence.
Original PR description
Task ID: 6348656
The Click and Collect option on the online store has been redesigned into a clearer radio-style selector. This makes pickup availability easier for shoppers to understand and helps create a smoother checkout experience.
Original PR description
task-6514854 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves how Odoo handles editing field definitions in web views. It introduces a shared mechanism that lets forms better control whether fields can be edited, making the editing experience more consistent and reliable for users configuring views.
Original PR description
The fieldEditionPlugin is used by field.js It is a global plugin because we cannot control where field.js is used The plugin allows for editing a **field definition**, not the content or value The formView reinstanciates it, giving it some control. The plugin instanciates items from a registry that each tell whether a field is editable or not. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now uses the same internal name for the X social media icon across website, email, marketing, forum, sales, and e-learning areas. This small cleanup helps keep branding consistent and reduces confusion when maintaining social sharing and social media templates.
Original PR description
*: iap_mail, marketing_card, mass_mailing, website_forum, website_sale, website_slides This commit homogenizes the name of the X icon.
Users can now compare delivery carrier prices directly when choosing a carrier, instead of calculating each option one by one. Prices can be refreshed when order weight changes, making it easier to choose the best shipping option and reducing manual work.
Original PR description
Before, people had to go 1 by 1 for each carrier to calculate the cost and pick the cheapest one. This is not user-friendly, which is why now, in the carrier selection we can directly see the price, which is recalculated each time when total weight changes. Also, cost are now also visible in the list view, when "Search more..." button is clicked on the carrier selection. A separate view was created specifically to ensure that on other views this column is not there. Calculated delivery prices are passed via the context to this view. task-6276527 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Belgian payroll now tracks legal leave in both days and exact hours, reflecting that different workdays can have different lengths. This improves visibility for employees and payroll teams by warning when the hour balance goes negative, while keeping the existing day-based blocking rules.
Original PR description
[IMP] l10n_be_hr_payroll: track legal leave balance in days and hours Belgian legal leave (and its N-1/N-2 postponed counterparts) is entitled in days, but the hours behind those days can vary by…
[IMP] l10n_be_hr_payroll: track legal leave balance in days and hours Belgian legal leave (and its N-1/N-2 postponed counterparts) is entitled in days, but the hours behind those days can vary by schedule (a short Friday isn't worth the same as a Monday). Uses hr_holidays' _get_consumed_leaves_extra_counters to track an exact hour counter alongside the existing day counter for these 3 types: taking a day off reduces hours by the real hours worked that day (or the average, for employees without a defined daily schedule), while the day counter still reduces by 0.5/1 as before. The day counter still blocks; the hour counter only warns, on the payslip and on the leave request, when it goes negative. Also reworks how days/hours are computed for these 3 types: - Payrun allocation (l10n_be_hr_payroll/wizard/hr_payroll_allocating_paid_ time_off.py): the number of days allocated is now based on the employee's days/week (4 weeks x days/week), not on hours/day, hours are computed independently rather than derived from the rounded day count, and are capped at the lower of the previous and current employer's absolute hours/week rather than their reference calendars. - Adds "Accrued Hours"/"Accrued Days" columns to the December payrun's Holiday Pay step. - Holiday attestations (l10n_be_holiday_attest.py): same hours-first, capped-at-the-lower-rate logic for hours/days carried over from a previous employer's certificate. - Time Off Dashboard card/popover and the leave form's Summary panel show the exact hour balance, muted, only when it actually disagrees with the rounded day-based estimate shown everywhere else. Task-6212208
Belgian payroll calculations now reflect the 2026 rules for intellectual property income, including ONSS exemptions, withholding tax limits, yearly caps, and artistic certificate cost treatment. This helps payroll teams apply the correct employee remuneration split and reporting rules automatically.
Original PR description
Since 2026, the intellectual property (IP) is exempt from ONSS up to 30% of the total remuneration (DmfA code 47), unless the ONSS contributions are forced on the contract (default). The IP withholding tax (15%) only applies within that share and while the average IP of the 4 previous years stays under the yearly limit (77220€ in 2026); the lump-sum costs only remain for the owners of a certificate of artistic work. The IP paid in the year is capped on the yearly limit, the exceeding part being a regular remuneration. The rule cp200_employees_salary_ip_part_onss becomes generic: ONSS on the remuneration exempt from withholding tax (category ONSS_NO_WT).
Marketing Automation now includes a template library so users can browse, create, and reuse mailing designs directly within campaign activities. Campaign mailings are easier to find and manage, including better access to automation mailings and corrected links when duplicating campaigns.
Original PR description
Overview ------ This commit adds the mass_mailing's template library to marketing_automation. Specs ------ The addes features are: - Add the `Templates` menu which lists the mailing templates. Note: the templates listed here are only for the models that work for marketing campaign. e.g., `mailing.list` templates are filtered out. - When creating an activity, a design button is added that allows to design a new template. Once set, the template is readonly. This PR is linked to a community PR. task-5358279 subtask-6110541
AI live chat now supports a guest-only access mode that aligns it with the broader live chat platform. This helps ensure website visitors can use chat flows without needing a logged-in account, improving consistency and reducing access friction.
Original PR description
Enterprise counterpart of "[IMP] im_livechat, *: add force_guest auth method", which explains the why. task-6259734 https://github.com/odoo/odoo/pull/267142
Turkish payroll now supports tax relief for eligible R&D and Design Center employees. The change applies stamp tax exemptions and income tax reductions up to the legal wage ceiling, helping businesses calculate payroll incentives more accurately.
Original PR description
Add tax relief incentives for R&D/Design Center employees. Employees qualifying for the incentive receive tax relief on wages up to 40 times the gross minimum wage: - Full stamp tax exemption up to the ceiling. - Income tax relief based on certificate level: 95% for doctorate, 90% for master's, and 80% for other levels. - Standard taxation on the portion exceeding the ceiling. task-6434855
Timesheet suggestions from Gmail and calendar items now look across a customer’s related company/contact structure to find the most recently used project. This reduces random or incorrect project matches and helps users log time faster with better defaults.
Original PR description
Before this commit: - Gmail emails are resolved to a random timesheeted project linked to a partner having the same email - Calendar events are resolved to the most recent timesheeted project linked to partner_ids In this commit: - Instead of looking to the partner, the most recent timesheeted project is taken from the partner tree (child_ids, parent_id) task-6254947 Forward-Port-Of: odoo/enterprise#128801
The Discuss header now uses browser styling instead of background scripts to size its input fields. This simplifies the interface logic and should make the header more reliable and easier to maintain without changing the user workflow.
Original PR description
Currently, the discuss header size is computed in JS. Code is not easy as it has to account for every participing node. This commit replaces this computation by a CSS only solution: - size the input based on an ::after element, containing the text of the input. - remove the inputs from the layour flow as to not impact sizing at all. 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 survey dashboard layout has been refined to present information more clearly, including better handling when surveys are grouped. This improves readability and consistency for users managing surveys across Survey, CRM, and eLearning-related workflows.
Original PR description
This commit fine-tunes the layout of the survey dashboard. To achieve this, it also introduces the new `customClasses` prop for the progress bar field, allowing for better layout customization.…
This commit fine-tunes the layout of the survey dashboard. To achieve this, it also introduces the new `customClasses` prop for the progress bar field, allowing for better layout customization. Additionally, it detects whether the survey Kanban view is grouped and adapts the layout accordingly. task-6512763 Co-authored-by: Adrien Dieudonné <adr@odoo.com> | Before | After | |--------|--------| | <img width="1918" height="902" alt="Screenshot 2026-09-04 at 17 01 35" src="https://github.com/user-attachments/assets/dca94109-23e0-4130-824b-c9117b6de965" /> | <img width="1915" height="864" alt="Screenshot 2026-09-04 at 17 02 23" src="https://github.com/user-attachments/assets/ce3a74df-279a-4fa4-9671-01a5f50d08dd" /> | | <img width="1919" height="906" alt="Screenshot 2026-09-04 at 17 01 47" src="https://github.com/user-attachments/assets/20c2e134-c8d6-4a54-9fc9-da51b8890ea0" /> | <img width="1914" height="807" alt="Screenshot 2026-09-04 at 17 02 33" src="https://github.com/user-attachments/assets/6e6b73c4-ea7c-45ea-a43e-912500e7826e" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now enrich a contact's company information directly from the actions menu. The enrichment process searches using the most reliable business identifiers first, then falls back to email or website, helping teams complete partner records faster and more accurately.
Original PR description
this commit will add a new server action to enrich a partner from the cog menu. We firstly check the duns number since it's something more precise. Then, we use the different identifier like vat, siret, siren (in that order). And then the email and website. task-6389091 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
VoIP users can now choose call forwarding with a simpler Forward or Don't Forward option, then pick internal destinations or external phone numbers from one place. This makes forwarding easier to configure and prevents one forwarding update from accidentally clearing other saved forwarding settings.
Original PR description
## Summary This PR simplifies the busy and no-answer forwarding settings. Users now choose between "Forward" and "Don't Forward". When forwarding is enabled, internal destinations and external phone numbers are selected from the same destination list. It also fixes an issue where updating one forwarding field on `res.users` could clear the other forwarding values stored on `res.users.settings`.
This update refreshes the spreadsheet interface components related to carousel-style data viewing. Business users may see a more up-to-date or improved spreadsheet experience, although the pull request details do not describe a specific workflow change.
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
This update reorganizes how automatic leave approvals are handled in the Time Off app by moving that logic into its own dedicated method. The change should make future maintenance and enhancements easier without changing the day-to-day experience for employees or managers.
Original PR description
task-6384703 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
Margin reporting screens are now easier to read and focus on the information users need. Forecast margins gain clearer pivot and graph analysis, while actual margins remove unrelated timesheet filters and use more relevant default groupings.
Original PR description
This commit cleans up the Actual Margins and Forecast Margins views to improve readability and remove irrelevant timesheet/accounting elements. Forecast Margins (sale.report): - Added a bar graph view (measured by margin, grouped by customer). - Added a pivot view (measures: untaxed total, expected cost, margin). - Reordered views to: list, pivot, graph, kanban. - Added 'Project' field and 'Project' group by to the search view. Actual Margins (account.analytic.line): - Reordered views to: pivot, graph, list, kanban. - Set default group by to Account and Billing Type. - Cleaned the search view by removing timesheet-specific filters (mine, billable, non_billable, parent_task_id, department, etc.) that do not apply to the margins context. task-6456183
Product names are no longer mixed into line-item descriptions on sales orders, purchase orders, and invoices. This makes descriptions clearer, improves electronic document exports, and reduces inconsistent behavior across related business documents.
Original PR description
Sale order lines, purchase order lines, and account move lines currently store the product's display name together with its description in the `name` field. This behavior was originally introduced so…
Sale order lines, purchase order lines, and account move lines currently store the product's display name together with its description in the `name` field. This behavior was originally introduced so the product field could remain hidden while still displaying both the product and its description in a single field. Maintaining this behavior requires a significant amount of JS logic and has led to several inconsistencies across the different models. Now that the framework supports stacking multiple fields in the same column, this workaround is no longer necessary. Keeping the product name in the description also has several drawbacks: - Product names are unnecessarily exported as EDI descriptions. - The description field always contains a value, making it impossible to tell whether a custom description was actually provided. - Models such as sale order templates do not follow the same convention,resulting to complex logic to make it work. - The JS widget needs complex logic to strip the product name while taking translations into account. - The product/description logic has become tightly coupled with the sections widget, making it difficult to maintain. This commit stores only the product description in the `name` field and introduces a new non-stored computed `label` field on sale order lines, purchase order lines, and account move lines. The `label` field combines the product display name and description and is used wherever both pieces of information need to be displayed, such as reports, the portal, and list view seachable text field introduced in d069ce59e28fda2bc25fb89fd01ee7b988a30fa0. For sale, the extra logic required to preserve the product name across sale orders and sale order templates is removed, allowing the `name` field to be used consistently as the product description. For purchase, the seller-specific naming logic is removed from the compute methods and delegated to the product display name retrieval. For accounting, EDI exports now contain only the actual line description instead of the product name followed by the description. This PR is the first step towards adapting the new framework `<column>` support for the product and description field, allowing the remaining JS logic to be significantly simplified in follow-up PR. task-6241473 See Also: - https://github.com/odoo/enterprise/pull/122792 - https://github.com/odoo/upgrade/pull/10919 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Merchants can now control whether product reference prices, such as price per kilogram, appear separately for each website. This prevents a setting enabled for one online store from automatically affecting other websites in the same database, supporting different pricing display needs across brands or markets.
Original PR description
The "Product Reference Price" setting, which adds a reference price per unit of measure on product pages (e.g. $/kg), was controlled by the group `product.group_show_uom_price`. As this group is…
The "Product Reference Price" setting, which adds a reference price per unit of measure on product pages (e.g. $/kg), was controlled by the group `product.group_show_uom_price`. As this group is shared across the database, enabling the setting on one website enabled it on every website, which doesn't fit merchants running several websites with different display requirements. This commit adds a `show_product_reference_price` field on `website`, exposed on `res.config.settings` through a related field, and switches the controller, `product_template`, and cart template logic to check it instead of the shared group. The underlying `product.group_show_uom_price` group is still granted to `base.group_user` when the website setting is enabled, since the base unit price computation on `product.template` still depends on it, but it is no longer revoked when the setting is disabled on a website, so as not to affect other websites relying on it. task-6340943 See also: - https://github.com/odoo/upgrade/pull/10838 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Calendar screens are easier to read and navigate, with duplicate meeting entries removed, clearer hover and availability indicators, and improved reminder notifications. Contacts now show meeting information directly, helping users quickly find upcoming or past meetings with a customer or partner.
Original PR description
Purpose --- This commit aims at improving the UX of the calendar module Specs --- - Meeting activities were displayed 2 times in the calendar, as an activity in the header of the day as well as an…
Purpose --- This commit aims at improving the UX of the calendar module Specs --- - Meeting activities were displayed 2 times in the calendar, as an activity in the header of the day as well as an event. Now only the event is displayed to avoid confusion. - Switches the default reminders view from list to kanban. Each card displays the type of reminder, the time before the event and the name of the reminder template. - Adds a search view to group reminders given their type. - Adds a grey pill when hovering over date in calendar view. - Adds a stat button displaying in the "res_partner" form indicating the next meeting date and redirecting towards the event upon click. In the case where there is no future meeting but past meetings, the button displays their count (with the exception of leaves) and redirect towards a list view containing all these meetings. If the partner doesn't have any meeting recorded, the button redirects to the calendar. - Fixes "CopyClipboardUrl" not displaying the text to be displayed instead of the URL. Before, the "text" attribute wasn't correctly transfered from "CopyClipboardUrlField" to "UrlField". Now, the "text" attribute correctly appears in the props of "UrlField". --- Task-6293537
Sales order delivery status is now displayed from the Sales app instead of depending on the Inventory-related Sales Stock component. This helps customers see delivery information in the portal even when full stock management is not installed.
Original PR description
The delivery_status field was moved from sale_stock to sale to display the delivery status for the 'stock without stock' logic, even when stock isn't installed. In this commit I merge the sale_stock.portal_my_orders template into the sale.portal_my_orders template. task-6378133
Accounting entries now expose the fiscal position from their related invoice or journal entry. This makes it possible to analyze fiscal position information directly in pivot reports, improving reporting flexibility for finance teams.
Original PR description
We add the relation fiscal_position_id from move_id inside account_move_line. This is used so that we can use it inside a pivot view. task-6508687
Product and sales document cards now show a visual preview, file type icon, or link icon alongside the title. This makes it easier for users to distinguish documents at a glance in kanban views.
Original PR description
Documents were only shown as a title in the kanban card, which made them hard to tell apart. Add back an aside with the image preview, the mimetype icon, or the link icon depending on the document. task-6090002
Odoo can now define the size of pop-up windows directly in the screen layout configuration. This gives teams more consistent dialog sizing across actions and relational field workflows, improving usability without changing day-to-day business processes.
Original PR description
This commit adds the support for the `dialog_size` attribute on the root node of views' archs. When the view is rendered inside a dialog, e.g. action in target="new", many2one "search more"/"create and edit", x2many FormViewDialog...), this attribute is used to determine the size (width) of the dialog. Possible values are those of dialog.js: "sm", "md", "lg", "xl", "fs" or "fullscreen". Before this commit, it was only possible to specify the dialog's size for actions with target="new", by setting the `dialog_size` key in the context. The plan is to convert the usecases to use this new API. Task~6429925 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
Italian electronic invoices now handle cash rounding lines more safely when generating XML. This keeps the required tax information in the invoice output without changing a shared tax calculation process used elsewhere, reducing the risk of side effects.
Original PR description
Remove the override of `_prepare_product_base_line_for_taxes_computation` since it's a low level method used by a lot of flows. Instead, we just add the 0% exempt tax on the line on-the-fly at the generation of the xml. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287016
The breadcrumb trail in Odoo’s web interface has been visually softened by removing bold styling and making separators less prominent. This creates a lighter, cleaner navigation experience without changing functionality.
Original PR description
ENT: https://github.com/odoo/enterprise/pull/130516 task-6527644 | Before | After | |--------|--------| | <img width="750" height="437" alt="Screenshot 2026-09-04 at 16 49 38" src="https://github.com/user-attachments/assets/428ed1f6-52fc-43c7-8ad7-aa87124f988b" /> | <img width="754" height="436" alt="Screenshot 2026-09-04 at 16 48 35" src="https://github.com/user-attachments/assets/c9eb44dd-1d5c-4c79-b0bb-43c41122b3f6" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now uses the combined product label for invoice, tax, and electronic document outputs after the product name was separated from the description field. This keeps customer documents and local compliance files accurate and consistent across accounting and sales flows.
Original PR description
This PR adapts EDIs and tests to the community change that removes the product's display name from the `name` field. From now on, the product's display name and description are combined in the `label` field instead. task-6241473 See Also: - https://github.com/odoo/odoo/pull/273948 - https://github.com/odoo/upgrade/pull/10919
Margin reports now make profitable and unprofitable totals easier to spot by coloring positive totals green and negative totals red. The margins report search view has also been simplified by removing timesheet-specific filters, helping users focus on margin analysis.
Original PR description
This commit cleans up the Enterprise margins views and introduces specific color coding for margin totals in the grid view. Actual Margins Grid View: - Created a new `margin_analytic_line_grid` js_class. - The grand total and section totals are now colored red if negative and green if positive to quickly highlight margin profitability. - Ensure standard text colors are not overridden by danger/success classes on non-total rows. - Reordered the grid view in the action sequence. Search View Cleanup: - Removed enterprise-specific timesheet filters (my_team_timesheet, my_department_timesheet, my_tasks, nonvalidated, validated) from the margins report search view. task-6456183
Payroll leave records can now show issues and warnings, helping payroll teams spot potential problems before they affect processing. The change also adds country-specific warning support for Belgian and Luxembourg payroll and fixes an upgrade issue in Belgian payroll.
Original PR description
In this commit, we added issues/warnings to hr.leave model. task-6384703
Working files now connect more directly with spreadsheets, letting users open a linked spreadsheet from a working file and insert other views into a working file sheet. Return check screens also receive styling improvements, making the workflow clearer and easier to use.
Original PR description
Better styling for return checks Added spreadsheet integration with working files, we can now access a spreadsheet linked to a working file using the embedded action on the working file. As well as add other views inside a working file sheet using the insert in spreadsheet action.
Payslips created through payroll runs now record which pay run created them and which user started the batch, making audit trails easier to understand. Companies can also disable these automatic creation messages for large payroll batches when performance is a priority.
Original PR description
Payslips log "Pay Slip created" in their chatter without naming the pay run that generated the payslip or the user who ran that batch. `hr.payslip._creation_message()` now names the origin in the log the record already gets: - from a pay run: `Payslip created from the pay run <run> by <user>` - created directly: `Payslip created by <user>` No second message, no extra query per payslip. For batches where even that log costs too much, the `hr_payroll.payslip_run_creation_no_message` system parameter skips it. Off by default. With it on, pay-run payslips get no creation message at all, including the generic one from task 6253290. Task 6530900
Appointment scheduling screens are easier to use with clearer quick creation options, cleaner staff schedules, better reminder grouping, and more informative appointment views. Shared booking links and Gantt date selection behavior were also improved, reducing confusion during everyday booking workflows.
Original PR description
Purpose --- This commit aims at improving the UX of the appointment module Specs --- - In the staff and resource booking views, "appointment_type", "resource_ids" and "user_id" were added to the…
Purpose --- This commit aims at improving the UX of the appointment module Specs --- - In the staff and resource booking views, "appointment_type", "resource_ids" and "user_id" were added to the quick create form. These fields are presets and possibly readonly depending on the way the quik create form was accessed. For example, if the user clicks on an appointment type then "New", the "appointment_type" field will be set to the appropriate value and be readonly, but the resource_ids/user_id will still be editable, however, if the user clicked on a slot, these fields will be readonly in addition to the "appointment_type" field. - Removed the display of time off events in the schedule staff view as the unavailability of the user is already handled internally as well as to keep appointment related events. - Shows the "appointment_type", "appointment_status" and "resource_ids" in the calendar event form view if debug mode is active. Furthermore, if the status becomes "cancelled", the resource fields isn't required anymore. - In shared link view, "# Booking" column is fully displayed, and clicking on the "copy link" button triggers a toats. - Adds the possibility to group reminders given the appointment_type. - Displays appointment type tags (10 max) in reminders kanban view. - When creating an appointment in the gantt view from the slots, the range stays highlighted instead of disappearing right away. --- Task-6293537
This update aligns several localization and tax modules with recent platform changes to address handling and portal dependencies. It helps keep checkout, portal address forms, and tax-related integrations working consistently after underlying community updates.
Original PR description
This commit adapt community changes: - Adapt zip_required reference to zip_applicability. - Adapt dependancy of localizasion modules as we merged portal_address_extended into portal and made portal dependant on base_address_extended. - Adapt address page overrides. task-5208254
Odoo views can now define their preferred dialog width directly, making pop-up windows more consistent across features such as quick creation, search, and embedded forms. This reduces reliance on action-specific settings and should make future interface behavior easier to standardize.
Original PR description
This commit adds the support for the `dialog_size` attribute on the root node of views' archs. When the view is rendered inside a dialog, e.g. action in target="new", many2one "search more"/"create and edit", x2many FormViewDialog...), this attribute is used to determine the size (width) of the dialog. Possible values are those of dialog.js: "sm", "md", "lg", "xl", "fs" or "fullscreen". Before this commit, it was only possible to specify the dialog's size for actions with target="new", by setting the `dialog_size` key in the context. The plan is to convert the usecases to use this new API. Task~6429925
Technicians can now open documents linked to equipment directly from the shift form. This makes technical documentation easier to access on site, helping teams diagnose and resolve service issues faster.
Original PR description
This commit adds a "Documents" stat button on the shift form that opens the documents linked to the equipment (serial numbers) selected on the shift. This lets technicians access technical documentation for the equipment directly from the shift while on site, helping them diagnose and resolve issues more efficiently. task-6090002
This update adds a VAT reconciliation check to help users review tax report grids more easily. It helps identify potential reporting mistakes, such as using the wrong tax grid or account, reducing the risk of inaccurate tax filings.
The notebook tab styling in Odoo Enterprise has been adjusted so tab labels no longer appear bold. This creates a lighter, more consistent interface and improves visual alignment with the wider application design.
Original PR description
COM: https://github.com/odoo/odoo/pull/286774 task-6527644
Reconciled bank statement lines now show the account name when the original move name is just a placeholder slash. This makes accounting records easier to read and reduces confusion during reconciliation review.
Original PR description
This commit will treat move with "/" as their name as empty, and put the name of the account in the reconciled line name task-6424612 Forward-Port-Of: odoo/enterprise#127842
Website owners can now configure the header search bar, including what it searches, sorting, and autocomplete suggestions, making site-wide search more relevant to each website. Product searches also return items from matching categories, helping shoppers find purchasable products faster instead of only seeing category links.
Original PR description
## [REF] html_builder, website_sale: let plugins declare dirty trackers Commit f3c119dd034b removed the `savable_selectors` resource from `SavePlugin`, on the grounds that `.o_savable` already…
## [REF] html_builder, website_sale: let plugins declare dirty trackers Commit f3c119dd034b removed the `savable_selectors` resource from `SavePlugin`, on the grounds that `.o_savable` already identifies the elements to flag with `o_dirty` and carries checks a raw selector bypasses, and adapted the `website_blog` templates so that the elements that needed saving qualify for the class instead of being named by a selector. That reasoning holds for every element that can qualify. It does not hold for an element rendered from template parameters. Such an element has no arch to be written back to, so it can never be `.o_savable`, and a plugin that needs to know when it changed is left duplicating the whole mutation resolution to look for its own selector. Commit 728049b4597b did this for the products grid of the shop, so the resolution exists in two places, and every further element in that situation duplicates it again. This commit replaces the hardcoded pair in `handleMutations` with a `dirty_trackers` resource, of which `SavePlugin` registers the existing `.o_savable` / `o_dirty` entry, and migrates the products design panel, which resolved mutations itself, to declare a tracker instead. The wishlist table, whose selector the products design panel used to resolve on its behalf, now declares its own next to its `product_design_list_to_save` entry. The arch saving pipeline is untouched, and the products design panel now honours `ignoreDirty` during drag and drop, which its own copy did not. Unlike the removed resource, a tracker does not widen what can be saved. It names its own class, which no `dirty_els_providers` returns, so the element never reaches the arch saving pipeline. What is being extended is change notification, not savability. A tracker matches the closest ancestor of the mutated element by default, which is what an element mutated through its descendants needs. The products grid and the wishlist table read what they persist from their own attributes, and the grid holds inline-editable product names, so `closest` would mark it dirty on every keystroke inside a tile. They declare `match: "self"` instead, which also keeps the constant-time check they had before. ## [IMP] website*: allow configuring the header search bar The Search snippet exposes builder options for what it searches within, how results are sorted, and how many autocomplete suggestions it shows. The search bar `website.header_search_box` renders has none of them. Its scope, results page and suggestion count are hardcoded, and clicking it in the editor selects nothing at all. A website dedicated to a single purpose therefore cannot point its site-wide search at that content. This commit registers the same searchbar option on the header search bar and stores its settings on the website record instead of the view arch. The option mutates the DOM as a live preview, and a plugin resolves those mutations itself and writes the values back to the record on save. The bar is also marked `o_no_save`, as saving it as a custom snippet would produce a block whose configuration lives outside its own markup. Searchable scopes were declared in two places, their label and results page in each module's builder template and their models in `_search_get_details`. They now come from `website._get_search_scopes()`, which `website.get_search_scopes()` exposes to the builder. This removes the per-module option templates. Setting the suggestion count to 0 now disables the autocomplete instead of falling back to 6, and the `limit` and `order_by` defaults move into `website.website_search_box_input` so that callers pass plain values. ## [IMP] website_sale: return a category's products when searching it `product.public.category` is searched alongside `product.template`, so a term matching a category name returns that category as a result of its own. The products it contains are not returned unless their own fields match the term as well, which they usually do not. Searching "chairs" offers a link to the Chairs category and nothing to buy, and the visitor has to click through to see anything. This commit adds `public_categ_ids.name` to the searched fields of `product.template`, the way the names of its tags and of its attribute values are already searched, so that a product matches when one of its categories does. The categories are also passed along with the tags of the product, so that the category a product was matched on is shown next to it. The highlight handler renders only the entries that matched, so a product found by its own name is left as it was. The tags and the attribute values were mapped to two fields and rendered as two rows of badges stacked on top of each other, which the categories would only have made more noticeable. They are merged into a single `badges` field so that all of them wrap as one row. Related: https://github.com/odoo/enterprise/pull/126373 task-6422203
Duplicating sections with many lines is now much faster and less likely to time out. The change batches the background recalculations needed during duplication, reducing repeated server calls and improving responsiveness for large sales documents.
Original PR description
Issue: Sections containing a large number of subsections or lines can take too long to duplicate and may eventually time out. The slowdown stems from the onchange issues in `_duplicateRecords()` in…
Issue: Sections containing a large number of subsections or lines can take too long to duplicate and may eventually time out. The slowdown stems from the onchange issues in `_duplicateRecords()` in sale.order.line. Each sale.order.line is first created as an empty datapoint, which triggers an onchange RPC. The copied values are then applied, triggering a second onchange RPC for every duplicated line. Fix: Prepare the copied values before creating the datapoints and send them through a batched onchange. This retrieves the required onchange values for all duplicated lines in a single RPC. Benchmarks: sale.order.line onchanges: Note: "Timing Before" is calculated by the difference between the first and last sale.order.line onchange completion times. | Lines | RPCs Before | RPCs After | Timing Before | Timing After | Speedup | | ----: | ----------: | ---------: | ------------: | -----------: | ------: | | 10 | 20 | 1 | 0.31s | 0.04s | 5.52x | | 50 | 50 | 1 | 1.62s | 0.14s | 11.67x | | 100 | 200 | 1 | 3.41s | 0.25s | 13.64x | | 500 | 1000 | 1 | 10.98s | 0.96s | 11.43x | | 1000 | 2000 | 1 | 31.07s | 2.74s | 11.34x | Related: opw-6395475 Forward-Port-Of: odoo/odoo#287031 Forward-Port-Of: odoo/odoo#280418
Improves how Odoo updates related records in large tree-like data sets, avoiding slow full-table scans when moving a branch. This can significantly speed up operations such as stock transfers or partner/location updates for databases with very large volumes of records.
Original PR description
Our customer has 1.7M packages and very slow validate: the transfer took 8.6s, and 5.35s of it was the single `UPDATE` that `_parent_store_update` runs to move `parent_path` over a subtree. It looks…
Our customer has 1.7M packages and very slow validate: the transfer took 8.6s, and 5.35s of it was the single `UPDATE` that `_parent_store_update` runs to move `parent_path` over a subtree.
It looks for the descendants with `LIKE concat(node.parent_path, '%')`. The pattern comes from a column, so Postgres cannot use the index on `parent_path` and scans the whole table. The change asks for the same rows as a range, which the index does serve:
AND child.parent_path >= node.parent_path
AND child.parent_path < left(node.parent_path, -1) || '0'
`parent_path` always ends with `/` and `0` is the next character, so that closes the range on the subtree. Same rows, same order, one line of SQL.
On a table of 302000 rows, moving 62 nodes, both forms return the same 9362 rows: 3302ms before, 223ms after. On the customer database a single parent write went from 0.82s to nothing measurable.
-- before
Update on stock_package child (actual time=3175.525..3175.527)
-> Nested Loop (actual time=7.171..2987.424 rows=9362)
Join Filter: ((child.parent_path)::text ~~ concat(node.parent_path, '%'))
Rows Removed by Join Filter: 18714638
-> Seq Scan on stock_package child (rows=302000)
-> Materialize (rows=62 loops=302000)
Execution Time: 3301.796 ms
-- after
Update on stock_package child (actual time=223.040..223.041)
-> Nested Loop (actual time=7.874..22.389 rows=9362)
-> Index Scan using stock_package_pkey on stock_package node (rows=62)
-> Index Scan using stock_package__parent_path_index on stock_package child
Index Cond: ((parent_path >= node.parent_path) AND (parent_path < left(node.parent_path, -1) || '0'))
Execution Time: 223.041 ms
This is not about only `stock.package`. Every model on `_parent_store` pays it once the table grows, `res.partner` and `stock.location` included.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#287180Belgian payroll rules now use an extra hours category instead of the previous overtime category. This keeps payroll terminology and related employee/work-entry setup aligned with the intended business process for tracking additional hours.
Original PR description
Task: 6488016
Moving a document from a folder to My Drive now creates the same activity log entry as moving it to any other folder. This gives users a consistent record of where files have been moved, improving traceability across Documents.
Original PR description
This PR ensures that moving a file from a folder to My Drive creates the same chatter log as other folder move operations. This keeps file movement tracking consistent across all destinations. Task-6391383
VoIP call flows can now continue after playing an audio message, instead of stopping at that step. Users get clearer routing options with separate paths for callers who skip the message and those who listen to the end, while audio timing stays aligned when messages change.
Original PR description
"Play Audio" nodes had no output: the PBX has no "play a sound then continue" primitive of its own, only a Menu (IVR) does, through its timeout branch. Back "Play Audio" with a Menu wrapping the…
"Play Audio" nodes had no output: the PBX has no "play a sound then continue" primitive of its own, only a Menu (IVR) does, through its timeout branch.
Back "Play Audio" with a Menu wrapping the chosen sound instead of the bare sound itself, with one option per key (0-9, *, #) so any key press exits early ("Skip") while letting the message play out reaches "After". The node still shows a plain sound picker and only two outputs: the wrapping Menu is created (or duplicated, since a sound can only ever back one Menu) behind the scenes, stays out of the Menus list, and is bypassed entirely when re-opening the node to edit its sound directly.
Keep the Menu's timeout in sync with its sound's own duration, recomputed whenever the call flow is saved, so a re-recorded or regenerated message is never cut short or left with dead air.
Update the JS unit and Python tests broken by the underlying model change (an audio_message node's record is now a voip.ivr, not a voip.sound, and the node no longer reports `terminal: true`).Knowledge and Appointment website search options are now declared in a shared central place instead of separate page builder templates. This makes search configuration easier to maintain and keeps these modules aligned with the broader website search improvements.
Original PR description
The community counterpart of this commit moves the declaration of the website search scopes out of each module's builder template and into `website._get_search_scopes()`, so that a scope's label, its results page and its models are declared in one place. This commit follows that change for the knowledge and appointment scopes and removes their builder templates. Related: https://github.com/odoo/odoo/pull/279774 task-6422203
This update re-enables a test setting for continuous production scenarios in shop floor work orders. It helps ensure users can complete work orders reliably across more production use cases after a prior limitation was fixed.
Original PR description
During the continuous production cleaning, a limitation was introduced that blocked users from marking a WO as done in shopfloor. This limitation was addressed and fixed in: odoo/enterprise#125787 , so we can safely uncomment the continuous flag to ensure we are covering different usecases in the tests. Forward-Port-Of: odoo/enterprise#128911
Payroll rule parameter lookups now handle elevated access internally instead of requiring each caller to request it. This makes payroll-related calculations and reports more consistent across countries while reducing the risk of access-related errors for HR teams.
Original PR description
Move sudo inside the _get_parameter_from_code instead of calling the method with sudo. task-6518823
Belgian payroll now settles remaining mobility budget amounts at year-end or on an employee's final payslip, aligning calculations with Partena requirements. The update improves accuracy for yearly prorations, termination fees, compliance checks, and warnings for cases such as budgets outside limits or employees combining a mobility budget with a CO2-emitting company car.
Original PR description
Rework the mobility budget logic according to Partena requirements. - Settle the remaining mobility budget in December or on the employee's final monthly payslip instead of in the anniversary month. - Include the mobility budget amount in termination fee computations. - Compute the yearly mobility budget as a prorated amount based on all employee versions within the calendar year. - Add warnings when the mobility budget falls outside the configured boundaries or exceeds 20% of the yearly wage. -Add a dashboard warning for employees with a mobility budget and a company car emitting CO₂. -Move the computation of the default mobility budget amount from l10n_be_hr_contract_salary to l10n_be_hr_payroll. related Upgrade commit: https://github.com/odoo/upgrade/pull/10877 task: 6263962
The web client’s underlying interface library was updated to the latest Owl release. This helps keep Odoo’s web experience current and maintainable, with limited direct impact expected for day-to-day users.
Original PR description
Release notes: https://github.com/odoo/owl/releases/tag/v3.0.0-alpha.49 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#287202
VoIP users can now manage multiple caller ID numbers and have the right personal number selected automatically based on the country they are calling. This helps teams with numbers in multiple countries present a more appropriate caller ID, while still allowing manual selection of shared or pinned numbers when needed.
Original PR description
A user could only ever be assigned a single DID number, which forced Wazo customers with numbers in several countries to always present the same caller ID abroad. Users can now hold several active DIDs; the outbound caller ID is picked automatically based on the destination country (falling back to a persisted choice), and can be reviewed, pinned, or toggled off from the status menu's "My numbers" section. The in-call view shows which number is being used while dialing out.
Belgian payroll now calculates salary reductions for unpaid time using the smaller paid or unpaid portion of the month, with a special rule for an exact 50/50 split. This makes deductions more consistent across months so the cost of an unpaid day is fairer regardless of the calendar.
Original PR description
In order to make salary computation more fair between months (taking an unpaid day off should cost the same from one month to another), we should always count the smallest amount of days and compute…
In order to make salary computation more fair between months (taking an unpaid day off should cost the same from one month to another), we should always count the smallest amount of days and compute salary based on that: If on the month, the employee got more unpaid time than paid time: -> we should take the HOURLY wage (smoothed on trimester) and multiply it by the amount of hours worked on the period. If on the month, the employee got more paid time than unpaid time: -> we should take the HOURLY wage (smoothed on trimester) and multiply it by the amount of hours not worked on the period. Remove that amount to the monthly wage. If on the month, there is a perfect 50% ratio between paid and unpaid, we take the wage / 2 Note: As the hourly wage is smoothed on trimester, the hourly wage is never equal to the normal hourly wage of the current month. Smoothed on trimester = wage * 3 months / 13 weeks / hours_per_weeks Meaning that if you take one unpaid leave in the month, assuming wage = 2200 and number of working days on the month = 22 and hours per week = 38 (5 days a week): you won't earn 21 * 100 = 2100. You will earn instead : 220 - 1 * (2200 * 3 / 13 / 5) = 2200 - 1 * 101.54 = 2098.46 Task-6352246
Administrators can now request a detailed database execution analysis directly from profiled slow queries, avoiding manual copy-paste work and server access. This helps technical teams investigate performance bottlenecks faster while keeping the data model compatible with existing tools and limiting access to admin users.
Original PR description
The profiling feature is really cool to analyse performance issues and detect bottlenecks. However, once you've identified a slow query, there's nothing to help you. You need to: - copy-paste the…
The profiling feature is really cool to analyse performance issues and detect bottlenecks. However, once you've identified a slow query, there's nothing to help you. You need to: - copy-paste the speedscope entry with the SQL query - extract the query from the line - have ssh access to the server - manually run EXPLAIN ANALYSE This commit introduces a way to run EXPLAIN ANALYSE on any profiled query. Design decisions ---------------- We are keeping the current schema, with SQL stored in a serialized blob. This allows external tools (runbot, ...) to work the same way across versions. It also allows to add metrics easily in the blob in stable versions if necessary. Preserving the schema also makes it possible to backport this feature to stable versions in the future, as we could simply extract the feature and move it to a separate module. Upon request, we duplicate the SQL data in a separate model (`ir.profile.query`) so it can be displayed and manipulated with standard list/form views. Duplicating the data is acceptable since it's throwaway data that is regularly garbage-collected. Visualizer? ----------- We considered including dalibo's open-source visualizer (pev2) to be able to visualize plans in one click. However, because that component depends on Vue.js, including it would likely trigger automated vulnerability scanners. Even if it's secure, we want to avoid the overhead of processing false-positive security reports. As a general rule, we also avoid adding external dependencies whenever possible. Instead, users can take the generated execution plan and visualize it as they see fit (e.g., using explain.dalibo.com). (Please note that SQL queries may contain sensitive data!) This feature is obviously limited to admin users. task-6422397 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
Belgian payroll now handles warrants more accurately by separating warrants that are subject to social security from those that are not. This improves payroll calculations and statutory reporting for taxes, social security declarations, and employee certificates.
Original PR description
Previously, the warrants structure only supported entering a raw amount on which a fixed withholding tax rate was applied. Requalified warrants (subject to ONSS) were not considered either. This commit refactors the warrant structure to properly compute ATN, ONSS, and withholding taxes. The single generic input was replaced by two distinct inputs for warrants with and without ONSS, separating the calculation bases. A rule parameter for the default 18% ATN was introduced, and we now compute the Withholding Tax (always) and ONSS (only for requalified warrants) the same way as a bonus. The ATN percentage can be overridden with a salary input, and we can also input a prepaid amount for the withholding tax. The DMFA was updated to report the warrant remuneration and contribution when subject to ONSS. The relevant values were also added to the Social Security Certificate. Besides, we made sure to report the gross and the withholding tax in 281.10/20 and 274.xx reports. Task-6392255