Tuesday, September 8, 2026
49 changes · master
Enhancements to existing features
Readonly image fields now hide the buttons for editing or clearing images. This prevents users from seeing actions they cannot use, making forms clearer and reducing confusion in kanban-based workflows.
Original PR description
Purpose ======= When the field is readonly, hide the "clear" and "edit" button for the `x2many_image_field` widget. Task-6323897
CRM lead cards now show the sales team when viewing leads across all sales teams, making it easier to understand ownership at a glance. Helper text was also adjusted so the wording stays clear whether the team switcher is active or not.
Original PR description
- Display the crm team on the lead kanban card when the switcher is activated and the "All Sales Teams" is selected. This improves the team visibility when leads from different teams are displayed. - Reword the helpers to make sure the wording works whether or not the team switcher is activated. Task-6537623 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Appointment scheduling checks are reinforced so private calendar events are counted when determining whether someone is unavailable for a booking. This helps prevent appointments from being offered when a team member already has a private commitment.
Original PR description
Make sure that private events are correctly taken into account when computing the unavailable partners for bookings. Task-6237805
The timesheet KPI header now uses less width when the leaderboard is hidden. This improves the visual fit of the page with the updated Frost design and helps avoid an overly wide header.
Original PR description
In this commit, we reduce the width of the kpi header if the leaderboard is not displayed. Due to the new frost design, the header was too wide and did not render well. task-6530653
Stacked list columns now align like regular numeric columns when their leading value is a number or amount. This makes list views easier to scan and keeps totals and grouped values visually consistent.
Original PR description
Columns declared with the `column` tag stack several fields in a single cell, but were always left-aligned, unlike plain numeric field columns. Such a column now takes the alignment of its first sub-field, since that is the one heading the cell: header label, data cells and group/footer aggregates are right-aligned when that field is a float, an integer or a monetary. opw-6533733
The view switcher now animates the selected highlight smoothly between buttons instead of jumping instantly. This makes switching between views feel more polished and visually clear for users.
Original PR description
Switching view moved the highlight of the switcher from one button to another in one jump. Paint it once, on the group, as a single layer travelling from the button being left to the one being activated. Switching view rebuilds the whole control panel, so the switcher that has to run the move is created only once the button it comes from is gone. That index is put on the document for the time of the switch, and '@starting-style' turns it into the first position the indicator renders at, which leaves the move itself to a plain CSS transition. The indicator is laid out as one button of the group, so at rest it covers exactly the background '.btn' used to paint - which it now leaves to the group. The group carries '--btn-active-bg' for that, the buttons still inherit it, and dark mode keeps overriding the one value. Code made by Claude Supervised by RFR
The Belgian payroll module now provides clearer explanations for employment bonus A and B directly in the payslip line tooltip. This helps payroll users better understand how these bonus lines are presented without changing payroll calculations.
Original PR description
1 - The explanation of the employement bonus A and B is improved
1.1 - (it is in payslip line's tooltip, next to the salary rule)
task-6448501Point of sale receipts now always show the base amount for each tax group, matching the earlier receipt layout. This makes tax lines easier for customers and staff to understand, especially when several taxes use the same base amount.
Original PR description
Revert the receipt tax summary design back to the 19.0 format, ensuring that the base amount is always displayed for each tax group. Before this commit, when all tax groups shared the same tax base, the base amount was hidden, leading to a flat tax listing. Now, the template always renders the tax groups in the format: "Tax [Name] on [Base Amount] [Tax Amount]" task-id: 6296906 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283120 Forward-Port-Of: odoo/odoo#270749
The WhatsApp embedded signup onboarding is now included directly in the main WhatsApp module instead of a separate add-on. This simplifies maintenance and setup without changing the experience for existing users, since both parts were already installed together.
Original PR description
whatsapp_oauth is a separate module because the Embedded Signup onboarding had to ship in stable, where whatsapp itself cannot be touched. In master that constraint is gone, so it is folded back in. The module was auto installed and depended on whatsapp, so every database already had both. The code only moves, nothing changes for them. `WhatsAppOAuthApi` is folded into `WhatsAppApi` as well, which drops the `_api_requests` passthrough that only existed so a subclass could reach the name mangled request helper. The proxy endpoint parameter is renamed from `whatsapp_oauth.endpoint` to `whatsapp.proxy_endpoint`, it no longer names a module that exists. Task-6529850
The user interface icon library has been updated with additional icons for VoIP log types. This helps make VoIP activity logs clearer and easier to recognize in the application.
Original PR description
This commit adds new icons to the Material Symbols library to be used for log types in the voip module. task-5864994 Requires: - https://github.com/odoo/enterprise/pull/128919 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
Entering a VAT or GST number in the partner name field now correctly triggers partner autocomplete again. This helps users find and select existing partners faster, reducing manual entry and duplicate records.
Original PR description
PURPOSE - Typing a VAT/GST number in the partner name field failed to trigger the autocomplete. - This was due to a [refactoring](https://github.com/odoo/odoo/pull/272884/changes#diff-0a5505b3e2038534267e3af27e91e6466d9326d8954d38c4bc44d69fa333989eR68) that restricted VAT validation strictly to the `vat` field. SPECIFICATION - We are automatically switching the search logic to VAT if a valid VAT/GST number is detected inside the name field. task-6544712
Code cleanup and technical improvements
The VoIP module was updated as part of the platform migration to Owl 3. This internal cleanup helps keep VoIP flows compatible with the newer web framework without changing day-to-day user behavior.
Original PR description
As part of the Owl 3 migration, replace **onWillUpdateProps** hook with the appropriate Owl 3 alternatives.
This fixes a timing issue in the restaurant point-of-sale order tracking test by waiting until order validation and syncing are complete. It helps prevent false test failures where the system checked order details before the latest changes reached the backend.
Original PR description
The order tracking tour only waited for the feedback screen to be shown after validating the payment. Since order validation is performed asynchronously while the feedback screen is displayed, the tour could finish before the updated order was synced to the backend. This caused the Python test to still see the original quantity and `is_edited` set to false. To fix we wait for the feedback screen continue button to be enabled, which ensures order validation and synchronization have completed before the tour ends. [error-940386](https://runbot.odoo.com/odoo/error/940386) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282726
This fix removes leftover setup data from an earlier change that could conflict with current repair subcontracting records. It helps keep the manufacturing repair configuration consistent and avoids unexpected conflicts during use or upgrades.
Original PR description
An old refactor left some data around that are in conflict with other records for the same model. 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#282103 Forward-Port-Of: odoo/odoo#281276
Manufacturing order notes in the shop floor view now stack vertically instead of appearing as separate columns. Long notes are contained in a small scrollable area, keeping the layout consistent and easier for operators to read.
Original PR description
Before : As multiple notes on MO are stored as a conjunction of div, they are shown as multiple columns in the shop floor view due to the flex layout. After : Wrap the notes in a scrollable container capped at 3 lines so the line height stays consistent regardless of note length. Changes: As we want to keep the edit icon aligned as it is, we keep the flex layout and wrap the notes in a separate div with a vertical flex container. We furthermore limit the height of the note to 3 lines with an overflow auto so that the line height stays consistent regardless of note length. [opw-6544909](https://www.odoo.com/odoo/project/966/tasks/6544909)
This fix prevents errors when company car benefit values are calculated outside Belgian company contexts or when expected payroll parameters are missing. It improves reliability for multi-company setups and avoids interruptions for users managing vehicle models across different countries.
Original PR description
. Handle multi-company and non-Belgian contexts in fleet.vehicle.model's . Add raise_if_not_found=False when retrieving min_car_atn to prevent UserError/TypeError when parameter records are missing or when processing non-BE models. . Add test to verify that computing BIK for non-Belgian companies executes safely without exceptions. task-6544760
This fixes automated Point of Sale stock test scenarios so they can find the intended test customer even when many demo customers are present. It helps keep test runs stable and prevents false failures during quality checks.
Original PR description
When running tests with demo data, the partner list is populated with many records, causing 'Partner Test 1' to fall outside the initial 100 loaded partners in the PoS session cache. Because clickCustomer defaulted to pressEnter=false, searching in the UI filtered the in-memory cache and displayed 'No customers found, press Enter to load more.', but never dispatched the Enter key to fetch the partner from the backend, timing out the tour step. Pass pressEnter=true in pos_stock customer selection tours so that the Enter key is dispatched and the partner is fetched from the server via RPC. runbot-error: 242001 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286513
Users with permission to edit a spreadsheet can still rename it after refreshing the page. This fixes a problem where refreshed spreadsheet links were incorrectly treated as read-only, reducing confusion and preserving normal editing workflows.
Original PR description
Spreadsheet backend URLs now contain an access token for regular users. After a refresh, the router restores this token and the navbar treated its presence as read-only, even when the user had write access. An access token identifies the spreadsheet URL and collaborative session; it no longer indicates that the current user is read-only. Actual permissions are provided by `has_write_access`, while archived spreadsheets are handled by `spreadsheetMode`. Use the spreadsheet mode as the single source of truth for both spreadsheet content and filename edition. Task: 6496749
The accounting module now uses today's date when a required reporting date is not provided. This prevents an unexpected error from interrupting currency consolidation calculations and keeps accounting workflows running smoothly.
Original PR description
`date_to` is accessed directly from `self.env.context` in `_compute_sql_consolidation_rate`. When the key is missing from the context, this raises an error and breaks the flow. Use today's date as the default value when `date_to` is not provided in the context, preventing the traceback and allowing the computation to continue normally. Forward-Port-Of: odoo/odoo#286965
Changing a shift will no longer automatically restore a sales order line that a user intentionally removed. The sales link is now updated only when the related project or task changes, helping keep staffing and billing information aligned with user intent.
Original PR description
Before this commit, when a change is made in a shift, the SOL initially removed by the user can be set by the one set on the task/project linked to that shift. The reason is because each time the compute of SOL field is triggered, the compute will set the SOL of the task or the project linked. The problem is we only want that behavior when the user changes the project or the task. This commit removes the logic the compute to set the SOL of the project/task, to do that logic inside an onchange method instead. Task-6354078 Forward-Port-Of: odoo/enterprise#130739 Forward-Port-Of: odoo/enterprise#125814
This fix makes Odoo's mail tracking tests use a consistent language setting instead of depending on each developer or server machine's regional settings. It prevents false test failures in accounting, CRM, HR recruitment, manufacturing, mailing, and related modules when systems are configured in non-US English locales.
Original PR description
Since the removal of tracking values, they are only accessible formatted and localized embedded into mail messages. This means when we try to check them in tests, we need to format the "reference"…
Since the removal of tracking values, they are only accessible formatted and localized embedded into mail messages. This means when we try to check them in tests, we need to format the "reference" values using the same locale. During testing the locale is *generally* `en_US` because that's the default for odoo / test users, but `TransactionCase.env` does not have a lang configured at all, so when tracking we call something like `babel_locale_parse(self.env.lang)` = `babel_locale_parse(None)`. `None` is obviously not a valid locale, so `babel_locale_parser` ~~raises an error~~ falls back, and the first fallback is `Locale.default()`, which checks the language / regional envvars (`LANGUAGE`, `LC_LANG`, `LC_ALL`, `LANG`) and returns the first valid one, otherwise `babel_locale_parse` then defaults to `en_US`. The middle case is the problem here, if a machine is configured with a locale other than `en_US` then that's what's used to format the tracking values against the stored message, so if someone's locale is `zh_TW` they get `2020年1月1日`, which for some reason does not match a english-US format, making pretty much every test checking tracking values fail. But hey for once it's not a babel version issue.
This update ensures the partner autocomplete identifier field is added through the correct module instead of being embedded in the core contact views. It also restores save and cancel prompts when users manually edit multiple identifiers, preventing changes from being missed.
Original PR description
This commit fixes 2 things : 1. the `additional_identifiers_list_partner_autocomplete` widget was hardcoded directly into the core `base` module's views for res.partner and res.company. 2. Manually editing the multi-ids field wouldn't show the save/cancel buttons. Fix af3f8f6bc267eb431c0be108f30c061f0b0e1c01 no task
This fix makes automated checks use a consistent language when verifying change history values. It helps prevent false test failures caused by translations, improving release reliability without changing customer-facing functionality.
Spreadsheet editing screens now consistently use a topbar color that blends with the main navigation, not just in the Documents area. This creates a more consistent and polished experience for users working with spreadsheets across the system.
Original PR description
The recent fix in #130001 to blend the topbar color with the navbar only worked for the documents action. This revision extends the behaviour for every spreadsheet editing action. task-6529910
Badge counters in the Discuss app now display correctly when they contain two or more digits. This prevents numbers from being cut off in tabs and messaging menu items, making unread or important counts easier to read.
Original PR description
This PR fixes the position of badge counter in tab and messaging menu item when they have more than 1 digits. Before / After <img width="401" height="466" alt="Screenshot 2026-09-07 at 23 41 58" src="https://github.com/user-attachments/assets/30d3a826-0898-4b5a-81a1-1ed816ed166b" /> <img width="403" height="466" alt="Screenshot 2026-09-07 at 23 34 36" src="https://github.com/user-attachments/assets/45687a6e-924d-413b-bd15-1b16bf5b012c" />
This fix prevents errors when sales reports or tracking references encounter outdated internal model records. It helps keep sales and marketing tracking features stable even when system metadata is temporarily out of sync.
Original PR description
Following 6dedae804748, in case `ir.model` models are out-of-sync with the available models in the registry, trying to compute the target selection model will result in a crash (`KeyError`). This commit ensure the target model is available in the registry to avoid that crash. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284541 Forward-Port-Of: odoo/odoo#284161
When an outgoing email fails, Odoo now shows the configured SMTP server name instead of a blank 'None' value. This makes delivery problems clearer for administrators and support teams, helping them identify which mail server needs attention.
Original PR description
Steps to reproduce: 1. Run a local SMTP server that responds with a server error. The server file is provided in the task [refuse_smtp.py](https://github.com/user-attachments/files/27166855/refuse_smtp.py) 2. Create an outgoing server for this SMTP server 3. Send an email Issue: The delivery failure reason displays Mail delivery failed via SMTP server 'None' instead of the configured server name. Cause: ir.mail_server.send_email() builds the failure message from the smtp_server argument, but in the common path the mail is sent via mail_server_id. In that case, the actual SMTP server is resolved in connect(), while smtp_server remains unset, so the error message shows None. Solution: Store the resolved server label on the SMTP connection when opening it, and reuse that value when formatting send failures. opw-6139168 Forward-Port-Of: odoo/odoo#280750 Forward-Port-Of: odoo/odoo#261776
Rental order lines created from the rental schedule now keep the normal product name, such as "Bike", instead of adding stock quantity details meant only for schedule rows. This prevents confusing descriptions on rental orders while still showing availability information where it is useful in the schedule view.
Original PR description
Versions -------- 19.0 and later Steps ----- - Install `sale_stock_renting`. - Go to Rental > Orders > Rental Schedule. - Create a new rental order line from a cell of the gantt view, on a row…
Versions -------- 19.0 and later Steps ----- - Install `sale_stock_renting`. - Go to Rental > Orders > Rental Schedule. - Create a new rental order line from a cell of the gantt view, on a row grouped by a storable rentable product. Issue ----- The first line of the description of the created line is named "Bike (3 items)" instead of "Bike". Cause ----- The `display_name` override adding that quantity is keyed on the `in_rental_schedule` context key. That key is set on the `action_rental_order_schedule` action itself, so it is part of the search context and is propagated to every record, dialog and dropdown opened from the schedule, while it is only meant to flag that we are in the schedule (default values conversion, hidden onchange buttons, group expansion, ...). Solution -------- Introduce a dedicated `display_renting_stock_quantity` context key and depend on it instead when fetching data to build the gantt rows, leaving the records opened from the schedule with their regular display name. Forward-Port-Of: odoo/enterprise#130651 Forward-Port-Of: odoo/enterprise#130322
The emoji picker in Discuss now stays stable when users select emojis during a search and then clear the search field. This prevents an unexpected crash, making chat interactions smoother and more reliable.
Original PR description
Steps to reproduce: - open Discuss, open any chat, open the emoji picker (no 'Frequently used' emojis) - search a term and select emojis without closing the picker (shift+click on desktop, plain…
Steps to reproduce:
- open Discuss, open any chat, open the emoji picker (no 'Frequently used'
emojis)
- search a term and select emojis without closing the picker (shift+click on
desktop, plain click on mobile)
- clear the search with backspace
=> traceback: 'Cannot read properties of null (reading
`getBoundingClientRect`)' in adaptNavbar().
This happens because when we clear the search input it calls
`highlightActiveCategory()`, which sets `categoryId` to the topmost category of
the grid, which is now the 'Frequently used' category (sortId 0), added to the
picker since the emojis we just picked updated the recent state. To update the
navbar, `currentNavbarPanel` then looks for the panel holding it in
`emojiNavbarRepr`, but that representation is only built in `adaptNavbar()`,
which runs on mount and from the `ResizeObserver` only, so it was built without
the 'Frequently used' category and no panel contains it. It returns undefined,
the navbar renders empty, its size change wakes the `ResizeObserver`, and
`adaptNavbar()` crashes on querySelector('.o-Emoji').getBoundingClientRect()`.
This commit solves the issue by rendering the `recentEmojis` from a snapshot
taken when the picker is opened, so they are not added to the picker while the
while `emojiNavbarRepr` does not contain their category id.
partial backported PR: https://github.com/odoo/odoo/pull/281104
Task-[6204249](https://www.odoo.com/odoo/project/1519/tasks/6204249)
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#287126
Forward-Port-Of: odoo/odoo#284372Accounting dashboard KPI calculations now use the right date periods when converting values across currencies. This prevents errors when viewing companies with different currencies and helps ensure profitability and cashflow figures use appropriate exchange rates.
Original PR description
Multicurrency KPI computation requires date bounds to determine the applicable consolidation rates, without them selecting companies with different currencies raises a keyerror on date_to. Use the fiscal year dates for profitability KPIs and the rolling 12-month period for the cashflow one. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where demo data could not be installed when the password policy module was active. Businesses can now set up demo or test databases more reliably without being blocked by default demo user credentials.
Original PR description
If auth_password_policy, demo data cannot be installed due to demo:demo user
Checkout step labels are now preserved when website checkout steps are copied during website setup. This prevents customer-facing checkout steps from showing an unwanted “(copy)” suffix, keeping the buying flow clean and professional.
Original PR description
Following PR: https://github.com/odoo/odoo/pull/272177, char fields "name" now append ["(copy)" by default](https://github.com/odoo/odoo/blob/b84ffce402d3fd12e3dd9521b248b15336763a76/odoo/orm/fields_textual.py#L503) on copy. As checkout steps names are generated from generic records at website creation, we want to keep their original name. opw-6538023
Pressing Escape in a date or time picker now discards any typed changes and restores the previous value instead of saving the edit. This makes the behavior consistent with other dropdown fields and helps prevent accidental date changes; Ctrl+Enter now behaves like Enter by saving and closing.
Original PR description
Steps to reproduce: - Click in the input of a datetime picker (with an existing value) - Manually edit the text in the input - Press Escape Current behavior: - The manually typed value is parsed and…
Steps to reproduce: - Click in the input of a datetime picker (with an existing value) - Manually edit the text in the input - Press Escape Current behavior: - The manually typed value is parsed and validated, exactly as if Enter had been pressed instead. Expected behavior: - Escape should discard the edit and restore the field's previous value, closing the picker without applying any change. This is how other dropdown-based fields (e.g. many2one) behave. Solution: - On Escape, reset the input(s) to the current (unedited) value instead of parsing the typed text. If the popover is open, let its own "closeOnEscape" hotkey close it (avoids a double-close race with our own close call); otherwise close/apply directly, since there is no such hotkey to rely on. Also, Ctrl+Enter had a dedicated behavior: it validated the typed value and re-opened/kept the picker open, refreshing its content to reflect the newly entered date. This is removed, so Ctrl+Enter now behaves like a plain Enter (validates and closes). task-6537497 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 website builder's automated checks were adjusted to handle a new way Chrome reports background image sizing. This helps keep quality checks reliable across browser versions without changing what users see or do.
Original PR description
In Chrome 152, single-value `background-size` properties may be serialized or expanded to include implicit dimensions (e.g., appending `auto` like `100px auto`), causing strict exact-string test assertions to fail. This commit updates `website` builder test expectations to use regex prefix matching or substring inclusion so tests remain reliable across different Chrome versions. runbot-946570 Forward-Port-Of: odoo/odoo#286094 Forward-Port-Of: odoo/odoo#285591
This fix updates a stock test so it searches for the exact product name instead of a broader term. This prevents unrelated products from being selected during automated checks, improving reliability without changing everyday user workflows.
Original PR description
When searching for the product created in the test we were only searching for "Serial" but another product with this word in the internal reference was showing up alone. To fix this we now look for the exact product name to avoid finding another product. The other matching record was introduced in this commit : https://github.com/odoo/enterprise/commit/6d4f4ec471d0d20c4deae5ad5d4fd4f803c20933 runbot-242820 Forward-Port-Of: odoo/odoo#284499
Map popovers now correctly follow whether editing is enabled or disabled for a map view. This prevents users from being blocked from editing when the view is configured to allow it, improving consistency with other Odoo views.
Original PR description
MapPopover.readonly reads model.metaData.canEdit, but it was never set: canEdit was missing from modelParams, so it was always undefined and the popover was permanently readonly regardless of the edit attribute on the arch. Read canEdit from archInfo.activeActions.edit when building modelParams, mirroring gantt_arch_parser and calendar_arch_parser. Task-6537184
The timer now excludes timesheet entries that are not linked to a project when loading systray timer data. This prevents irrelevant or incomplete entries from appearing in the timer, making time tracking clearer for users.
Original PR description
exclude AAL without a project when loading systray timer data task: 6538364 Forward-Port-Of: odoo/enterprise#130515
When selecting a private city on an employee address, the state and ZIP code now appear immediately instead of only after saving. This makes address entry clearer and reduces the chance of incomplete or confusing employee address information.
Original PR description
Picking a city didn't fill in state and zip until you saved. Added an onchange so it happens live, same as we already do for state/country. Task 6482304
Fixed an issue where card views could stop refreshing correctly after the first reload. This helps users see up-to-date information consistently without needing extra manual refreshes or workarounds.
Original PR description
`this.key` is the signal function, so `this.key + 1` concatenates its source and `set` stores that same string on every reload: the first reload changes the key and re-creates the Record, the next ones are no-ops. Introduced in odoo/odoo#260098 Forward-Port-Of: odoo/odoo#286988
This fixes the messaging menu so it explicitly opens the Chats tab instead of relying on a fallback behavior. It makes the user experience more reliable and reduces the chance of future tab-order changes causing the menu to open incorrectly.
Original PR description
Before this commit, the systray state is inserted with `activeTab: MENU_TABS.CHATS`, a name no module defines, so the value is undefined and the state links no tab at all. This happens because each module names its own tabs, and the discuss one declares `MENU_TABS.CHAT`. The eager compute of `activeTab` hides the mistake: with no tab to keep, it falls back to the first visible tab, which is Chats whenever it is shown, as its sequence is the lowest. This commit inserts `MENU_TABS.CHAT`, so the state says which tab it opens on rather than depending on the sequences around it.
Fixed a typo in the Italian electronic invoicing withholding tax reason text. This improves the accuracy of tax-related wording shown or reported by the Italian localization without changing business processes.
Original PR description
Correction of a typo in italian withholding tax reason. opw-6514615 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284992
This fixes an issue where editing only the analytic details of a bank reconciliation line could be blocked by accounting lock date rules. Users can now make these analytic updates without being incorrectly stopped, while lock date protections remain in place for other accounting changes.
Original PR description
In the case of the bank rec widget, when modifying a line, we actually unlink it and create a new one. In that case, modifying the analytic would trigger the lock date error. But user should be allowed to modify the analytic all the time. In the edit of the bank rec widget, we add a context key that will be added if analytic distribution is the only key modified. task-6397993 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#277260
New database installation tests now skip older AI App modules and their connector modules. This keeps fresh installations aligned with the newer AI Agentic app while preserving the legacy modules for existing upgraded databases.
Original PR description
Exclude AI App and its bridge modules from fresh-install builds. They are kept for upgraded databases only; new databases use AI Agentic. task-id-6497307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Bank reconciliation edits that only change analytic information will no longer be blocked by lock date checks. This lets users update analytic allocations when needed without disrupting accounting controls for other changes.
Original PR description
In the case of the bank rec widget, when modifying a line, we actually unlink it and create a new one. In that case, modifying the analytic would trigger the lock date error. But user should be allowed to modify the analytic all the time. In the edit of the bank rec widget, we add a context key that will be added if analytic distribution is the only key modified. task-6397993 Forward-Port-Of: odoo/enterprise#124852
Time off types that are not available for time off no longer show a misleading allocation balance such as (0/0). This keeps payroll and time off screens cleaner and avoids confusion for users reviewing leave-related entries.
Original PR description
**Issue:** When a user deselects the `time_off_selectable` field on a Time Off Type, the `requires_allocation` field is hidden from the view but retains its default background value of `True`. Because the system still evaluates it as true, the `display_name` appends a misleading allocation ratio of `(0/0)` next to the time off type's name. **Solution:** Updated the `_compute_display_name` method to account for the `time_off_selectable` state. The allocation ratio `(0/0)` is now only calculated and appended to the display name **if the time off type is both selectable for time off *and* requires allocation.** Before: <img width="469" height="413" alt="image" src="https://github.com/user-attachments/assets/469fc063-23d9-46a2-9367-8f3bf4ef7312" /> After: <img width="418" height="392" alt="image" src="https://github.com/user-attachments/assets/030451b2-b9cf-4954-a598-01d9846c738e" /> task-6487681
Creating a new CRM stage no longer shows an unnecessary warning about recalculating opportunities. The warning is now reserved for editing existing stages, reducing confusion for CRM users while keeping the helpful alert where it matters.
Original PR description
Changing whether a CRM stage is won may trigger the recomputation of its opportunities. An onchange warning was added to inform users about this potentially expensive operation. However, the warning was also displayed when creating a stage because the onchange was triggered while initializing the form. Fix: Only display the warning when editing an existing stage, as it's useless to show this warning when creating a new stage. Task-6424174 Forward-Port-Of: odoo/odoo#284679
Since [1], we have 2 calls to `_bootstrap_homepage` - one in the `post_init_hook`, and one in `website.create`, causing the menu hierarchy to be duplicated. This doesn't apply to the default website (from base) as there was no `create` method override at the point of creation (website is not installed yet) and the homepage/menu is only created once, by the `post_init_hook`. Steps to reproduce: 1. Install website with demo data. 2. Menus for website 2 are duplicated. Solution: Si
Original PR description
Since [1], we have 2 calls to `_bootstrap_homepage` - one in the `post_init_hook`, and one in `website.create`, causing the menu hierarchy to be duplicated. This doesn't apply to the default website (from base) as there was no `create` method override at the point of creation (website is not installed yet) and the homepage/menu is only created once, by the `post_init_hook`. Steps to reproduce: 1. Install website with demo data. 2. Menus for website 2 are duplicated. Solution: Simply check if the website doesn't have a menu before duplicating it. [1]: https://github.com/odoo/odoo/commit/ae81b6f6074632d1a609387e53f97a61ee6c95f4 task-6030210 Forward-Port-Of: odoo/odoo#286713
The settings screen now hides both the Project field and its label when billing is turned off or Project Planning is enabled. This removes a confusing leftover label and makes the Billable configuration clearer for users.
Original PR description
*: planning_field_service_sale_timesheet,project_timesheet_forecast_field_service_sale ## Before this commit Only the project field was hidden when "Billing" is not enable, or if "Project Planning" is enabled, leaving the "Project" label visible in any case. ## After this commit The label and field are hidden if "Billing" is not enabled, or if "Project Planning" is enabled. task-6478896 Forward-Port-Of: odoo/enterprise#129852
The accounting reports code was updated to use the current supported behavior in Odoo's interface framework. This keeps audit balance report screens compatible with the next OWL version while preserving existing tested behavior.
Original PR description
Replaced `useLayoutEffect` with `useEffect` (from `@odoo/owl`) because `useLayoutEffect` is deprecated in OWL3. The useLayoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - TestAccountReportsTours.test_account_reports_audit_tours (account_reports post-install) see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2748320/build/124302666