Daily updates from Odoo
Tuesday, August 26, 2025
20 changes
Resolved issues and error corrections
Planning calendar invites can now be exported even when a shift has no employee assigned. The system uses a safe fallback timezone, preventing an error and ensuring managers can still send or download calendar invites.
Original PR description
Currently, an error occurs when a user tries to export a calendar invite (ICS) for a planning shift that has no assigned resource. **Steps to reproduce:** - Install the `planning` module. - Go to `Planning > New`, and click `Publish & Send`. - Enable developer mode and go to `Settings > Technical > Email > Emails`. - Open the latest email record and click `iCal/Outlook`. **Error:** `AttributeError: 'bool' object has no attribute 'upper'` **Root Cause:** At [1], when no employee is assigned to the shift, `slot.employee_id` is `empty`, so `slot.employee_id.tz` is `False`, which leads to an error. This commit ensures a valid timezone is always used by selecting the current user's timezone or 'UTC' when the shift has no assigned employee. [1] https://github.com/odoo/enterprise/blob/13ce65b8ca61f9a825f2876e2727cddfae83f894/planning/controllers/main.py#L355 sentry-6781639319 Forward-Port-Of: odoo/enterprise#92984 Forward-Port-Of: odoo/enterprise#91889
Cancelling selection or numeric filter setup no longer leaves an extra side panel open. This keeps spreadsheet filter configuration cleaner and avoids confusing stacked panels for users.
Original PR description
…numeric filter Steps to reproduce: - Open the global filter side panel - Click on selection filter or numeric filter - Click on cancel => Two side panels are stacked. Commit 51f2d18f5952a63ced1ed8e1b252650cffc50c2a already fix this issue, but selection and numeric filter were forgotten. Task: 5042490
A misplaced internal method has been moved to the right area so AI-powered livechat channels can start and run properly. This fixes a regression that could prevent businesses from using AI assistance in livechat conversations.
Original PR description
[FIX] ai_livechat: move method to the correct model In 5fc0a49, `_get_or_create_ai_chat` and all the methods that it uses internally were moved from `discuss.channel` model into `ai.agent` model. However, one method `_get_ai_channel_type_domain` was not moved by mistake which prevented livechat channels with AI from working properly. This commit moves the method to the correct model (ai.agent). The commit also fixes references to the moved methods so that they are called from `ai.agent` model instead of `discuss.channel` model.
This fixes an issue in Indian GST reports where matching purchase bills by IRN could fail unexpectedly. The required matching information is now always set, helping bill matching complete reliably and avoiding runtime errors.
Original PR description
Before this IR: - When a purchase document was matched using the IRN number, the variable `matching_keys` was not defined. - This led to an `UnboundLocalError` during bill matching. After this PR: - `matching_keys` is now set together with the IRN number. - This ensures `matching_keys` is always available and prevents runtime errors when IRN matches bills. opw-5037128 Forward-Port-Of: odoo/enterprise#93051
This fix lets Odoo Quality IoT distinguish between multiple connected cameras, so businesses can use more than one camera at the same time without device conflicts. It also improves camera communication reliability by preventing a websocket error when sending camera data.
Original PR description
Due to an issue with the `CameraInterface`, the same identifier would be chosen for any connected camera (`camera-2`), meaning only one camera could be used at once. To fix this, the `camera.id`…
Due to an issue with the `CameraInterface`, the same identifier would be chosen for any connected camera (`camera-2`), meaning only one camera could be used at once. To fix this, the `camera.id` property is used as the identifier instead. The `libcamera` documentation says the following: > The camera ID is a free-form string that identifies a camera in the > system. IDs are guaranteed to be unique and stable: the same camera, > when connected to the system in the same way > (e.g. in the same USB port), will have the same ID across both > unplug/replug and system reboots. However, we will also still return the last camera with the `camera-2` identifier, so that existing device configurations in the backend don't get lost. In master we will remove this legacy identifier. You can see the legacy camera with the others in the list below: <img width="801" height="385" alt="image" src="https://github.com/user-attachments/assets/6f3a6408-bcb4-46b0-980e-b5a8881f6df0" /> In addition, another small fix was made to the `CameraDriver` to ensure a string is sent rather than raw bytes, this prevents a traceback when communicating over the websocket. task-4792552 Forward-Port-Of: odoo/enterprise#93076
Work entries are now calculated correctly for employees on flexible schedules when they record attendance during a public holiday. This prevents short gaps between attendances from being incorrectly counted as a full 8-hour work entry, improving payroll and time tracking accuracy.
Original PR description
### Steps to reproduce: - Set Marc Demo's contract work entry source to attendances and working schedule to flexible hours. - Create a public holiday with generic time off work entry type. - Create…
### Steps to reproduce: - Set Marc Demo's contract work entry source to attendances and working schedule to flexible hours. - Create a public holiday with generic time off work entry type. - Create one or multiple attendances for marc demo on the public holiday. - Regenerate work entries for marc demo for that day, the gaps in between the attendances created and the working hours will be filled with work entries with the right start/end time but duration will always be 8h. ### Cause: This is happening because when getting the duration batch for the work entry we get the attendance intervals the employee should work in that period and if the employee is flexible we will get a fake attendance with the number of hours required per day ignoring if the period is just a small period of the day ### Fix: We are checking now since the start date not monday so we don't set a fixed week start. We check if the period is less than the remaining hours we get it as it mostly means that it is less than one day opw-4887933 Forward-Port-Of: odoo/enterprise#92519 Forward-Port-Of: odoo/enterprise#90163
The payroll setup now prevents saving group insurance rates that are zero, negative, or 100% and above. This helps avoid incorrect contract payroll data and reduces the chance of downstream payroll calculation issues.
Original PR description
Prevent users from entering invalid percentages in the `l10n_be_group_insurance_rate` field by adding a `constraint` that warns the user if the input is less than or equal to 0 or greater than or equal to 100. task-4982158
When invoice OCR finds several contacts with the same VAT number, it now chooses the contact with the strongest customer or supplier relationship instead of an arbitrary match. This helps invoices link to the correct partner when companies have multiple addresses or related contact records.
Original PR description
It's possible that multiple partners are sharing the same VAT number, for example, when multiple addresses are set on it (each address will be a child `res.partner` with the same VAT number). Previously, when the OCR matched such partners from their VAT number, it would select one "at random" (based on the default sort of `res.partner`). Now, it will match the one with the highest supplier/customer rank. opw-[4954057](https://www.odoo.com/odoo/49/tasks/4954057) Forward-Port-Of: odoo/enterprise#92398
Swiss payroll declarations now include contact person details only when all required contact fields are filled in. This helps prevent incomplete information from being sent during ELM transmissions, reducing submission errors and follow-up work.
Original PR description
Contact person information should only be transmitted if all 3 fields are filled Forward-Port-Of: odoo/enterprise#93084
This fixes an access error that prevented regular users from opening the Dashboard app. Users can now view dashboards without being blocked by an internal permissions issue, improving reliability for day-to-day reporting.
Original PR description
Steps to reproduce: - login as a regular user - open the Dashboard app -> "You are not allowed to access 'Model Data' (ir.model.data) records." runbot-error-230950
This update makes the AI live chat handling more reliable by separating how the system finds different types of AI chat channels. It also cleans up internal access to AI chat actions, reducing the chance of incorrect chat matching while keeping the user experience unchanged.
Original PR description
- In bc4929a0, controller methods were added to call 'post_error_message' , 'close_ai_chat' and 'generate_response' and all orm.call usages that referenced these methods were turned into rpc calls.…
- In bc4929a0, controller methods were added to call 'post_error_message' , 'close_ai_chat' and 'generate_response' and all orm.call usages that referenced these methods were turned into rpc calls. Hence, the visiblity of these methods can be changed to private. Note: 'generate_response' was also renamed because there is already a private '_generate_response' method. - The `_get_or_create_ai_chat` method was changed to receive channel_id parameter to be used for retrieving the ai chat channel if exists. However, this caused a bug because the more than one chat channel could be retrieved by the channel while all the flows that depend on`_get_or_create_ai_chat` expect only one. To fix this, retrieving an ai chat channel was separated into two methods. - `_get_ai_chat_channel` which retrieves channels of type `ai_chat`. All the flows ensure that there will only be one `ai_chat` channel. - `_get_ai_channel_from_id` which receives channel_id parameter and retrieves the ai channels of any type, namely `ai_chat` or `livechat`.
Belgian payroll users now see a clear error when trying to change an employee's working schedule without a contract start date. This prevents an unexpected system crash and guides users to correct the missing employee contract information first.
Original PR description
Prevent the apparition of a traceback when changing the schedule through the wizard Forward-Port-Of: odoo/enterprise#91880
The contract offer screen now hides the signature request button for users who cannot access the related request. This prevents users from clicking a button that would lead to an error, while keeping it visible for authorized users such as signature administrators.
Original PR description
Before this PR, when logged in as a different user from the one responsible for counter-signing the contract, the smart button still showed, and clicking on it caused an error. This PR fixes that, by hiding the smart button when there are no accessible signature requests. Note that sign admins will still be able to see the smart button; users with access to the signature request. Task-4966129 Forward-Port-Of: odoo/enterprise#90819
A missing setting was added to Point of Sale Enterprise tests so they run correctly during automated builds. This helps prevent false build failures and keeps quality checks reliable without changing customer-facing behavior.
Original PR description
steps to reproduce: 1. install pos_enterprise 2. run the test `test_should_not_affect_other_pos_config` or `test_is_header_or_footer_to_false` this commit adds the missing_field `account_tax_return_journal_id` to the test build_error-230301 Forward-Port-Of: odoo/enterprise#90995
The Swiss payroll accounting test setup now gives the test user the needed payroll permissions. This prevents a known automated test failure caused by missing access rights, helping keep payroll-related releases stable.
Original PR description
steps to reproduce: 1. install l10n_ch_hr_payroll_account 2. run test_ema_declaration_2021_11 test added payroll user and manager groups to the test user to avoid missing access rights error build_error-230682
Employee referral progress now reflects the applicant's actual recruitment stage, including when an applicant is moved back to an earlier stage. This prevents employees from seeing incorrect completed stages and helps ensure referral points and notifications stay accurate.
Original PR description
**Steps:** - Install the hr_referral and hr_recruitment modules. - Open a referred applicant from the Recruitment module. - Create a new stage and place it before the applicant’s current stage. -…
**Steps:** - Install the hr_referral and hr_recruitment modules. - Open a referred applicant from the Recruitment module. - Create a new stage and place it before the applicant’s current stage. - Move the applicant back to the newly created stage. - Open the Referral view for the referring employee. **Description of the issue/feature this PR addresses:** Even though the applicant is moved back to a newly created stage, the referral view still shows the previous (later) stage as completed. The new stage is not reflected, leading to incorrect stage tracking in the referral module. **Cause:** The `use_in_referral` field in the `hr.recruitment.stage` model controls whether points are updated for a stage. Stage checkbox in the referral view depend on these points. **Fix:** This PR updates the logic to: - Allow stage point updates even when the applicant moves back to a previous stage. - Ensuring that points are awarded for all use_in_referral stages skipped when jumping from one to any non-referral stage. - Ensure that points are added or removed properly and even sending notification based on the `use_in_referral` field. task-4968602
Employees can no longer create time off requests through a shortcut when the time off type requires an approved allocation. This keeps all request entry points consistent and helps prevent leave balances from being bypassed.
Original PR description
Steps: - Navigate to Time Off > Configuration > Time Off Types. - Open a time off type that requires allocation. - Click on the 'Time Off' smart button and try to create a request. Issues: - Employees could create time off requests via the smart button even without an approved allocation. - This bypassed the existing restriction enforced in the standard time off request creation flow. Fix: - Added a constraint on the time off model to validate allocations even when requests are created via the smart button. - Ensured validation covers both allocation presence and allowed negative leaves - Raised a ValidationError when no valid allocation is found. - Added a test case to ensure constraint behaves correctly. - Adjusted some of tests to comply with the new validation. Task - 4671236 Forward-Port-Of: odoo/enterprise#92377 Forward-Port-Of: odoo/enterprise#89975
Fixed an issue where opening return links from the dashboard showed the audit-style view instead of the tax return view. This ensures users land on the expected screen and can continue their tax return work without confusion.
Original PR description
When users click on the return links on the dashboard, the audit-style view is opened instead of the tax returns one. task-id: 5016400
The automated accounting walkthrough was adjusted so it opens the correct menu during nightly testing. This helps keep quality checks stable and reduces false build failures for the accounting area.
Original PR description
The nightly build were failing due to the wrong menu being opened, the solution is to use a more generic filter for the Add button, this is not a perfect solution as it will also select add button on other views that we dont want. task-4822215
A small issue in the Documents app was corrected to ensure document-related database queries run as intended. This helps prevent errors in affected document operations and improves reliability without changing the user experience.
Original PR description
odoo/odoo#219105