Daily updates from Odoo
Tuesday, June 16, 2026
77 changes · master
New functionality added to Odoo
This update incorporates a new rule to comply with Belgian tax regulations regarding employee omission (ONSS 863). The change utilizes updated contribution rates from a recent XML file and integrates this rule into the company's payroll management system. This ensures accurate tax calculations and reporting for employees in Belgium.
Original PR description
add ONSS OMISSION (input rule) and using Rates defined in "NOSSContributionRate_2026_1.xml" and add it to dmfa Task Id: 6259645
This update adds sample data and an interactive onboarding tour specifically for appointment types like account payments, HR recruitment, and restaurant bookings. This allows new users to quickly understand and experience the appointment functionality within Odoo Enterprise, improving the initial user experience.
Original PR description
*=appointment_account_payment,appointment_hr_recruitment,pos_restaurant_appointment This PR adds demo events for selected appointment types and introduces an onboarding tour. Task-6233604
This update allows users with appropriate permissions to easily create reusable quotation templates directly from existing sales orders or quotations. This streamlines the process, reducing the number of steps and improving efficiency for creating and reusing templates. Related changes also align with a recent update to the Community version of Odoo.
Original PR description
Currently, there is no option to convert a quotation or sales order into a reusable template. In https://github.com/odoo/odoo/pull/252541, we introduce this option for users with rights to create a quotation template. This enhancement reduces extra clicks and navigation, making it easier and faster for users to create and reuse quotation templates directly from the quotation. In this commit, we add the extra fields added to quotation templates by enterprise modules. Additionally, following the removal of the `sales_management.group_sale_order_template` group in Community, we have updated the relevant Enterprise views and tests to align with this change. - Community: https://github.com/odoo/odoo/pull/252541 - Upgrade: https://github.com/odoo/upgrade/pull/10415 --- task-5260606
This update enhances the company's payroll reporting for employees using eco-friendly company vehicles. It adds a new salary rule and reports contributions to the DMFA (under code 868), accurately reflecting the tax benefits associated with these vehicles. This ensures compliance and provides employees with correct financial reporting.
Original PR description
For employees benefiting from a mobility budget and using an eco-friendly company vehicle: - add a dedicated salary rule; - report the contribution amount in the DMFA under code 868; - add code 1 for eco-friendly vehicles in the list of the company cars. task-259958
This update expands the Odoo mail API to include support for 'Cc' (carbon copy) recipients. Previously, the API only supported 'To' recipients. This enhancement allows users to send emails with multiple recipients, improving email communication flexibility within Odoo.
Original PR description
We adapt the code to support "Cc" recipient in the mail API (odoo/odoo#256333). various: account_followup, ai, helpdesk, hr_contract_salary, web_studio Task-5910857
Enhancements to existing features
This update enhances the flexibility of the Hong Kong payroll localization by streamlining salary rules based on categories. This allows for easier creation of new reporting rules and supports custom salary structures, improving accuracy and adaptability for tax reporting requirements.
Original PR description
This task aims to improve flexibility in the Hong Kong localization by reworking the salary rules and declarations so that we make full use of categories. IRD declarations are now built purely by summing categories, allowing to easily add new rules while targeting specific report cases. We also remove the hardcoded reference to specific salary structures when possible, opening support for custom structures to be reported as well if their rules use the pre-defined categories. task-6100375
This update simplifies the integration with Monster by moving the Monster ID information from employee types to contract templates. This change allows each localization to manage its own Monster settings, reducing complexity and improving flexibility. The system now reads Monster IDs from contract templates instead of employee types.
Original PR description
**Version:** - master This PR introduces improvements to **hr_recruitment_integration_monster** module, focuses on removing the dependency of this module from employee module: - Moved monster_id field from hr.employee.type to hr.version (contract template). - Removed the data file from monster integration module as no generic hr.version data files exist in base hr module. - Each localization is now responsible for setting monster_id values on their own contract templates. - Updated the job posting logic to read monster_id from contract template instead of employee type. **Task-6190560**
This update enhances the Odoo Enterprise website configuration tool, streamlining the process for businesses to customize their online presence. Specifically, it adapts the website generator hook to a new description screen and adds a welcome message for the AI assistant, improving the user experience.
Original PR description
This PR is linked to the community PR #odoo/262484 improving the website configurator. Improvements: - Added a custom first-message subtitle for the AI assistant after the configurator. - Adapted the Enterprise website generator hook to the new description screen. task-5910875
This update adds dropzones to controller pages within the Enterprise module, improving the user experience for tasks like appointments and helpdesk requests. Standardizing dropzone messages ensures a more consistent and intuitive workflow for users interacting with these features.
Original PR description
*: appointment, website_appointment, website_helpdesk This commit introduces the missing dropzones for controller pages and standardizes the dropzone messages. task-4430461 Community: https://github.com/odoo/odoo/pull/233738
This update enhances the Time Off dashboard's usability by dynamically filtering time off requests based on the user's team and department. This provides a clearer and more relevant overview of employee time off, improving efficiency for HR and managers. It also updates the Gantt and Calendar views for a better user experience.
Original PR description
Purpose: - Improve usability and clarity of the Time Off dashboard and overview by enhancing UI layout, adding meaningful data (units, statuses), and applying some default behaviors. This PR includes: - Extended the Overview SearchModel to dynamically apply 'My Team' or 'My Department' filters based on the current user's hierarchy. - Apply the behavior to both Calendar and Gantt overview views. Related Community PR: https://github.com/odoo/odoo/pull/263006 task-6132977
This update integrates the Belgian flat-rate payroll system with job categories within Odoo. Previously, flat-rate calculations were separate; now, they are linked to specific job roles, ensuring accurate payroll processing for employees in Belgium. This improves reporting and compliance with local tax regulations.
Original PR description
Task-6128111
This pull request updates the design of the frontdesk interface to ensure it looks consistently good across different devices and screen sizes. The changes focus on improving the overall user experience and responsiveness, particularly in key areas like the host selection screen. A new feature was also added to detect custom background images.
Original PR description
Follow-up of: - https://github.com/odoo/enterprise/pull/119827 - https://github.com/odoo/enterprise/pull/120380 --- This PR review the overall frontdesk design to improve responsiveness and…
Follow-up of: - https://github.com/odoo/enterprise/pull/119827 - https://github.com/odoo/enterprise/pull/120380 --- This PR review the overall frontdesk design to improve responsiveness and consistency across views. task-6022341 | master | this PR | |--------|--------| | <img width="1021" height="765" alt="image" src="https://github.com/user-attachments/assets/d981f222-e3ce-42ae-9846-8eb05378fb46" /> | <img width="1022" height="769" alt="image" src="https://github.com/user-attachments/assets/4c49206b-3022-40bc-9ce6-e8e374156c6d" /> | | <img width="1025" height="767" alt="image" src="https://github.com/user-attachments/assets/1b929595-c8fb-4863-9c02-2c4d8cd00376" /> | <img width="1023" height="766" alt="image" src="https://github.com/user-attachments/assets/750b4423-be14-4974-bdde-4a8e332e6f29" /> | | <img width="1020" height="764" alt="image" src="https://github.com/user-attachments/assets/45cdad54-0654-4d86-a844-4b004400bab9" /> | <img width="1017" height="758" alt="image" src="https://github.com/user-attachments/assets/c848e800-5b4f-4a70-a718-d1d6d48ae411" /> |
This update adjusts the number of badges displayed on shift templates to a maximum of 4. Previously, the limit was lower, which could restrict the visibility of important scheduling information. This change improves usability and ensures all relevant details are easily accessible for shift planners.
Original PR description
This commit changes the maximum visible badges limit to 4 for shift templates. task-3705263
This update introduces a new wizard that simplifies the process of splitting journal items, such as bills, into individual lines for asset creation. Previously, users had to manually split large lines, which was time-consuming. This automation streamlines workflows and improves efficiency for creating assets from multiple transactions.
Original PR description
This commit allows the user to manipulate move lines dynamically. It is often the case that when you have a bill line of 10 items you want to create assets for every single item in that line. Right now you need to split the line manually into 10 different lines and then create assets from them. The split wizard automates this flow. task-6222463
This update improves the report editor by displaying a clear warning in the sidebar if a report block is shared with another user. This helps ensure collaborators understand who is editing a report and prevents potential conflicts. It's a simple but important enhancement for team collaboration.
Original PR description
In the report editor, the sidebar show if the currently editing block is shared. If so, the name and a warning is shown in the sidebar. TASK-6144417
This update improves the timesheet timer by prioritizing recently used projects, tasks, and helpdesk tickets. This reduces the time users spend searching for relevant records and streamlines the timesheet entry process. The change maintains existing prefill functionality for a seamless experience.
Original PR description
Before this PR --- The systray timer used the default search ordering, making users repeatedly search for projects, tasks, and helpdesk tickets they had recently tracked time on. After this PR --- The systray timer now ranks projects, tasks, and helpdesk tickets according to recent timesheet activity. Frequently used records are surfaced first while preserving the existing prefill behavior, making timer selection faster and requiring fewer manual searches. task - 6216535 Forward-Port-Of: odoo/enterprise#118299
This update introduces a new boolean field in fleet vehicles to manage CO2 emission calculations. When selected, it intelligently copies CO2 values from similar vehicle models (diesel or gasoline) if available, or multiplies the default value by 2.5. This ensures more accurate tracking of vehicle emissions.
Original PR description
[IMP] l10n_be_hr_payroll: false hybrid:
1 - false hybrid boolean field is added to the fleet_vehicle_model
1.1 - I added it to fleet_vehicle as a related field
1.2 - It is displayed in fleet_vehicle_model view conditionally
2 - When Plug-in diesel is selected and false_hybrid is ticked as true
2.1 - Look to other diesel model with same name and if there are any, take its default_co2 and use it in this model
2.2 - If not, multiply the current default_co2 by 2.5
3 - When one of the Plug-in gasoline/full-hybrid is selected and false_hybrid is ticked as true
3.1 - Look to other gasoline model with the same name and if there are any, take its default_co2 and use it in this model
3.2 - If not, multiply the current default_co2 by 2.5
task - 6146410This update simplifies the naming of new fields created within Odoo's Studio interface. Previously, fields received random, complex names, making them difficult to manage. Now, fields are named with a consistent 'x_studio_[field_type]_[n]' format, ensuring clarity and ease of identification.
Original PR description
Currently, a new field created with Studio will have a randomly generated name (ie: `x_studio_integer_field_p1a_c0s291499`). This commit simplifies the generation as follows: `x_studio_[field_type]_[n]` with `n` being an increment to avoid duplicates. (ie: `x_studio_integer_1`). task-6241678
This update enhances the timesheet and attendance app's systray by allowing users to access both check-in options based on their permissions. A new user role has been added to control access, and the systray now dynamically displays relevant check-in options depending on the user's rights, improving usability.
Original PR description
1 - Normally, when the timesheet app is installed systray was always only including the timesheet, it was hiding attendance lines
1.1 - Now, it can include timesheet, attendance and both
2 - New right "User" is added to attendance (check-in and access are both okay but cannot modify anything in attendance)
3 - Check-in separation
3.1 - If no right for timesheet + attendance check in, no systray in the app
3.2 - If no right for attendance but at least User: own timesheets only right for timesheet, timesheet check-in is possible
3.3 - If no right for timesheet but at least User right for attendance, only attendance check-in possible from systray
3.4 - Else, both check-in options are put into the systray UI.
task - 5942545This update adds a confirmation popup when users reset manually modified salary rules. This ensures users understand the potential impact on database salary rules, preventing unintended consequences and improving data accuracy. It's a small change designed to enhance data integrity.
Original PR description
A new confirmation popup will be displayed to the user in case they reset a manually modified salary rule in order to inform them of the effects of that reset on the salary rules in the DB. Task: 6222776
This update enhances the softphone's call reporting feature by now displaying records from all partners within the same 'family' (defined by the same commercial partner ID). Previously, it only showed calls related to the individual partner. This change provides a more complete view of customer interactions.
Original PR description
voip_* = voip_crm, voip_helpdesk, voip_project, voip_sale, voip_sale_subscription In this commit, we call all partners with same commercial_partner_id are from the same partner family. In softphone "Go to" button, we now count and show records from all its family instead of only the records from itself. Task-[5437327](https://www.odoo.com/odoo/5778/tasks/5437327)
This update enhances the Odoo Enterprise payroll system to better comply with Hong Kong regulations regarding employee continuous status. New warnings are now triggered when employees approach key milestones (3 or 4 qualifying weeks) to ensure accurate reporting to eMPF and avoid legal issues. The warning color has also been updated for increased visibility.
Original PR description
Improve the 'Validated Payslip Not Reported To eMPF' by fixing the deadline to the 10th of the month, allowing a more accurate warning. Also change the color class of the warning to 'warning', as it is quite an important deadline to meet for legal compliancy. --- Under HK law, an employee earns continuous status if they maintain an unbroken streak of 4 "qualifying weeks". A week legally qualifies if the employee worked: - 17+ hours in that specific week, OR - 68+ hours in total across that week and the 3 preceding weeks. We are adding two new warnings to notify users about non-continuous employees that are approaching the continuous status: - One when the streak of "qualifying weeks" reach 3 - One when the streak reached 4 or more
This update enhances the accuracy of salary calculations for Belgian employees, specifically addressing potential negative net pay issues. It includes a new input for salary adjustments and ensures that salary rules correctly consider maximum seizable amounts, providing a more reliable payroll process.
Original PR description
- added a new input for salary adjustment of type Assignment of Salary (Prior) - reordered the rules for salary adjustments and changed the calculation to ensure that it doesn't result in a negative net - for Attachment and Assignment of salary, the amount now follows the Seizable Amount Percentages salary rule parameter (the max seizable amount is considered in the salary rules instead of showing a warning) - added a link to the payslip in the salary attachment chatter when a payment is recorded task-id: 5478677
This update now automatically logs the reasons why orders aren't synchronized with Lazada. Previously, determining the cause required manual investigation of order details. This enhanced logging provides clearer insights into synchronization issues, streamlining troubleshooting and improving overall order processing efficiency.
Original PR description
Before this commit, the only way to know why an order was not synchronized was to inspect the order details and infer the reason from the code. This commit now logs those reasons. Forward-Port-Of: odoo/enterprise#120511 Forward-Port-Of: odoo/enterprise#120212
This update streamlines the process of managing synced calendar accounts by removing unnecessary options and simplifying the user interface. The change improves usability by focusing on the core functionality of syncing events, addressing a previous complexity that rarely benefited users.
Original PR description
The user settings contained a wizard for disconnecting a synced account. This task simplifies it, removing some of the unnecessary options. A part of the wizard relating to re-sync policies was removed - the use cases where it would be useful are minimal, and letting the user decide which events to sync and which not to could lead to inconsistencies in the events Task-5346620
This update streamlines the inventory counting process by automatically focusing on the quantity field when a user edits a product barcode. Previously, operators had to navigate through multiple steps to enter quantities, now it's reduced to just a single input. This improves efficiency and reduces wasted time during inventory operations.
This update centralizes geolocation logic across Odoo, making it easier to use in various views like Gantt charts. It now dynamically updates maps with partner locations and routes, enhancing functionality and data accuracy. This change improves the overall user experience by streamlining location-based features.
Original PR description
Currently, geolocation is tied to the Map view. However, this may be used by other views later on (e.g., in Gantt to display travel times between field service interventions). Hence, this commit…
Currently, geolocation is tied to the Map view. However, this may be used by other views later on (e.g., in Gantt to display travel times between field service interventions). Hence, this commit moves all geolocation-related logic (address/coordinate lookups, partner geocoding, and routing) out of the `MapModel` and into a new `Geolocation` util in `web_enterprise`, allowing any view to take advantage of it. The `Geolocation` class exposes methods for (1) searching coordinates from an address, (2) reverse-geocoding coordinates to an address, (3) geolocating partners (and updating the records server-side), and (4) fetching routes. It dynamically switches between MapBox and OSM APIs based on token availability and/or returned errors. When using OSM, it internally throttles requests through an async queue to comply with the one-request-per-second limit imposed by the nominatim API. On the contrary, MapBox allows us to perform all requests in parallel. Further, this commit turns the map view totally asynchronous, meaning that it is directly rendered, and as partners become geolocated, the view is updated with pins/routes, and record groups are created in the side panel. task-6200247
This update allows businesses in Belgium to generate separate monthly payruns for employees, streamlining payroll processing. The new 'Multi Pay' button generates payruns for specific date ranges, creating detailed records for each month. This improves reporting and compliance for Belgian companies.
Original PR description
[IMP] test_l10n_be: separated months for payslips in payrun empty for now... task - 6253506
Resolved issues and error corrections
This update resolves an issue preventing printing receipts from the Odoo Mobile App. The fix allows the app to correctly print receipts, mirroring the functionality available on the desktop and web versions. This improves the mobile user experience for order review and fulfillment.
Original PR description
**Steps to reproduce:** - Go on the Odoo App, start the PoS - Go to orders, and go to paid ones - Click on review - Click on Print Receipt - It doesn't do anything but it prints correctly on browser or desktop **Why the fix:** This is a partial backport of 41e4549 that fixes the app to allow the way we created IFRAMES in PoS since 19.2, allowing us to print on the app again. Community PR: https://github.com/odoo/odoo/pull/265024 opw-6186261 Forward-Port-Of: odoo/enterprise#120043
This update fixes an issue where the Datev export incorrectly displayed currency amounts due to a mismatch between the invoice currency and the company currency. The change ensures that tax amounts are accurately reflected in the Datev export, regardless of the invoice's currency, improving financial reporting accuracy.
Original PR description
There is an issue in the Datev export functionality. In the current functionality, the code calculates a delta between the taxes in the `tax_totals` and the ones on the journal items. Issue is, the tax amounts from tax_totals were always in company currency, while the entry itself can use a foreign one. This replaces the use of company currency with the use of the invoice's currency and appropriately adjusts the test featuring foreign currency. Steps: Create a foreign currency. Create an invoice with a taxed product using the currency. Export the ledger to Datev. Inspect the resulting csv. Note that neither the final listed price, nor the rate listed for the currency align with the ones in the db. opw-6275889 Forward-Port-Of: odoo/enterprise#120293
This update resolves an issue where inventory counts weren't accurately recording products without lot numbers. The fix ensures that new units without a lot are correctly added to inventory counts, preventing miscounts and improving data accuracy. It addresses a validation error related to how the system handles lotless products during inventory adjustments.
Original PR description
### Steps to reproduce: 1. Create a product tracked by lot 2. Put 10 units in WH/Stock without lot 3. Inventory > Operations > Adjustments > Physical Inventory 4. Select the line referring to your…
### Steps to reproduce: 1. Create a product tracked by lot 2. Put 10 units in WH/Stock without lot 3. Inventory > Operations > Adjustments > Physical Inventory 4. Select the line referring to your product and request an inventory count + Show Expected Quantity 5. Open the barcode app > Count Inventory 6. Scan your product #### > The line is not selected, in particular, next scans will be re-interpreted as product scans rather than new serial creation for your product. ### Cause of the issue: Scanning your product search a line to select if any: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1432-L1435 https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1630-L1632 However, the `findLine` will fail since this method calls the `_canOverrideTrackingNumber` to determine if the lot of the barcodData matches the one of the line: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L1859-L1863 But, the override of the `_canOverrideTrackingNumber` method for the `BarcodeQuantModel` does not handle the absence of lotName in the barcodeData correctly as it does not consider that a line without lot can be overridden by an empty lotName: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_quant_model.js#L729-L731 Note however that the super call does: https://github.com/odoo/enterprise/blob/bce04ce24b66fb1a2481274eb3aebdc30a62766e/stock_barcode/static/src/models/barcode_model.js#L795-L798 ### Issue 2: ### Steps to reproduce: - Steps 1 -> 5 - Click on your product line to select it - Scan a new lot to add one new unit referring to that lot - Confirm (1) - Apply Now #### > User Error: Quant's editing is restricted, you can't do this operation Since the line is selected, you have a currentLine during the `processBarcode` and hence the existing line will be updated using the `lotName``: https://github.com/odoo/enterprise/blob/cf3c2fce8a6b7b2d7547d44a0e4423f887986d52/stock_barcode/static/src/models/barcode_model.js#L1560-L1584 However, writing on the line will then try to write on the related quant during the validation process which will be forbiden since we are not allowed to change the lot of an existing quant: https://github.com/odoo/odoo/blob/e3b0ca11d99b2ef819cdad68b169112cd73668b6/addons/stock/models/stock_quant.py#L351-L360 Now, the issue is that actually due to the nature of the line and of the barcode data, the line lot is not expected to be updated but rather a new line is expected to be created: https://github.com/odoo/enterprise/blob/cf3c2fce8a6b7b2d7547d44a0e4423f887986d52/stock_barcode/static/src/models/barcode_model.js#L795-L798 Additional issue: Fixing issue 1 and 2 highlight and other issue of the validation process: - Steps 1 -> 6 > The line gets selected - Scan a newlot > a new subline is added referring to 1 unit of your new quant - Confirm (1) > Some serials where not counted, set them as missing #### > Check your quants: the 10 unit lotless quant was not updated but a new quant for 1 units was created for your newlot ### Cause of the issue: Applying all quantities is expecting to toggle them as counted before applying to update the existing quants: https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L72-L82 https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L287-L296 However, only line tracked by serial numbers are set as counted: https://github.com/odoo/enterprise/blob/c8535a7a0e2eae811048a34a0bae187a1fa45311/stock_barcode/static/src/models/barcode_quant_model.js#L60-L63 opw-6212923 Forward-Port-Of: odoo/enterprise#118373
This update corrects a misleading error message that prevented new online account connections for Canadian bank accounts (which don't use IBANs). The fix skips the journal duplication check when an account number is missing, ensuring a fresh journal is created and preventing unnecessary errors. This improves the user experience for a common scenario.
Original PR description
…unt number When a provider returns an account without `account_number` (typical for Canadian banks, which do not use IBANs), the existing-journal search ran with `bank_account_number = False`.…
…unt number When a provider returns an account without `account_number` (typical for Canadian banks, which do not use IBANs), the existing-journal search ran with `bank_account_number = False`. Because `bank_account_number` is a related field on `bank_account_id.account_number`, that search matched every bank journal in the user's allowed companies whose `bank_account_id` was unset. If any of those journals was tied to a connected online link, the new sync was blocked with the misleading error "There's already a synchronized journal linked to this IBAN", even though no IBAN was involved. Skip the search entirely when `account_number` is falsy: without an identifier there is nothing meaningful to dedup against, and the downstream code already handles `existing_journals` being empty by creating a fresh journal. Note: when the provider omits `account_number`, a delete-and-recreate of the connection will now create a fresh journal rather than coincidentally reusing an unlinked empty-`bank_account_number` journal. That reuse path already failed (with a spurious "IBAN already connected" error) as soon as the user had more than one such journal, so the prior behavior was not reliable. The supported recovery path remains the reconnect button on the existing journal, which uses the `active_id` branch and is unchanged. opw-6253563 Forward-Port-Of: odoo/enterprise#119848
This update resolves a visual issue in dark mode and improves the user experience of the Gantt holiday view. Specifically, the way users select holidays has been corrected to accurately reflect the number of selected days, enhancing usability and data accuracy.
Original PR description
- changed selected value in the view to be number of selected cells instead of number of selected records - fixed a visual bug in dark mode where the create popup has ugly background task-id: 6124765 Forward-Port-Of: odoo/enterprise#119253 Forward-Port-Of: odoo/enterprise#116229
This update fixes a potential problem where users could accidentally trigger mass email campaigns bypassing intended filters. The change prevents users from directly retrying failed mailings linked to marketing automation, reducing the risk of unintended spam and ensuring targeted email delivery. The fix includes a user error message and a hidden retry button to guide users.
Original PR description
When a mailing is managed by a marketing automation campaign, its target domain is dynamically handled by the campaign's activities. If a user clicks the "Retry" button directly on the mailing…
When a mailing is managed by a marketing automation campaign, its target domain is dynamically handled by the campaign's activities. If a user clicks the "Retry" button directly on the mailing template, it bypasses the campaign filters and queues the mailing for the entire target model, causing unintended mass spam. This commit fixes the issue by: 1. Raising a UserError in `action_retry_failed` if the mailing is linked to marketing automation (`use_in_marketing_automation`). 2. Hiding the "Retry" button in the frontend view to prevent confusion. 3. Adding a unit test to ensure this edge case is caught in the future. Steps to reproduce: 1. Create a marketing campaign with a filter and an email activity. 2. Run the activity and ensure at least one email trace fails. 3. Open the mailing template via the "Templates" smart button. 4. Click the "Retry" button on the template form. 5. The mailing is placed in the standard queue, bypassing the domain and targeting all records of the underlying model. OPW-6220106 Forward-Port-Of: odoo/enterprise#119760 Forward-Port-Of: odoo/enterprise#118759
This update resolves an issue where the Balance Sheet report incorrectly displayed zero amounts when using the 'Ledger' grouping option. The fix ensures the 'Ledger' group is only applied when appropriate (multicompany or different journal groups are present), preventing incorrect calculations.
Original PR description
[FIX] account_reports: only restore horizontal group from previous_options when it's available The 'Ledger' group will only be available when in multicompany or using different journal groups. It was…
[FIX] account_reports: only restore horizontal group from previous_options when it's available
The 'Ledger' group will only be available when in multicompany or using different journal groups. It was still restored from previous options, even when it shouldn't have been available.
=============================================
[FIX] account_reports: properly compute Ledger group when there's no journal group
To reproduce the issue
1) Populate the db with some data impacting the Balance Sheet
2) Delete all the journal groups that would be created by default
3) Open the Balance Sheet, with multiple companies active.
4) Select the "Ledger" horizontal group
====> The report is displayed horizontally grouped by company, but all amounts are 0.
This happens because, when no journal group exists, the "Ledger" horizontal group creates a column group per company, applying a domain doing ('journal_id', 'in', []), so nothing matches. This is caused by the fact that, in this case, options['journals'] will require to match all journals, and will hence be an empty list. We fix it by properly searching for all journals to build the horizontal group's domain when options['journals'] is empty.
Forward-Port-Of: odoo/enterprise#119418This update corrects a potential issue in the Swiss payroll module where users could incorrectly request refunds on payslips. Swiss regulations limit employees to one payslip per month, so the system now guides users to cancel and re-create the payslip for any necessary corrections. This ensures compliance with Swiss payroll rules.
Original PR description
Prevent refunds for CH payslips since only one payslip per month is allowed for Swiss payroll. Users should cancel the payslip and create a new one to apply corrections. task-5951981 Forward-Port-Of: odoo/enterprise#107943
This update resolves an issue where bank statement imports were incorrectly multiplying amounts by 100. This was caused by a double-parsing of debit and credit values when both the bank statement extract and import modules are installed. The fix ensures the correct parsing of these values, preventing inaccurate financial data.
Original PR description
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns…
Steps to reproduce --- 1. With Accounting installed, import a bank statement CSV that has separate Debit and Credit columns using number separators (e.g. a line with "1.234,56"). 2. Map the columns to Debit and Credit and import. The imported amounts are multiplied by 100: "1.234,56" is imported as 123,456.00. Issue --- This only happens when both `account_bank_statement_import_csv` and `account_bank_statement_extract` are installed, which is the default in any Accounting database since both modules are auto-installed. `account_bank_statement_extract` turns debit and credit into real Monetary fields on `account.bank.statement.line`: https://github.com/odoo/enterprise/blob/af863c5a53d0ab50fe67cb9ea910391d4a1979dd/account_bank_statement_extract/models/account_bank_statement_line.py#L7-L8 Because they are now real fields, the generic importer already converts those columns to floats: https://github.com/odoo/odoo/blob/bfa39854e56da4bf23295d62f63d66973ad0d78e/addons/base_import/models/base_import.py#L1281-L1285 The CSV statement wizard then parses the same columns a second time: https://github.com/odoo/enterprise/blob/d7ab7ee1287342638006e290ede20b955aae8370/account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py#L92-L93 The first pass correctly reads "1.234,56" as "1234.56", but the second pass sees a lone dot, mistakes it for the thousands separator, strips it, and produces 123456. The wizard now parses debit and credit only when they are virtual fields, so when they are real fields the values parsed by the generic importer are reused instead of being parsed twice. Without `account_bank_statement_extract`, debit and credit exist only as virtual import fields, so the generic importer skips them and the wizard parses them once. That is why the regression stays hidden until the extract module is present. opw-6227083 --- Forward-Port-Of: odoo/enterprise#118979
This update corrects a calculation error in the GOSI (Saudi Government Social Insurance) contributions for employees with unpaid leave. The fix prortions contributions based on actual worked days, ensuring accurate deductions for employees who are absent. This improves payroll accuracy and compliance for Saudi Arabia operations.
Original PR description
Task: 6279514 Forward-Port-Of: odoo/enterprise#119990
This update addresses a missing rule in the calculation of employer costs within the Odoo Enterprise HR module. Following a review, a crucial rule was added to ensure accurate employer cost computations, building upon previous fixes. This improves the reliability of payroll and HR reporting.
Original PR description
In this previous PR https://github.com/odoo/enterprise/pull/106839 the computation of the employer cost was fixed and many rules were flagged as needed in that computation. After a report, we found one of the rules was missing so we add it in this PR. Task: 6088412 Forward-Port-Of: odoo/enterprise#112681
This update fixes a potential issue where certified point-of-sale configurations could allow users to enter negative quantities on order lines. This has now been resolved across both the backend and frontend of the system, ensuring data accuracy and preventing errors in sales transactions. This change improves the reliability and stability of our POS functionality.
Original PR description
Certified pos configs should not allow to set negative quantities on order lines. We now prevent it from both backend and frontend. see odoo/odoo#269487 task-5942777 Forward-Port-Of: odoo/enterprise#120513 Forward-Port-Of: odoo/enterprise#119702
This update ensures that when users open links in new tabs or windows, the current debug mode settings are automatically carried over to the new page. Previously, this functionality was broken, causing debug information to be lost. This improvement maintains a consistent user experience and simplifies debugging workflows.
Original PR description
Before this commit, opening a link in a new tab or window via middle-click or Ctrl+click would lose the active debug state, as the query parameter was not forwarded to the new page context. This commit ensures that the debug status is copied from the current window and appended to the target URL when a user opens a link in a new window. task-6285277
This update adds a temporary mock model to the spreadsheet dashboard edition module, resolving an issue that prevented test cases from running correctly. This ensures the stability and reliability of the dashboard's testing process, allowing for continued development and quality assurance.
Original PR description
This commit introduces a mock `SpreadsheetDashboardFavoriteFilter` model in the `spreadsheet_dashboard_edition` module. It ensures that test cases relying on favorite filters can run correctly. Task: [5114625](https://www.odoo.com/odoo/2328/tasks/5114625)
This update fixes a visual issue where the 'suggestion' icons weren't appearing in the Assistant when it detected tasks. The change ensures the Assistant correctly identifies activity types, allowing the icons to display accurately and provide better guidance to users. This improves the Assistant's usability and effectiveness.
Original PR description
- When the Assistant detected activities such as 'Working on task', the suggestion icon was not displayed because the event type was not assigned. Unlike `aw.rule` matches, the Odoo URL resolver only set the label and related record information, but did not set the activity type required by `getIcon()`. - Expose the activity type through `get_assistant_data` and assign the activity type when resolving model URLs in extractWatcherActivity. task-6259793 Forward-Port-Of: odoo/enterprise#120370
This update resolves a bug where the employee field in appraisals wouldn't automatically populate when using the appraisal smart button from the employee record. The fix ensures the correct employee ID is passed through the system, regardless of the user's navigation path, improving the appraisal process flow.
Original PR description
[FIX] hr_appraisal: fix auto-fill of employee in appraisal Bug production: 1 - employee app -> department -> select employees -> select any employee -> use appraisal smart button in top ->…
[FIX] hr_appraisal: fix auto-fill of employee in appraisal
Bug production:
1 - employee app -> department -> select employees -> select any employee -> use appraisal smart button in top -> employee_id is not coming
Bug cause:
1 - When we press smart button of appraisal action_send_appraisal_request in hr_employee is called.
2 - It send the self.env.context as a context and active_model and active_id.
3 - In hr_appraisal, _get_default_employee function calculates the default employee_id by looking to context and especially by looking to active model and id.
3.1 - If active_model is hr.employee and there is active_id, it finds the employee automatically (that is the case when we are coming directly from employee -> smart button hr_appraisal)
3.2 - When we first click to department and then we click to employee and smart button, active_model is hr.department and default_employee_id cannot be calculated in default version.
Bug solution:
1 - I have passed the default_employee_id to the context in action_send_appraisal_request function. Since we know the employee in the action_send_appraisal_request function we can pass it directly.
task - 6285434
Forward-Port-Of: odoo/enterprise#119737This update fixes a bug where the 'Due' button wasn't appearing on customer forms when a balance existed, specifically for customers linked only at the journal entry line level. The fix ensures the button is always visible, regardless of how the customer is linked to accounting records, improving user experience and financial reporting accuracy.
Original PR description
Steps to Reproduce: 1. Install Accounting module (without Point of Sale). 2. Create a customer. 3. Create a journal entry with that customer set only at line level. 4. Post the journal entry. 5. Open…
Steps to Reproduce: 1. Install Accounting module (without Point of Sale). 2. Create a customer. 3. Create a journal entry with that customer set only at line level. 4. Post the journal entry. 5. Open the customer form. Issue: The Due smart button is not visible on the partner form even though an outstanding balance exists for the customer. Note: This issue does not reproduce when Point of Sale is installed, as the POS module overrides `_compute_has_moves` with its own implementation that checks the outstanding balance directly. Root Cause: The `_compute_has_moves` method queries only `account.move `for partner matching. When a partner is referenced only at the account.move.line level, the partner is never picked up by this query, resulting in `has_moves = False` and the Due button remaining hidden. Fix: Replaced the EXISTS-based implementation with a UNION-based approach as the EXISTS implementation evaluated the query per partner row, whereas UNION processes all partners in a single batch query. Additionally extended the UNION to also include account.move.line partner matching, ensuring partners referenced only at the line level, are correctly detected and has_moves is set to True. Result: The Due smart button is now correctly visible for all partners with an outstanding balance, regardless of whether the partner is set at the journal entry level or only at the line level. owp = 6243562 Forward-Port-Of: odoo/enterprise#120492 Forward-Port-Of: odoo/enterprise#119084
This update resolves an issue where account reports were displaying with incorrect styling due to a missing CSS class. The change ensures that all lines within the reports are rendered with the correct visual formatting, improving the overall presentation and readability of financial data. This ensures consistent and accurate reporting.
Original PR description
commit introducing the issue: https://github.com/odoo/enterprise/commit/6608d5c21a7fb9d57786c2a7618b878e244bd420 Forward-Port-Of: odoo/enterprise#120532
This update resolves an accessibility issue with tooltips on smartphones and tablets. By using the `data-tooltip` attribute instead of the native `title` attribute, the tooltip service now provides a consistent and reliable experience for all users, including those using keyboard or touch devices.
Original PR description
Treat the `title` attribute as `data-tooltip` in the tooltip service. On touch devices (like smartphones, tablets) the native `title` based tooltip is unreliable and inaccessible, so we now read `title` and expose it via `data-tooltip` to provide consistent behavior. - Many user agents do not expose the `title` attribute in an accessible way (for example they require a pointing device to show a tooltip), which excludes keyboard-only and touch-only users [1] - This change ensures the same appearance and behavior for tooltips triggered via `title` and via `data-tooltip` - We no longer have duplicate tooltips caused by nested `data-tooltip` and `title` attributes. task-6159644 [1]: https://html.spec.whatwg.org/multipage/dom.html#the-title-attribute
This update resolves a previous installation problem that caused a compulsory logout. It also restores the functionality to generate payruns through the module's initialization process, ensuring accurate payroll calculations. The fix includes safeguards to prevent long-running processes and maintain system stability.
Original PR description
This commit fixes the compulsory logout that was happening when trying to install the module and also brings back the payrun generation through the init hook. It was previously commented due to an error and now it's back and working perfectly, while respecting the runbot limits so the execution don't timeout. task-6259077
This update resolves an issue where the account audit status on reports wasn't updating correctly. By using a more efficient method to load the status data, the display now reflects the most current information, ensuring accurate reporting. This change addresses a technical dependency update related to Odoo's rendering engine.
Original PR description
Load the account audit status record via asyncComputed instead of a useLayoutEffect-triggered async method, so the record is returned as a reactive value rather than written as a side effect on useState state. WHY: useLayoutEffect deprecated with OWL3
This update resolves a technical issue where the Urbanpiper order information screen displayed customer details even when no customer was associated with the order, causing a traceback. The fix ensures customer details are only shown when a customer is correctly linked to the order, improving the user experience.
Original PR description
Steps to reproduce: ==== - Place an order through Urbanpiper. - Edit the order and remove the customer. - Open the ticket screen and click the info button. - A traceback occurs. Cause: ==== - Customer details were rendered even when no customer was linked to the order. Fix: ==== - Display customer details only when a customer is present on the order. task-6233812 Forward-Port-Of: odoo/enterprise#120521 Forward-Port-Of: odoo/enterprise#118147
This update fixes an issue where multiple taxes applied on Brazilian sales orders were displayed on a single line, making them difficult to read. The change adds a line break to separate tax details, improving clarity and usability for users. This ensures accurate tax reporting and a better user experience for Brazilian customers.
Original PR description
Upon creating a SO in the Brazilian localization and computing taxes, tax details are displayed on the SO lines. However, when multiple taxes are applied, all tax details are shown on a single line, making them difficult to read. Add a line break between tax details so that each tax is displayed on a separate line. Before: https://www.awesomescreenshot.com/image/61178015?key=703ceba935bbf0b97f4b45c649722827 After: https://www.awesomescreenshot.com/image/61178078?key=3b980b91b7657aa48dec9b825549ebeb opw-6234768 Forward-Port-Of: odoo/enterprise#120527
This update resolves an issue where inactive taxes were incorrectly displayed and selectable within the bank reconciliation process. The fix ensures that only active taxes are available for selection, improving data accuracy and preventing users from inadvertently using archived tax information. This enhances the reliability of financial reconciliation reports.
Original PR description
### Issue:
When editing a line within the bank reconciliation widget, inactive and archived taxes are incorrectly available for selection
### Cause:
The bank reconciliation edit line form view carried the `{'active_test': False}` context on the `tax_ids` field
This context allowed archived taxes to be loaded and selected during creation and manual edition
### Fix:
Explicitly force `active_test: True` in the view context for the tax field to ensure only active taxes can be searched and selected by the user
### Steps to reproduce:
- Install `account_accountant`
- Create a new tax and set it to inactive
- Go to the Bank Reconciliation widget
- Create a bank statement line
- Set the account to 600000 Expenses
- Edit the line by clicking on the pencil icon
- Open the Taxes selection dropdown
Before the fix, the inactive tax is visible and available for selection by default
opw-6245641
Forward-Port-Of: odoo/enterprise#119522This update fixes an issue where the reconciliation dialog only displayed posted journal items, hiding draft items. Removing a default filter ensures the dialog shows all matching items, providing a more complete and accurate reconciliation view. This improves the user's ability to resolve discrepancies.
Original PR description
The reconcile badge counts draft and posted journal items, but the matching dialog forces a posted filter by default, this makes the dialog show fewer lines than count as it discards the draft ones. Remove the default posted search filter so the dialog displays all matching items. task-6234801 Forward-Port-Of: odoo/enterprise#118146
This update prevents users from sending receipts directly from the Ticket Screen when the Blackbox BE feature is active. This change ensures data consistency and accuracy, particularly in scenarios where Blackbox BE is used for enhanced transaction tracking. It addresses a potential issue related to redundant receipt generation.
Original PR description
In this commit: ------------------- - Restrict the send-receipt functionality on the Ticket Screen when Blackbox BE is enabled. Task- 6139558 Related PR - https://github.com/odoo/odoo/pull/260596
This update resolves a bug that was causing a warning related to minimum wage calculations for Belgian employees. The fix ensures the system correctly identifies the appropriate job category and wage scale, preventing inaccurate reporting. This ensures compliance and accurate payroll processing for our Belgian clients.
Original PR description
**Description:** Select Belgium company, employee, select student and make its contract as 1st of January. Error appears. For repetition look to the provided link. **Implemntation:** . Add a check for l10n_be_job_category_id, as it is required to determine the minimum wage scale. . Add corresponding tests task-6302901
This update fixes an issue where removing a BoM operation left behind unnecessary data in manufacturing quality checks. By automatically deleting related quality points and ECO changes, the system now provides cleaner, more accurate manufacturing data. This improves the reliability of production reporting and reduces data clutter.
Original PR description
Deleting a BoM operation removes the linked `mrp.routing.workcenter` record, but its instruction steps could remain in the database. Those steps are stored as `quality.point` records linked through `operation_id`. Since that relation did not cascade on deletion, removing an operation left orphaned quality points behind, creating unnecessary noise in manufacturing quality checks. This commit's change: - Set the `quality.point`'s operation_id relation to cascade on delete - Set the `mrp.eco.routing.change`'s operation_id relation to cascade on delete - Set the `mrp.eco.routing.change`'s quality_point_id to cascade on delete task-6079838
This update fixes an issue where long-term sick leave payments weren't correctly calculated for existing employee data. The change ensures that legacy sick leave records are handled properly, preventing incorrect unpaid sick leave payouts. This maintains accurate payroll processing for Belgian employees.
Original PR description
Following this task: https://www.odoo.com/odoo/project/1251/tasks/5942163, sick time offs are automatically split between paid/unpaid when the leave is created. However, existing data was not upgraded, and might result on sick leaves not being unpaid when they should. This commit re-introduces the method to ensure legacy compatibility with existing sick leaves. Upgrading the data by splitting/creating new sick leaves would be too heavy. task-6297274 Forward-Port-Of: odoo/enterprise#120546
This update fixes an issue where the Balance Sheet report export was incorrectly including all accounts instead of the selected one when changing date filters. The fix removes a filtering mechanism that was unintentionally introduced, ensuring the report accurately reflects the user's chosen account selection.
Original PR description
Steps: - Open Balance Sheet report and unfold lines - Open the General Ledger from a line with an account - On GL report, change date filter - Export XLSX report -> We export all accounts instead of the one selected in the search bar Cause: Since f8dceec74e44ffe4aef67655be8811c96da91eba we filter out the filter if a default account is defined in the context which is the case in the `caret_option_open_general_ledger` method Fix: Remove the filtering as the behavior that was fixed by the mentioned commit does not happen anymore. opw-6234427 Forward-Port-Of: odoo/enterprise#119588 Forward-Port-Of: odoo/enterprise#119156
This update resolves an issue where demo leave allocations wouldn't correctly validate during an Odoo upgrade from 17.0 to 18.0. The fix ensures that the approval process is executed during upgrades, preventing data inconsistencies and ensuring accurate leave tracking.
Original PR description
Steps: - Install an Odoo 17.0 database with the Indian Payroll module and demo data. - Upgrade the database to 18.0. Issue: - The Indian payroll demo data creates leave allocations and approves them…
Steps: - Install an Odoo 17.0 database with the Indian Payroll module and demo data. - Upgrade the database to 18.0. Issue: - The Indian payroll demo data creates leave allocations and approves them through an XML function call. - During a fresh installation, demo files are loaded in 'init' mode, so the approval function is executed and the allocations move from 'confirm' to 'validate'. - However, during a 17.0 >>> 18.0 upgrade, demo files are loaded in 'update' mode. Odoo automatically loads demo files with 'noupdate=True' from the load_demo() >> load_data() function: - This value is passed to the XML importer and becomes the default noupdate state for the file. Since the demo XML file does not explicitly override this value, the function tag uses 'noupdate=True'. - When the XML parser reaches the approval function, _tag_function() skips its execution because of noupdate = 'True' and mode = 'update' condition. - As a result, the approval function is not executed during the upgrade and the leave allocations remain in 'confirm' state. Subsequent demo payroll data expects validated allocations and fails during loading. Fix: - Explicitly set 'noupdate=0' on the demo XML file. This overrides the default 'noupdate=True' value applied to demo files, making the parser evaluate the section with 'noupdate=False'. - As a result, '_tag_function()' executes the approval method during upgrades, the demo leave allocations are validated in both fresh/new db installations and 17.0 >>> 18.0 upgrade scenarios. runbot error-https://runbot.odoo.com/odoo/error/230430 task-6268381 Forward-Port-Of: odoo/enterprise#119217
This update resolves an issue where HR users without payroll access couldn't view employee type configurations. The change adds HR Manager permissions to the field, allowing all users to access this setting. This ensures consistent functionality across the system.
Original PR description
**Steps to Reproduce** 1. Create a database on v19.3. 2. Install `hr` and `hr_payroll`. 3. Create or log in as a user who only has access rights for the Employee app (`hr`) and no Payroll access. 4.…
**Steps to Reproduce**
1. Create a database on v19.3.
2. Install `hr` and `hr_payroll`.
3. Create or log in as a user who only has access rights for the Employee app (`hr`) and no Payroll access.
4. Go to **Employees → Configuration → Employee → Employee Types**. Opening the Employee Types menu raises the following error:
```python
You do not have enough rights to access the field "employee_type_id" on
Employee Contract (hr.version). Please contact your system administrator.
Operation: read
User: 2
Groups: allowed for groups 'Payroll / Assistant'
```
**Issue Description:**
The field `employee_type_id` is defined in both modules with different group restrictions:
* In `hr/models/hr_version.py`, the field is restricted to **HR Managers**. [field](https://github.com/odoo/odoo/blob/f7e87637d5c47047ebffda0f3c929c25022c3f27/addons/hr/models/hr_version.py#L184)
* In `hr_payroll/models/hr_version.py`, the field is extended with the **Payroll / Assistant** group.
[field](https://github.com/odoo/enterprise/blob/acd831acd0f59f7b8c15bccfb6da0c3969fc3f6d/hr_payroll/models/hr_version.py#L41) When both modules are installed, access to `hr.version.employee_type_id` requires Payroll permissions.
In v19.3, PR #241780 introduced the `employee_count` [computation](https://github.com/odoo/odoo/blob/f7e87637d5c47047ebffda0f3c929c25022c3f27/addons/hr/models/hr_employee_type.py#L25) on `hr.employee.type`. During this computation, `_read_group()` is executed on `hr.employee` using the domain.
[pr] : https://github.com/odoo/odoo/pull/241780/changes
HR-only users (without hr_payroll.group_hr_payroll_user) cannot read the field, causing below traceback.
**Solution**
added `group_hr_manager` group to the field `employee_type_id` so both groups can view employee_type.
**Traceback**
```python
File "/home/odoo/src/odoo/saas-19.3/addons/hr/models/hr_employee_type.py"
line 25, in _compute_employee_count
employee_count_by_employee_type = dict(self.env['hr.employee']._read_group(
...
File "/home/odoo/src/odoo/saas-19.3/odoo/orm/models.py", line 2732, in
check_field_access
raise AccessError(error_msg)
odoo.exceptions.AccessError: You do not have enough rights to access the field
"employee_type_id" on Employee Contract (hr.version).
Operation: read
User: 8
Groups: allowed for groups 'Payroll / Assistant'
```
opw-6246367
upg- 4302826
tgb- 2751
Forward-Port-Of: odoo/enterprise#120233This update adjusts the certification checksum to align with recent changes to the core Odoo system. Specifically, a new scale driver was implemented to reduce exception handling, necessitating this checksum update for accurate certification verification. This ensures continued compliance and proper operation of the l10n_eu_iot_scale_cert module.
Original PR description
As we updated the scale driver to reduce the amount of exception caught, we need to update the certification checksum. see odoo/odoo#268796 Forward-Port-Of: odoo/enterprise#119683
This update ensures that all properties from records – previously missing from spreadsheet exports – are now included. This change aligns the export behavior across different views (kanban, list, spreadsheet) and resolves a previous limitation, ensuring complete data transfer for spreadsheet users. It’s a fix to improve data consistency.
Original PR description
* = [documents_spreadsheet] When exporting properties from records in the web kanban and list views, sub-properties created within a record were previously not supported. Support for exporting these sub-properties has now been added. However, in spreadsheet this should only be enabled from saas-19.2 onwards (where it is already available). To keep the behavior aligned with the usual flow on earlier versions, this filters out the sub-properties exported from the record in `spreadsheet_edition`. community: https://github.com/odoo/odoo/pull/264267 task-6123524 Forward-Port-Of: odoo/enterprise#119675 Forward-Port-Of: odoo/enterprise#118913
This update ensures that changes made to leave requests within the popover form are now correctly saved. Previously, modifications weren't persisted, leading to data inconsistencies. The fix automatically saves changes with a slight delay to handle rapid input, while maintaining accessibility to key actions like 'Refuse' and 'Delete'.
Original PR description
Steps:- - Navigate Payroll > Time Offs. - Create a leave of any type (STO, PTO etc...) - Click on the pill after creating leave. - Try to change values on popover. - Changed values are not saved!! Cause:- There is no save action trigger on popover form. Fix:- - Hooked `debounceAutoSave` method on every field value changes. - `debounceAutoSave` will save record with 500ms debounce to batch rapid changes. - Set popover form to readonly mode for validated leaves (validate/validate1 states) - Remove readonly condition from action buttons footer to keep Refuse/Delete accessible task-[6117310](https://www.odoo.com/odoo/project/1251/tasks/6117310) Forward-Port-Of: odoo/enterprise#120634 Forward-Port-Of: odoo/enterprise#114445
This update fixes an error that occurred when downloading the asset template, specifically when a user removed the account code from their Fixed Assets account. The change allows for optional account codes, ensuring the system correctly identifies the asset account name instead of throwing an error. This prevents disruption to the asset template download process.
Original PR description
Currently, an error occurs when downloading the asset template. **Steps to Reproduce:** - Install the `account_asset` module without demo data. - Go to `Accounting` > `Configuration` > `Accounting` >…
Currently, an error occurs when downloading the asset template. **Steps to Reproduce:** - Install the `account_asset` module without demo data. - Go to `Accounting` > `Configuration` > `Accounting` > `Chart of Accounts`. - Open the `Fixed Assets` account, set a `Depreciation` value, and remove the `account code`. - Go to `Accounting` > `Accounting` > `Assets & Liabilities` > `Assets`. - Click `With our template` on the screen. `TypeError: startswith first arg must be str or a tuple of str, not bool` After this [recent commit], account codes became optional and can be removed. As a result, when the code is removed from the Fixed Assets account and when donloading the asset template, the system checks whether the account name starts with the account code [1]. Since the account code is `False`, it raises an error. This commit ensures that the check is only performed when the account code exists; otherwise, the account name is used directly for the asset account. [recent commit]: https://github.com/odoo/odoo/commit/c3313b336b9f1305c363097745926f2bdf61e277 [1]- https://github.com/odoo/enterprise/blob/421fce171dc158faa3b13406b6cea5c1c907ee49/account_asset/controller/asset_template_controller.py#L46-L49 sentry-7487406857 Forward-Port-Of: odoo/enterprise#117580
This update ensures that if a warning card fails to load on the payroll dashboard, the user will see an error message instead of a traceback. Crucially, the remaining warning cards will still load and display, providing a more complete and accurate view of potential issues. This enhances the user experience and data visibility.
Original PR description
Prior to this, if loading a warning caused a traceback, the loading of the remaining warnings would be stopped and the user would only see the traceback. Now, if loading a warning card fails, the error will be shown, but the remaining cards will keep loading and be displayed as well. task-6298866
This update fixes a payroll calculation error that occurred when employees had multiple contract versions active simultaneously. Previously, the system incorrectly calculated out-of-contract deductions. The fix ensures that all worked days across all contract versions are considered, leading to accurate wage deductions.
Original PR description
…rsions on same contract **Steps to reproduce**: - Create a contract version from May 1 to May 14. - Create another contract version starting on May 15, then create an amendment version from May 20. - Generate a payslip for May using the May 20 version. - The employee receives the full monthly wage. The out of contract period (May 1 to May 14) is not deducted. **Reason**: - OUT worked days are linked to the first version of the contract starting on May 15. - When computing the OUT ratio, the system only considers worked days linked to the exact version being processed. - As a result, the May 20 amendment version does not see the OUT worked days and no deduction is applied. **Fix**: - Compute the OUT ratio using the contract start date instead of the current version, ensuring OUT worked days are correctly taken into account across all versions of the same contract. Task: 6259341 Forward-Port-Of: odoo/enterprise#120462 Forward-Port-Of: odoo/enterprise#119893
This update fixes a potential issue in the Belgian HR payroll module where the base amount for holiday pay could exceed an employee's regular wage. The change ensures that holiday pay calculations are accurately capped at the employee's standard earnings, improving payroll accuracy and compliance. This resolves a previous error that could have resulted in overpayment.
Original PR description
The base amount should never be more than the employee's wage. Forward-Port-Of: odoo/enterprise#120681
This update ensures that data isn't lost when an IoT box is removed from a point-of-sale system. Previously, deleting an IoT box could result in the loss of associated fiscal data. Now, the system verifies that the IoT box isn't currently linked to a POS configuration before deletion, safeguarding important business information.
Original PR description
Before unlinking an iot.box from the database, we must ensure that its fiscal data module is not currently used in any pos.config. task-id: 5144489 Forward-Port-Of: odoo/enterprise#110099
A technical issue prevented users with limited time-off permissions from accessing the Attendances Gantt View when viewing leave requests. This fix ensures that the Gantt View correctly displays leave information for all users, regardless of their specific access rights. The change involved a minor code adjustment to improve data access.
Original PR description
Version: - 19.0 Steps to reproduce: - Install Attendances and Time Off - Create an internal user. - Give the user: Attendances Officer access & No Time Off Officer/Manager rights - Create an employee…
Version: - 19.0 Steps to reproduce: - Install Attendances and Time Off - Create an internal user. - Give the user: Attendances Officer access & No Time Off Officer/Manager rights - Create an employee linked to the user. - Configure the employee with a Flexible Working Schedule. - Create and approve a Time Off request for the employee. - Open: Attendances -> Gantt View - Navigate to the month containing the employee's approved leave. Issue: - An access error is raised when opening a month that contains the employee's approved leave. Cause: - In `_handle_flexible_leave_interval`, the code accesses `leave.holiday_id` to read fields such as `request_unit_half`, `request_unit_hours`, and `request_hour_from/to` on the `hr.leave` model. - When the current user has Attendances Officer rights but no Time Off access(rare cases), the ORM access check on `hr.leave` raises an AccessError, even though this read is purely for internal calendar computation and does not expose leave data to the user interface. Fix: - Added sudo() on holiday_id to access the employee's leave details and compute the work interval as expected. Task-6264510 Forward-Port-Of: odoo/enterprise#120668 Forward-Port-Of: odoo/enterprise#119116
This update resolves a bug that occurred when sorting financial reports by account code. The issue was caused by attempting to compare numeric and string values, leading to a crash. The fix ensures correct sorting even when account codes are missing (None), improving the reliability of financial reports.
Original PR description
If you're grouping by account_code on a line using an account_code
engine, and there's a None value, it will crash.
To get that, you can (with demo data):
- install l10n_be
- set "BE Company COA" as the main, keeping "My Company (San Francisco)"
activated
- go to the profit and loss "Profit and Loss (Abbr) (BE)", set the date
as the current year
- set "Consolidation" filter
- Unfold "60/61 - Goods for Resale,..."
```
Traceback (most recent call last):
...
File "... in _compute_formula_batch_with_engine_account_codes
results_list.sort(key=lambda x: math.inf if x[0] is None else x[0])
TypeError: '<' not supported between instances of 'float' and 'str'
```
Because in case of `None`, we compare with `math.inf` but the account
codes are string.
no-task
Forward-Port-Of: odoo/enterprise#120641
Forward-Port-Of: odoo/enterprise#120531This update resolves a critical issue that caused OOM crashes when generating the Swedish SIE 4 report for large datasets. By optimizing the data extraction process with a single SQL query and efficient chunking, the report now runs significantly faster and uses far less memory, improving overall system performance.
Original PR description
### Description of the issue/feature this PR addresses: Prevent Out of Memory (OOM) crashes and drastically improve execution speed when generating the Swedish SIE4 verification export for massive…
### Description of the issue/feature this PR addresses: Prevent Out of Memory (OOM) crashes and drastically improve execution speed when generating the Swedish SIE4 verification export for massive datasets. ### Current behavior before PR: When exporting a large volume of journal entries (e.g., 190,000+ account moves), the `_export_l10n_se_sie4_verification` method relies on iterating through heavy ORM recordsets and accessing relational child fields (move.line_ids) inside a loop. This triggers a severe N+1 query problem, maxing out server RAM and causing an OOM crash. ### Desired behavior after PR is merged: The method now utilizes a hybrid data extraction approach: - The ORM is used strictly to safely evaluate domains (multi-company rules, dates, states) and fetch a lightweight list of valid move_ids. - A single SQL query with JOIN statements fetches all parent moves, child lines, and account codes in exactly one database query. - itertools.groupby chunks the flat, lightweight dictionary results back into their respective journal entries. The export now handles massive datasets in seconds with minimal memory overhead, while remaining perfectly secure. ### Benchmark: For Memory: | # Input Data | Before PR | After PR | | -------- | -------- | -------- | | ~190,000 moves | MemoryError | 407MB| | ~200,000 moves | 1.8GB | 174.8 MB| For Speed: | # Input Data | Before PR | After PR | | -------- | -------- | -------- | | ~190,000 moves | MemoryError | 5.10s | | ~200,000 moves | 1m29s| 5.3s| ### Reference: opw-6067999 Forward-Port-Of: odoo/enterprise#119303 Forward-Port-Of: odoo/enterprise#113227
Features or functions removed from Odoo
This change removes a recent update that allowed non-manager users to see a list of individuals receiving feedback requests. This reversion addresses privacy concerns and restores the original system where only managers could view this information. The change involves reverting a security rule and updating related views.
Original PR description
With the following PR (https://github.com/odoo/enterprise/pull/102487) we made it possible for non-manager users to see the list of people to whom a feedback was requested. Here, we want to revert this for privacy reasons. Since we are removing an ir.rule, which has noupdate=1, we need to unlink the record. To do this, we create a local upgrade script that runs following the bump in minor version of the module. Task: 6159748
Code cleanup and technical improvements
This pull request updates the employee field in the HR module to improve data consistency and clarity. The change ensures a more standardized approach to recording employee information, which will help with reporting and data analysis. This is a refactoring effort focused on internal HR processes.
This update simplifies the bank reconciliation process within Odoo Enterprise by restructuring the core function. The changes enhance readability and maintainability, making it easier for developers to understand and update the code. This ultimately contributes to a more stable and efficient accounting system.
Original PR description
Reworked the try_auto_reconcile function to make it more readable by creating helper functions and splitting the function into multiple smaller ones. task-6171727 Forward-Port-Of: odoo/enterprise#120500 Forward-Port-Of: odoo/enterprise#116958
This update modernizes the Live Chat component to align with Odoo's OWL3 framework. The change replaces outdated React hooks with newer Signal/useEffect equivalents, resolving a deprecation issue. A small adjustment using setTimeout ensures the chat interface refocuses correctly after AI responses.
Original PR description
Replaces proxy/useRef/useLayoutEffect with signal/useEffect (OWL3 APIs). setTimeout is used when refocusing after AI response because OWL3's useEffect fires synchronously on signal change, before the DOM patch that re-enables the textarea. WHY: useLayoutEffect is deprecated in OWL3
This update introduces a new 'card' view type to standardize the display of records across different Odoo views like kanban, gantt, and calendars. This improves consistency and simplifies development by creating a single, reusable template for compact record representations, ultimately enhancing the user experience.
Original PR description
This PR is the first part of a larger effort to unify the API and appearance of cards across view types (kanban records, gantt popovers, calendar popovers, map popovers, activity records, hierarchy…
This PR is the first part of a larger effort to unify the API and appearance of cards across view types (kanban records, gantt popovers, calendar popovers, map popovers, activity records, hierarchy records). All of these views share the same need: displaying a compact representation of a record. Until now, each of these cases had its own implementation, resulting in inconsistent arch APIs (poor developer experience) and an inconsistent look across the UI (poor user experience). As a first step toward this goal, this PR introduces the card view type and allows it to be referenced from other views via the card_id attribute. When this attribute is set on the root node of an arch, the corresponding card view is automatically inlined into the arch. The kanban view has been refactored: its core card rendering logic has been extracted into a dedicated view/component. The gantt popover API has been updated to use the new card API. The kanban_view_id attribute has been removed in favor of card_id, so it is no longer possible to reference a kanban view inside a popover. The popover template API has also been reworked to align with the card API (which is basically the well-known old kanban templates API). Concretely, one can now either reference a card view via the card_id attribute, or directly inline the popover-header, popover-body, and popover-footer templates, which follow the same API as cards. Part of task~5262907
This update simplifies access to AI tools within the AI App by introducing a dedicated 'Tools' menu. Previously, users had to manually filter AI tools from other server actions. This change clarifies the distinction between 'Executable' and 'Guidance' skills, improving the overall AI experience.
Original PR description
The previous naming implied a divergence from the standard, and the old type field distinction wasn't expressive enough. Skills are now differentiated as: **Executable** - a skill that relies on tools to perform its action **Guidance** - a skill that provides reusable instructions or logic without tool invocation Alongside this, a dedicated Tools menu is introduced in the AI App, replacing the need for manual custom filters to isolate AI tools from other server actions. This gives a clearer entry point for viewing and creating AI tools.