Daily updates from Odoo
Navigate
Branch
Thursday, October 2, 2025
222 changes
10 changes
Resolved issues and error corrections
The recruitment talent record’s open applications button now shows the same set of related applications as the displayed application count. This prevents users from seeing a mismatch between the number shown and the applications opened, making candidate follow-up more reliable.
Original PR description
`_get_similar_applicants_domain` used in `action_open_applications` did not return the same domain used in `_compute_application_count`. Fixed by complementing the domain within `_get_similar_applicants_domain` used in the action to include applications with the same associated `pool_applicant_id` as the current applicant/talent. Task-5092128
This fix prevents an error from appearing when users edit the refusal email for a job applicant. The unavailable option to save that edited message as a template is hidden in this version, allowing the refusal process to continue smoothly.
Original PR description
Steps to reproduce: - open any applicant in recruitment app - click on refuse button - enable send email toggle key - edit the message - try to save the template Issue: - traceback pop ups and not able to save the template Reason: - The method 'open_template_creation_wizard' is missing, causing the error when trying to save the template. This method was not implemented. Solution: - Remove the 'save the template' feature for this version by adding the context. It require two fields which are not present in the current model, thus avoiding the error. task-4948736
The employee payroll form once again shows the Patrena code field needed for Belgian payroll processing. Related payroll provider codes for UCM and SD Worx were also rearranged so they appear more clearly, two per row, making the form easier to use.
Original PR description
Restored the Patrena code field and arranges the other related codes (UCM & SD Worx) so that they are displayed two per row. task-5052003
Fixes the Belgian payroll working schedule change flow so users are taken back to the employee form with the new version selected after validation. This avoids landing on an outdated version list and makes it easier for HR users to continue their work in the right place.
Original PR description
…dule change The working schedule change wizard was redirecting to a list of version when validating. This was the old behavior with the contract. Instead, redirect to the employee form view with the new version selected. task-5126204
Attendance officers who are not HR officers can now create, edit, and delete attendance records for employees they manage without running into access errors. This helps delegated attendance management work as intended while keeping the permission expansion limited to the necessary attendance flow.
Original PR description
…rs to create attendances Because creating attendance records requires access to the `version_ids` field on the employee and subsequently `hr.version` records, which require `hr.group_hr_user` group on the user. This change runs said flow in sudo mode only if the user has `hr_attendance.group_hr_attendance_officer` or it's implying groups. task-5071058 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now open Time Off from an employee profile without encountering a Missing Record error. This ensures the Time Off page uses the correct employee context, improving reliability for HR self-service workflows.
Original PR description
**Steps to reproduce (without demo data):** - Install hr_holidays - Go to "My Profile" - Open "Time Off" **Issue:** Accessing Time Off from a user profile triggers a `Missing Record` error. **Cause:** The system was passing the user’s active_id to the employee record incorrectly. **Fix:** Now, when the context's active_model is 'hr.employee', the correct active_id is applied. **Commit issue:**https://github.com/odoo/odoo/pull/225839 Forward-Port-Of: odoo/odoo#229497
This fixes the favorite star in spreadsheet dashboards so it immediately shows the correct selected or unselected state after a tap on mobile devices. The change removes confusing visual feedback and makes the mobile experience consistent with the rest of Odoo.
Original PR description
The star icon on mobile would have a strange behaviour. After clicking it, the star would not change between filler/not filled until clicking elsewhere. It turns out that on mobile, after a click the hover rule is applied. And our hover rule would modify the icon to be the opposite of what it should be. This commit changes the CSS to use the same css as `BooleanFavoriteField` to stay consistent with the rest of Odoo. Task: [5092945](https://www.odoo.com/odoo/2328/tasks/5092945) 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#227663
The Fleet app’s vehicle kanban view now opens the contracts button correctly. This helps users access vehicle contract information from the dashboard without confusion or extra navigation.
Original PR description
Fix contracts button in vehicle kanban Task-5109335 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228341
Recurring subscription billing now skips subscriptions linked to archived companies. This prevents customers from being invoiced for companies that are no longer active, reducing billing errors and follow-up corrections.
Original PR description
## Issue: When a company with active subscriptions is archived, the recurring invoicing cron still processes these subscriptions. Subscriptions for archived companies must not be invoiced. ## Steps to reproduce: 1. Create a company A. 2. Create a subscription for company A with next invoice date <= today. 3. Archive the company. 4. Run the scheduled action "Sale Subscription: generate recurring invoices and payments". 5. Unarchive the company and check the subscription. It should not have been invoiced. (Adjust the user's Allowed Companies if needed to access it.) backport-of: a93e7ec opw-4904325 Forward-Port-Of: odoo/enterprise#95408
This fix ensures that updating followers across multiple records correctly handles removals without losing pending changes. It prevents inconsistent subscription results when several items are updated at once, improving reliability for Mail-related workflows.
Original PR description
When updating `message_partner_ids` on a batch of records, the previous implementation of the inverse method could lead to incorrect results if the new value implied unsubscription. The `message_unsubscribe()` method, called inside the loop over the records, unlinks `mail.followers`. This `unlink` operation invalidates all the fields cache. As a result, when processing the next record in the batch, its cached fields (the new value of `message_follower_ids`) were erased, causing the logic to fail. This commit fixes the issue by postponing all unsubscription operations. opw-5050023 Forward-Port-Of: odoo/odoo#227499
17 changes
Enhancements to existing features
This update improves how Point of Sale orders handle taxes, fiscal positions, product configuration, receipts, and customer display information. It helps make checkout totals and order details more consistent across related POS flows such as restaurant bills, events, loyalty, sales, and self-ordering.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves Point of Sale behavior across several localization and payment areas, including certified scale display, Italian fiscal documents, Belgian blackbox flows, and settling due amounts. These changes help stores meet local compliance requirements and provide smoother checkout/payment handling.
Approved leave that uses a work leave type will no longer automatically create a timesheet entry. This keeps timesheet records cleaner and avoids extra entries for time off that should not be tracked as worked time.
Original PR description
When a leave using a work leave type is approved, now it should not create a timesheet. task-5097482 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229568 Forward-Port-Of: odoo/odoo#229300
Resolved issues and error corrections
The mobile dashboard favorite star now updates immediately when tapped, instead of appearing stuck until the user taps elsewhere. This makes saving or removing favorite dashboards clearer and consistent with the rest of Odoo.
Original PR description
The star icon on mobile would have a strange behaviour. After clicking it, the star would not change between filler/not filled until clicking elsewhere. It turns out that on mobile, after a click the hover rule is applied. And our hover rule would modify the icon to be the opposite of what it should be. This commit changes the CSS to use the same css as `BooleanFavoriteField` to stay consistent with the rest of Odoo. Task: [5092945](https://www.odoo.com/odoo/2328/tasks/5092945) 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#227663
The fleet vehicle kanban view now opens or handles vehicle contracts correctly from its contract button. This removes a small usability issue for fleet managers who need quick access to contract information from vehicle cards.
Original PR description
Fix contracts button in vehicle kanban Task-5109335 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228341
This fixes a display issue where custom text fields added to sales order lines did not show tooltips when users hovered over them. The change restores the expected tooltip text, making customized sales order views easier to read and use.
Original PR description
## Versions 18.0+ ## Issue No tooltip can be displayed on Sale Order Lines. ## Steps to reproduce *Install Studio* - Open any SO; - Open Studio: - Click "Edit List view" on the Order Lines table; - Add a "Text" field in the columns; - Close Studio. - Add a product line if none: - Write something in the new column added with Studio; - Hover that cell and see no tooltip appear ## Cause https://github.com/odoo/odoo/blob/4daf4824a70ef679f65d5cbb15d71bc55c1e760e/addons/web/static/src/views/list/list_renderer.xml#L250 The template calls `getCellTitle` which returns a formatted text but has been overridden. These methods call the original `getCellTitle` method but don't return the formatted value. opw-4921113 Forward-Port-Of: odoo/odoo#225550
A test for settling customer dues in Point of Sale now uses the current order number instead of a fixed, date-sensitive value. This prevents false build failures when tests run in different time contexts, improving release reliability without changing user-facing behavior.
Original PR description
test was failing because the order name was hardcoded to "TSJ/2025/00001". This value includes a date-dependent year and sequence number, which vary based on context_today. this will ensure that the tour dynamically generates the order name based on the current year, making it correct for faketime builds build_error-230717 <img width="1366" height="768" alt="image" src="https://github.com/user-attachments/assets/9822763c-9c78-4589-a72a-8ac207c009d7" />
This fix makes automated tests run consistently whether or not demo data is installed. It reduces the risk of false test failures caused by default user permissions being expanded during demo setup, helping teams validate changes with greater confidence.
Original PR description
The tests should not be impacted by the demo data however it is currently the case. Indeed, a lot of groups are added to the default group user when installing the demo data. Instead, we only take the user group like it is the case when no demo is installed.
Odoo Mail no longer crashes when a new message arrives while the browser tab is out of focus. This keeps messaging stable and avoids interruptions when the system checks whether a message has already been seen.
Original PR description
Backport of #213607. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229504
Recurring subscription invoicing now skips subscriptions linked to archived companies. This prevents customers from being billed while their company record is inactive, reducing incorrect invoices and follow-up corrections.
Original PR description
## Issue: When a company with active subscriptions is archived, the recurring invoicing cron still processes these subscriptions. Subscriptions for archived companies must not be invoiced. ## Steps to reproduce: 1. Create a company A. 2. Create a subscription for company A with next invoice date <= today. 3. Archive the company. 4. Run the scheduled action "Sale Subscription: generate recurring invoices and payments". 5. Unarchive the company and check the subscription. It should not have been invoiced. (Adjust the user's Allowed Companies if needed to access it.) backport-of: a93e7ec opw-4904325 Forward-Port-Of: odoo/enterprise#95408
This fixes an issue where changing followers on multiple records at once could incorrectly leave some followers subscribed or unsubscribed. The mail module now handles removals after processing the full batch, making follower updates more reliable for users working with multiple records.
Original PR description
When updating `message_partner_ids` on a batch of records, the previous implementation of the inverse method could lead to incorrect results if the new value implied unsubscription. The `message_unsubscribe()` method, called inside the loop over the records, unlinks `mail.followers`. This `unlink` operation invalidates all the fields cache. As a result, when processing the next record in the batch, its cached fields (the new value of `message_follower_ids`) were erased, causing the logic to fail. This commit fixes the issue by postponing all unsubscription operations. opw-5050023 Forward-Port-Of: odoo/odoo#227499
This update adjusts automated tests so they no longer depend on demo/default user group settings. It helps ensure Helpdesk timesheet and Swiss payroll checks run consistently across different test environments, reducing false failures without changing customer-facing behavior.
Original PR description
The community counter part makes the tests independent from `env['res.users']._default_groups()`. `helpdesk.group_helpdesk_manager` is the only group that is given to `base.default_user_group` in the master data (is that normal?), so we need to give it explicitly in the tests since we don't rely on the default user groups anymore in tests
This fixes an issue in the website/page editor where the color picker closed unexpectedly while previewing background colors on table cells. Users can now choose table cell background colors without interruption, making table formatting smoother and more reliable.
Original PR description
Problem: When applying a background color to a `td`, the color picker dismisses unexpectedly. Cause: After c810b0c17b2f882b0ab5d073ba38464bffb0617e, we rely on the class `o_selected_td` to check if…
Problem: When applying a background color to a `td`, the color picker dismisses unexpectedly. Cause: After c810b0c17b2f882b0ab5d073ba38464bffb0617e, we rely on the class `o_selected_td` to check if we are in a selected `td` to keep the toolbar open. However, in another fix (254efd86cd1ce871807fdc25479ebc5beeb4eab3), we removed that class during the color preview operation. Previewing a color on a `td` triggers a selection change, which runs `shouldBeVisible`. Since `o_selected_td` is not found, the toolbar closes along with the color picker. Solution: Update https://github.com/odoo-dev/odoo/commit/254efd86cd1ce871807fdc25479ebc5beeb4eab3. A better fix is to use `o_selected_td_bg_color_preview` which will undo the `box-shadow` when we preview a color. Steps to reproduce: 1. Add a table. 2. Select a cell. 3. Apply a background color. 4. Select the cell again. 5. Hover a color to preview. → The color picker dismisses once a color is hovered. opw-5066309 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225827
This fixes an issue where increasing the quantity on a sales order using a customized warehouse route could create an incorrect extra delivery quantity. Businesses using multi-step deliveries and custom internal routes will now get the right remaining quantity to pick and ship, reducing fulfillment errors.
Original PR description
**Steps to reproduce:** - enable multi-step routes setting. - navigate to warehouse management/locations create a new location (the "test location"). - select "internal location" for the location…
**Steps to reproduce:** - enable multi-step routes setting. - navigate to warehouse management/locations create a new location (the "test location"). - select "internal location" for the location type. - select WH for the parent location - navigate to warehouse management/warehouses and select the warehouse corresponding to WH. - set the warehouse in 3 steps delivery. - click on the routes smart button. - click on the "deliver in 3 steps (pick+pack+ship)" route. - add a rule, for the action select "push to", for the operation type select "internal transfers", for the source location select the "test location" you just created and for destination location select "WH/Output". - save. - create a storable product and set an on-hand quantity - create a new sale order for 1 quantity of this product and confirm it - click on the picking smart button, change the destination location to the test location and validate - open the sale order and change the quantity to 3 **Current behavior:** A new picking is created from stock to packing zone (which is the expected behavior) but the quantity is 1 **Expected behavior:** The quantity should be 2. If we only increase the quantity by 1 on the sale order it does not even create the new picking **Cause of the issue:** The warehouse_id field is invisible in stock.rule form view when the action is push. Therefore, the rule is created without a warehouse_id. Also, moves created from a rule have the same warehouse_id as the rule. https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/stock/models/stock_rule.py#L275 So, when we validated our first move (from stock to the test location), this created a second move (from test location to output) that does not have a warehouse id (because it was created from our own push rule that we created). When we update the quantity of the sale ordre line, _action_launch_stock_rule calls _get_quantity_procurement to compute the current quantity on the moves. This method then calls _get_outgoing_incoming_moves to get the initial move created from the rule. In this case this should return only the first move created. But because the second move does not have a warehouse_id, it's rule.id is added to triggering_rule_ids. https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/sale_stock/models/sale_order_line.py#L315-L317 And the move is later added to the outgoing moves that will be returned. https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/sale_stock/models/sale_order_line.py#L322-L329 So the two moves are returned and the sum of the quantities of the moves is 2 instead of 1. https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/sale_stock/models/sale_order_line.py#L292-L294 So the product quantity for the procurement will be 1 (3-2) instead of 2 (3-1). https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/sale_stock/models/sale_order_line.py#L386 opw-5039249 Forward-Port-Of: odoo/odoo#228812 Forward-Port-Of: odoo/odoo#227421
Inventory revaluation calculations now keep full precision until the final result is ready. This prevents small rounding differences from accumulating into incorrect or negative valuation amounts, improving the reliability of stock accounting.
Original PR description
Before this commit, the remaining_value_unit_cost was rounded before any computation. In the case where the numer of layers with remaining value and remaining quantity increase, the rounding error introduced by that rounding quickly explodes, leading to a negative remaining_value during revaluation computation. After this commit, the remaining value is rounded at the end, after the computations and the checks. This ensures that the rounding error remains constant and does not accumulate over the execution of the method. opw-4901966 Forward-Port-Of: odoo/odoo#228767 Forward-Port-Of: odoo/odoo#222690
The automated guided test for the accountant merge wizard now waits for the final step to complete before closing. This reduces false failures in validation runs and helps keep accounting-related releases more stable.
Original PR description
The last check of the tour is always true. So it sometimes closes too early. Wait really for the last operation for the last check runbot-error-108440 Forward-Port-Of: odoo/enterprise#95991
Uploaded file fields added to field service worksheet templates now appear correctly in the customer-facing worksheet report. This ensures customers and staff can see attached files during report review and signing, avoiding missing information in the portal.
Original PR description
Steps to reproduce: ------- - Install industry_fsm_report module - Open FSM app - Select worksheets from settings in the configuration - Go to worksheet templates in the configuration - Create a worksheet template - Click the design template button. You arrive in the studio - Add file field and close it - Create a new task and select a newly created template in the worksheet template - Click the worksheet button in the control panel - Upload a file and save it - Click on the sign report button - Here file field is not visible Issue: ------- The file field is not visible in the worksheet portal. Cause: ------ The view of the file field is not created for the worksheet portal. Solution: ------- Created the view of the file field to display in the worksheet portal. task-3691529 Forward-Port-Of: odoo/enterprise#95754 Forward-Port-Of: odoo/enterprise#56035
3 changes
Resolved issues and error corrections
Helpdesk ticket lists now sort ticket references in a way that matches user expectations, especially after ticket numbers pass 100. This makes it easier for teams to find the oldest or newest tickets without confusing number ordering.
Original PR description
**Issue** With the default `helpdesk.ticket` sequence, once users reach 100 tickets, ordering tickets by `ticket_ref` in the list view is unintuitive as it is a Char field (so '11' > '100') and the results are not useful if the user wants to see the oldest/newest tickets. opw-4891916 Forward-Port-Of: odoo/enterprise#95548 Forward-Port-Of: odoo/enterprise#93058
The recurring invoicing process now ignores subscriptions linked to archived companies. This prevents invoices from being generated for companies that are no longer active, avoiding billing mistakes and follow-up corrections.
Original PR description
## Issue: When a company with active subscriptions is archived, the recurring invoicing cron still processes these subscriptions. Subscriptions for archived companies must not be invoiced. ## Steps to reproduce: 1. Create a company A. 2. Create a subscription for company A with next invoice date <= today. 3. Archive the company. 4. Run the scheduled action "Sale Subscription: generate recurring invoices and payments". 5. Unarchive the company and check the subscription. It should not have been invoiced. (Adjust the user's Allowed Companies if needed to access it.) backport-of: a93e7ec opw-4904325 Forward-Port-Of: odoo/enterprise#95408
This fix prevents completed signature requests from being deleted after they have been signed. It helps preserve important signed documents and avoids accidental loss of business records.
Original PR description
backport of https://github.com/odoo/enterprise/commit/b2d32811877cdf1649095435ce16274ae96421f3 opw-5111568 Forward-Port-Of: odoo/enterprise#95922
35 changes
New functionality added to Odoo
This work appears to introduce or adjust offline user interface behavior, helping users understand or continue work when connectivity is unavailable. Because the pull request is still marked as work in progress and includes a revert, the final business impact is uncertain.
Egypt employee benefit costs now include housing, transportation, and other allowances, giving companies a more complete view of total employment cost. The payroll interface also clarifies benefit labels and tooltips, and employer cost calculations now include relevant contribution and tax deduction rules.
Original PR description
Include Housing , Transportation, Other allowances to the benefits costs for the EG employees Task: 5061791
Enhancements to existing features
This change updates several customer-facing document and email templates across appointment scheduling, electronic invoicing, stock delivery guides, and signatures. It likely improves consistency or corrects wording/layout in these documents, with limited business impact beyond clearer communications and compliant-looking outputs.
Validated work entries in the Gantt and calendar popovers now include a direct link to the related payslip. This makes it easier for payroll users to trace which payslip locked an entry and review it without extra navigation.
Original PR description
Before: - From the work entry gantt and calendar view, there was no way to directly access or identify the related payslip. - This made it difficult for users to trace or review the payslip that locked the work entry. After: - Added a "View Payslip" button in the work entry gantt and calendar popover for validated entries. - Allows users to quickly navigate to the associated payslip directly from the work entry screen. Task-5035337
Payslips with negative net amounts now surface this concern in the standard payslip issues area instead of as a separate warning. This makes payroll checks more consistent and easier for payroll teams to review before reporting or processing.
Original PR description
This moves the previous warning "negative net amount to report" to the new issues system on payslips. Task: 5068686
This update reorganizes how chat channel membership information is stored and accessed in Discuss-related features. It supports cleaner internal data handling for messaging integrations like AI and WhatsApp, helping future improvements be easier to maintain without changing the user experience.
Original PR description
Part of task-4675831 PR community: https://github.com/odoo/odoo/pull/229208
The automatic currency rates provider has been changed to xe.com. This improves how exchange rates are retrieved for accounting-related workflows, helping businesses keep currency conversions up to date.
Original PR description
Changed the Automatic Currency Rates service to xe.com task-id: 4745275 Forward-Port-Of: odoo/enterprise#90006
This update replaces an outdated template instruction across many Odoo Enterprise apps with the current supported equivalent. The change helps keep reports, emails, and portal pages maintainable and compatible without altering day-to-day business workflows.
The AI module can now process tabular attachments such as CSV files more effectively by reading rows with their column headers. This helps uploaded data sources be split into useful sections, improving how AI agents understand and use spreadsheet-like business information.
Original PR description
This PR aims to properly support and chunk tabular attachments including csv, xls, xlsx, and ods attachments. task-id-5045336
Appointment pages now show more helpful empty-state screens with consistent visuals, explanatory text, and clear action buttons for website editors. This makes it easier for editors to understand what is missing and quickly create the needed appointment content, while visitors do not see editor-only actions.
Original PR description
Previously, empty state screens featured only a title, e.g., "Product not defined", accompanied by an alert prompting users to select the "+New" button in the top-right Odoo navbar. Users would then either fill out a form or get redirected to the backend page to perform the desired action. With this commit, we make all those empty screens more consistent and bring a new structure, being; - New (milky) Iconography (provided by EDI) which adapts its colors based on the user's website theme color palette. - Title - call-out/subtitle (if included) - Button/call-to-action for editors (like «add», «create» , «write»..) This button always appears in Odoo's primary color, irrespective of the user's theme palette, ensuring it remains distinctive and easily recognizable for website editors. This button remains always hidden for website visitors. This commit handles the appointment empty states screens only. Related: odoo/odoo#136248 task-3378285
Resolved issues and error corrections
Fixes an error that could occur when users edited budget amounts after switching between date ranges in the Budget report. The change keeps monthly budget items aligned correctly, preventing duplicate incomplete records and allowing users to continue editing budgets reliably.
Original PR description
Currently, an error occurs when user editing the budget report items. Steps to Reproduce [Video](https://drive.google.com/file/d/1bz0GEQjwxQrckzcEHdYPfvaA5M43lmFF/view): - Install the `Accounting`…
Currently, an error occurs when user editing the budget report items. Steps to Reproduce [Video](https://drive.google.com/file/d/1bz0GEQjwxQrckzcEHdYPfvaA5M43lmFF/view): - Install the `Accounting` module. - Go to `Profit and Loss` > `Budget` and `create a budget`. - Select `custom dates (e.g., start: 01/01/2025, end: 12/10/2025)` and change the amount of a budget line. - Change the `date range (e.g., start: 01/10/2025, end: 12/10/2025)` and change the amount again. - `Switch back to the first date range` (start: 01/01/2025, end: 12/10/2025) and try changing the amount once more. `TypeError: unsupported operand type(s) for +: 'float' and 'NoneType'` This error occurs when a user editing the budget report items. When user enters a date period, the system creates budget items for the first date of every month within that range. If the user then changes the date period to the next date of the same month, the system attempts to fetch the existing budget item `[1]` for that range. However, due to the start date alignment, it fails to fetch the correct budget item and instead creates an extra one `[2]`. Later, when the system checks again from the first date of the same month as the start date, it finds this extra budget item, for that the amount is None, which raises the error `[3]`. This commit ensures that when fetching existing items and generating the start month dates `[4]`, the system always uses the first day of the month as the `start date` so that the flow is maintained.. [1]- https://github.com/odoo/enterprise/blob/1df83837a2aec4801b34a9a7ab0cd68f640b4fd6/account_reports/models/budget.py#L44-L49 [2]- https://github.com/odoo/enterprise/blob/1df83837a2aec4801b34a9a7ab0cd68f640b4fd6/account_reports/models/budget.py#L75-L79 [3]- https://github.com/odoo/enterprise/blob/1df83837a2aec4801b34a9a7ab0cd68f640b4fd6/account_reports/models/budget.py#L72 [4]- https://github.com/odoo/enterprise/blob/1df83837a2aec4801b34a9a7ab0cd68f640b4fd6/account_reports/models/budget.py#L58-L61 sentry-6883207225 Forward-Port-Of: odoo/enterprise#95090
This fix restores the initialization needed for Turkish accounting reports to load correctly. It prevents failures in reports such as the Turkish General Ledger, helping users access required local reporting functionality again.
Original PR description
## Before this commit: The referenced commit removed `from . import models` from the module’s `__init__.py`. As a result, the files inside `l10n_tr_reports/models/` (such as `account_general_ledger.py`) were not loaded. This prevented their logic from being executed and caused issue like the Turkish General Ledger report to fail to load. Ref commit: https://github.com/odoo/enterprise/commit/a86bc92f9358eed458872a3e60d5c3c791b3860c ## After this commit: Reintroduced the missing import in `__init__.py`, ensuring that the models package is initialized correctly and all related reports and functionality work as intended. Forward-Port-Of: odoo/enterprise#95576
Payroll users with Administrator access can now cancel completed payslips as intended. This prevents an incorrect error from blocking authorized payroll staff and keeps payroll correction workflows moving smoothly.
Original PR description
steps to reproduce: ------------------- 1. Install payroll 2. Create a user and grant "Administrator" access to Payroll. 3. Log in as the new user and try to cancel a 'Done' payslip. issue: ------ A UserError is raised: "Cannot cancel a payslip that is done." observation: ------------ A user with Payroll "Administrator" access is unable to cancel a payroll payslip cause of the issue: ------------------- During cancellation, the system checks whether the user is "Admin" instead of verifying if the user has Payroll "Administrator" access. https://github.com/odoo/enterprise/blob/13832d80570956e504e1c09f41acbeb0bc4baedc/hr_payroll/models/hr_payslip.py#L509-L513 solution: ---------- Check that the user has Payroll "Administrator" access. opw-5040029 Forward-Port-Of: odoo/enterprise#95277 Forward-Port-Of: odoo/enterprise#93831
The Slovak payroll accounting test setup now gives the test user the required payroll manager permissions. This prevents access-rights failures during automated payroll checks, helping keep payroll functionality reliable.
Original PR description
steps to reproduce: install l10n_sk_hr_payroll_account run test_payslip_1 test added payroll manager groups to the test user to avoid missing access rights error build_error-230673 Forward-Port-Of: odoo/enterprise#95305
The Swedish SIE4 export now uses the character encoding required by the official SIE standard. This helps exported accounting files handle Swedish characters correctly and reduces the risk of compatibility issues when sharing them with other systems.
Original PR description
The SIE4 specification (page 8, section 5.8) requires the file character set to be IBM PC 8-bit extended ASCII (Codepage 437). Previously, 'ISO-8859-1' was used, which does not comply with the standard and may cause issues with Swedish characters. This commit updates the SIE4 export to use codepage 437, ensuring full compliance with the specification. Specification can be found here: https://sie.se/wp-content/uploads/2020/05/SIE_filformat_ver_4B_080930.pdf Forward-Port-Of: odoo/enterprise#95876
This fix disables a revert mechanism in Swiss payroll that could cause incorrect or unwanted payroll reversals. It helps keep payroll processing more predictable and reduces the risk of payroll records being changed unexpectedly.
Original PR description
Forward-Port-Of: odoo/enterprise#95867
This fix ensures test errors are correctly detected instead of being silently ignored. It improves confidence in quality checks for the affected helpdesk live chat area, without changing customer-facing behavior.
Original PR description
This commit follows a community fix that restores proper error handling within and outside of unit tests. As such, it fixes tests reporting errors that were previously not picked up. Community PR: https://github.com/odoo/odoo/pull/228836 Forward-Port-Of: odoo/enterprise#95797
Estimated employee operation costs are now included correctly in manufacturing cost and production analysis reports. This helps businesses see more accurate production costs and compare planned versus actual performance with the right labor cost details visible in reports.
Original PR description
Make sure that operations with estimated costs are correctly computed in the Cost Analysis Report and the Production Analysis Report. task 4896715 Forward-Port-Of: odoo/enterprise#96013 Forward-Port-Of: odoo/enterprise#89135
This fix ensures payroll accounting entries use the correct analytic distribution, so costs are allocated to the right departments, projects, or cost centers. It improves the reliability of payroll-related financial reporting without changing normal payroll workflows.
Original PR description
In this PR we fix some code that was not adapted for analytic distributions Forward-Port-Of: odoo/enterprise#95921
This fixes an issue in Indian payroll where the total allowance check against wages could behave incorrectly. It helps ensure payroll validations are applied reliably, reducing the chance of incorrect employee compensation setup being accepted or rejected.
Original PR description
Forward-Port-Of: odoo/enterprise#96003
This update fixes how withholding tax adjustments are calculated in Belgian payroll. It helps ensure employee payslips and payroll accounting reflect the correct tax amounts, reducing the risk of payroll inaccuracies.
Original PR description
This commit fixes the withholding tax adjustment computation. task-5112828 Forward-Port-Of: odoo/enterprise#95522
When confirming a Belgian payroll working schedule change, users are now taken directly to the employee form with the newly created version selected. This avoids the confusing old redirect to a list of versions and helps HR users continue their work in the right place.
Original PR description
…dule change The working schedule change wizard was redirecting to a list of version when validating. This was the old behavior with the contract. Instead, redirect to the employee form view with the new version selected. task-5126204 Forward-Port-Of: odoo/enterprise#95877
The Follow-Up Report no longer crashes when users load more entries for a partner with many invoices. This prevents interruptions when reviewing customer follow-up information in Accounting.
Original PR description
**Steps to reproduce:** 1. Install the Accounting module. 2. For partner X, create minimum 90 invoices for `See more/Load more` option into page. 3. In the partner form view, click the Customer…
**Steps to reproduce:**
1. Install the Accounting module.
2. For partner X, create minimum 90 invoices for `See more/Load more` option into page.
3. In the partner form view, click the Customer Statement smart button.
4. Change the Report Type from Customer Statement to Follow-Up Report.
5. In the report, click `See more` in the dropdown → traceback occurs.
**NOTE**
- You can easily create invoices using this cron job to generate 90 invoices.
```py
for i in range(90):
invoice = env['account.move'].create({
'move_type': 'out_invoice',
'partner_id': 10,
'company_id': env.company.id,
'invoice_line_ids': [(0, 0, {
'product_id': 16,
'quantity': 1,
'price_unit': 100.0,
})],
})
invoice.action_post()
```
**Issue:**
`UncaughtPromiseError > OwlError
Uncaught Promise > Got duplicate key in t-foreach: ~account.report~17|~res.partner~42|Due~~
Occured`
- A traceback occurs due to a duplicate key error.
**Cause:** https://github.com/odoo/enterprise/blob/459e8ddaf6f67a556d35bf00e0fbb68eb1500a94/account_reports/static/src/components/account_report/account_report.xml#L72-L73
- In account_report.xml component uses line.id as a key.
<img width="781" height="176" alt="image" src="https://github.com/user-attachments/assets/57bf36ea-6890-45ef-8414-5522d71ece7b" />
- When expanding `See more` headings like `Overdue` are rendered again with the same ID causing a duplicate key error.
<img width="754" height="194" alt="image" src="https://github.com/user-attachments/assets/0eba65e0-0bf2-4f64-a997-27a25e5de5fe" />
**Solution:**
- Use the `line_index` instead of `line.id` as the key, ensuring a unique key for every line and preventing the traceback.
**opw - 5083894**
Forward-Port-Of: odoo/enterprise#95396
Forward-Port-Of: odoo/enterprise#95103The Salary Calculator no longer crashes when a user clears the Working Schedule field. If no schedule is selected, it uses the company default schedule so benefit configuration and offer link sharing can continue normally.
Original PR description
#### Steps to Reproduce In Payroll → Employees → Salary Calculator: 1. Select an employee with a working schedule. 2. The working schedule is auto-filled in the modal. 3. Remove the working schedule.…
#### Steps to Reproduce In Payroll → Employees → Salary Calculator: 1. Select an employee with a working schedule. 2. The working schedule is auto-filled in the modal. 3. Remove the working schedule. #### Issue A traceback occurs because the flow tries to recompute work entries with an empty calendar in the Salary Calculator. The purpose of this PR is to make the Working Schedule field optional, with the company's schedule as default when it's empty. #### Fix - Always attach `salary_simulation=True` in the base `_get_version()` and propagate the context when creating a new version for the simulation employee, to avoid unnecessary work entry recomputations. - The Working Schedule field is no longer required: it now has a placeholder and defaults to the company’s calendar when left empty. - The "Configure Benefits" and "Copy Link" buttons are now always enabled since there's always a working schedule (company's schedule is required). task-5063150 Forward-Port-Of: odoo/enterprise#94624
This fixes an automated Accountant test flow that could finish before the final action was complete. The change improves reliability of validation for the account merge wizard without changing day-to-day user features.
Original PR description
The last check of the tour is always true. So it sometimes closes too early. Wait really for the last operation for the last check runbot-error-108440 Forward-Port-Of: odoo/enterprise#95991
The Field Service onboarding guide now starts correctly even when the project already contains task templates. This prevents setup guidance from getting blocked for teams with preconfigured workflows.
Original PR description
This commit's purpose is to allow the fsm onboarding tour to work even if there are existing task template within the fsm project. note : This commit has to be edited in the 19.0 forward port, since its IsActive selector was updated. It should be ["body:has(.o-kanban-button-new.o-dropdown-caret"] instead. task-5088820 Forward-Port-Of: odoo/enterprise#94904
Scanning a production order barcode in Shop Floor can temporarily filter the work orders shown. This fix ensures that when operators scan follow-up action barcodes, the action runs and the previous filter is cleared, preventing confusion and keeping the work list accurate.
Original PR description
To reproduce: - Create multiple WOs in assembly line 1 - Open shop floor, assembly line 1 - Scan one of the MO barcodes to filter - Scan OBTPAUS/OBTCLMO/OBTCLWO Current behaviour: The expected action gets executed, but the MO filter set in the search bar remains. Expected behaviour: The expected action gets executed and the filter is removed. Task: 5107223 Forward-Port-Of: odoo/enterprise#94584
This update corrects how subscription invoice sections are handled for combo products. It helps prevent existing section information from being overwritten and avoids adding unnecessary values, improving invoice accuracy.
Original PR description
This commit improve fix of PR https://github.com/odoo/enterprise/pull/90989 to avoid overriding right combo section values and avoid setting unnecessary values on the section. opw-5069278 Forward-Port-Of: odoo/enterprise#95831 Forward-Port-Of: odoo/enterprise#94776
Fixes several issues that could hide or remove comments in Knowledge articles, especially after reloading, switching between locked articles, or placing comments near the top of a page. This helps users keep discussion context visible and avoids crashes when comments are attempted in code blocks.
Original PR description
### Issue 1: Summary: When a user adds a comment inside a baseContainer element, the comment beacons created during the comment insertion can be discarded during the document normalization step. How…
### Issue 1: Summary: When a user adds a comment inside a baseContainer element, the comment beacons created during the comment insertion can be discarded during the document normalization step. How to reproduce: - Open an article in Knowledge. - Select text and change the block style from "Paragraph" to "Normal" using the powerbox. - Add a comment on the selected text using the powerbox. - Write a message in the comment thread. - Save and reload the article. Issue: - The comment beacons disappears from the editor and the user can't see it anymore. Resolution: When the editor is initialized, `div` are not yet categorized as paragraph related elements. The `comments_plugin` logic to identify valid positions for comments beacons should take that into account and allow elements which are candidates to be a paragraph related element. ### Issue 2: Summary: There was an issue where comments were not displayed when switching from a locked article to another (read-only). How to reproduce: - Create two articles and add a comment on each. - Lock both articles (so that they are effectively read-only). - Switch from one article to the other. Issue: - Comments are not displayed to the user. Resolution: When switching between read-only articles, `KnowledgeHtmlViewer` is not fully reloaded and continues using the same `CommentBeaconManager` instance for the newly opened article. As a result, comment beacons are not displayed when switching article. The simplest solution to this issue is to re-instantiate a new `CommentBeaconManager` whenever the HTML value changes to ensure comments are correctly displayed. ### Issue 3: There is an issue in the logic of `computeVerticalDimensions` to display comments. If the `top` value of a thread in the article is `0`, it will be filtered out and not displayed because `top` was used as a boolean value. Instead, it should properly consider `top` as a finite number to display the comment or not. Note: This issue is not easily reproducible because there are few configuration where a comment would have a top value equal to 0. ### Issue 4: There is a crash when inserting a knowledge comment in a `/code` block: In this previous [task], insertion in `pre` elements was filtered to prevent non-phrasing content from being inserted (as it is invalid per the html specification). To prevent a crash, knowledge comments will be disabled in `<pre>` elements, as they rely on `anchor` elements for the comment position in the article body. [task]: 216e9eb task-4984152 Forward-Port-Of: odoo/enterprise#95952 Forward-Port-Of: odoo/enterprise#91408
Budgets that are shared across companies can now display monetary values correctly even when no specific company is assigned. This prevents currency-related display issues for organizations using company-independent budgets under a shared-currency assumption.
Original PR description
Budgets can work without a company, making the assumption that all the companies using the budget have the same currency. This is done by not setting a company on the budget. Since the currency is computed on the company, we need a fallback for the monetary widget to work. Forward-Port-Of: odoo/enterprise#95000
Spanish tax reporting now handles missing date information safely when creating or testing new records. This prevents unexpected failures in automated checks while keeping the normal date validation unchanged for regular report use.
Original PR description
The `_get_mod_period_and_year` method assumed that `options['date']` would always be present with `date_from` and `date_to`. However, during the automatic `TestEveryModel.test_computed_fields_without_dependencies`, this method is called on a `new()` record where no options are provided. This resulted in a `KeyError: 'date'`. We now gracefully handle missing or incomplete `options` by returning `(None, None)` instead of raising an exception. This ensures that tests and new records can be created without errors, while preserving the original validation logic when valid options are given. build_error-231511 Forward-Port-Of: odoo/enterprise#94154
Opening a spreadsheet list side panel no longer crashes when the list was sorted by a field that was later removed or renamed. Users can now access the panel and remove the invalid sorting after upgrades, avoiding disruption when working with older spreadsheets.
Original PR description
If a list is sorted on an invalid field and you try to open the list side panel, it crashes. It should open to allow the user to remove the sorting. A list with an invalid sorting field if the spreadsheet was created in a given version, then upgrades to a version where that field has been removed or renamed. Task: 4962837 Forward-Port-Of: odoo/enterprise#94972 Forward-Port-Of: odoo/enterprise#92393
Consolidated invoicing for Mexican Point of Sale orders now uses values entered in the invoice creation wizard, avoiding errors when selected orders contain differing localization details. This helps businesses create combined invoices reliably while reducing the risk of incorrect Mexican e-invoicing information.
Original PR description
Issue: Currently when we consolidate billing for PoS orders we receive an error because some l10n fields expect a single record and not a recordset. This can be solved by looping over the PoS orders…
Issue: Currently when we consolidate billing for PoS orders we receive an error because some l10n fields expect a single record and not a recordset. This can be solved by looping over the PoS orders instead and preparing the invoice values per order (this is how the sale orders handles consolidated billing) however, we run into an issue if not all PoS orders have the same l10n fields. Ideally PoS orders with different l10n fields should not be consolidated. Purpose of this PR: Allow the l10n fields to be reassigned for consolidated billing. The l10n fields will be added to the Create Invoice(s) wizard and those values will be used for the newly created invoice instead of the possible mixed values from the PoS orders. The values are assigned through context. Steps to reproduce on Runbot: install pos and l10n_mx* create pos orders for same contact try to create invoices with consolidated billing enabled singleton error is raised Note: spoke about this change with LAO Currently the sale orders handle this error by looping over the orders, however the invoice created will have the l10n fields of the last sale order. This can lead to misinterpreting information. opw-4802180
Features or functions removed from Odoo
Public Knowledge articles no longer include Twitter-specific preview metadata. This simplifies the page metadata and avoids maintaining social tags that are no longer needed, with minimal impact on regular website visitors.
Code cleanup and technical improvements
Several internal model labels were updated from plural to singular wording across multiple Odoo apps. This improves naming consistency in the system and helps keep generated labels, exports, and configuration screens clearer without changing business workflows.
Original PR description
https://github.com/odoo/odoo/pull/229299
26 changes
Resolved issues and error corrections
The salary calculator no longer crashes when a working schedule is removed. If no schedule is selected, it uses the company schedule by default so users can continue configuring benefits and sharing offers without interruption.
Original PR description
#### Steps to Reproduce In Payroll → Employees → Salary Calculator: 1. Select an employee with a working schedule. 2. The working schedule is auto-filled in the modal. 3. Remove the working schedule. #### Issue A traceback occurs because the flow tries to recompute work entries with an empty calendar in the Salary Calculator. The purpose of this PR is to make the Working Schedule field optional, with the company's schedule as default when it's empty. #### Fix - Always attach `salary_simulation=True` in the base `_get_version()` and propagate the context when creating a new version for the simulation employee, to avoid unnecessary work entry recomputations. - The Working Schedule field is no longer required: it now has a placeholder and defaults to the company’s calendar when left empty. - The "Configure Benefits" and "Copy Link" buttons are now always enabled since there's always a working schedule (company's schedule is required). task-5063150
This fix corrects how withholding tax adjustments are calculated in Belgian payroll. It helps ensure employee payslips and related payroll accounting use the right tax amounts, reducing the risk of incorrect payments or reporting.
Original PR description
This commit fixes the withholding tax adjustment computation. task-5112828
Opening Time Off from an employee profile no longer triggers a Missing Record error. This ensures users can access leave information reliably from their profile without interruption.
Original PR description
**Steps to reproduce (without demo data):** - Install hr_holidays - Go to "My Profile" - Open "Time Off" **Issue:** Accessing Time Off from a user profile triggers a `Missing Record` error. **Cause:** The system was passing the user’s active_id to the employee record incorrectly. **Fix:** Now, when the context's active_model is 'hr.employee', the correct active_id is applied. **Commit issue:**https://github.com/odoo/odoo/pull/225839 Forward-Port-Of: odoo/odoo#229497
Payroll users can now generate payslips from a pay run with multiple employees without encountering an error. The fix updates payroll processing to use the current work entry date field, helping teams complete payroll runs smoothly.
Original PR description
Steps to reproduce: - In the Payroll app, go to Pay Runs - Select a pay run with several employees in it - Click on "Generate Payslips" - Get a traceback Reason: The function responsible to generate payslips did not get updated when the fields "date_start" and "date_stop" where replaced by "date" in work entries, causing the error. How it was fixed: Changed "date_start" and "date_end" in the condition to "date" Task ID: 5084666
Marketing automation email templates have been updated to work with the latest email building blocks. This helps ensure campaign, trial, partnership, discount, and website sales emails keep their intended layout and presentation.
The vehicle kanban view now correctly shows and uses the contracts button. This helps fleet users access vehicle contract information reliably from the overview screen.
Original PR description
Fix contracts button in vehicle kanban Task-5109335 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228341
This fix makes employee record handling more reliable when databases contain unusual or inconsistent version information. It helps prevent HR processes from being affected by edge cases in employee data history.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix corrects the styling of the Belgian payroll holiday attestation screen so it appears as intended. It helps employees and HR users view the holiday attestation information more clearly after a previous UX update used the wrong layout classes.
Original PR description
We recently fixed the UX of holiday attest but the classes used in xml were wrong. We fix this in this task. Task: 5109176
The Belgian payroll employee view now uses the correct styling for holiday certificates. This fixes a recent display issue so HR users see the holiday attest information as intended.
Original PR description
We recently fixed the UX of holiday attest but the classes used in xml were wrong. We fix this in this task. Task: 5109176
The Point of Sale order search now shows paid orders only from the current register setup or its trusted related registers. This prevents staff from seeing unrelated paid orders from other PoS configurations, reducing confusion and keeping order lookup results relevant.
Original PR description
Before this commit, when searching paid orders in the PoS UI, orders from other configs could appear even if they were not part of the trusted configs or the same PoS config. This commit ensures that only orders related to the current PoS configuration (or its trusted configs) are loaded and displayed. opw-5083747 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228691 Forward-Port-Of: odoo/odoo#227709
Batch updates to message followers now handle removals correctly. This prevents some records from keeping or losing followers incorrectly when multiple records are updated at once, improving consistency in Mail notifications and subscriptions.
Original PR description
When updating `message_partner_ids` on a batch of records, the previous implementation of the inverse method could lead to incorrect results if the new value implied unsubscription. The `message_unsubscribe()` method, called inside the loop over the records, unlinks `mail.followers`. This `unlink` operation invalidates all the fields cache. As a result, when processing the next record in the batch, its cached fields (the new value of `message_follower_ids`) were erased, causing the logic to fail. This commit fixes the issue by postponing all unsubscription operations. opw-5050023 Forward-Port-Of: odoo/odoo#227499
The HTML editor now avoids including ignored, untracked content when saving an editing snapshot. This prevents errors that could block snapshot creation and helps keep editor history actions reliable for users.
Original PR description
When creating a snapshot step, unobserved nodes (i.e. node inserted via `ignoreDOMMutations`) should not be included in the snapshot step. This commit restores a previous behavior in which, on serialization, nodes that had no entry in the node map were ignored (instead of throwing an error). Because of this thrown error, before this commit it was not possible to create a snapshot step if the editable contained unobserved nodes.
Belgian payroll Dimona declarations now better track declaration status and support updated government API requirements. This reduces manual follow-up and helps payroll teams submit more accurate employee start and end declarations.
This fixes budgets that are shared across companies without a specific company assigned. The budget screen now has a fallback currency so money amounts display correctly when those companies use the same currency.
Original PR description
Budgets can work without a company, making the assumption that all the companies using the budget have the same currency. This is done by not setting a company on the budget. Since the currency is computed on the company, we need a fallback for the monetary widget to work.
The Belgian payroll working schedule change process now opens the employee record with the newly selected version instead of showing an outdated list view. This reduces confusion for HR users and helps them continue their workflow in the right place after validating a schedule change.
Original PR description
…dule change The working schedule change wizard was redirecting to a list of version when validating. This was the old behavior with the contract. Instead, redirect to the employee form view with the new version selected. task-5126204 Forward-Port-Of: odoo/enterprise#95877
This fix ensures text highlights with transparent custom colors display evenly, without darker edges caused by overlapping fill and outline colors. It also adjusts a website menu test so it runs reliably in more test environments.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an error from appearing when users edit a refusal email while processing an applicant. The unavailable template-saving option is hidden for this flow, allowing recruitment users to continue without interruption.
Original PR description
Steps to reproduce: - open any applicant in recruitment app - click on refuse button - enable send email toggle key - edit the message - try to save the template Issue: - traceback pop ups and not able to save the template Reason: - The method 'open_template_creation_wizard' is missing, causing the error when trying to save the template. This method was not implemented. Solution: - Remove the 'save the template' feature for this version by adding the context. It require two fields which are not present in the current model, thus avoiding the error. task-4948736 Forward-Port-Of: odoo/odoo#220118
Scanning a package now correctly converts quantities when the package and delivery line use different units of measure. This prevents warehouse staff from seeing partial or incorrect delivered quantities, such as 10 g instead of 10000 g, when the stock is packaged in kilograms.
Original PR description
Manual forward port of https://github.com/odoo/enterprise/pull/90878 **Problem:** When scanning a package with a different UoM than the barcode line, the conversion is not made. **Steps to…
Manual forward port of https://github.com/odoo/enterprise/pull/90878 **Problem:** When scanning a package with a different UoM than the barcode line, the conversion is not made. **Steps to reproduce:** - Enable the "Packages" setting; - Create a new storable product and set kg as its UoM; - In the inventory tab, add "g" in the packagings - Click on the on hand smart button and select update quantity - Add a new line; - In the package column create a new package; - Set a quantity of 10 kg; - Create a delivery and select your product; - Set a demand on 10000 and select g as the UoM; - Mark as todo; - Open the delivery in the Barcode app; - Scan the package. **Current behavior:** The quantity on the line is now 10 / 10000 g **Expected behavior:** It should be 10000 / 10000 g **Cause of the issue:** https://github.com/odoo/enterprise/blob/4c9fa9dc010958710d848fbcb3241b17ea7205ca/stock_barcode/static/src/models/barcode_picking_model.js#L1500-L1505 remaining_qty is expressed in the uom of the quant so it will be 10 but qty_needed is expressed in the uom of the line is it will be 10000. qty_used beeing the minimum of those two it will be 10. **Fix:** To define how much quantity to take from the package, we convert the line's quantity by using the package's UoM. Then, when we add this quantity to the line's quantity, we re-convert it by using the line's UoM. opw-4860064 Forward-Port-Of: odoo/enterprise#95659 Forward-Port-Of: odoo/enterprise#93693
This fixes how subscription combo sections are handled when creating invoices. It prevents correct section information from being overwritten and avoids adding unnecessary section details, helping invoices stay accurate and easier to read.
Original PR description
This commit improve fix of PR https://github.com/odoo/enterprise/pull/90989 to avoid overriding right combo section values and avoid setting unnecessary values on the section. opw-5069278 Forward-Port-Of: odoo/enterprise#95831 Forward-Port-Of: odoo/enterprise#94776
Fixed an issue where the favorite star on spreadsheet dashboards did not visually update immediately on mobile after being tapped. This makes the favorite action clearer and more consistent with the rest of Odoo.
Original PR description
The star icon on mobile would have a strange behaviour. After clicking it, the star would not change between filler/not filled until clicking elsewhere. It turns out that on mobile, after a click the hover rule is applied. And our hover rule would modify the icon to be the opposite of what it should be. This commit changes the CSS to use the same css as `BooleanFavoriteField` to stay consistent with the rest of Odoo. Task: [5092945](https://www.odoo.com/odoo/2328/tasks/5092945) 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#227663
The Talent applications button now opens the same set of related applications that is shown in the application count. This prevents recruiters from seeing a mismatch between the count and the list, making talent records easier to review accurately.
Original PR description
`_get_similar_applicants_domain` used in `action_open_applications` did not return the same domain used in `_compute_application_count`. Fixed by complementing the domain within `_get_similar_applicants_domain` used in the action to include applications with the same associated `pool_applicant_id` as the current applicant/talent. Task-5092128 Forward-Port-Of: odoo/odoo#228007
This fixes an automated Accountant app test so it waits for the final merge wizard action before closing. It reduces false test failures and helps keep accounting-related updates moving through validation more reliably.
Original PR description
The last check of the tour is always true. So it sometimes closes too early. Wait really for the last operation for the last check runbot-error-108440 Forward-Port-Of: odoo/enterprise#95991
Fixes an issue in the HTML editor where the color picker could close unexpectedly when previewing a background color for a table cell. This makes table formatting more reliable and avoids interrupting users while editing content.
Original PR description
Problem: When applying a background color to a `td`, the color picker dismisses unexpectedly. Cause: After c810b0c17b2f882b0ab5d073ba38464bffb0617e, we rely on the class `o_selected_td` to check if…
Problem: When applying a background color to a `td`, the color picker dismisses unexpectedly. Cause: After c810b0c17b2f882b0ab5d073ba38464bffb0617e, we rely on the class `o_selected_td` to check if we are in a selected `td` to keep the toolbar open. However, in another fix (254efd86cd1ce871807fdc25479ebc5beeb4eab3), we removed that class during the color preview operation. Previewing a color on a `td` triggers a selection change, which runs `shouldBeVisible`. Since `o_selected_td` is not found, the toolbar closes along with the color picker. Solution: Update https://github.com/odoo-dev/odoo/commit/254efd86cd1ce871807fdc25479ebc5beeb4eab3. A better fix is to use `o_selected_td_bg_color_preview` which will undo the `box-shadow` when we preview a color. Steps to reproduce: 1. Add a table. 2. Select a cell. 3. Apply a background color. 4. Select the cell again. 5. Hover a color to preview. → The color picker dismisses once a color is hovered. opw-5066309 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225827
Uploaded file fields on field service worksheets are now visible when customers open or sign the worksheet report in the portal. This prevents missing attachment information and makes completed worksheet reports more accurate for review and approval.
Original PR description
Steps to reproduce: ------- - Install industry_fsm_report module - Open FSM app - Select worksheets from settings in the configuration - Go to worksheet templates in the configuration - Create a worksheet template - Click the design template button. You arrive in the studio - Add file field and close it - Create a new task and select a newly created template in the worksheet template - Click the worksheet button in the control panel - Upload a file and save it - Click on the sign report button - Here file field is not visible Issue: ------- The file field is not visible in the worksheet portal. Cause: ------ The view of the file field is not created for the worksheet portal. Solution: ------- Created the view of the file field to display in the worksheet portal. task-3691529 Forward-Port-Of: odoo/enterprise#95754 Forward-Port-Of: odoo/enterprise#56035
Survey descriptions and end messages now avoid a content option that could prevent embedded videos from appearing to respondents. This ensures shared surveys display their message content as intended outside the editor.
Original PR description
Embedded components do not render when the html field content is displayed outside the editor, as their mechanism relies on the editor plugin. Solution: --------- Disable embedded components for the…
Embedded components do not render when the html field content is displayed outside the editor, as their mechanism relies on the editor plugin. Solution: --------- Disable embedded components for the survey messages (Description and End Message). Steps to reproduce: ------------------- * Create a new survey * Add a video as End Message or Description * Use the share link to view de survey * Video not showing Cause of the issue: ------------------- The new web_editor has a plugin system, and one option that is enabled by default is embedded_components. This option has been introduced in: https://github.com/odoo/odoo/commit/03f495c696030214c17e6479076571823513f60e According to the description: "It is forcibly set to false in HtmlMailField since embedded components can only be rendered inside Odoo." Observation : ------------ similar fix: https://github.com/odoo/odoo/commit/1446167e482745c71725563e56411948c3dd1f41 opw-5005752 Forward-Port-Of: odoo/odoo#224808
Anonymous self-order customers could see an error after their restaurant order was paid because the system tried to update information they were not allowed to change. This fix limits order updates to the necessary details, so customers see the correct order status without disruption.
Original PR description
Before this commit, updating an order in a self as an anonymous user raised a traceback: "Failed to write field pos.order.message_partner_ids" Steps to reproduce - Open a self in an anonymous window and create an order. - In the restaurant, pay the order. - Back in self, an error notification is displayed, and the order is not updated. The issue occurred because all fields were being loaded, including ones not writable for anonymous users. After this commit, only the required field are loaded. task-5126416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
8 changes
Enhancements to existing features
This update improves part of Odoo's core file handling in the Base module. It should make the underlying system behavior more reliable without changing day-to-day workflows for most users.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale now lets staff mark a terminal payment as completed when Odoo is still waiting for the card terminal response. This gives cashiers a safe fallback when the payment succeeded on the terminal but the system did not update, helping avoid blocked checkouts and unnecessary retries.
Original PR description
Current behavior before PR: If we faced an issue with a terminal payment while the `line.payment_status` being "waitingCard", only possible option for the user would be to "Cancel" the payment and try again or choose another payment method. This is an issue for the cases where the payment went through on the terminal but Odoo didn't update the status for some reason. Desired behavior after PR is merged: We add the possibility to "Force done" while the status is "waitingCard" to avoid blocking the user in such situations and have a possible fallback. opw-4978772 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228406
Resolved issues and error corrections
This fixes the contracts button shown on vehicle cards in the Fleet kanban view. Fleet users can reliably open related vehicle contracts from the overview, reducing navigation friction and avoiding a broken shortcut.
Original PR description
Fix contracts button in vehicle kanban Task-5109335 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an issue where running an action on multiple Documents could create all expected vendor bills but then open only one result. Users are now taken to the full set of created records, making batch document workflows behave as expected.
Original PR description
[FIX] base: run all multi-state actions as multi(record) Context --- In the Documents module, users can select one or more records and run an action on them. Recent changes (ref.1) replaced…
[FIX] base: run all multi-state actions as multi(record) Context --- In the Documents module, users can select one or more records and run an action on them. Recent changes (ref.1) replaced documents.workflow.action with `ir.embedded.actions`, which are linked to `ir.actions.server`. Some actions, such as `ir_actions_server_create_vendor_bill`, are multi-state actions (where "state" is sometimes referred to as "TYPE" in `IrActionsServer.run`). These actions execute dependent actions when triggered. A distinct but related concept is multi-action, which refers to actions defined with a method suffixed `_multi`. These methods are designed to handle multiple records at once. What seem to be a separate concept is a **multi action**. That is an action defined by a method suffixed `_multi`. Such action can handle multiple records at its execution. Reproduce --- - install documents_account - open documents -> finance folder - select two (or more) documents (shift + click) - run action "Create Vendor Bill", bills are created ok for all documents - BUG: you are taken to a from view of a single bill... ... instead of to the list of all created documents, like it used to be in the previous version Root Cause of the Bug --- - When `ir_actions_server_create_vendor_bill` is executed, Odoo searches for the appropriate runner method. - Since `_run_action_multi_multi` does not exist, Odoo defaults to `_run_action_multi`, which is executed in single-record mode. - The term multi in this case refers to the action's state, not the number of records being processed. - Because `_run_action_multi` is not designed for multi-record execution, it is called individually for each record. - This approach works for invoice creation but is inefficient and restricts navigation, as it only opens a single document (`account_create_account_move`) instead of the full list. FIX --- - Treat all server actions with state=multi as multi-record actions. - Pass all active_ids to the runner method to process all selected records in a single execution. References --- (ref.1) a32825ee00f2b330d99113f4d8c1488903fe744e [IMP] documents, *: modernize access rights, sharing, and actions opw-4547250
Discarding a quality worksheet wizard no longer creates a worksheet record or marks the quality check as completed. This avoids misleading completion status and keeps quality check progress accurate when users cancel the worksheet flow.
Original PR description
**Problem:** Opening the worksheet wizard and discarding it makes the worksheet "completed" **Steps to reproduce:** - create a quality check - set a product - in type select worksheet - select the "quality issues" template - select a team - click on the worksheet smart button - discard **Current behavior:** the worksheet is marked has completed **Cause of the issue:** when discarding, this line causes the creation of an instance of worksheet.template linked to the quality.check via its worksheet_template_id https://github.com/odoo/enterprise/blob/a1dd58f2b59ecd2d22efd29eb0aace7bdca64f66/quality_control_worksheet/static/src/views/quality_worksheet_fromview.js#L35 which will make the worksheet_count field of the quality check worth 1 after discarding https://github.com/odoo/enterprise/blob/1c5e547b59a57c840ef72b2e76c6a6a627f1f18e/quality_control_worksheet/models/quality.py#L37-L39 opw-4980945
The French FEC export now excludes invoice note and section rows that are not real accounting entries. This prevents non-accounting information from appearing in official accounting export files and keeps reports cleaner and compliant with expected behavior.
Original PR description
Step to reproduce: - for l10n_fr Localization - Create a customer invoice and add a note or Add a section . - Go to accounting > reporting > FEC - Export FEC (don't exclude 0 lines) Obseravtion: - The journal items with note and section will be included in the FEC Cause: - for Fec report, we consider move_line which do not have account_id linked to it, due to left_join, hence lines with display_type line_note or line_section are included Fix: - use `join` instead of `left_join` - **v17.0, when the behaviour was as expected** https://github.com/odoo/odoo/blob/3d3898b442379d7416da0ee7e363b6587c725218/addons/l10n_fr_fec/wizard/account_fr_fec.py#L194-L196 opw-5079457 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where unassigning and reassigning goods from the reception report could reserve the wrong stock location. Warehouse teams can now reliably link incoming receipts to sales orders without leaving available stock incorrectly blocked.
Original PR description
### Issue: #### Steps to reproduce: 1- Activate routes & locations and enable Reception Report 2- Enable Show reception report at validation from operation type: receipts 3- Create a product with…
### Issue: #### Steps to reproduce: 1- Activate routes & locations and enable Reception Report 2- Enable Show reception report at validation from operation type: receipts 3- Create a product with vendor. Put 2 unit on `WH/Stock/Shelf1` 4- Create a Sales Order for 3 units. 5- Create a PO for 1 unit and validate/receive. 6- On the Reception Report, click Assign to link incoming to sales pick 7- Open the sales pick in a new tab, observe there are 2 moves which first one is 1 and 2nd one is 2 8- On the reception report, click Unassign, then Assign again Back on the Pick, only 1 move (the one with quantity of 2) is reserved; checking availability reserves nothing although stock exists. #### Cause: When unassigning from the Reception Report, the system incorrectly unreserves stock that was already in `Shelf1` instead of unreserving the incoming move which the location_id is `WH/Stock`: User clicks Unassign on the Reception Report. `report_stock_reception.action_unassign()` is invoked. That calls `stock_move._do_unreserve()`. `_do_unreserve()` unpicks quants referenced by the `move.move_line_ids`. At this moment one of the `move_line_ids` points to `WH/Stock/Shelf1`, so `_do_unreserve()` removes the reservation from that `shelf1` quant. Consequence: `shelf1` stock(which should have remained reserved) becomes free. The receipt quant at `WH/Stock` remains reserved/ unavailable. When the user clicks Assign again, the system cannot reserve because it is alreade reserved by another move and therefore it is unavailable. #### Root cause: Now we look earlier in the flow to see why the move had a move_line pointing to `WH/Stock/Shelf1` in the first place. Earlier, in `report_stock_reception.action_assign` in the first assign: We create a new move from current outgoing move: https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/report/report_stock_reception.py#L224-L231 And we link current move_lines to the new move: https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/report/report_stock_reception.py#L245-L259 new_out.move_line_ids now contains move lines for multiple source locations, here in our case `[WH/Stock/Shelf1, WH/Stock]` The loop in above code does not check `move_line_id.location_id` when selecting lines. The first matching line in the iteration can be the `shelf1` one, so the code links the `shelf1` move_line to out instead of the `WH/Stock` move_line, which is a mismatch and causes the out move having different location with its move_line, which later will going to cause problem is unassign as explained. ### Fix: We can sort move_line_ids in a way that which line have the same location as potential ins' dest locations come first as better candidates: ```diff - for move_line_id in new_out.move_line_ids: + matching_locations = potential_ins.location_dest_id + for move_line_id in new_out.move_line_ids.sorted(lambda ml: ml.location_id not in matching_locations): ``` opw-4944047
Scheduled background jobs now refresh their system information before running, so they no longer use outdated data after an app is uninstalled. This prevents worker crashes and console errors that could interrupt automated tasks in multi-worker deployments.
Original PR description
**step to reproduce:** - start a database with worker, use `--max-cron-thread=1 --workers=2` - Add a sample cron, which runs every minute(just so that we can see the status) - install helpdesk -…
**step to reproduce:**
- start a database with worker, use `--max-cron-thread=1 --workers=2`
- Add a sample cron, which runs every minute(just so that we can see the status)
- install helpdesk
- uninstall helpdesk
**Observation**
- traceback in console
```
2025-09-25 06:07:26,389 18450 ERROR ? odoo.service.server: Worker WorkerCron (18450) Exception occurred, exiting...
Traceback (most recent call last):
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/service/server.py", line 1171, in _runloop
self.process_work()
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/service/server.py", line 1270, in process_work
base.models.ir_cron.ir_cron._process_jobs(db_name)
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/addons/base/models/ir_cron.py", line 139, in _process_jobs
registry[cls._name]._process_job(db, cron_cr, job)
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/addons/base/models/ir_cron.py", line 331, in _process_job
now = fields.Datetime.context_timestamp(ir_cron, datetime.utcnow())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
....
....
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/models.py", line 3873, in fetch
fetched = self._fetch_query(query, fields_to_fetch)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/addons/base/models/res_users.py", line 546, in _fetch_query
records = super()._fetch_query(query, fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/models.py", line 3965, in _fetch_query
self.env.cr.execute(query.select(*sql_terms))
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/sql_db.py", line 335, in execute
res = self._obj.execute(query, params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
psycopg2.errors.UndefinedColumn: column res_users.helpdesk_target_closed does not exist
LINE 1: ...s"."odoobot_state", "res_users"."odoobot_failed", "res_users...
```
Issue:
- traceback occurred, as the system is try to fetch fields related to helpdesk module
which do not exists now after uninstalling it.
- cron in case of workers, use daemon threads [1]
- the uninstalled happened with main thread and registry is updated.
- the daemon thread is unaware of this change.
- the `_process_jobs` uses the registry, without checking if it needs reload
[1]: https://github.com/odoo/odoo/blob/e82fdfaf621f45515b92c891334595250accbfbd/odoo/service/server.py#L582-L587
FIx:
- when assigning the registry, we check if needs a reload or not.
opw-5062313
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#2285151 change
Enhancements to existing features
Brazilian service products now show the correct LC116 Code label instead of the Mercosul NCM Code label. This reduces confusion when configuring fiscal information because goods and services use different naming conventions for their tax classification codes.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435