Daily updates from Odoo
Tuesday, June 16, 2026
43 changes · master
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