Daily updates from Odoo
Tuesday, August 26, 2025
14 changes · master
Enhancements to existing features
Payroll teams can now manage salary adjustments directly from an employee record in a dedicated tab. The new view shows key details such as type, dates, amount, payment progress, remaining periods, and status, making salary attachment follow-up clearer and more centralized.
Original PR description
- Add a tab Salary Adjustments in the employee - Add a list view with Type, Start, Note, Amount, Until and Status (optional hide, Amount Paid (computed from payslips lines), Periods Left, End Date) -Add a line opens a form view popup. One column for the inputs, the other is for the description Task: 4930543
Brazilian localization users can now set a CFOP code directly on operation types, giving businesses more control over how fiscal operations are classified. This value is used consistently in tax calculation and electronic invoicing, reducing manual corrections and helping align invoices with local tax requirements.
Original PR description
In this PR: - Added `l10n_br_cfop_code` field to operation types in form view for providing users with greater flexibility in selecting the appropriate CFOP. - Modified Avatax tax calculation service to send the custom CFOP value when configured, overriding automatic determination. - Updated invoice line CFOP computation logic to prioritize operation type override over standard Avatax response. - Modified EDI submission to preserve CFOP overrides by re-applying them when reusing stored Avatax tax calculation data. Task-4947957
French VAT report exports now combine tax declarations and related reimbursement requests into one submission. This reduces duplicate export steps and improves tracking of each included document through the external filing process.
Original PR description
This commit merges the tax export and tax reimbursements into a single export. New model `account_report_async_document` was created for handling document specific fields, like `deposit_uid`, `declaration_uid`, `state`, and the logs, as these fields are set from the response of the ASPone API. Before this commit, we couldn't merge multiple documents into a single export due to these fields. These fields were removed from the `account_report_async_export` models and moved to the `account_report_async_document`. Also, most methods in `account_report_async_document` are taken from `account_report_async_export` with minimal changes. The export creation was modified to account for handling multiple documents. task-4546529
Manufacturing planners can now open a suggestion pop-up in the Master Production Schedule to estimate and fill forecasted demand for a selected product. Suggestions use historical or actual demand across periods, helping teams plan faster and with less manual entry.
Original PR description
This PR enables the user to use a pop-up suggestion for the MPS. The tool suggests for the user the forecasted demand and fills it out in all periods for the chosen product in the MPS based on historical demand (last year, before last year or actual demand). If the user chooses to apply the suggestion for a certain period and not all the periods in MPS, the suggestion will be based only on last year. Task-4827486
The departure process now gives HR teams the option to remove a departing employee’s linked user account when archiving the employee. This helps streamline offboarding and reduces the chance of inactive staff retaining system access.
Original PR description
When you archive an employee and he has a user we need to have the ability to remove this user from the departure wizard Task: 4680081
Mexican accounting now uses dedicated accounts for credit notes, discounts, bonuses, returns, and certain POS re-invoicing entries instead of mixing them with regular sales. This helps businesses comply with local accounting rules and better see how much revenue was reduced by these operations, while allowing users to customize the default accounts.
Original PR description
[IMP] l10n_mx_*: provide different account for credit notes modules: l10n_mx_reports, l10n_mx_edi, l10n_mx_edi_pos When handling credit notes for accounting purposes it's not correct (or even legal…
[IMP] l10n_mx_*: provide different account for credit notes modules: l10n_mx_reports, l10n_mx_edi, l10n_mx_edi_pos When handling credit notes for accounting purposes it's not correct (or even legal in mexico) to use the same account for anything related to credit notes (discounts, bonuses or returns). Instead, all of these are accounted for in a different account that reduces the sales but also tell us how much of the sales were reduced by this account. This commit provide an account for these cases, and make it customizable for the user to set the account he wants (with a setting in the 'Default Accounting' section). Also, POS returns are now associated with this account. A second account is created to handle the "re-invoicing" concept: when a pos order is done and the session is closed, if the customer wants to self-invoice the system perform a reversal of the session and create 2 new invoices, 1 for the customer and 1 for all other orders from the original session. The new account is associated to the debit lines of the reversal (not vat), the credit lines of the customer invoice (not vat) Task-4576187
Users can again mark individual invoices or journal items so they do not trigger customer payment follow-ups. Follow-up reports, exports, and reminder emails now exclude those marked items, while entries without due dates are shown as due rather than overdue.
Original PR description
During the [rework of the follow-up report][1], we removed the "No Follow-Up" field from journal items, making it impossible to exclude individual journal items from triggering a follow-up. In the…
During the [rework of the follow-up report][1], we removed the "No Follow-Up" field from journal items, making it impossible to exclude individual journal items from triggering a follow-up. In the related community commit, we re-introduce a field for that, since it is a common requirement to be able to exclude individual items from the follow-up reports. In this commit we do the following: 1. Adapt the Follow-Up Report and Customer Statement variants of the Partner Ledger to add a toggle for the "No Follow-Up" field on each report line, that toggles the field on the corresponding journal item(s). 2. Prevent the follow-up status on the partner to change when all of the overdue journal items are marked as "No Follow-Up". 3. Make sure users can toggle the "No Follow-Up" setting on the invoice level when opening the "Overdue Invoices" view from the partner's "Accounting" tab. 4. Make sure all receivable/payable lines without a due date (either from a manual miscellaneous entry or a PoS entry) are put under the "Due" section is the Follow-Up Report instead of the "Overdue" section. Since there is no due date, they can't be overdue. [1]: https://github.com/odoo/odoo/commit/67dc71588751c9f115e09959d774686c2207a1f9 [task-4632300](https://www.odoo.com/odoo/project.task/4632300) Related to https://github.com/odoo/odoo/pull/203329
Audit report PDFs now include the styling needed to display edited content more consistently and professionally. Layouts, checklists, icons, tables, and common formatting options render more clearly, making reports easier to read and present.
Original PR description
This commit embeds the required Bootstrap assets into the HTML pages used for generating audit report PDFs. By leveraging Bootstrap's styles, the reports now have a cleaner, more professional appearance, and many of the blocks from the HTML editor are rendered with consistent, high-quality formatting. The column layout (`/column`), the checklists (`/checklist`), the icons (`/image`), etc will be displayed properly on the PDF. In addition to that, the tables will span over the entire page width making them more readable and some of the Bootstrap utility class will now also be supported (such as `bg-100`). Note: `wkhtmltopdf` does not support CSS variables, which prevents some Bootstrap rules from applying as intended. To address this, `bootstrap_review_report.scss` includes targeted workarounds to replace certain variable-based properties, ensuring the styles remain consistent in the PDF output. Task-4989809
Resolved issues and error corrections
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 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
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
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