Daily updates from Odoo
Monday, August 18, 2025
23 changes · master
New functionality added to Odoo
HR managers and administrators can now print salary certificates directly from an employee profile when UAE payroll is installed. This helps provide official salary documentation more quickly, provided the employee has an active contract and an assigned HR responsible person.
Original PR description
Once l10n_ae_hr_payroll is installed we can generate Salary Certificate. ### Prerequisites: - An employee must have an running contract in order to use this feature. - The active contract must have an assigned HR Responsible Employee for activity creation(scheduled activity) ### Functionality: - HR Manager/Administrator can navigate to the employee’s profile in the Employee module and generate the salary certificate using the (Print Actions button > Salary Certificate). task - 4551883
Enhancements to existing features
Belgian payroll now excludes PFI contracts when calculating an employee's seniority for departure notice periods. This helps ensure notice periods for leaving employees follow Belgian rules more accurately and avoids overstating seniority from ineligible contract types.
Original PR description
When you generate the notice period for leaving employees, you must compute their seniority. In Belgium, PFI contracts should not be taken into account. This commit filters the contracts to ignore PFI ones. task-4788455
This update adjusts several Point of Sale compliance features for Belgian, Swedish, and EU scale certification requirements. It improves configuration, session handling, and self-ordering behavior so businesses can better meet local fiscal and device compliance obligations.
Businesses can now choose specific product categories where the Contact Us button appears for zero-priced rental or subscription items. If no categories are selected, the behavior remains unchanged and applies to all products, giving teams more control without disrupting existing setup.
Original PR description
- Added an option to choose specific product categories where the Contact Us button should appear for zero-priced items. - If no categories are selected, the rule still applies to all products (same as before). - Makes it easier to apply the rule only to certain collections only. See also: - Community PR: https://github.com/odoo/odoo/pull/215526 - Upgrade PR:https://github.com/odoo/upgrade/pull/7928 Affected_Version:Master Task_ID:4819657
Payroll now only offers pay schedules that are supported by each country’s localization, reducing the risk of incorrect payslip calculations. When monthly payroll is the only valid option, the schedule selection is hidden to simplify employee and contract setup.
Original PR description
In most locas, we only have correct computations for monthly payslip so we should restrict the choice depending on the loca. Also if there is only one choice, monthly, we should not display the selection field at all. Task: 4890507
Kiosk configuration now shows only settings that are relevant to kiosk mode. This reduces confusion for users setting up kiosks and makes the configuration process quicker and clearer.
Original PR description
Before this commit: =================== - Configuring a kiosk showed many settings that were not applicable to kiosk mode, creating unnecessary complexity. After this commit: ================== - We have removed all the irrelevant settings from the kiosk configuration Task: 4830228 Related Community PR: https://github.com/odoo/odoo/pull/212665
Document search filters now separate files into clearer categories such as PDF/documents, images/videos, URLs, and spreadsheets. This makes it easier for users to find the right content quickly, including linked shortcuts to those document types.
Original PR description
Add more granularity to the documents filter. - PDF/Documents: All binary documents (+ shortcuts) which are not image/video, spreadsheet or shortcut of those. - Image/Video: All image/video documents (+ shortcuts). - URL: All documents of type 'url' (+ shortcuts). - Spreadsheet: All spreadsheet documents (+ shortcuts). Task-4897125
Payroll accounting now supports assigning analytic distributions on employee versions and salary rules. This helps businesses allocate payroll costs more accurately across departments, projects, or cost centers without extra manual accounting work.
Original PR description
task-4775857
Belgian payroll can now include an employee's seniority from before hiring when calculating notice periods. This helps produce more accurate departure notice results when the company chooses to count prior seniority.
Original PR description
In this PR, we added seniority at hiring to the notice period computation. When the option of including the Seniority at Hiring is set, we consider the first_contract in the notice period calculation as `notice.first_contract - seniority at hiring (in years)`. Related task: 4936801.
Payroll users can now see employer cost directly on payslips and pay runs. This makes it easier to understand the full payroll expense without manually adding contributing salary rules.
Original PR description
Before: - The salary rule field was labeled "View on Employer Cost Dashboard" - Payslip list view did not include employer cost. - Pay run (batch) had no summary of total employer cost for all its payslips. After: - Renamed salary rule field to "Contributes to Employer Cost" for better clarity. - Added a computed "Employer Cost" field on the payslip, summing all rules marked as contributing. - Displayed "Employer Cost" by default in the payslip list view. - Added a new field on the Pay Run (batch) to show the total Employer Cost, computed as the sum of all employer costs from associated payslips. Task-4793801
The Point of Sale customer list now opens much faster when many customers are loaded and the cart has many items. This reduces delays for cashiers during checkout and improves the in-store sales experience.
Original PR description
Before this commit, opening the customer list in PoS could be slow when many customers were loaded (common in active PoS environments) and the current order had numerous orderlines. This performance hit was due to repeated recalculations of `get_total_with_tax`. This commit resolves the issue by storing the `get_total_with_tax` value of the current order when the customer list is opened. This value remains constant while the customer list is active, eliminating unnecessary recalculations. Performance Impact: With 500 customers loaded and 20 orderlines in the cart, opening the customer list improved from 5 seconds to 200 ms. opw-4921262 Forward-Port-Of: odoo/enterprise#92354 Forward-Port-Of: odoo/enterprise#89526
Spreadsheet users get a smoother experience when editing global filters, as panels now replace each other correctly and restore previous views when cancelled or removed. The update also protects performance by blocking very large static pivot insertions and adds chart zooming for easier analysis.
The Approvals app now presents request cards in a clearer, easier-to-scan Kanban layout. Status labels display the right text and colors, users can group requests by status, and approver avatars are visible in category lists for quicker recognition.
Original PR description
In this PR, Before: - The Approvals Kanban board was difficult to read at a glance. - Status labels (like “Pending” or “Approved”) sometimes displayed incorrect colors or text. - Users couldn’t group approvals by status in the search view. - The list view for approval categories didn’t show user avatars. After: - Redesigned the Kanban cards to be cleaner and more readable. - Status labels now show the correct name and color consistently. - Added support to group approvals by status in the search view. - User avatars are now visible in the list view of approval categories Task-4677549
Users can now create a blank dashboard without leaving the spreadsheet selector. This removes extra steps when adding list, pivot, or graph views and makes the dashboard creation flow faster, especially when no dashboard exists yet.
Original PR description
**Description of the issue/feature this PR addresses:** - Enable users to create a new blank dashboard directly from the spreadsheet selector dialog instead of being limited to inserting into existing dashboards. **Current behavior before PR:** * Users could only insert list/pivot/graph views into existing dashboards. * Creating a new dashboard on the fly via the selector was not possible. * If no dashboards existed, users had to leave the selector, create one manually, and reopen the selector to proceed. **Desired behavior after PR is merged:** * The selector now offers a **“Blank dashboard”** entry in the Dashboard notebook. * Selecting this entry opens a minimal creation form (Name, Section, Access Groups) in a dialog. * Once saved, a new dashboard is created and immediately opened in edit mode as the insertion target. Task: [4948417](https://www.odoo.com/odoo/project/2328/tasks/4948417)
Resolved issues and error corrections
The restaurant floor plan now only shows appointments scheduled for the current day, preventing future bookings from appearing too early. Late customer appointments are also highlighted correctly, helping staff identify delayed arrivals at a glance.
Original PR description
Steps to reproduce: =================== 1. Install `pos_restaurant_appointment`. 2. From the Appointments menu, schedule an appointment for tomorrow for a table. 3. Open the restaurant floor plan. Issue 1: ======== - Appointments scheduled for tomorrow are incorrectly shown on the floor plan. Issue 2: ======== - When a customer is late, the appointment label is not displayed in red. Common Cause: ============= - The appointment's `start` field is already a `DateTime` object, but it is being deserialized again, which leads to incorrect time-based comparisons. Fix: ==== - Avoid deserializing the `start` field if it is already a `DateTime` object. Task: 4845006 Forward-Port-Of: odoo/enterprise#86997
Payroll users can now export Belgian Group S work entries for any active company they are allowed to use, instead of being limited to their current company. The export also checks that the selected company has its required Group S code set, helping prevent failed or incomplete payroll submissions.
Original PR description
before this commit only the current company was taken into account when exporting work entries now another company can be selected if multiple companies are active for the current user In addition to that this commit also add a check for the company's group s code to enforce the user to set it before exporting work entries task-4213675 closes old PR: odoo/enterprise/pull/71521 Forward-Port-Of: odoo/enterprise#89438
DHL shipping rate checks during ecommerce checkout now use a planned date in the future, preventing errors caused by same-day timestamps. This helps customers complete checkout more reliably when DHL delivery options are shown.
Original PR description
Before this commit: During checkout on Ecommerce website the default date of the order is current date and time. There is no option to change the date when getting rate. Which results in an error that the date must be in the future. After this commit: `Planned_date` for getting rate is set in furture to avoid the error. Docs reference: https://developer.dhl.com/api-reference/dhl-express-mydhl-api#reference-docs-section under rating endpoints. opw-4849754 Forward-Port-Of: odoo/enterprise#91705
Odoo now automatically matches customer account charges and settlements made through Point of Sale. This prevents settled POS amounts from incorrectly appearing as available credit for other invoices, reducing customer account confusion.
Original PR description
### Problem: When paying a PoS order using customer account, an account move line debiting Account Receivable will be created. Settling this amount inside the PoS (by depositing money) will create…
### Problem:
When paying a PoS order using customer account, an account move line debiting Account Receivable will be created. Settling this amount inside the PoS (by depositing money) will create another account move line crediting Account Receivable (represents the payment). The second move line is considered, by Odoo, as an outstanding amount, and this amount can be used to pay another invoice (sale order invoice). The moves affecting Account Receivable are still correct. However, unreconciling the two lines created from PoS will cause a confusion for clients who may use this amount to pay other invoices.
### How to reproduce:
* Open a PoS session.
* Create an order and pay using customer account.
* Settle this customer's account (inside PoS).
* Create a Sale Order and invoice it (or just an invoice).
* The amount settled can be used as outstanding amount and can be used to pay the created invoice.
commmunity PR: https://github.com/odoo/odoo/pull/210619#pullrequestreview-2853451890
opw-4794793
Forward-Port-Of: odoo/enterprise#92374
Forward-Port-Of: odoo/enterprise#86114Fixes an issue where nested grouped lines in accounting reports did not collapse properly and could trigger an error when users folded or unfolded a partner line. This improves report reliability and prevents duplicate lines from appearing during normal report navigation.
Original PR description
Steps to reproduce: - Create an Account Group - Create a new Account Report as follows: * Name: any * Lines: 1. [test line] * Group By: partner_id,account_id * Expressions: 1. [test expression] *…
Steps to reproduce:
- Create an Account Group
- Create a new Account Report as follows:
* Name: any
* Lines:
1. [test line]
* Group By: partner_id,account_id
* Expressions:
1. [test expression]
* Computation Engine: Odoo Domain
* Formula: [('account_id.account_type', '=', 'asset_receivable')]
* Subformula: sum
- Actions > Create Menu Item
- Open the new report
- Try to unfold/fold a partner line
Issue:
Folding will not fold the first child (representing the created account group). Also, error will raise
```
Uncaught Promise > Got duplicate key in t-foreach: ~account.report~37|~account.report.line~255|{'groupby': 'partner_id'}~res.partner~4226|~account.group~90
Occured on odoo.nas.cpolar.cn on 2025-04-26 04:58:53 GMT
OwlError: Got duplicate key in t-foreach: ~account.report~37|~account.report.line~255|{'groupby': 'partner_id'}~res.partner~4226|~account.group~90
Error: Got duplicate key in t-foreach: ~account.report~37|~account.report.line~255|{'groupby': 'partner_id'}~res.partner~4226|~account.group~90
at AccountReport.template (eval at compile (https://odoo.nas.cpolar.cn/web/assets/debug/web.assets_web.js:13743:20), <anonymous>:138:49) (/web/static/lib/owl/owl.js:5752)
at App.callTemplate (https://odoo.nas.cpolar.cn/web/assets/debug/web.assets_web.js:11363:50) (/web/static/lib/owl/owl.js:3372)
at AccountReport.template (eval at compile (https://odoo.nas.cpolar.cn/web/assets/debug/web.assets_web.js:13743:20), <anonymous>:9:12) (/web/static/lib/owl/owl.js:5752)
at RootFiber._render (https://odoo.nas.cpolar.cn/web/assets/debug/web.assets_web.js:9774:38) (/web/static/lib/owl/owl.js:1783)
at RootFiber.render (https://odoo.nas.cpolar.cn/web/assets/debug/web.assets_web.js:9766:18) (/web/static/lib/owl/owl.js:1775)
at ComponentNode.render (https://odoo.nas.cpolar.cn/web/assets/debug/web.assets_web.js:10493:23) (/web/static/lib/owl/owl.js:2502)
```
Analysis:
Folding issues occurs because of a mismatch in the grouping markup quote escape. If we don't have the very same string the controller cannot properly recognize the parent line and then is unable to fold/unfold properly.
This eventually led to the mentioned error at unfold as the backend will try to generate the apparently missing lines to unfold, only to create duplicate lines
opw-4754241
Forward-Port-Of: odoo/enterprise#89726Winbooks data imports now continue even when the chart of accounts setup differs from Odoo's default expectations. This prevents import failures and lets users review and adjust the imported draft data inside Odoo afterward.
Original PR description
When importing Winbooks data, if the CoA configuration in Winbooks is different from Odoo's default, users will experience a failure with a message similar to ``` Validation Error Tax Receivable Account (411000 VAT Recoverable) should be an account of type "Receivable" or "Payable" with both options "Allow Reconciliation" and "Non Trade" enabled. ``` This occurs because the account 411000, meant to store the tax provisions, in Winbooks was used as tax receivable. In similar cases we should not raise any error and should let the import go through: the data is imported in draft and the user has the possibility to bring the modifications in Odoo opw-4850314 Forward-Port-Of: odoo/enterprise#91828
XLSX files converted into Odoo spreadsheets now automatically limit portal users to view-only access. This prevents conversion failures when files come from shared folders where portal users previously had edit rights, keeping spreadsheet creation smoother and access rules consistent.
Original PR description
Let's say a Document Folder is shared with a portal user with 'edit' access. The portal user shares a .xlsx file to the folder, and an internal user later try to convert the file to odoo spreadsheet. During the conversion, the portal user has 'edit' role on the folder, which is copied to the documents.access records of the converted sheet. Since Odoo prevents Spreadsheets from being shared in edit mode to portal users, _check_spreadsheet() raises a Validation Error. <img width="544" height="188" alt="image" src="https://github.com/user-attachments/assets/48426ff8-0cd9-4fb0-8e52-31099e586064" /> To resolve this issue, we force portal users to have `view` role on Spreadsheets during the XLSX to Spreadsheet conversion. opw-4753670 Forward-Port-Of: odoo/enterprise#92427 Forward-Port-Of: odoo/enterprise#92134
The accounting automation now runs under the correct company context, preventing exchange rates from being applied for the wrong company. This helps keep bank statement reconciliation and currency-related accounting values accurate in multi-company setups.
Original PR description
In this commit: https://github.com/odoo/enterprise/pull/89244/commits/788d79cea3c2d45582e16b25847c7821a6521da1 we fixed a bug where the cron would be trigger with the wrong company which impacted the currency rate. We decided to put the change in the try_auto_reconcile, but it was a bit of code duplication so this commit will refactor that. Task-4933083 Forward-Port-Of: odoo/enterprise#92016 Forward-Port-Of: odoo/enterprise#90305
Manufacturing users can now stop work orders that run longer than expected without hitting an access error related to analytic accounting entries. This prevents production workflows linked to billable projects from being blocked for users who do not have accounting permissions.
Original PR description
To reproduce:
=============
- create a BOM with an operation having an expected duration
- make sure the product of BOM has MTO and Manufacturing routes
- create a Billable project with visibility=portal
- create an SO with the product of BOM and set the project for analytic distribution
- confirm the SO -> a MO is created
- with a user having:
- hr.group_hr_user
- mrp.group_mrp_manager
- project.group_project_user
- hr_timesheet.group_hr_timesheet_approver
- go to the MO and start the first operation and wait to exceed the expected duration
- stop the operation -> access error on the analytic account line
Problem:
========
when the user tries to stop the operation, at first moment AAL will be created, as we exceed the expected duration, we will try to update the AAL which leads to an access error as the user does not have accounting rights.
Solution:
=========
deal with AAL records as sudo
opw-4897142
Forward-Port-Of: odoo/enterprise#92422