Monday, January 5, 2026
12 changes · 19.0
Resolved issues and error corrections
This update resolves an issue where Australian BAS W2 reports were displaying incorrect negative signs due to a change in how signs were handled in Odoo 19.0. The fix ensures the correct sign is applied to W2 reports, aligning with report aggregation logic and preventing double sign inversions.
Original PR description
Since 19.0, sign handling was moved out of tax tags. In community commit 9f55bc242e71e96260edc425d227409775b6b096, the sign was removed from tax tags, but for BAS line W2 a negative sign was mistakenly kept at the tag level, while the report aggregation already applies a negative sign. This resulted in a double sign inversion. This commit fixes W2 by applying the correct sign. enterprise pr -https://github.com/odoo/enterprise/pull/102114 task- [5416350](https://www.odoo.com/odoo/project.task/5416350)
This update resolves an issue where files attached to activity notes within the Chatter interface were not being displayed. The change adjusts how HTML content is rendered within activity notes to ensure attachments are correctly shown. This improves the user experience when sharing files and collaborating on activities.
Original PR description
Currently, when a user creates an activity with a note containing a file using `/file`, the attached file is not displayed in the chatter. **Steps to produce:** * Install `crm` with demo data * crm >…
Currently, when a user creates an activity with a note containing a file using `/file`, the attached file is not displayed in the chatter. **Steps to produce:** * Install `crm` with demo data * crm > open any lead > Activity > use `/file` to attach a file > Save **Observed Behavior:** The user cannot see attached files in the chatter. **Root cause:** * This behavior occurs because after commit [1], the `EmbeddedFilePlugin` started being used for all HTML fields with embedded components enabled, and since commit [2], all HTML fields have `embedded_component` set to true by default. * As a result, file attachments may not display correctly, since embedded components do not render when HTML content is shown outside the editor. **Solution:** Disable the embedded component option for the note field in the activity to display the full HTML and make the attachment visible, instead of rendering-related data. **Before:** <img width="640" height="150" alt="image" src="https://github.com/user-attachments/assets/edabbe9f-eedf-4ef1-8f0d-749e0145ce8f" /> **After:** <img width="651" height="148" alt="image" src="https://github.com/user-attachments/assets/8a3d1d3d-a5f8-4726-83be-6134e96db689" /> [1]: https://github.com/odoo/odoo/pull/216572/commits/86c7176833fc36b9ca7d2989d31587c353bd5800 [2]: https://github.com/odoo/odoo/commit/a44b05fd06d8c157b5edacbd6a7061197eb4ee5f opw-5426126,5361933
This update fixes an issue where refund transactions incorrectly displayed the customer as the author instead of the user who initiated the refund. The change ensures the logged-in user is always identified as the author for refund, capture, and void transactions, improving data accuracy and reporting. This resolves a discrepancy in message attribution.
Original PR description
Currently, the customer, who did not perform the operation, is set as the author of the refund, capture, and void transaction messages. **Steps to reproduce:** - Install the `sale_management` module…
Currently, the customer, who did not perform the operation, is set as the author of the refund, capture, and void transaction messages. **Steps to reproduce:** - Install the `sale_management` module and enable the `demo` payment provider. - Create a new quotation and from the `gear` icon, select `Mark Quotation as Sent`. - From the `gear` icon, choose `Generate a Payment Link`, and copy the link. - Open the link in an incognito window, and complete the payment. - Return to the original tab and open the payment transaction from the chatter. - Click `Refund` > `Refund` and observe the `author` of the messages in the chatter. **Observation:** The refund messages entry shows the customer as the author instead of the logged-in user who executed the refund. **Root Cause:** At [1] and [2], when the logged-in user is not a superuser, the code assigns the customer (`self.partner_id`) as the author, even during `refund`, `capture`, and `void transactions`, resulting in an incorrect message author. **Fix:** This commit ensures that during refund, capture, and void transactions, the message author is set to the logged-in user instead of the customer. [1]: https://github.com/odoo/odoo/blob/bbf3bd7b0e1d3e015350f9c959fad056384e2318/addons/account_payment/models/payment_transaction.py#L223 [2]: https://github.com/odoo/odoo/blob/5cf325dfff1ffbc1c4b4d0bcfc44ac9f55ea7c51/addons/sale/models/payment_transaction.py#L110 **Before:** <img width="1910" height="624" alt="5379376_before" src="https://github.com/user-attachments/assets/decdd620-d741-488e-9dec-e5c8c9bafc48" /> **After:** <img width="1917" height="622" alt="5379376_after" src="https://github.com/user-attachments/assets/5f38f3c3-fd2c-489e-afc9-d7a356fde23a" /> opw-5379376 Forward-Port-Of: odoo/odoo#241923 Forward-Port-Of: odoo/odoo#239224
This update resolves an issue where loyalty programs weren't correctly applying pricelist conditions in the Point of Sale (POS) system. The fix ensures the POS configuration properly loads the pricelist ID, allowing loyalty programs to function as intended. This improves the accuracy of loyalty rewards and discounts.
Original PR description
Task: [#4974070](https://www.odoo.com/odoo/my-tasks/4974070) Runbot build error: [#229672](https://runbot.odoo.com/odoo/runbot.build.error/229672) --- ## Error FAILED: [12/46] Tour…
Task: [#4974070](https://www.odoo.com/odoo/my-tasks/4974070)
Runbot build error: [#229672](https://runbot.odoo.com/odoo/runbot.build.error/229672)
---
## Error
FAILED: [12/46] Tour test_refund_does_not_decrease_points → Step selection popup has '$ 1 per point on your order' (trigger: .selection-item:contains("$ 1 per point on your order")).
## Qualifiers
{
"module": "pos_loyalty",
"test_path": "/pos_loyalty/tests/test_frontend.py",
"tour_name": "test_refund_does_not_decrease_points",
"tour_step": ".selection-item:contains(\"$ 1 per point on your order\")",
"test_class": "TestUi",
"test_method": "test_refund_does_not_decrease_points",
"test_module": "pos_loyalty"
}
## Fix
In some cases, the POS config's `pricelist_id` was not available in the frontend, causing loyalty program conditions to be skipped when checking for a matching pricelist.
By explicitly setting `use_pricelist` to True on the POS config, we ensure that `config.pricelist_id` is properly loaded and available at runtime, allowing loyalty programs with pricelist conditions to behave as expected.
Forward-Port-Of: odoo/odoo#221921This update corrects a problem where delivery pickings remained 'Waiting Another Operation' after cancelling a manufacturing order (MTO) in multi-step production processes. The fix reuses existing logic to properly unlink related stock moves, ensuring availability is correctly updated and preventing delays in order fulfillment.
Original PR description
Issue ----- After cancelling a MO created by a SO (MTO), user cannot reserve quantity from stock for the delivery picking. This happens for both MO & Reception as long as they are multi-step. Steps…
Issue ----- After cancelling a MO created by a SO (MTO), user cannot reserve quantity from stock for the delivery picking. This happens for both MO & Reception as long as they are multi-step. Steps to reproduce ----- - Enable multi step routes - Set WH to 3-step manufacturing - Create a product - empty bom - MTO & manufacturing routes - 5 in stock - Create a SO for the product - Cancel the linked MO - Open the delivery picking - Click "Check Availability" > The product is not getting reserved from stock > The delivery picking is still "Waiting Another Operation" Cause ----- The problem happens in `action_cancel` https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L1995 In 1-step case, `move.propagate_cancel` is false so we go through https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L2017-L2021 where `move_dest_ids` is the move of the delivery picking. This makes it so that, when we go to the delivery picking and do `action_assign` we go through the first condition while skipping the second of https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L1929-L1931 instead of going into the `else` part https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L1947-L1949 In 3-step, when we `action_cancel`, `move.propagate_cancel` so we go through https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L2009-L2014 which lacks the swap to MTS and unlink `move_dest_id` logic. Solution ----- We can re-use the logic of unlink and MTS swap to `move_dest_ids` that were not cancelled by https://github.com/odoo/odoo/blob/0eb44aec8867e292f8258df02045efe7fbd3303f/addons/stock/models/stock_move.py#L2012 This also takes care of the problem of the status of the delivery picking being `waiting` instead of `confirmed` because it gets recomputed https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L754 and since it was set to MTS, it goes into the `else`part of https://github.com/odoo/odoo/blob/3f7d79731fd5e5a751f7f1aeae63379c6211de5c/addons/stock/models/stock_move.py#L2202-L2216 ----- Ticket: opw-5124380 Forward-Port-Of: odoo/odoo#241579 Forward-Port-Of: odoo/odoo#237890
This update addresses a previous issue where planning managers were blocked if employee work emails were missing. Now, a notification is displayed listing employees with incomplete email information, allowing managers to easily resolve the issue by contacting HR or the employees directly. This streamlines the planning process and prevents workflow interruptions.
Original PR description
Before this commit, when the planning manager wants to send the planning and for some employees the work email is missing, the user is blocked on the wizard to fill the work email on those employees if he does not edit access to employee model. This commit makes sure the wizard to fill in the missing work email is not displayed if the user cannot edit the information of the employees. It also displays a notification listing the employees for which the work email is missing. By doing that, the user can easily remove those employees to continue his flow or ask to HR user or the employees concerned to complete the missing information. task-5090163 Forward-Port-Of: odoo/enterprise#102458 Forward-Port-Of: odoo/enterprise#96111
This update allows users to export Intrastat reports in XML format directly from the system, addressing previous limitations that prevented successful report submissions. Previously, users needed to create a separate return to export, now they can directly download the XML file containing both arrivals and dispatches, improving reporting efficiency and compliance.
Original PR description
**Behavior:** Currently Intrastat reports are exported from the account.return view, and will be exported specifically in their extended mode and will contain both arrivals and dispatches. This…
**Behavior:** Currently Intrastat reports are exported from the account.return view, and will be exported specifically in their extended mode and will contain both arrivals and dispatches. This causes issues for some users that want more specific formats like standard over extended, only arrivals/dispatches or both, etc... And this can cause them to not be able to submit their reports. The solution is to currently reenable the user to export their report to XML from a cog menu in the Intrastat Report view. While still leaving the current flow through account.return possible, until a better solution is thought of. **Steps to reproduce:** - Connect to a company under Belgian Localisation. - Create a product and, under the Accounting tab, specify a Commodity code (eg Live asses) and Country of Origin (Belgium) - Create an Invoice containing the product to a Client in another EU Country (eg Luxembourg) and under the 'Other Info' tab, specify Intrastat Countrt (Belgium) - You can choose to leave out Intrastat Transport Mode and Incoterm, this will make the resulting XML have some missing informations - Create a Bill with the product with the same settings - If you go to Intrastat Report, after changing the 'Report' filter to Intrastat (Goods) you will now be able to see an arrival and a dispatch. The extended mode filter is enabled by default, if you didnt fill Intrastat Transport Mode and Incoterm, you will see these missing. - From this view there is currently no way to export the XML, to do that click the Returns button (select an Opening Date for accounting if needed), click on 'New' and specify Intrastat in the Return Type and a time window containing your Invoice and Bill. - Then you will see an Intrastat Report show up and after selecting Review, then Submit, you will be able to download the XML. which will contain dispatches and arrivals and will be in Extended Mode. Which, if missing Transport/Incoterm, will fail when submitted to OneGate opw-5347238 Forward-Port-Of: odoo/enterprise#102531
This update resolves an issue where employees were incorrectly receiving duplicate deductions on their CFDI payslips. The change removes a redundant CFDI concept from the payroll rules, ensuring accurate calculation of employee withholdings and compliance with Mexican tax regulations. This improves payroll accuracy and avoids potential financial discrepancies.
Original PR description
Avoid duplicate employee deductions on the CFDI payslip by eliminating the CFDI concept that is currently generating a second retention already accounted for in the “IMSS Total (Employee)” payroll rule. target: 19.0 task-5436851
This update corrects a bug that caused subscription order processing to repeat unnecessarily, leading to potential delays and inefficiencies. The fix ensures that order progress is accurately tracked, preventing redundant reprocessing and improving order execution times. This resolves a technical issue impacting subscription order management.
Original PR description
Before this commit, when the continue instruction was called before the _subscription_commit_cursor call, the order would be reprocessed again and and again. Commit with a progress=1 was commited but if the continue was called before, progress with 0 was never called.
This update resolves an issue where HR Officers without payroll access could inadvertently access sensitive salary adjustment data. The changes restrict access to relevant data models and views, ensuring that HR Officers only see information aligned with their assigned roles. This improves data security and prevents unauthorized access to payroll-related information.
Original PR description
* = hr_contract_salary Steps to reproduce: - Install 'hr', 'hr_payroll', 'hr_work_entry', and/or 'hr_contract_salary'. - Log in as an HR Officer without payroll access. - On an employee form: -…
* = hr_contract_salary
Steps to reproduce:
- Install 'hr', 'hr_payroll', 'hr_work_entry', and/or 'hr_contract_salary'.
- Log in as an HR Officer without payroll access.
- On an employee form:
- Switch to the 'Salary Adjustments' tab.
- Edit/save a record (tracking reads 'salary_offer_ids').
- Click the 'Work Entries', 'History', or 'Offers' smart buttons.
Cause:
- HR Officers could still reach payroll-only data:
- 'salary_offer_ids' (one2many to 'hr.contract.salary.offer') triggered
tracking reads on a model restricted to HR Managers/Recuriters.
- The 'Salary Adjustments' tab and offer buttons remained visible even when
the user lacked payroll rights.
- The payroll overrides changed 'contract_date_start' to
'hr_payroll.group_hr_payroll_user', so the 'Work Entries'/'History' buttons
show AccessErrors while the buttons stayed visible.
Fix:
- Restricted 'salary_offer_ids' to 'hr.group_hr_manager'.
- Made the 'Salary Adjustments' tab visible only to
'hr_payroll.group_hr_payroll_user' and existing 'Offers' buttons stay for
HR Managers.
- Added dedicated overrides giving 'Work Entries' and 'History' buttons the
'hr_payroll.group_hr_payroll_user' group when payroll is installed.
Task - 5188997This update restricts access to certain features on employee forms based on user roles. Specifically, HR Officers can no longer create users or access sensitive payroll-related data, preventing errors and ensuring data security. This change aligns with access control best practices for HR data management.
Original PR description
* = hr_work_entry
Steps to reproduce:
- Install 'hr' and 'hr_work_entry'.
- Log in as an HR Officer.
- Open an employee form and click:
- 'Create User'
- 'Work Entries' smart button
- 'History' smart button
Cause:
- 'Create User' was visible to HR Officers, but only users with Settings rights
('base.group_erp_manager') can create 'res.users', causing an AccessError.
- The 'Work Entries' and 'History buttons were visible to HR Officers, but
fields as 'contract_date_start' which only HR Managers can read when
payroll is not installed.
Fix:
- Restricted 'Create User' to 'base.group_erp_manager'.
- Limited the 'History' smart button to 'hr.group_hr_manager'.
- Limited the 'Work Entries' smart button to 'hr.group_hr_manager'.
Task - 5188997This update significantly speeds up invoice processing by optimizing how the system determines parent IDs for accounting lines. Previously, the system performed numerous individual updates, leading to performance issues and potential memory errors. Now, the system efficiently updates multiple related lines at once, resulting in a 4-second improvement on invoices with 2000 lines.
Original PR description
Before this commit, computing the `parent_id` of `account.move.line` records, involved looping over the `move_lines` grouped by their `move_id` sorted by the `sequence`. The updates on the move_lines…
Before this commit, computing the `parent_id` of `account.move.line` records, involved looping over the `move_lines` grouped by their `move_id` sorted by the `sequence`. The updates on the move_lines are done per line and this involves an individual write operation on each one of them. The cardinality of the set of possible values of the new `parent_id` may involve a lot of values in cases where a big number of lines have a display type of either 'line_section' or 'line_subsection', in most of the cases it is not the case, so a possible performance improvement in the method is to upper bound the number of write operations by the cardinality of the set of possible values instead of a single write operation on each single `move_line`. This can be done by mapping the values to a record set of move lines and updating the move_lines that share the same value. The benchmark below is done on an invoice that contained **2000** `move.line` records. An individual **write** operation is being done on each one of them. | Scenario | Time (seconds) | |-----------|----------------| | **Before** | **Memory Error** | | **After** | **4s** | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr