Monday, August 10, 2026
4 changes · 19.0
Enhancements to existing features
Belgian payroll now includes the upcoming fiscal employment bonus rate changes starting in August 2026 and 2028. This helps ensure payslip calculations stay aligned with new rules for low-wage workers and the general fiscal rate.
Original PR description
Starting from August 2026: - The increased fiscal rate for low-wage workers (Volet B) rises from 52.54% to 63% (and to 72% in 2028). - The general fiscal rate (Volet A) rises from 33.14% to 35% starting in 2028. This adds new rule parameters for the fiscal rates and updates computation logic to apply these rates Task-6438319 Forward-Port-Of: odoo/enterprise#126713
Resolved issues and error corrections
Fixes an error that could occur when users turned the No Follow-Up setting on or off for invoices paid in multiple installments. This keeps the Follow-Up Report usable when some installments are already settled and others remain open.
Original PR description
Steps to Reproduce: 1. Configure Payment Term (Accounting > Configuration > Payment Terms) containing multiple installments. 2. Create a Customer Invoice with this Payment Term. 3. Post the invoice.…
Steps to Reproduce:
1. Configure Payment Term (Accounting > Configuration > Payment Terms) containing multiple installments.
2. Create a Customer Invoice with this Payment Term.
3. Post the invoice.
4. Register a payment and fully reconcile one of the installments.
5. Navigate to the customer's Follow-Up Report (Accounting > Reporting > Partner Ledger > Report: Follow-Up Report).
6. Navigate to remaining open installment/account move line for that invoice.
7. Turn On or Off the No Follow-Up toggle for the invoice.
An error occurs when enabling or disabling the No Follow-Up toggle.
Issue:
Enabling or disabling the No Follow-Up toggle on a remaining open installment in the Follow-Up Report raises a server error when the invoice contains multiple installments and one or more installments are already fully reconciled.
Root Cause:
The Follow-Up Report only loads and sends non-fully reconciled account move lines from the JavaScript side through all_line_ids. In action_toggle_no_followup(), when the selected line belongs to an invoice, the code retrieves all receivable/payable lines of the invoice, including fully reconciled installments:
```
move.line_ids.filtered(
lambda line: line.account_type in ('asset_receivable', 'liability_payable'),
)
```
The method then attempts to map every receivable/payable line to a report line ID using aml_id_to_line_id. Since fully reconciled installments are not present in all_line_ids, they are missing from the mapping dictionary, causing a KeyError when accessing:
`aml_id_to_line_id[line.id]
`
Fix:
Restricted the impacted lines to those present in the report by adding a check that the account move line exists in aml_id_to_line_id before performing the mapping:
```
lambda line: line.account_type in ('asset_receivable', 'liability_payable')
and line.id in aml_id_to_line_id
```
opw-6245448
Forward-Port-Of: odoo/enterprise#126156Timesheets now use each employee's scheduled weekly hours when checking weekly totals, rather than comparing part-time schedules against a full-time reference. This prevents correct timesheets from being incorrectly marked as under target for employees on flexible or reduced schedules.
Original PR description
Root cause: For an employee on a flexible working schedule, the weekly overtime shown in the timesheet grid compares the entered total against the full time equivalent of the schedule instead of its…
Root cause: For an employee on a flexible working schedule, the weekly overtime shown in the timesheet grid compares the entered total against the full time equivalent of the schedule instead of its own weekly hours. The target is sent by _count_daily_working_hours: https://github.com/odoo/enterprise/blob/27f3a05ca8a5ad6e8d4537dac4f613e60931f0cd/timesheet_grid/models/hr_employee.py#L117-L119 It reads full_time_required_hours, but since https://github.com/odoo/odoo/commit/5cb102546ea4370b4fe5e4a4f37cccdc90c263fd this field holds the company full time reference used to compute the work time rate, and the hours the schedule actually expects per week are on hours_per_week. So for a part time schedule at 80% of a 42 hours full time, the grid expects 42 hours instead of 33h36 and the weekly total shows in red with a wrong negative overtime. Fix: In _count_daily_working_hours, send the hours_per_week of the calendar as the weekly target and keep full_time_required_hours as a fallback when it is not set. For a full time schedule both fields hold the same value so nothing changes there. The result key stays the same so the grid renderers need no change. Steps to reproduce: 1. Go to Employees > Configuration > Working Schedules and create a schedule with Schedule Type Flexible, Full Time Equivalent 42:00 and Total 33:36 hours per week 2. Assign this schedule to an employee linked to a user 3. As that user, go to Timesheets > My Timesheets 4. On a past week, log 6:44 on Monday and 6:43 from Tuesday to Friday on a project 5. Check the Time Spent weekly total => the weekly total 33:36 shows in red with a -8:24 overtime while the employee worked exactly the 33h36 expected by the schedule Ticket [link](https://www.odoo.com/odoo/project.task/6352965) opw-6352965
The Shop Floor view now preserves the intended order of work orders after refreshes or filter changes. This prevents confusing reshuffling and keeps production teams seeing work orders ordered by status and scheduled start date.
Original PR description
Records already in cache are intended to be sorted by their position in `recordCacheIds` to preserve the previously computed display order. However, `recordCacheIds` stores database record ids (`resId`), and currently the cache lookup incorrectly uses `id` instead. As a result, every lookup returns `-1`, and could lead to inconsistent ordering. Steps to reproduce: 1. Create several manufacturing orders with work orders assigned to the same work center. 2. Give the work orders different states and scheduled start dates. 3. Open Shop Floor and display that work center. 4. Refresh the view or change a filter so the records are recomputed. It should use `resId` so the previously computed display order remains, which is based on state and scheduled start date. Related: odoo/enterprise#74421 opw-6402233 Forward-Port-Of: odoo/enterprise#125928