Wednesday, August 26, 2026
37 changes · saas-19.4
Enhancements to existing features
The Indian localization stock demo data now includes a warehouse for the Indian demo company. This removes extra setup work during demonstrations, testing, and purchase or delivery workflows involving e-way bills.
Original PR description
Following the task-4034713, we used to create warehouse for all company but after this task we only create warehouse for the main company while testing for Indian Demo company considering the ewaybills it's annoying to create a new warehouse for Devs and POs and even for Demos After this commit, we will create demo warehouse for the Indian demo company Task [link](https://www.odoo.com/odoo/project.task/4034713) task-4034713 Forward-Port-Of: odoo/odoo#283797
The timesheet assistant now shows the actual record name when ActivityWatch cannot directly match an Odoo page but can identify a record from the URL. This makes generated work descriptions clearer and more useful, such as showing the department or record being worked on instead of only the general app name.
Original PR description
Before this commit, when the ActivityWatch integration encountered unmatched Odoo URLs, it would fallback to displaying the general application name (e.g., "Working on Sales"). With this commit, if the URL path ends with a valid record ID (e.g., /odoo/departments/1) and the corresponding model can be identified, the assistant will attempt to fetch and display the actual record name (e.g., "Working on Research & Development"). task: 6365568 Forward-Port-Of: odoo/enterprise#127547 Forward-Port-Of: odoo/enterprise#124138
The appointment booking view now groups entries by guest automatically, making it easier for staff to review reservations by customer. This improves day-to-day booking management by reducing manual filtering and helping teams quickly spot each guest's appointments.
Original PR description
Add default Group By Guest Task-id: 6253719 Forward-Port-Of: odoo/enterprise#118681
French DAS2 and fiscal declaration return forms now display the expected color indicators for their statuses. This makes it easier for users to quickly understand the state of these returns at a glance.
Original PR description
During the development of the das2 report and fiscal declaration, we didn't change the _compute_visible_states to accept the return of those reports. By doing so, we now have colors on the returns. task-6297355 Forward-Port-Of: odoo/enterprise#120417
Resolved issues and error corrections
Fixed a niche issue where quotations created from templates with section or note lines could cause problems when connected to an active planning session. The update ensures only real sale order lines are considered, helping field service planning and sales workflows remain reliable.
Original PR description
This commit patches a niche bug involving creating a quotation via a quotation template containing a line section, then connecting it to an active planning session. The current architecture did not filter out `line_section` or `line_note` typed lines. This updated search domain resolves this issue. opw-6351484 Forward-Port-Of: odoo/enterprise#125056
Email notifications for tracked changes now display the expected arrows and parentheses, making updates easier to understand directly from the email. This fixes a presentation issue without requiring broad data changes to existing messages.
Original PR description
Bug === When notifying by email a tracking change, the arrow and parentheses are not rendered in the email body. Technical and Constraints ========================= The class `o_track` is only set in…
Bug === When notifying by email a tracking change, the arrow and parentheses are not rendered in the email body. Technical and Constraints ========================= The class `o_track` is only set in the web client template (`mail.Message`). There's no class in the body of the email that is sent. It can be rendered with "notification templates" that we cannot change either (and they just do `t-out="message.body"`, so the body field of the mail message has to be properly rendered). We also need existing mail messages to be rendered correctly, and so we need a way to differentiate mail messages created before the fix from those created after it, to know when to disable the arrow and parentheses. Alternatives ============ We have tough about many solutions, this one is the best we found based on the constraints we have 1. Add a class in 19.3, use that class to not remove the arrow on previous mail message. That solution required a migration script that will change all tracking messages. Because the initial migration of the tracking was really slow, we wanted to avoid that. 2. Add a class, and keep it forever. But that solution makes the body of the mail messages bigger, which defeat one of the purpose of the initial refactoring 3. Change the outgoing email without changing the body of the mail message. That solution was really not reliable (regex change to add the arrow, and we have no clean way to target the tracking rows) 4. During the migration create a system parameter with the date, and compare with the create_date of the mail message to know if we should add the arrows or not (but we will need to keep that system parameter forever, and the code to support both to) Task-6424104 Forward-Port-Of: odoo/odoo#282210
This fix prevents an error that could occur when sales reporting tries to use tracking information that is not fully in sync with the system. It helps keep sales and marketing attribution reports stable instead of failing unexpectedly.
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
This update fixes an internal automated test related to mobile mail notifications after a template tracking change. It helps keep quality checks reliable so future mail-related updates can be validated with fewer false failures.
Original PR description
Task-6424104 Forward-Port-Of: odoo/enterprise#127778
A small configuration error in Accounting report protections was fixed. This ensures two important invoice and vendor bill report records cannot be accidentally deleted, helping preserve expected reporting behavior.
Original PR description
On `ir.actions.report` we want to block the unlinking of specific reports in odoo. However, when the list was created a comma was missed between `action_account_original_vendor_bill` and `account_invoice_without_payment` which means we were actually protecting against people unlinking `action_account_original_vendor_billaccount_invoice_without_payment`. Adding in that comma will allow these two records to be properly protected. task-none Forward-Port-Of: odoo/odoo#283323
This update improves the error shown when sending a French e-invoicing credit note in demo mode. Users now receive a clearer, more helpful message when EDI document generation cannot proceed, reducing confusion and support needs.
Original PR description
Steps to reproduce: - Install `l10n_fr_pdp` module > Switch to `FR Company` - Activate `French e-invoicing` (Demo mode) - Create a New `Credit Note` with `FR Customer` > Send Issue: The system currently displays a confusing error message during EDI document generation. We are making the error message clearer and more user-friendly. opw-6412521 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284189
Duplicating multiple projects now gives each copied project only the milestones from its original project. This prevents confusing or incorrect milestone data from being added when teams duplicate projects in bulk.
Original PR description
Before this commit, duplicating several projects at once from the list view gave every copy the milestones of all the duplicated projects, because the copy loop assigned the milestones of the whole recordset instead of the ones of the project being copied. Duplicating a single project behaves correctly, which hid the issue. Steps to reproduce: - create two projects with milestones enabled, add a milestone to the first one and two others to the second one - select both projects in the list view and duplicate them Each copy contains the three milestones instead of only the milestones of its original project. Solution: Copy the milestones of the project being duplicated. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278520
The HTML editor now removes formatting correctly from list items that contain headings. It also prevents formatting applied to a parent list item from unintentionally affecting nested list items, making document editing more predictable.
Original PR description
**Current behavior before PR:**
1. Create a list with h1, have some text inside.
2. Select whole heading and apply underline style.
3. Click on remove format button.
You will notice that underline style is not removed from list.
**Desired behavior after PR is merged:**
Now, format is removed correctly from the list.
task-6348753
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prPayroll users can now remove or adjust a payslip period without triggering an error. The system skips employee contract period checks until both payslip start and end dates are available, keeping payslip creation and editing smoother.
Original PR description
Currently, an error occurs when the user removes the payslip period. **Steps to Reproduce:** - Install the `hr_payroll` module. - Go to `Employees` and create an `employee`, or use an existing one. -…
Currently, an error occurs when the user removes the payslip period. **Steps to Reproduce:** - Install the `hr_payroll` module. - Go to `Employees` and create an `employee`, or use an existing one. - Make sure the `employee's version` has a `contract start date`. - Go to `Payroll` > `Payslips` > `Payslips` and create a payslip. - Select that `employee` on the payslip, then remove the `payslip start date`. `TypeError: '<=' not supported between instances of 'datetime.date' and 'bool'` After the [recent commit], which computes the version from the payslip period without allowing it to be overridden, when the user selects an employee whose version has a contract start date, it checks whether the version overlaps with the payslip period [1]. However, since the payslip dates have not yet been set, it raises an error. This commit ensures that the check for the version overlapping with the payslip period is skipped if the payslip does not have both a start and end date. It also makes the method depend on date_to, because if the user changes the payslip end date, it should recheck whether the version overlaps with the payslip period. [recent commit]: https://github.com/odoo/enterprise/commit/569ce2af32477d410b79e98ca72729385042619b [1]- https://github.com/odoo/enterprise/blob/8a66d7beabe6f9b28000ef12725f3a9937d5d1ee/hr_payroll/models/hr_payslip.py#L1716-L1725 sentry-7632216317
Cash in and out receipts in Point of Sale now print even when a default printer has not been set yet. The system will choose an available fallback printer, reducing failed receipt printing during store operations.
Original PR description
## Description Fixes cash in/out receipt printing when no default printer is configured. ## Issue Previously, an early return in the printer selection logic prevented the fallback printer mechanism from being executed, causing receipt printing to fail when no default printer was configured. ## Fix Removed the early return so that the fallback printer selection logic can select an available printer before attempting to print the receipt. This ensures cash in/out receipts can be printed even when no default printer is configured. opw-6485495 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The overtime rules screen now only shows the related employee versions button to HR managers. This prevents HR officers from seeing an access error caused by data that requires manager-level permissions, improving reliability during normal use and upgrades.
Original PR description
The button requires the group `hr.group_hr_user`, but the button uses `versions_count`, that in its computation uses fields like `contract_date_start` that require the group `hr.group_hr_manager`. To avoid the mismatch, the button is restricted to only managers. This error was found in upgrades failing. To reproduce: - Install `hr_attendance`. - Assign any employee the Default Ruleset to make the button not invisible. - Change the HR security of your user to Officer. - Go to Attendance->Configuration->Overtime Rulesets and try to see the record. - A message will display the following error: ``` You do not have enough rights to access the field "contract_date_start" on Employee Record (hr.version). Please contact your system administrator. Operation: read User: 2 Groups: allowed for groups 'Employees / Administrator' ``` Forward-Port-Of: odoo/odoo#284194
The website editor now preserves the intended color styling for links that have their own color theme. This keeps the Splash Intro scroll button icon readable and prevents section styling from accidentally reducing contrast.
Original PR description
Steps to reproduce: - Drag and drop a "Splash Intro" snippet onto the page. - Inspect the scroll button. => The icon uses the `o_cc5` link color from the section. => There is not enough contrast between the arrow and the button background, making the arrow hard to see. Before this commit, color combination link rules still targeted links that were color combination roots themselves. Since [1] added `o_cc5` on the `s_splash_intro` section, its `a:not(.btn)` rule overrode the `o_cc1` scroll button color. After this commit, link color rules skip elements with `o_cc`, so a link using its own color combination keeps its own colors. [1]: https://github.com/odoo/odoo/commit/b7a4edb9fa3d task-6303725
Peruvian accounting reports now use the exchange rate already stored on each accounting entry instead of recalculating it during report generation. This reduces rounding differences and helps produce more reliable financial reporting figures.
Original PR description
Previously, the `_get_ple_report_data` method computed the currency rate when called. Since the calculation was based on the entry totals, it was prone to rounding errors. This PR makes it use the rate stored in the entry itself. This should lead to more accurate results. opw-6411322 Forward-Port-Of: odoo/enterprise#128027 Forward-Port-Of: odoo/enterprise#126882
AI chat windows now appear in front of other conversations when opened on mobile screens. This prevents chats and related AI popups from being hidden behind fullscreen editors or existing windows, making the feature easier to use.
Original PR description
AI chats opened on mobile views could appear behind other chats. This was inconsistent with the expected stacking behavior, where newly opened chats should appear on top of existing ones. To reproduce: * Open the chatter of any module. * Open the message composer in fullscreen mode. * Click the AI button. This commit increases the z-index of AI chats on mobile views so they are displayed on top of other chats. task-6412411 Forward-Port-Of: odoo/enterprise#128649 Forward-Port-Of: odoo/enterprise#128346
Chat windows now keep their normal display priority by default, but other Odoo apps can adjust how they layer on mobile screens when needed. This helps prevent chat from unintentionally covering or being covered by other interface elements in customized setups.
Original PR description
The z-index of chat windows on mobile views was previously fixed at `1020`, preventing other modules from adjusting their stacking order. This commit introduces a configurable z-index for chat windows, defaulting to `1020` while allowing other modules to override it when needed. task-6412411 Forward-Port-Of: odoo/odoo#283671 Forward-Port-Of: odoo/odoo#283178
The lunch ordering test now waits for the correct product to appear after changing location before placing an order. This prevents occasional failures caused by outdated demo products still being shown, improving test reliability without changing user-facing behavior.
Original PR description
The lunch order tour selects `Farm 1` before ordering a product. However, it only waits for the location input to be updated before clicking the first kanban record. With demo data installed, a product from the previous location can still be displayed while the product model is being reloaded. The tour can therefore order a demo product instead of the product created by the test. This notably fails during weekends when the corresponding demo vendor is unavailable. To fix we need to wait for the product created by the test before clicking it. Besides selecting the intended product, this also ensures that the product reload following the location change has completed. [error-181572 ](https://runbot.odoo.com/odoo/error/181572) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281753
The recruitment job offer screen now shows the quick assign button at the same size as the avatar image when a company is linked. This removes a small visual mismatch and makes the interface look cleaner and more consistent.
Original PR description
Before this PR, the o_quick_assign button was not the same size as the o_avatar img which makes it look like it's misaligned when there is a company associated with the job offer. task-6092395 | Before | After | |--------|--------| | <img width="1058" height="705" alt="Screenshot 2026-04-20 at 15 19 03" src="https://github.com/user-attachments/assets/31b38b78-591d-4c55-b3e8-b3888484f9a1" /> | <img width="1058" height="705" alt="Screenshot 2026-04-20 at 15 29 40" src="https://github.com/user-attachments/assets/6f78190a-be92-4eeb-9a9f-55e8f247bf1c" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283038 Forward-Port-Of: odoo/odoo#260133
This fix prevents a manufacturing test cleanup from accidentally targeting stock rules outside the intended route or company. It reduces the risk of test failures caused by trying to remove records that are still in use, improving reliability for ongoing releases.
Original PR description
`test_check_update_qty_mto_chain` was removing `stock.rule` records from other companies using `mto_route.rule_ids.search()`. Calling `search()` on a recordset does not restrict the search to the records already present in that recordset, so the domain was effectively applied to all `stock.rule` records. With demo data, this could attempt to unlink an unrelated stock rule that is still referenced by an existing stock move, causing a `stock_move_rule_id_fkey` foreign key violation. This commit restricts the search explicitly to rules belonging to `mto_route` before unlinking them. [error-940031 ](https://runbot.odoo.com/odoo/error/940031) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282930
Sales quotation and pro forma email templates now use separate full sentences for quotations and orders. This lets translators adapt grammar correctly in languages where the two terms require different wording, improving customer-facing email quality.
Original PR description
The quotation and pro forma email templates inserted either "quotation" or "order" into shared translatable text. In French, for example, "devis" is masculine while "commande" is feminine, so the surrounding articles and adjectives cannot agree with both terms. Define a complete sentence for each document state so translators can translate the surrounding grammar independently. opw-6445304 Forward-Port-Of: odoo/odoo#283901 Forward-Port-Of: odoo/odoo#283229
Fixes a report layout issue where customized sale order PDFs could show an empty column after users removed fields such as Taxes or Discount in Studio. This keeps printed sale documents cleaner and aligned with the customer’s configured report layout.
Original PR description
**Steps to reproduce:** 1. Open a Sale Order report in Studio 2. Delete the Taxes column 3. Save 4. Create a sale order with at least one section line and products that have taxes 5. Print the sale…
**Steps to reproduce:** 1. Open a Sale Order report in Studio 2. Delete the Taxes column 3. Save 4. Create a sale order with at least one section line and products that have taxes 5. Print the sale order PDF **Issue:** - A blank column is rendered in the PDF report on section (and combo) rows whenever a column such as Taxes or Discount is removed via Studio. **Why this happens:** - The section row's `colspan` and the combo row's `colspan` were computed using `3 + (1 if display_discount else 0) + (1 if display_taxes else 0)`. - `display_taxes` and `display_discount` are derived from order data (i.e. whether any line has taxes/discounts), not from which columns are actually rendered in the table. - When Studio removes a column it deletes the `<th>` and matching `<td>` elements via XPath, but these Python variables remain `True`. As a result, section/combo rows still accounted for the removed column in their `colspan`, producing one extra cell and a visible blank column. **Fix:** - Introduce a `colspan_count` variable which is incremented inside each `<th>` body - Use that counter for `td_section_name` and `td_combo_name` instead of the previous formula. - Because the increment occurs inside the `<th>` element, it is skipped whenever the element is not rendered, whether because `display_taxes`/`display_discount` is `False` or because Studio's XPath removed the element entirely. opw-6433679 Forward-Port-Of: odoo/odoo#283657 Forward-Port-Of: odoo/odoo#280719
Employees and managers can now mark multiple appraisals as done from the list view without an error. The system sends the completion notification separately for each appraisal, ensuring the process finishes reliably.
Original PR description
Steps to reproduce: - select multiple appraisals and try to mark as done from list view. Issue: - The completion notification uses an appraisal variable assigned by a previous loop, raising an UnboundLocalError. Furthermore, message_notify() requires a singleton. Fix: - notify and post the completion message for each appraisal explicitly. task-6479018 Forward-Port-Of: odoo/enterprise#128207
The accounting app now blocks fiscal year periods that fully contain an existing fiscal year. This prevents duplicate or conflicting fiscal calendar setup, helping maintain accurate reporting periods.
Original PR description
Before this commit: - The current constraint for overlap check allows if we define a new, larger fiscal year that completely swallows an existing smaller one (e.g., creating Aug 2025 - Nov 2026 when Sept 2025 - Oct 2026 already exists). After this commit: - The constrain domain was changed to consider the above missed case. no task Forward-Port-Of: odoo/enterprise#128942
Appointment invitation emails now generate public calendar links without triggering permission errors. This helps ensure attendees can receive and open their appointment invitations consistently.
Original PR description
Since calendar attendee access tokens are restricted to system users, appointment mail templates must sudo token reads when generating public calendar links. This follows the same pattern as the calendar mail templates and avoids an AccessError when rendering attendee invitation emails. ref: https://github.com/odoo/enterprise/commit/88a3cca752a5f726cd0260b485fc93f65a268cf8 Forward-Port-Of: odoo/enterprise#128959
This fix ensures French VAT submissions treat notes containing only spaces as empty. It prevents incomplete XML filings from being sent to ASPOne, reducing avoidable submission errors for businesses filing French tax returns.
Original PR description
While sending the tax return to ASPOne, before adding the BC zone we are checking that BA zone won't be empty as if BC is completed there must be the BA zone in the xml file. The problem is that when we have only whitespaces, the condition will be respected but later on due to cleanup_xml_node(), the BA zone will not be rendered in the xml but BC will and it leads to an error This commit checks that express_mention_reason fields is not empty or not only whitespaces task-6476440 Forward-Port-Of: odoo/enterprise#128242
The German tax report now keeps decimal values for the Kz83 field instead of rounding them down to whole numbers. This helps ensure submitted XML reports show accurate amounts, such as 26.40 instead of 26.00.
Original PR description
Description of the issue this commit addresses: The German tax report XML casts Kz83 to an integer before formatting it. This truncates decimal values, causing amounts such as 26.40 to become 26.00. --- Desired behavior after this commit is merged: This commit preserves the Kz83 decimal value and formats it with two decimal places in the German tax report XML. --- task-6414439 Forward-Port-Of: odoo/enterprise#125607
This fixes an issue where the HTML editor could remove inline items that looked empty because they had no text, even though they displayed visible content such as icons or images. Saved pages and content should now better retain those visual elements, reducing accidental formatting or content loss.
Original PR description
#### Description of the issue this PR addresses: - Empty inline elements were detected using only their text content, causing visible non-text content (e.g. icons, images) to be removed. #### Desired behavior after PR is merged: - Remove the empty inline attribute when an inline element contains visible content by using `isVisible`. - Use `isVisible` to detect visible content instead of relying on text content. task-6391496 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The update ensures the system always includes the required signup type when creating signup or invitation links. This prevents token generation failures that could block invited users from accessing shared project or portal content.
Original PR description
A `signup_type` is required to generate a token. Task-6452339 Forward-Port-Of: odoo/odoo#283417 Forward-Port-Of: odoo/odoo#280891
This update stabilizes an automated website test related to hiding popups, reducing occasional false failures during quality checks. It does not change the website experience for users, but helps keep development and release validation more dependable.
Original PR description
The test `undoing something on a target outside s_popup closes it` had a few fails in CI: the `fa-eye-slash` was not set as expected. This commit adds a `waitSidebarUpdated` call just before to ensure owl has no pending rendering when checking the eye. The fix is similar to aaf0f54d1feda60becb0bfbad578b366715c0172 which is about a similar failure in another test. runbot-938967 Forward-Port-Of: odoo/odoo#284381
The mail thread data endpoint now requests only the information actually needed for each user and conversation. This reduces unnecessary data handling and helps make mail discussions more reliable across access scenarios.
Original PR description
This change cleans up the requested data from `/mail/thread/data` route, ensuring it aligns with what is actually needed depending on the user and thread. part of task-6452761 Forward-Port-Of: odoo/odoo#284350 Forward-Port-Of: odoo/odoo#280713
The salary configurator now handles cases where no company bike is configured. This prevents an error when users select the company bike option and lets the offer process continue smoothly.
Original PR description
Steps to Reproduce: - install l10n_be_hr_contract_salary module. - make sure that there is no model with vehicle type bike in fleet. - create an offer in recruitment. - open salary configurator. - click on company bike checkbox. Issue: - traceback occurs when enabling the company bike option without a configured bike. Reason: - the company bike depreciated cost value is empty when no bike is available, but the code tries to split it into bike options and vehicle ID resulting in a traceback. Solution: - Use the condition to check if the company bike depreciated cost is available before spliting the value. - Set the depreciated cost to 0 when no bike is selected. task-6468987 Forward-Port-Of: odoo/enterprise#127898
The ESG HR pay gap tests now use the correct contract wage value depending on the payroll setup. This prevents false test failures and helps keep employee reporting checks reliable across configurations.
Original PR description
Without `hr_payroll`, the contract wage is stored in `wage`. With `hr_payroll`, hourly employees use `hourly_wage` instead. This commit uses `_get_contract_wage_field()` so the test sets the correct field in both cases. [error-237750](https://runbot.odoo.com/odoo/error/237750) Forward-Port-Of: odoo/enterprise#127398
The Point of Sale now automatically chooses a product option when it is the only available choice, except for multi-select options. This removes an unnecessary step for cashiers and helps products with simple variants be added to orders smoothly.
Original PR description
Before this commit: ----------- - When a product attribute had only one available value, it was not automatically selected for display types other than multi. After this commit: ------------ - Automatically select the attribute value when an attribute has a single available value and its display type is not multi, allowing the product to be added without any additional user interaction. Task-6327371 Forward-Port-Of: odoo/odoo#282350 Forward-Port-Of: odoo/odoo#272437
Archived projects no longer appear as selectable recent projects in the timesheet timer. This prevents users from accidentally logging new time on projects that have been closed or archived, keeping timesheet entries aligned with active work.
Original PR description
Steps to reproduce: ---------------------------------- 1. Install the `timesheet_grid` module. 2. Create a project and add any timesheet to it. 3. Archive the project. 5. From the systray timer,…
Steps to reproduce:
----------------------------------
1. Install the `timesheet_grid` module.
2. Create a project and add any timesheet to it.
3. Archive the project.
5. From the systray timer, click on the Project field.
Observation:
----------------------------------
The archived project is visible in the dropdown.
Issue:
----------------------------------
In Odoo, standard search views and `name_search` calls on `project.project` automatically respect `active_test=True`. When you open the timer, the frontend passes `{'timesheet_timer_search': True}` in the context to `name_search` with an empty query string. `name_search` overrides standard searching to retrieve recently used projects first by querying `account.analytic.line` via `_get_recently_used_records ('project_id', ...)`. `account.analytic.line` stores past timesheet logs. Even after a project is archived, historical timesheet records for that project still exist in `account.analytic.line`. Because `_get_recently_used_records` runs a `_read_group` query on `account.analytic.line` (which has no active field of its own), it fetched the `project_id` from historical timesheet entries without checking if the referenced project was active.
Solution:
----------------------------------
In `name_search`, explicitly append `[('active', '=', True)]` to the `project_domain` used when querying `_get_recently_used_records`. Standard form/list views using `_domain_project_id` already benefit from Odoo's default ORM `active_test=True` mechanism during standard `project.project` searches.
Note:
----------------------------------
Another solution was to add `active = true` in `getTimesheetTimerFieldInfo` https://github.com/odoo/enterprise/blob/22eb84cdc94ba334d42bad32fb491d35c8147c94/timesheet_grid/static/src/services/static_timesheet_timer_service.js#L322-L328
Fixing it in Python ensures that any call passing `timesheet_timer_search` in context (e.g. mobile widgets, custom RPCs, or python wizards) will benefit from the fix, rather than only patching a single OWL JS service.
opw-6445528
Forward-Port-Of: odoo/enterprise#127374