Daily updates from Odoo
Monday, November 17, 2025
44 changes · master
New functionality added to Odoo
Spain’s Intrastat localization now includes the required filing schedules and deadlines for tax returns. This helps Spanish companies prepare Intrastat declarations on time and keeps the localization aligned with national reporting rules.
Original PR description
Introduce the country-specific periodicities and deadlines for Intrastat returns in the Spain localization, as part of the new tax return feature added in 18.3. This ensures that Spanish Intrastat reports comply with the national requirements and aligns the localization with other European implementations. Task-4987876 Forward-Port-Of: odoo/enterprise#92852
Enhancements to existing features
Payroll labels and descriptions were updated to improve clarity and consistency across the core payroll app and several country-specific payroll localizations. This helps payroll users see more accurate translated wording in day-to-day payroll setup and processing.
Original PR description
task-4571722
The point of sale payment screen now hides the remaining or change status when the amount is zero. This reduces unnecessary information at checkout and makes the payment flow clearer for cashiers.
Original PR description
Before this commit : ------------ - Payment screen always showed Remaining or Change even when the amount was 0. After this commit : --------------- - Payment screen no longer shows the status section when the amount is 0. ------------------------------------------------- Task-5266175 Related PR-https://github.com/odoo/odoo/pull/235929
Users now see a clear banner when a spreadsheet is in the trash, and they can restore it directly from the spreadsheet view. Trashed spreadsheets are protected from edits, helping prevent accidental work on files that were meant to be removed.
Original PR description
Current behavior before PR: - When a spreadsheet was moved to trash, it remained editable. - No banner or notification indicated that the file was in trash. - Users could not restore a trashed spreadsheet directly from the view. Desired behavior after PR is merged: - Rename `isReadonly` variable to `hasWriteAccess` for clarity - Trashed spreadsheets become read-only. - A banner is displayed indicating the file is in trash, with a button to take it out of trash. - Updates are not real-time for other active users, but editing a trashed file raises a UserError. Task: [5030282](https://www.odoo.com/odoo/2328/tasks/5030282)
Adds realistic sample data for field service tasks covered by warranty. This helps teams demonstrate and test how warranty-related service work should be handled in the system.
Original PR description
This commit introduces demo data specifically designed for tasks that are covered under warranty within the industry_fsm_sale module. The purpose of this addition is to enhance the testing and demonstration capabilities by providing realistic examples of how warranty-related tasks should be managed within the system. task: 3853356
Field service users can now open an itinerary or call a customer directly from Gantt and calendar schedule popovers. This reduces extra clicks and helps teams coordinate visits faster without opening each task form.
Original PR description
_ *: industry_fsm, voip, gantt In this commit, we have made the process smoother for FSM users. Now, they can directly open the map or make a call from the Gantt popover, so there is no need to open the form view. task-3617833
Field service task chatter now shows how far timer start and stop times are from the planned task dates. This makes it easier for users and managers to quickly see whether work time was tracked in line with the schedule.
Original PR description
Added the time difference between start and stop times in the FSM task chatter.this helps users easily identify whether the timer was used according to the planned dates. Example: - Timer started at: 01/23/2025 15:11:29 AM (hh:mm before/after the start date) - Timer stopped at: 01/23/2025 15:11:43 AM (hh:mm before/after the end date) task-4510245
When users enable Do Not Disturb, incoming calls no longer make the softphone pop up, reducing interruptions during focused work. The calling status text was also clarified so users can better understand when a call is still being placed.
Original PR description
Before this commit, enabling `Do Not Disturb` mode only muted incoming rings, but the softphone still popped up on incoming calls, which could be distracting. Now, when `Do Not Disturb` is active, the softphone is not displayed at all. task-5262271 Forward-Port-Of: odoo/enterprise#99409
Knowledge article links now open a preview popover instead of immediately navigating away, helping users confirm the target content before opening it. The update also improves article link previews by showing the correct title, supporting summaries and cover previews where available, and preventing crashes in link handling.
Original PR description
This PR addresses the following: - Updated command link appearance to use btn-secondary styling. - Fixed /link to correctly display titles in previews and prevent crashes. - Ensured clicking on article links triggers a proper link preview popover. Task-4624296
This update modernizes internal VoIP calling code by replacing an outdated programming utility. It helps keep call handling and AI-related VoIP features compatible with the latest platform standards without changing the user experience.
Original PR description
Commit [1] deprecated the `Deferred` util. This commit replaces its usage in voip apps. [1]: https://github.com/odoo/odoo/commit/2067b860d2168ff581434f21b49355af92d09780
UAE payroll now applies the latest GPSSA and ADPF pension contribution rules for national employees. Contributions are calculated using the employee enrolment date, company sector, salary thresholds, and the company’s emirate, improving compliance and payroll accuracy.
Original PR description
Purpose: - Update UAE social insurance calculation for nationals to comply with the latest GPSSA and ADPF rules, ensuring correct contribution rates based on employee enrolment date, sector type, gross salary thresholds, and emirate of the company. Changes: - Updated "Social Insurance Company Contribution" and "Social Insurance Employee Contribution" salary rules logic. - Changed emirate determination to use the company address instead of the employee's personal address. GPSSA (All Emirates except Abu Dhabi): - If Pension Enrolment Date is before 31 Oct 2023 → Employee: 5%, Company: 15% (non-private) / 12.5% (private). - If on or after 31 Oct 2023 → Employee: 11%, Company: 15% (non-private) / 12.5% (private, gross < 20k). ADPF (Abu Dhabi): - If Pension Enrollment Date is before 1 Dec 2023 → Employee: 5%, Company: 15%. - If on or after 1 Dec 2023 → Employee: 11%, Company: 15%. Task-4991327
The Attendance Gantt view has been adjusted so the right fields are shown or hidden based on the newly introduced access group. This helps ensure users see the attendance information appropriate to their permissions without changing core workflows.
Original PR description
Update the Gantt form view's visibility attributes to accommodate the newly added field based on the new access group. Task: 4815633
The Twitter/X user search in Odoo Social now uses a search-focused endpoint instead of only checking for an exact username match. This makes it easier for users to find and select the correct Twitter/X account when setting up or managing social accounts.
Original PR description
This commit changes the endpoint used in the twtitter_get_user_by_username method to allow the user to properly search for a user on Twitter/X. The old endpoint didn't allow a proper search as it only returned a singular element. This means that we didn't do a proper search per se but only checked if the username provided existed. By now using `/2/users/search`, the user can properly search for a specific user on Twitter/X. task-5170291
The Indian payroll dashboard now warns when employees are missing required LWF numbers, helping payroll teams catch compliance data gaps earlier. Demo data was also adjusted and a dashboard pay run label was clarified for a cleaner user experience.
Original PR description
Add a dashboard warning for missing employees with LWF numbers. Remove the ESIC number from the demo data of employee Alisha Sharma. Change the string of the dashboard payrun. task-5222433
Payroll officers can now see and manage employee contract offers directly from the employee form. This removes the need to grant recruitment permissions just so payroll teams can handle offer-related work.
Original PR description
Previously, the "Offers" smart button on the employee form was only available to recruitment users. This limited visibility for payroll officers who also need access to contract offers. This commit: - Changes the button visibility to `hr_payroll.group_hr_payroll_user` in `hr_employee_views.xml`. - Adds missing access rights in `ir.model.access.csv` for `hr.group_hr_user` (inherited by payroll users). - Updates the module manifest to include the new security CSV. The goal is to ensure payroll users can access and manage offers directly without requiring recruitment rights. task-5085078
The payroll dashboard warning now checks for duplicate payslips across all relevant payslips, not just those in the latest batch. This helps payroll teams spot potential duplicate payments more reliably before processing payroll.
Original PR description
- update the warning to include all the payslip not only the ones on the last batch Task: 5186729
Companies can now choose whether employee payslips are emailed when they are validated, when they are paid, or not sent automatically. This helps payroll teams align payslip delivery with local practices and company policies.
Original PR description
Currently, employees receive the payslips through email right when the payslip is validated (When the journal entry is created), but in some countries, that should not be the case, as they expect receiving the payslip after it is actually paid. This commit allows the company to decide when payslips are sent, either on validation or on payment or never. Task-ID: 5168943
The fleet mobility card field is now limited to Belgian payroll and fleet localization screens. This keeps country-specific employee and fleet information visible only where it applies, reducing confusion for users in other countries.
Original PR description
Added a the mobility card field to the belgian localisation to make it exclusive to belgium after removing it from the hr_employee common vue. task - 5176316 Community PR : 232873
The Payroll work entry type screens have been reorganized to make setup easier to understand, with clearer sections, labels, tooltips, placeholders, and useful list filters. The change also removes redundant internal fields and updates related payroll, attendance, planning, holidays, and localization logic so the new category-based setup stays consistent.
Original PR description
The Work Entry Type form view needed to be refactored. The form view is now split into new groups (computation, display, exports code, benegit eligibility and description). Tooltips and placeholders…
The Work Entry Type form view needed to be refactored. The form view is now split into new groups (computation, display, exports code, benegit eligibility and description). Tooltips and placeholders have been added to avoid further confusion of the fields, and some naming repetition has been removed (e.g.: "Partena Code" under the "Exports Code" group). Some hidden columns and some filters have been added to the list view. Here is a visualization of all the visual changes that needed to be done: https://app.excalidraw.com/l/65VNwvy7c4X/4LJSOZo8W3D `_is_unforeseen` (and anything related to it) has been deleted, since it was not used anywhere. After the UI cleanup, some views became unused. I had to remove them in migrations. `is_leave` (and its mirrror, `is_work`) are redundant, especially now that we want to use a selection field instead. So I had to remove them both and replace every single one of their occurences in the code by a new selection field named `category`. A migration making sure `category` reflects the old `is_leave` needed to be put in place. Due to having to do some back and forth in how to handle `is_work`, I found some issues (unused file, bad `querySelector`, etc.) with the `boolean_radio` widget. Fixes of this widget are thus included in this PR. task-5162567
Indonesian payroll benefit inputs are now handled through salary rules, aligning them with the newer flexible benefits system. This makes payroll configuration more consistent and keeps related payroll inputs together for easier administration.
Original PR description
purpose: adapting the new system of flexible benefits coming from salary rules for id localization - removed the records in `hr.payslip.input.type` and converted them into corresponding salary rules - changed the tests in `test_salary_rule` to use salary rules instead of other inputs task-id: 5122371
The Documents module tests now wait more reliably for error messages before checking them. This reduces random test failures in automated checks, helping teams trust build results and avoid unnecessary investigation time.
Original PR description
The `unhandledrejection` event is triggered asynchronously in JS. Once this event is triggered, the error is handled and an error dialog might be displayed, depending on the type or error being thrown. In several tests, after throwing an error, we only waited for an animation frame before asserting the presence of the error dialog. This only works if the `unhandledrejection` event is fired before the next animation frame, which isn't guaranteed. When it is not the case, the test fails because the error dialog is not there yet. We already had to fix that kind of issues multiple times, after impacted tests were caught failing non deterministically on runbot (e.g. [1][2][3]). This commit fixes several other occurrences of the faulty pattern, which haven't been spotted yet but could have non deterministically failed as well. [1] https://github.com/odoo/odoo/pull/178491 [2] https://github.com/odoo/odoo/pull/235446 [3] https://github.com/odoo/odoo/pull/235464
Removed unused access group markers from accounting-related client-side templates because they were not being applied there. This simplifies the code without changing what users see or how permissions work.
Original PR description
The `groups` attribute in used in the QWeb template to display nodes based on access groups. This attribute is only available on server-side templates. This commit removes the useless `groups` attributes from client-side (aka. `static`) templates as they are not applied anyway.
The payroll wording has been updated from "Salary Structure" to "Pay Structure" across payroll-related screens and documents. This makes the terminology clearer and more consistent for HR and payroll users without changing payroll calculations or business processes.
Original PR description
*: hr_contract_salary_payroll, l10n_in_hr_payroll - Renamed the "Salary Structure" label to "Pay Structure". task-5262042
This update refreshes the UAE payroll setup with clearer company demo data, adjusted payroll structures and salary rules, and an Emirati working schedule aligned with the local timezone. It also improves how work addresses are determined so payroll settings better follow the logged-in company.
Original PR description
The cleanup includes: -Changing the company name to "My Emirati company". -Adjustments in payroll structures and salary rules. -New working schedule for Emirati company has been created to follow the Emirati timezone. -Improvements in the payroll module description. -Editing the logic behind the work address calculation to follow the logged-in company.
The Belgian payroll 273S report is easier to use with clearer year display, faster line creation, and improved generate buttons. These changes reduce confusion and streamline report preparation for payroll users, while ensuring records are linked to the correct company.
Original PR description
- Corrected display of Year field (removed thousand separators formatting) - New button now adds a new line directly - Extended binary_field widget to a custom widget for generate buttons - Added company id field - task-5167073
The Indian Payroll Reports menu has been reorganized so report entries appear in alphabetical order. This makes the list cleaner, easier to scan, and more consistent for payroll users.
Original PR description
Before: - The menu item of Indian Payroll Reports was not in order. After: - Arranged all Indian Payroll Reports in alphabetical order. Impact: - Keeps the reports list clean and consistent. task-5222845
Resolved issues and error corrections
Regular users can now receive VoIP calls without the system crashing when contact details are matched to the call. The fix keeps call records protected from user tampering while allowing the application to update the linked contact safely.
Original PR description
In order to prevent users from tampering with their voip.call records, they aren't given direct write access to them. This leads to crashes in the get_contact_info function, which attempts to update the partner_id field of call records. This commit resolves the issue by switching to sudo mode for setting the partner_id. Forward-Port-Of: odoo/enterprise#99429
Fixed an issue where entering certain barcode values, especially URN-style codes, could cause the barcode scanning screen to fail. This improves reliability for warehouse and manufacturing users when manually entering or scanning barcodes.
Original PR description
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature`…
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature` - Barcode > click on `Scan or tap` > Enter a barcode(barcode number should startwith `urn` (eg: "urn:epc:tag:sgtin-96 : 3.0614141.038656.0")) > Apply Traceback: --- `KeyError: 'rule'` (with GS1 Nomenclature) `AttributeError: 'list' object has no attribute 'get'` (without GS1 Nomenclature) At [1], we expect the key `rule` to be present in the result, but this key is never set in the return statement at [2]. Since [1] also relies on the result’s type, a new key value `type` has been added in this [commit] to address that. This commit ensures that the correct keys are passed in the result dictionary. [1]- https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/stock_barcode/controllers/stock_barcode.py#L29-L31 [2]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/barcodes/models/barcode_nomenclature.py#L174-L189 [commit]: https://github.com/odoo/odoo/commit/1394fa161a6fcf77b4443cbf784ad7dd635e7f9e#diff-be2a58d0591614180295c070396ff487f4bc04bf33aad2829d7bfab4671a792cR60 sentry-6992944243 Forward-Port-Of: odoo/enterprise#98761
The journal audit report now matches the selected filter for draft entries. This ensures users who enable draft entries can review the expected journal items instead of seeing an empty result.
Original PR description
* In a new journal, create a draft entry * Open the journal audit: Accounting > Review > Journal Audit * Activate the "With draft Entries" option. * The journal should display 1 entry to review * Click on the review button, there is nothing to display We should be consistent in the filters selected is the search view and what is displayed on the report. Forward-Port-Of: odoo/enterprise#99381
French FEC imports now use less memory when matching imported records to existing partners. This helps companies with very large partner databases avoid import failures and complete the process more reliably.
Original PR description
### Description: When importing an FEC, Odoo will fetch all the partners to link the new imported records to the existing partners. The issue is that it triggers the prefetching of all the fields of the partners (304k partners in their case), causing a memory error. To avoid that, we can just fetch the field that we need (e.g. "name" and "ref"). ### Reference: opw-5153555 Forward-Port-Of: odoo/enterprise#98483
This fixes an issue where regular users could be blocked from signing a document because the system looked up the wrong user record. The signing flow tests now run as a regular user as well, helping catch permission problems that administrators would not see.
Original PR description
By running the test_sign_flow tour as a regular user, a typo is detected by the tests in the sign.send.request wizard. The issue is that, on the model `res.partner`, the field `user_id` is the…
By running the test_sign_flow tour as a regular user, a typo is detected by the tests in the sign.send.request wizard.
The issue is that, on the model `res.partner`, the field `user_id` is the Salesperson associated to this Contact, whereas the field `user_ids` contain the `res.users` that inherit this Contact, and `main_user_id` is the most appropriate User of `user_ids` when we need only one.
When testing as admin, all fields are the admin user, whereas when testing as Laurie Poiret (or any regular user), the Salesperson is still the admin while `main_user_id` is Laurie Poiret.
A regular user can access only its own `sign_signature` field, while an administrator can access the `sign_signature` of all users, so this bug remained undetected:
On a runbot, log in as `admin` to change the sales person of Marc Demo to Mitchel Admin, then log in as `demo` and click on "Sign Now" on the `Rental_Agreement.pdf` template.
You do not have enough rights to access the field "sign_signature" on User (res.users). Please contact your system administrator.
Operation: read
User: 5
Groups: allowed for groups 'Role / Administrator'
Forward-Port-Of: odoo/enterprise#99408Helpdesk refunds now create credit notes for only the product chosen by the user, instead of including every product from the original sales order. Product selection is also narrowed to items related to the sales order, reducing mistakes and speeding up after-sales processing.
Original PR description
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we…
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we click on refund. Even if we specify the product to refund, this action creates a credit note containing both products (previously present on the SO) instead of only the one to refund. Additionally, when selecting the product, we could see in the dropdown of suggestions all the existing products, instead of only the ones related to the SO. ## Reproduction Steps 1. Create a SO containing 2 different products and confirm it. 2. Create a regular invoice and confirm. 3. Go to Helpdesk. Click on the configuration tab, and helpdesk teams. 4. Click on your helpdesk team, scroll down. In After-Sales, check "Refunds". 5. Create a ticket and specify the customer who wants to refund. Make sure the correct helpdesk team is assigned. 6. Click on refund. It opens the wizard. Specify the product to refund and the Invoices to Refund. 7. Click on reverse. ### Expected behavior A credit note containing only the specified product to refund should be created. ### Unexpected behavior The created credit note contains both products originally present on the SO. ## Origin of the issue When issuing a refund from helpdesk_stock_account, this piece of code is called: https://github.com/odoo/enterprise/blob/2051e84c55618c64179c4b9f3e99f4e795bacd32/helpdesk_stock_account/wizard/account_move_reversal.py#L16-L17 which calls the ```reverse_moves``` method in the helpdesk_account.py file, which itself calls the ```reverse_moves``` method in the account_move_reversal.py file, in the account module, and so on. Finally, we arrive in the account_move.py file. In the ```_reverse_moves``` of this file, we can see the code: https://github.com/odoo/odoo/blob/bee7fc1f955c52a88b527ad9a2ddf0021529bbc7/addons/account/models/account_move.py#L4937-L4947 where we simply copy all the lines of the move in the SO without filtering them. As a result, we get the lines of the product we don't want to refund __ opw-5148789 Forward-Port-Of: odoo/enterprise#99477 Forward-Port-Of: odoo/enterprise#98771
Fixed an access problem that blocked non-admin users from creating Mexico Global Invoices. Regular accounting users can now complete the process and generate the required Global CFDI document without needing administrator permissions.
Original PR description
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the…
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the attachment creation to use the SUPERUSER: https://github.com/odoo/enterprise/pull/95197 However, updating `attachment.res_id` then required `base.group_system` access rights, preventing regular users from modifying the attachment As a result, non-admin users (like demo) triggered an access error during Global Invoice creation ## Steps to reproduce: - Switch to the MX company - Create a product with an UNSPSC Category (Accounting Tab) - Create and Confirm an Invoice for the product (enable CFDI to public) - Connect as Demo - Go in Accounting > Customers > Invoices - Toggle the last created invoice checkbox - Actions > Create Global Invoice - Before the fix, the Access Error is displayed - Check in the invoice Chatter for the Global CFDI document creation success opw-5181925 Forward-Port-Of: odoo/enterprise#98218
Archiving a company no longer causes access errors when users open the Documents app. The change ensures document folders are filtered to those the user is allowed to access, improving reliability in multi-company setups.
Original PR description
**Steps to reproduce:** - Add some folders - Create a new company - Assign some folders to the new company - Archive the company - Click on Documents app - AccessError is raised when opening it…
**Steps to reproduce:** - Add some folders - Create a new company - Assign some folders to the new company - Archive the company - Click on Documents app - AccessError is raised when opening it **Issue:** The issue seems to be related to caching issue on the field `type` when fetching the documents with `search_panel_select_range` and going through `_compute_display_name`: `folders = accessible_records.filtered(lambda d: d.type == 'folder')` This error was quite inconsistent and might be related to the cache missing some prefetched data on a record it shouldn't have been able to read. There is a need to ensure only the folders available to the user are able to be fetched. **Fix:** Added the `type` field in the `search_panel_fields` but this might not be needed if the issue comes from elsewhere. For now the issue was mitigated by explicitly checking for the user companies in the domain of the searchs, but it needs to be checked as this behavior might break other flows. opw-4931278 Forward-Port-Of: odoo/enterprise#99126 Forward-Port-Of: odoo/enterprise#96817
Creating an offer from an existing employee's Offers button no longer incorrectly fails because an applicant is missing. The field visibility rules were adjusted so HR teams can generate offers in this scenario without interruption.
Original PR description
-When creating a new offer for an existing employee through the smart button "Offers", an error appears showing that the applicant is missing. -The issue has been fixed by changing the visibility conditions for the fields.
Mexican electronic invoices now report local fixed-amount taxes using the configured amount instead of multiplying it by 100. This prevents incorrect tax values in CFDI XML files and helps businesses issue compliant invoices.
Original PR description
Steps to reproduce: 1. With an MX Company setup configure a new tax as follows - Tax Computation: Fixed - SAT Tax Type: Local - Factor Type: Cuota - Amount: 5 2. Create a customer invoice with the tax 3. Generate CFDI Issue: In the XML the ImpuestosLocales node contains `<implocal:TrasladosLocales ImpLocTrasladado="VAT 0%" Importe="20.00" TasadeTraslado="500.00"/>` The tax fixed amount was multiplied by 100 This occurs because we don't check if the tax is fixed when normalizing the amount opw-5132807 Forward-Port-Of: odoo/enterprise#99431 Forward-Port-Of: odoo/enterprise#98988
Belgian payroll employee version fields now correctly record change history. This restores expected audit visibility and prevents related automated checks from failing.
Original PR description
The test_hr_version_fields_tracking was failing because the Belgian Dimona fields in hr.version model were missing tracking=True. task-5122440 Forward-Port-Of: odoo/enterprise#99144 Forward-Port-Of: odoo/enterprise#95735
The sample data ribbon setting was removed from shared action helper screens. This prevents an outdated visual marker from appearing in affected views and keeps the interface consistent for users.
Original PR description
This commit fully removes the prop `showRibbon` from the `ActionHelper` component.
Quick replace actions in the work entries Gantt view now show the proper error when users try to change validated entries. This prevents silent failures and makes it clear whether a validated entry cannot be modified or deleted.
Original PR description
Issue: Work entry quick replace buttons in gantt view didn't show error messages when trying to modify validated entries. The JavaScript was filtering out validated entries client-side and preventing server-side validation from triggering. Steps to Reproduce: - Open work entries gantt view - Select validated work entries - Click quick replace buttons (work entry type change) - No error message appears, operation silently fails Fixes: - Removed client-side filtering to allow all entries (including validated) to reach server validation - Added server-side check to distinguish modification vs deletion operations - Server now shows appropriate error message: "This work entry is validated. You can't modify it." for modifications vs "This work entry is validated. You can't delete it." for deletions Task ID: 5075615
This change prevents installation errors when Saudi Payroll and Salary Package modules are loaded in different orders. Employee cost fields are now added from the module that has the correct dependencies, making setup more reliable without changing day-to-day payroll behavior.
Original PR description
Reproduce Issue : loading hr_contract_salary after l10n_sa_hr_payroll causes this error Element '<xpath expr="//separator[@name='employer_costs']">' cannot be located in parent view Issue : in the hr_employee_view of the l10n_sa_hr_payroll , we inject three fields in the seperator "employer_costs" which is defined in hr_contract_salary , because there is no dependecy between the two modules , this causes the error to happen if the l10n_sa_hr_payroll is loaded first. Fix : Create another view to add these fields in the l10n_sa_hr_contract_salary module which depends on both l10n_sa_hr_payroll and hr_contract_salary task - 5258832 related PR : enterprise#98239
This update prevents salary configurator tests from failing when the Belgian localization is not installed. It removes assumptions about Belgium-specific employee fields from the general salary module and keeps those settings handled only in the Belgian flow.
Original PR description
This fix targets an issue introduced by PR [odoo/enterprise#96415]. Steps to reproduce: Install the hr_contract_salary module on its own or with a localization other than BE, then run the test TestEmployeeSalaryConfigurator.test_employee_salary_configurator_flow. You will get the following error: ValueError. Cause: The fields mobile and internet are only defined on hr.employee under the Belgian localization. However, when creating test employees in hr_contract_salary, these fields were being referenced directly. Therefore, when testing without the BE localization, the fields were missing. Solution: Remove the fields from the hr_contract_salary test. Since mobile_invoice and internet_invoice are hidden when the fields are not available, we now set their values manually in the extention of the tour of the BE localization to avoid dependency on BE-specific fields. Related PR: enterprise#96415 Task: 5249282
This fix reverts a recent change that moved Belgium private car benefits into salary rules because that approach could not support required manual and folded benefit handling. Belgian payroll and salary package flows now use the previous field-based behavior, reducing the risk of incorrect or confusing car benefit calculations.
Original PR description
*: l10n_be_hr_contract_salary,l10n_be_hr_payroll,
l10n_be_hr_payroll_fleet,test_l10n_be_hr_payroll_account
In this PR, the migration of private car benefit from a field into a salary rule was reverted, since it caused issues because a salary rule cannot currently be folded or manual, since these are fields, and the salary rules currently don't allow that(salary rules depending on normal fields). In the future, when we have a structure for manual and fold salary rule for other salary rule, this might be readdressed. (Note: This might still not be possible, since other benefits that are fields have a manual on a field, and this benefit also needs this field as manual field/rule).
task-5236589This update fixes a visual issue in Odoo Studio where sidebar elements could overlap or scroll above other page headers. By aligning the sidebar layering with the header, the Studio interface behaves more consistently and is easier to use.
Original PR description
With Commit[^1], the `.o_web_studio_component` `z-index` was set to `$zindex-modal (1055)`. While a high value is probably needed, this introduced an issue related to the `z-index` value of `.o_notebook_headers`, which is arbitrary and lower than that of `.o_web_studio_component`, causing the elements to scroll above it. With this commit, we decrease the `z-index` value and align it with the header one, ensuring a clearer relationship between these two elements. task-5241146 <img width="571" height="507" alt="image" src="https://github.com/user-attachments/assets/483b6ce6-8edd-47ff-aa45-39829758d44b" /> [^1]: https://github.com/odoo/enterprise/commit/8489b760dd601d2a5196c8323eb0e1929c0f2132
Fixed an issue that could prevent active employees with valid contracts from showing in the pay run wizard, especially in newly created databases. This helps payroll teams prepare pay runs reliably without missing eligible employees.
Original PR description
Addressed the issue where employees were missing in the pay run wizard for new databases. Fixed _get_valid_version_ids to use self.env.company.id as a fallback when self.company_id is empty. task-5240136