Daily updates from Odoo
Thursday, October 9, 2025
15 changes · master
Enhancements to existing features
Belgian payroll now uses a clearer residency status with Resident, Non-Resident, and Frontalier options. For Frontaliers, withholding tax exemption is applied automatically and locked in the interface, reducing manual errors while keeping flexibility for other employees.
Original PR description
- Add l10n_be_resident_situation field with 3 options: Resident, Non-Resident, Frontalier - Compute no_withholding_taxes automatically for Frontaliers with readonly UI behavior - Maintain backward compatibility with computed is_non_resident field - Update employee and contract template views to use new selection field - Update test data to use new field structure Frontaliers now automatically get no withholding taxes with a disabled checkbox, while Residents and Non-Residents can still manually control the setting. task-4936512
A new filter helps users quickly find salary offers that are waiting for their signature. This makes it easier to focus on pending actions and replaces an older default filter with the clearer, dedicated option.
Original PR description
Add filter for 'Waiting For Me' in salary offer search view, returning only offers with signature expected (half signed). Also context filter replaced with the newly introduced one Task ID: 5031087
Users can now duplicate existing records even when creating brand-new records is disabled. This gives businesses more precise control, allowing teams to reuse approved records while still preventing unrestricted new entries.
Original PR description
*: documents, web_studio This commit allows record duplication even when creation is disabled (create="0"). Duplication permissions should depend only on specific duplication rules (e.g., duplicate attribute) and server-side access rights — not on the create attribute. This makes sense in cases where users are allowed to duplicate existing records but not create new ones from scratch. task-5131124
The VoIP call history and softphone views now show clear icons when calls include recordings or AI-generated transcriptions. This helps users quickly identify which past conversations have supporting audio or text records available for review.
Original PR description
Task-4962728
Work entries now show where they came from, such as schedules, time off, planning, attendance, or manual creation. Access to work entries is also aligned with HR and payroll roles, helping teams review payroll-related records with clearer ownership and permissions.
Original PR description
- added Source field in `hr_work_entry_view_form` which takes value from:
- `resource_calendar_id` if the work entry has been generated from the working schedule
- `leave_id` if the work entry has been generated from a time off
- `planning_slot_id` if the work entry has been generated from a planning
- `attendance_id` if the work entry has been generated from attendance
- Manual if the work entry has been generated manually
- removed the expand button in the `hr_work_entry` pop up
- added inherited views for `hr_work_entry_view_form` in `hr_work_entry_attendance` and `hr_work_entry_palnning` to show corresponding fields
- changed access of the work entries smart button to be only `group_hr_manager` and then change to `group_hr_payroll_user` when payroll is installed
- removed access to work entries from `group_hr_manager` when payroll is installed
Task [link](https://www.odoo.com/odoo/project.task/5118852)
task-5118852Financial reports now use parent accounts to group and present accounting data, replacing the previous account group approach. This makes reports such as trial balance, aged partner balance, asset reports, and localizations more consistent and easier to interpret for finance teams.
Original PR description
WIP: implement parent account in reports Task: [5055586](https://www.odoo.com/odoo/project/967/tasks/5055586)
Cashiers can now use a dedicated Food Platform button on the POS ticket screen to quickly view orders received through UrbanPiper. This makes it easier to separate third-party delivery orders from in-store sales, while replacing the previous UrbanPiper search filter with a clearer workflow.
Original PR description
In this commit: =============== - Added a "Food Platform" filter button on the ticket screen to show only orders received from UrbanPiper. This helps cashiers quickly identify and manage third-party food platform orders separately from in-store orders. - Removed the UrbanPiper search filter since a dedicated filter button has now been added on the ticket screen for managing UrbanPiper orders. Task-5033759 Related PR: https://github.com/odoo/odoo/pull/224217
Payroll salary rules can now be created without assigning them to a category. This simplifies payroll setup by avoiding unnecessary one-off categories and makes salary rule management easier for teams.
Original PR description
**Issue** To simplify salary rule configuration and reduce unnecessary records the salary rule category field is made non-mandatory, to avoid creating categories that contain only a single rule and making the setup easier to manage. Task ID: 5126314
This update changes Bangladesh payroll benefits so they are handled as employee properties rather than fixed payroll inputs. It makes benefit setup more flexible and helps payroll calculations retrieve configured values more reliably.
Payroll users can now generate payslip PDFs more conveniently from list views, with small batches created immediately. Printed payslips are also saved directly on the employee payslip record, making documents easier to find and manage.
Resolved issues and error corrections
This fix prevents invoices from failing during tax calculation when no external tax is found for a customer's ZIP code. The system now safely treats missing manual tax details as empty, allowing users to continue computing taxes without interruption.
Original PR description
Currently, an error occurs when computing taxes for an invoice. **Error:** `KeyError: 'manual_tax_amounts'` **Cause:** When a user clicks the `Compute Tax` button, the system calculates the tax for…
Currently, an error occurs when computing taxes for an invoice.
**Error:**
`KeyError: 'manual_tax_amounts'`
**Cause:**
When a user clicks the `Compute Tax` button, the system calculates the tax for that invoice, including the `manual_tax_amount` [1]. However, if no tax is found for a given customer ZIP code, the `tax_values_list` becomes empty [2]. As a result, `manual_tax_amounts` in the base line also becomes empty.
Later, when the system tries to fetch the `manual_tax_amounts` key from extra_tax_data, it raises a KeyError [2], because the key no longer exists.
Additionally, the condition in [3] indicates that there is no guarantee that the `manual_tax_amounts` key will always be present in the base_line.
**FIX:**
This commit ensures that if the manual_tax_amounts key does not exist, an empty dictionary {} is used instead. This prevents the KeyError from occurring during tax computation.
[1]- https://github.com/odoo/enterprise/blob/b17b6b4e5ca3085d831fc763457496b5c5b639c5/account_external_tax/models/account_external_tax_mixin.py#L155-L163
[2]- https://github.com/odoo/enterprise/blob/a51aee8f6e8bce2aa699d3199d6723495464a762/account_external_tax/models/account_external_tax_mixin.py#L88
[3]- https://github.com/odoo/odoo/blob/241c170dbece8c1652db9ca1aa935b2106ede532/addons/account/models/account_tax.py#L1330
sentry-6919182805
Forward-Port-Of: odoo/enterprise#96401Gantt group headers now keep the right size so they remain visible and aligned while users scroll. This prevents oversized headers from breaking the sticky behavior, especially on smaller mobile screens.
Original PR description
Gantt group headers could stop being sticky because their width was fixed based on the number and size of columns. Even though they were set to position: sticky, oversized headers could no longer remain aligned when scrolling, as they extended beyond the viewport and were constrained by the document width. This was especially noticeable on mobile, where group headers are often wider than the screen. The fix applies a max-width style to these headers, capping their size to the available space so they remain sticky without overflowing the document. task-4970992 Forward-Port-Of: odoo/enterprise#96612 Forward-Port-Of: odoo/enterprise#96015
Quality checks for products tracked by serial number now correctly remain failed when the check is failed from a receipt. This prevents defective items from being incorrectly marked as passed, improving inventory and quality control accuracy.
Original PR description
Serial number tracked product are marked as pass even when they fail a move_line type of check. ### Steps to reproduce: * Create a product tracked by serial number * For this product create a control…
Serial number tracked product are marked as pass even when they fail a move_line type of check. ### Steps to reproduce: * Create a product tracked by serial number * For this product create a control point: - Control per quantity - Operations : Receipts * Create a receipt for this product * Mark the receipt as Todo * Start the Quality check from the receipt, without using the smart button. * Fail the Quality check * The Quality check still passes ### Issue: When validating a quality check and it fails: https://github.com/odoo/enterprise/blob/d48228127c239e45938551d9bbac734afab8b31a/quality_control/wizard/quality_check_wizard.py#L84-L92 I will not go through the standard process with show_faillure_message where the user can select failed_qty, it directly goes to confirme_fail>_move_to_failure_location: https://github.com/odoo/enterprise/commit/49149580d34ec5583559fa0288356fec6cb2c514#diff-2ffdc2ffc25417076b580b772447514c7e9d8b3e2d2fff2d3100721eb5ccbaf4L455-R457 In our case since failed_qty is still at 0 this new condition transfer the quality check to pass. In the case of serial numbers, the quality check is done one by one, the failed_qty can be retrived from check.move_line_id.quantity opw-5015266 Forward-Port-Of: odoo/enterprise#92966
When an employee contract is signed, the selected company car is now reliably recorded in the employee history even if the value was already present on the contract version. Offer summaries also show the selected car and bike names, making compensation details clearer for HR and employees.
Original PR description
As when signing the employee contract, the version related to that contract is already created and we just set the version active, the value of the car does not change, so the tracking is not triggered and it's not added into the chatter. This PR force the car_id and ordered_car_id to be tracked by adding the initial value the employee precommit tracking values, before the version is activated (so before the employee get the new values from the newly active version). Also, this PR adds the selected car and bike names to the offer summary. Task-4962922 Forward-Port-Of: odoo/enterprise#90915
The Time Off screens now correctly open the group request wizard from list, calendar, and Gantt views. This ensures managers can create group time off requests without the button failing or being ignored.
Original PR description
See https://github.com/odoo/odoo/pull/226574 **Issue** - When clicking header buttons other than approve/refuse in Time Off list view, the actions are not processed correctly. - Added New Group Time Off to calendar and gantt view **Steps to Reproduce** 1. Navigate to Time Off > Management > Time Off or Allocations 2. Switch to List view 3. Click on New Group button 4. Action is not executed properly **Root Cause** Previously, handleViewButtonClick only processed approve/refuse actions and ignored other header button actions. Now, non-leave actions are correctly forwarded to the default handler. Task ID: 5062846 Forward-Port-Of: odoo/enterprise#95153