Daily updates from Odoo
Friday, March 13, 2026
25 changes · master
Resolved issues and error corrections
This update adds a warning to the system when a customer manually changes payroll rules defined in data files. This prevents accidental overrides of standard rules and ensures customers always have access to the latest, approved settings. Users can then reset the rule to re-apply the current data files.
Original PR description
Usually, rules that are defined in the data of modules are automatically updates on the customers database even if they modified those rules manually. To prevent overriding the modifications by the customers, we add a warning when a rule from data has been modified by the user. The user can then choose to reset the rule, thus upgrading it again from the current data files. Task: 5917278
A recent update resolved an error preventing demo users without payroll permissions from accessing the attendance app. The fix involved adding a check to prevent unnecessary data requests, ensuring the app functions correctly for all users. This improves the user experience and prevents disruptions to payroll processes.
Original PR description
Steps : - Settings -> Users -> Manage Users -> marc demo - make sure the demo user has no rights over HR apps - go into debug mode -> check "User: Read his own attendances" - Connect using the demo…
Steps : - Settings -> Users -> Manage Users -> marc demo - make sure the demo user has no rights over HR apps - go into debug mode -> check "User: Read his own attendances" - Connect using the demo user. - Try to access the attendance app or to click the monthly hours smart button from it's own employee form view. - you'll get an access error. Reason : - The `PayRunMixin` patches Attendance views globally and injects the `PayRunLayout`. Upon mounting, `PayRunLayout` unconditionally fetch the Kanban architecture for `hr.payslip.run`. This triggered a `get_views` RPC call that the backend rejected for users without Payroll rights. Solution : - Added an asynchronous ACL check inside the `onWillStart` hook of `PayRunLayout`. If the user does not have the `hr_payroll.group_hr_payroll_user` group, or if there is no active `payrun_id` in the context, the component aborts the `loadViews` request early, preventing the RPC call and the resulting crash. Task - 5965727
This update resolves a security vulnerability by preventing the use of public partner information within the Enterprise POS module. This change ensures data privacy and strengthens the overall security posture of the Odoo Enterprise platform. It corrects a potential risk related to data exposure.
Original PR description
Enterprise counter-part. https://github.com/odoo/odoo/pull/251472
This update ensures accurate subline totals in stock barcode transactions. The system now requires the 'stock.group_production_lot' setting to be active, which was introduced in the 18.3 release. Without this setting, the test fails to calculate the correct totals.
Original PR description
This issue occurs on Single App and Single L10n, without demo data ### Summary This part of the test verifies that the sub line totals are calculated correctly, which from 18.3 requires the…
This issue occurs on Single App and Single L10n, without demo data ### Summary This part of the test verifies that the sub line totals are calculated correctly, which from 18.3 requires the stock.group_production_lot setting to be active. Specifically, it validates that the sum accurately reflects the Unit of Measure (UOM) across various packagings. https://github.com/odoo/enterprise/blob/93e3c6f13fbab8d54694648d04908e451f1e97fc/stock_barcode/static/tests/tours/tour_test_barcode_flows_picking.js#L6472-L6498 ### Observation The grouping logic is contingent on the stock.group_production_lot setting. If this setting is inactive, the system fails to group lines, preventing the calculation of the aggregate total. Without the production lot group active, the conditional checks will bypass the grouping process: https://github.com/odoo/enterprise/blob/d664e1f97f6e7fa462b4cf1806322a54762c0de4/stock_barcode/static/src/models/barcode_model.js#L53 https://github.com/odoo/enterprise/blob/d664e1f97f6e7fa462b4cf1806322a54762c0de4/stock_barcode/static/src/models/barcode_model.js#L224-L225 When the demo data are enabled [the group is implied](https://github.com/odoo/odoo/blob/8a7ca8beac521f41faf79a6022935fdbb605de76/addons/stock/data/stock_demo.xml#L185-L187) ### Impact When stock.group_production_lot is disabled: - Lines remain ungrouped. - The total sum of the grouped line is never generated. - The test fails as it cannot find or validate the expected sub-line totals. This issue originate from the 18.3 forward port of this [commit](https://github.com/odoo/enterprise/commit/84d4b1f144e8a437fe76ec5ef3bc9799cdf993b0) runbot-241109 Forward-Port-Of: odoo/enterprise#108908
This update resolves a technical issue where the Odoo Enterprise system would crash or display warnings due to missing view IDs. It also adds a calendar icon to date-type fields in the sidebar, improving clarity and usability for users. This ensures a more stable and intuitive experience.
Original PR description
Before this commit, the component would crash or throw warnings when the optional view ID was missing. The sidebar list also lacked a clear visual indicator for date-type fields. After this commit, the view ID is correctly marked as optional to prevent those errors. We also map the calendar icon to date items so they're easier to identify. taskid-6018352
This update ensures that the filing status for employees is always selected during payroll configuration. Previously, missing this information would prevent users from generating payslips. This change ensures accurate payroll calculations and avoids disruptions to the payroll process.
Original PR description
Before this PR, if an employee’s filing status is not selected in the configuration, users get an error and cannot compute payroll using the US salary structure. In this PR, we make the l10n_us_filing_status field required. This prevents users from being blocked when generating a payslip. task-5957074
This update resolves a warning in the payroll dashboard that appeared when employees were linked to partners without a defined DMFA work location. The change adds a field to the partner record to directly link it to the appropriate DMFA location, providing clearer reporting and a more user-friendly experience for payroll management.
Original PR description
Previously, DMFA work locations were defined in their own model and linked to a partner. The link didn't exist in the other direction (from partner to DMFA work location). Therefore, when an active employee had a partner not relate to any work location, we were getting a warnign in the payroll dashboard that was showing the list of partners with missing location. However, it was not possible from the partner to define the location, which was confusing and not helpful. With this commit we add the new field on res_partner and modify the views to show it. Task: 5940867
This update corrects a technical issue in the timesheet grid that prevented proper task state resets. Adding a missing 'super()' call ensures the parent method executes correctly, maintaining the integrity of timesheet data. This resolves a minor bug impacting timesheet accuracy.
Original PR description
The `_onchange_project_id` override was missing a `super()` call, which prevented the parent method (responsible for resetting the task state) from executing. This commit adds the missing super call. task-4210148
This update resolves an issue preventing users from completing rental orders. The removal of a temporary flag and the addition of a synchronization step now ensures the order confirmation only occurs when required data is valid. This improves the reliability and user experience of the rental order process.
Original PR description
This commit marks the 'rental_tour' as stable by removing the 'undeterministicTour_doNotCopy' flag. A synchronization step has been added to wait for the input field to have a valid value before confirming the order.
This update resolves an issue preventing users from successfully exporting new modules through the Odoo Studio tour. The change removes a problematic flag and adds a wait step to ensure the home menu is fully loaded, guaranteeing a smoother and more reliable experience for users.
Original PR description
This commit marks the 'can_export_new_module' tour as stable by removing the 'undeterministicTour_doNotCopy' flag. A new step has been added to wait for the home menu to be fully loaded before proceeding to open Studio.
This update corrects a visual problem with the appointment form grid, ensuring that all appointment details are displayed correctly. The change prevents a broken layout that was impacting user experience when viewing appointment records. This ensures consistent and accurate appointment data display.
Original PR description
opw-6036938
This update corrects a bug where copying product records after creation didn't function correctly due to a context key. Previously, tests were incorrectly passing, masking a fundamental problem. The fix ensures tests accurately reflect product creation behavior, improving overall system reliability.
Original PR description
Copy of `product.product` records wasn't working as expected when called on records returned by a `create` call, as they had a context key disabling product creation. Since this is now fixed (see counterpart PR), some enterprise tests were failing as they wrongly assumed the copy worked as expected, previously making some assertions succeed regardless of the absence of a product.
This update corrects a previous calculation error related to how extra legal holidays impact salary and benefit costs. The new formula now accurately reflects that taking extra days off doesn't increase benefit costs, leading to more precise wage calculations, particularly for meal vouchers. This ensures accurate payroll processing for employees in Belgium.
Original PR description
Specifications ============== Before this PR, taking extra legal paid holidays on your salary package was making the benefit taken cost more then if you didn't take any extra legal holidays. At fixed…
Specifications
==============
Before this PR, taking extra legal paid holidays on your salary package was
making the benefit taken cost more then if you didn't take any extra legal
holidays.
At fixed wage, the yearly cost was then higher than it should be.
At fixed yearly cost, the wage was then lower than it should be.
Indeed, for example, the average Meal vouchers monthly cost should only be
multiplied by the number of month in the year the get the yearly cost of meal
voucher. Before, they were also weighted by the number of extra legal days,
but taking more extra legal holidays will not cost more meal voucher to
the employer. In fact, in that precise example, the employee will not even
receive meal vouchers when an extra legal day off will be taken.
In that precise example, it will even cost less to the employer.
But anyway, benefits should not be weighted in function of the number of
the extra legal paid holidays the employee will take as benefit cost are in
reality not impacted by those extra legal days.
After this PR, only the wage is impacted by the extra legal paid holidays.
See below development for more numbered details.
Old Formula
===========
Yearly Cost
----------------
YC = (Benefits + (Cost_Factor * Wage) + Sacrifice_Fixed) / Sacrifice_Ratio
Detailed Example given for Belgian payroll
Yearly_cost = (
(sum_of_monthly_benefits_costs * 12)
+ sum_of_yearly_benefits_costs
+ ((13.92 + (13.0 * EMPLOYER_ONSS)) * Gross_Salary)
+ insurance_group_cost
) / (1.0 - (Extra_Legal_holidays_number / 231.0))
For: wage = 5000€, Benefits = 150€ Rep fee + 500€ car, Extra Legal = 15:
-> Yearly Cost = 101641.07
Wage
--------
Wage = ((YC * Sacrifice_Ratio) - Sacrifice_Fixed - Benefits) / Costs_factor
Detailed Example given for Belgian payroll
Wage = (
(
Yearly_cost
* (1.0 - (Extra_Legal_holidays_number / 231.0))
)
- insurance_group_cost
- (sum_of_monthly_benefits_costs * 12)
- sum_of_yearly_benefits_costs
) / (13.92 + (13.0 * EMPLOYER_ONSS))
For: Yearly Cost = 100k€, Benefits = 150€ Rep fee + 500€ car, Extra Legal = 15:
-> Wage = 4912.05
New Formula
===========
Yearly Cost
----------------
YC = Benefits + (Cost_Factor * Wage / Sacrifice_Ratio) + Sacrifice_Fixed
Detailed Example given for Belgian payroll
Yearly_cost = (sum_of_monthly_benefits_costs * 12)
+ sum_of_yearly_benefits_costs
+ (
(13.92 + (13.0 * EMPLOYER_ONSS))
* Gross_Salary
/ (1.0 - (Extra_Legal_holidays_number / 231.0))
)
+ insurance_group_cost
For: wage = 5000€, Benefits = 150€ Rep fee + 500€ car, Extra Legal = 15:
-> Yearly Cost = 101099.40€ (541.67 less than with old formula)
Wage
--------
Wage = (YC - Sacrifice_Fixed - Benefits) * Sacrifice_Ratio / Costs_factor
Detailed Example given for Belgian payroll
Wage =
(
Yearly_cost
- insurance_group_cost
- (sum_of_monthly_benefits_costs * 12)
- sum_of_yearly_benefits_costs
)
* (1.0 - (Extra_Legal_holidays_number / 231.0))
/ (13.92 + (13.0 * EMPLOYER_ONSS))
For: Yearly Cost = 100k€, Benefits = 150€ Rep fee + 500€ car, Extra Legal = 15:
-> Wage = 4941.08€ (29.03 more than with old formula)
Also, this PR applies a correction for the meal vouchers cost computation.
The more extra legal days off are taken, the less the meal voucher number
received by the employee there will be, and the less it will cost in average
per month.
Task-5896493This update ensures all Odoo reports consistently include the 'has_sublines' key in their results. Previously, some reports lacked this key, causing confusion for developers and potential issues with report functionality. This change improves the reliability and predictability of our reporting engine.
Original PR description
Some reports doesn't return the has_sublines key in their results which can be confusing for developers and can be a source of issues. This PR ensures that it's not the case anymore. task-id: 4896816
This update corrects a budgeting issue impacting cultural and training industries where VAT isn't deductible. It ensures budgets accurately reflect VAT contributions, preventing misleading figures before bill recording. This improves budget forecasting and reporting for these specific business sectors.
Original PR description
In the cultural industry and/or training (formations) industry namely but not only, users often do not have right to deduct VAT. Though, they receive bills issued by their customer, where VAT is…
In the cultural industry and/or training (formations) industry namely but not only, users often do not have right to deduct VAT. Though, they receive bills issued by their customer, where VAT is explicitly set. Our users want to fetch the bills (import, Peppol, whatever) and post them quickly. Hence why even though they don't deduct VAT, they manipulate taxes. By doing so, they adapt their taxes: adapting the tax grids removing the account on the tax repartition line (or setting a distinct P&L account) >> this is how you can deduct if a tax is deductible or not The issue is that in budgets, before the bill is recorded, the committed account forgets to compute the non-deductible tax contribution. And the user is temporarily mislead because if the amounts have already been committed, the budget suggests that they have not yet been committed. Only when the bill is registered, then the committed amount is adapted to the bills. Adapt the computations of the budget so that the committed amount takes into account the non-deductible VAT. task-5993281
This update resolves an issue where payments weren't automatically matched to invoices when 'Outstanding Receipts' accounts were used in the bank journal. The fix allows for amount matching, ensuring accurate reconciliation of payments and invoices. This improves financial reporting accuracy.
Original PR description
Steps to reproduce - Have a Bank journal with Outstanding Receipts accounts set - Create and confirm an invoice with a payment reference - Create the payment - Create a bank transaction with: - Label: any label - Partner: invoice partner - Amount: invoice full amount Issue: Transaction won't be matched automatically Analysis: Transaction will be automatically matched if the outstanding receipts account is not set. It occurs because in case it is set, the sytem will only try to match the communication pattern against the journal item of the payment, without trying amount matching Note: another solution could be to relax the communication matching. In the user case the invoice payment reference is something like `TEST-12345` and the payment communication `AAAAAAAAAAA /BBBBBBBBBBB TEST 12345` opw-5872387 Forward-Port-Of: odoo/enterprise#109992 Forward-Port-Of: odoo/enterprise#108564
This update restores the previous method for handling files within knowledge articles, resolving a printing problem caused by a recent change. The fix ensures that knowledge articles can now be printed correctly using wkhtmltopdf, improving the user experience for generating reports and documents.
Original PR description
### Purpose of this PR: - Restore the static file box implementation and drop the embedded component, as it breaks printing with wkhtmltopdf. - The original issue with the static file box was fixed in [#241591](https://github.com/odoo/odoo/pull/241591) Reverts: https://github.com/odoo/enterprise/pull/88929 community: https://github.com/odoo/odoo/pull/251098 Forward-Port-Of: odoo/enterprise#109376 Forward-Port-Of: odoo/enterprise#108999
A recent update caused crashes when creating and saving YouTube posts in Odoo. This fix removes outdated references to a 'name' attribute within the social_youtube module, resolving the issue. The change ensures stable post creation without impacting core functionality.
Original PR description
Bug: Following recent changes introduced in saas-19.2, creating and saving a YouTube post causes the flow to crash. Cause: A refactoring in the social module removed the `utm.source.mixin` dependency from the `social_post` model. This consequently removed the `name` attribute from the model. However, `social_youtube` still expected this attribute to exist, triggering the crash. Solution: Remove all references to the `name` attribute within the `social_youtube` module. We opted not to reintroduce the attribute on the model because it did not add significant functionality and has been superseded by other attributes. Forward-Port-Of: odoo/enterprise#109203
This update fixes an issue where customers could inadvertently set subscription start dates to 'false,' leading to incorrect invoicing. The change prevents users from removing the start date, ensuring subscriptions are properly billed and tracked. This maintains accurate subscription records and prevents revenue discrepancies.
Original PR description
**Issue** Some customers were removing the `start_date` of subscriptions, leading to the subscription being considered free on the next invoicing. While there are legitimate use cases to edit the `start_date` of a running subscription, it should probably not be removed. opw-5325303 Forward-Port-Of: odoo/enterprise#104925
This update resolves an error that prevented the generation of customer statement reports. The issue stemmed from a missing domain variable, causing a type error. The fix ensures the domain is always provided, guaranteeing correct report output and preventing failed email previews and PDF generation.
Original PR description
**Steps to reproduce:** * Install the **l10n_my_reports** module. * Go to `Accounting > Reporting > Partner Ledger`. * Change report to `Customer Statement`. * Add data in the report and click Send. * In the email template, set the `dynamic reports` as `statement of accounts` under the options tab. * Click Preview. **Observed behavior:** * Error: `TypeError: Domain() invalid argument type for domain: None` * Email preview fails and PDF cannot be generated. **Cause:** * The `statement_account_document` template uses `filtered_domain(domain)` but the domain variable was not being passed to the template context by the `_get_report_values` method, resulting in None being passed to `filtered_domain()`. **Fix:** * Ensure domain is always present in the report context, defaulting to an empty list when not provided. * Added safe handling for missing data and context parameters. opw-5880385 Forward-Port-Of: odoo/enterprise#107400
This update fixes a potential issue with Instagram polls by ensuring the system only requests the poll's ID after it's successfully published. Previously, attempting to retrieve the ID prematurely could cause errors. The changes include updated tests to simulate the Instagram API's behavior and prevent future problems, ensuring poll data is reliably fetched.
Original PR description
Follow-up to 06256aa02cb92378933edd638259dd725a2d04c1 The Instagram API returns an error if the `ig_id` field is requested while the container is still processing. This commit splits the container status check into two steps: 1. Poll for `status_code` only to determine the current state. 2. If the status is `PUBLISHED`, perform a second request to fetch the `ig_id`. Updated the test mocks to simulate this restriction, ensuring that requesting `ig_id` on a non-published container results in a 400 error to prevent future regressions. opw-5081325 Forward-Port-Of: odoo/enterprise#110094
This update fixes a technical issue preventing HR modules from properly customizing VoIP contact information. The change ensures VoIP data aligns with how it's stored in the system, maintaining consistency and allowing for future flexibility in how VoIP interacts with other business processes. This improves the reliability of VoIP data across the enterprise.
Original PR description
`_store_voip_fields` was directly adding `"im_status"` to the stored partner fields. This bypassed `_store_im_status_fields`, so module overrides (notably HR-related ones) could not extend/adjust the IM status payload. Use `_store_im_status_fields(res)` from `_store_voip_fields` instead of hardcoding `"im_status"`. Also align the VoIP mock server `res.partner` contact payload with the real store payload by including the same contact fields and IM status data (`partner_share`, `im_status`, `im_status_access_token`, etc.). This keeps VoIP aligned with the extensibility contract and keeps tests on the same data shape as runtime. [H>A] Forward-Port-Of: odoo/enterprise#110070
A minor bug fix has been implemented to ensure the correct field for account numbers is being used in the account_online_payment module. This prevented a technical error and ensures data is processed accurately. The change improves system stability.
Original PR description
Due to an oversight during https://github.com/odoo/enterprise/pull/109070, the old field `sanitized_acc_number` was used instead of the new one `sanitized_account_number` This causes a traceback. No task ID Forward-Port-Of: odoo/enterprise#110266
This update corrects a bug in the DATEV export that was causing currency exchange difference values to appear as zero. The fix now uses the line balance, ensuring that actual exchange rates are accurately reflected in the exported DATEV file, providing correct financial reporting.
Original PR description
**Steps to reproduce: 1. Create DE company (EUR currency) 2. Add USD -> EUR exchange rates for XX/01/26 and XX/15/26 (XX is target month) 3. Install l10n_de_reports 4. Make sure bank journal has…
**Steps to reproduce: 1. Create DE company (EUR currency) 2. Add USD -> EUR exchange rates for XX/01/26 and XX/15/26 (XX is target month) 3. Install l10n_de_reports 4. Make sure bank journal has 'outstanding receipts' set for incoming manual payment [Accounting -> Config -> Journals -> Bank] 5. Create USD invoice for XX/02/26 and confirm it 6. Register a Payment for XX/16/26 and confirm it (you should see the exchange difference entry matched alongside the payment) 7. Go to [Accounting -> Reporting -> General Ledger] and export DATEV data **Description of issue: The currency exchange rate difference entries in the exported file are shown as 0 **Expected behavior: The actual currency exchange difference values should be displayed **Why this happens? The DATEV export currently sets the amount based on 'amount_currency'. For currency exchange difference entries, this value is 0.0 in the General Ledger, resulting in 0 values in the export. **The fix: Updated the logic to use the line balance when the entry is identified as a currency exchange difference. opw-5358954 Forward-Port-Of: odoo/enterprise#109655 Forward-Port-Of: odoo/enterprise#107268
This update corrects a calculation error in the HRA (House Rent Allowance) rules for Indian employees. The change ensures that HRA percentages are accurately applied, aligning with standard India payroll practices. This update improves the consistency and accuracy of employee compensation calculations.
Original PR description
… fields - compute HRAMN from categories['BASIC'] with result_rate = l10n_in_hra_percentage * 100 - add python condition to skip the rule when HRA percentage is zero - keeps ind_emp behavior consistent with regular India payroll rules task-5964270 Forward-Port-Of: odoo/enterprise#108507