Daily updates from Odoo
Wednesday, April 1, 2026
3 changes · saas-19.2
Enhancements to existing features
The sickness relapse checkbox in Belgian payroll processing now defaults to unchecked instead of checked. This change reflects the updated 56-day sickness period policy, where relapse situations are less common and the system now assumes "no relapse" by default, reducing manual corrections needed by HR staff.
Original PR description
Because the sickness period is now 56 days, the heuristic has switched to "mostly always a no," so the relapse checkbox is unchecked by default. Task: 6081595
The payroll system now hides worked day details from the payslip summary widget when they're not needed for certain pay structures, such as bonus-only payments. This change reduces clutter and confusion for pay officers by dynamically showing only relevant information based on the pay structure type.
Original PR description
In order to improve the experience of pay officers and prevent any confusion, some pay structures will not require the display of individual work day lines such as bonuses. Accordingly, the worked day widgets will be dynamic. Task: 6030842
This update significantly speeds up stock availability calculations by optimizing how the system matches incoming and outgoing inventory moves. The change reduces processing time from 90 seconds to 10 seconds for large shipments, making inventory reports load much faster and improving overall system responsiveness.
Original PR description
Before this commit, computing `product_availability` and `product_availability_state` required calling the `get_report_lines` method from the `stock.forecasted_product_product` model. In pickings…
Before this commit, computing `product_availability` and `product_availability_state` required calling the `get_report_lines` method from the `stock.forecasted_product_product` model. In pickings containing moves linked to many incoming and outgoing moves, the `reconcile_out_with_ins` function caused performance issues. The reconciliation logic worked as follows: 1. For each `out_move`, attempt to match it with an `in_move` if the `in_move` references the `out_move` in its `move_dests`. 2. If the demand of the `out_move` is not fully satisfied, add it to `unreconciled_outs`. 3. Loop over `unreconciled_outs` (after attempting to reconcile them using the initial prodcedure) to reconcile against the remaining `in_moves`. The performance bottleneck was that even when an `in_move` directly referenced an `out_move`, the code would unnecessarily loop over **all** `in_moves` to filter out the `in_moves` that has the `out_move` in its `move_dest`. --- To improve performance, an **inverse mapping** from `out_move` IDs to their corresponding `in_moves` is introduced. - Reconciliation now starts by iterating only over the relevant `in_moves`. - If the demand is still unmet, the algorithm attempts reconciliation against the remaining `in_moves`. - This reduces the time complexity to **O(N + M)**, since `in_moves` with zero quantities are removed and never revisited. **Implementation details:** - An `OrderedSet` is used for the inverse mapping to preserve the original query order. - Benefits of `OrderedSet`: - **O(1)** removal (assuming no collisions) - Maintains insertion order, ensuring the same order as the query result. --- | Metric | Before PR | After PR | |---------------|-----------|----------| | Execution Time| ~90 sec | ~10 sec | The benchmark above is done on a `stock.picking` record that queried in the `_get_report_lines` method **5331** `out_moves` and **8922** `in_moves`. opw-4951469 Forward-Port-Of: odoo/odoo#235801 Forward-Port-Of: odoo/odoo#224002