Monday, December 15, 2025
24 changes · 19.0
Enhancements to existing features
Odoo now sends a dedicated identifier with PayPal payment activity so PayPal can recognize transactions coming from Odoo. This improves tracking and partner reporting without changing the payment experience for users.
Original PR description
PayPal requested that we add an identifier so that they know which transactions are coming from Odoo for better trackability. task-5358321 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239937 Forward-Port-Of: odoo/odoo#237336
Adyen payment requests now include Odoo platform information so the payment provider receives the expected context. This improves payment integration reliability while keeping the customer payment flow unchanged, with tests added to confirm successful requests.
Original PR description
Add applicationInfo to the payload sent to Adyen, ensuring that externalPlatform is correctly transmitted. A test was added to verify that applicationInfo is present in the payload and that the payment request succeeds as expected. task-5157863 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238583 Forward-Port-Of: odoo/odoo#233075
This update simplifies the underlying query used to generate sale commission reports. By adding an alias to a key component, the code is now easier to maintain and modify, ensuring future updates to the reporting process are smoother and less prone to errors. This ultimately improves the reliability of our sales commission reports.
Original PR description
Add an alias to the CTE used for sale order log selection. This is done to simplify modifications to the query.
Resolved issues and error corrections
This fix prevents Chilean invoices from crashing when they are confirmed with a zero total in a currency different from the company currency. Users can now validate these edge-case invoices without interruption, improving reliability for Chile localization workflows.
Original PR description
Steps to reproduce:
--------------------
1. Install l10n_cl and switch to the CL company
2. Create a new invoice:
- Change the currency to a value different from the company currency
(e.g., from CLP to USD)
- Add an invoice line with a price value of 0
- Remove the default tax value
3. Try to confirm the invoice
Issue:
------
A traceback occurs:
`ZeroDivisionError: float division by zero`
Cause:
------
Since the price value is 0, the `amount_total` of the move becomes 0.
When computing the currency rate, it tries to divides by `amount_total`, resulting in a ZeroDivisionError.
Solution:
---------
Add a conditional check before division to ensure the `amount_total` is non-zero
Related enterprise PR: https://github.com/odoo/enterprise/pull/99518
opw-5247058
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#239247
Forward-Port-Of: odoo/odoo#235252Documentation and clarification updates
This update records Jaco-Tech's corporate contributor license agreement for Odoo. It clarifies that contributions from the listed contributor are covered, supporting clear legal governance for future work.
Original PR description
Corporate Contributor License Agreement for jaco-tech. This CLA covers contributions from: - Jaco Waes (@jwaes) Forward-Port-Of: odoo/odoo#239516
Project users can now see and use the Share Task action from the task menu. This restores expected access for regular project team members, making it easier to share task information without needing manager-level permissions.
Original PR description
Steps to reproduce: ------------------------- 1. Install project with demo data. 2. Go to Tasks → cog menu → observe the "Share Task" action. 3. Log in as the demo user. 4. Observe that the "Share Task" action is missing. Issue: -------- The "Share Task" action is not visible for project users. Cause: -------- After this b396f9608390ee57dda3670ccc575986f3c205be, the model changed from `portal.share` to `task.share.wizard`. The security file only grants access to project managers: https://github.com/odoo/odoo/blob/bf83a4efefedae61e06a6b29ad82e647fd673ce2/addons/project/security/ir.model.access.csv#L45 Solution: --------- Grant project users necessary access to `task.share.wizard`. opw-5342875 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The login form now keeps the Reset Password link separate from the password label. This lets website editors change the password label as expected and improves accessibility for users relying on assistive tools.
Original PR description
Before this PR, the `Reset Password` link was injected inside the password label in the login form. This prevented `inherit_branding` from applying `data-oe-*` attributes on the label, which in turn stopped the editor from making it as `contenteditable`. With this PR, the `Reset Password` link is injected `after` the label instead `inside`. This preserves the label's branding attributes, making it editable inside the editor. This change also improves accessibility, since placing interactive elements (links/buttons) inside a <label> is not recommended.
Italian e-invoicing imports now preserve vendor bill lines with a unit price of zero instead of replacing them with the product's default cost. This prevents incorrect bill amounts when suppliers legitimately send free or reverse-charge line items.
Original PR description
**Steps to reproduce:** * Install the **Italy – E-invoicing (l10n_it_edi)** module. * Create a product with a non-zero cost price. * Create a **vendor bill** for an Italian vendor using the **RC…
**Steps to reproduce:** * Install the **Italy – E-invoicing (l10n_it_edi)** module. * Create a product with a non-zero cost price. * Create a **vendor bill** for an Italian vendor using the **RC fiscal position**. * Add the product with **unit price = 0**, apply **RC tax**, and set the **Origin Document Type**. * Confirm the bill and click **Send to Tax Integration** to generate the XML in the chatter. * Upload the generated XML through **Accounting → Vendors → Bills → Upload**. **Observed behavior:** * The imported bill ignores the XML value **0.00** and uses the product's default price instead. **Cause:** * The XML’s `<PrezzoUnitario>` value is mandatory and may be **0**, but the code skipped it because `0.0` evaluates as falsy in the walrus assignment. **Fix:** * Always set the parsed `PrezzoUnitario` value (including **0.0**) on the invoice line. ref: https://fex-app.com/FatturaElettronica/FatturaElettronicaBody/DatiBeniServizi/DettaglioLinee/PrezzoUnitario opw-5322187 Forward-Port-Of: odoo/odoo#239904 Forward-Port-Of: odoo/odoo#239419
Product images in the website shop carousel now follow the merchant's auto-crop choice. When auto-crop is turned off, images are shown fully instead of being cut off, improving product presentation accuracy.
Original PR description
When the "auto-crop" option was disabled for a product's image, the image in the product carousel was still being cropped. Steps to reproduce: =================== 1. Navigate to a product page with…
When the "auto-crop" option was disabled for a product's image, the image in the product carousel was still being cropped. Steps to reproduce: =================== 1. Navigate to a product page with multiple images & enter Edit mode. 2. Change the main product image. 3. In the media dialog, Put "auto-crop" option to disabled. -> The image in the product is still cropped. Cause: ====== A CSS rule was forcing images within the product carousel (`#o-carousel-product`) to use `object-fit: cover;`. https://github.com/odoo/odoo/blob/726af8b5c0f40f2eea7a3cfa5004c56df128c248/addons/website_sale/static/src/scss/website_sale.scss#L1517 This property sizes an image to fill its container, cropping any parts that overflow the aspect ratio. This rule took precedence over the user's choice, meaning disabling "auto-crop" setting had no visible effect on the carousel image. the commit that cause the issue (see [2]) Solution: ========= apply `object-fit: contain;` when auto-crop was disabled `object-fit: contain` scales the image to fit inside the container while preserving its aspect ratio, See [1] to learn more about object-fit CSS property [1]:https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/object-fit [2]:https://github.com/odoo/odoo/commit/670b1daa2254d7600b54bae675dd673f457aa8fa#diff-e7fd12b506f935d1a853ecff44d3fedf867796ddef908e32fd15b5da672a851bR1455 opw-5359460
The accounting dashboard now excludes unrelated journal entries when users open unpaid or late invoice suggestions. This helps finance teams focus only on invoices and bills that actually need follow-up, avoiding confusion from already reconciled imported entries.
Original PR description
Error steps: - Create or import "miscellaneous" entries in a sales journal (through the FEC import e.g.) - Have at least one late or unpaid invoice in the same journal. - The journal dashboard view should display a "X Unpaid" or "X Late" suggestion -> click on it => The filtered view shows the correct unpaid or overdue invoices/bills AS WELL as the imported entries, even if the latter are fully reconciled already. Now the filters correctly filter out the entries. opw-5215997 Forward-Port-Of: odoo/odoo#239533 Forward-Port-Of: odoo/odoo#237092
This update fixes a potential error that could prevent invoices from being confirmed when specific currency and pricing settings are used. The fix adds a check to ensure invoice amounts are non-zero before currency calculations, preventing a division-by-zero error. This ensures smoother invoice processing and avoids disruptions to financial operations.
Original PR description
Steps to reproduce: -------------------- 1. Install l10n_cl and switch to the CL company 2. Create a new invoice: - Change the currency to a value different from the company currency (e.g., from CLP to USD) - Add an invoice line with a price value of 0 - Remove the default tax value 3. Try to confirm the invoice Issue: ------ A traceback occurs: `ZeroDivisionError: float division by zero` Cause: ------ Since the price value is 0, the `amount_total` of the move becomes 0. When computing the currency rate, it tries to divides by `amount_total`, resulting in a ZeroDivisionError. Solution: --------- Add a conditional check before division to ensure the `amount_total` is non-zero Related community PR: https://github.com/odoo/odoo/pull/235252 opw-5247058 Forward-Port-Of: odoo/enterprise#101695 Forward-Port-Of: odoo/enterprise#99518
This update fixes a technical error that occurred when removing IoT records in Odoo. The issue stemmed from an incomplete evaluation of a key tag, leading to a traceback. The fix ensures accurate record removal, improving system stability and reliability.
Original PR description
For an unknown reason, when removing an IoT record, Odoo was evaluating only partly an `invisible` tag. The condition was `not version or version[0] == 'W'`. When deleting, `not version` was still false, but `version` in `version[0]` was undefined, resulting in a traceback. This is fixed using `'W' in version` instead. opw-5352092
This update fixes an issue where shifts were incorrectly created for weekends and non-working days. The change ensures shifts are now automatically generated based on a resource's defined working schedule, improving planning accuracy and reducing manual effort.
Original PR description
Steps to reproduce: - Go to Planning. - Create a multi-shift for a resource for the entire week. - Shifts are created for all days, including weekends and non-working days. Issue: Shifts were created for the entire week, ignoring the resource working schedule, so weekends and non-working days were also included. Cause: Shifts were created without considering the resource’s working schedule, which led to inclusion of weekends and non-working days. Fix: Updated shift creation to align with the resource’s schedule, skipping weekends and non-working days. task-5051694
This update removes messages indicating the POS system's certification status. Currently, the POS is only certified to the LNE in version 18.0, and this change ensures that users don't see outdated certification information until a newer version is certified.
Original PR description
The POS in only certified by the LNE in version 18.0. Until such time that we receive the certification in a higher version, we will disable the certification status messages. task-5386904 Forward-Port-Of: odoo/enterprise#102028
This update fixes an issue where newly created employees were incorrectly marked as unavailable in the Planning Gantt view. The fix addresses a problem with how the system identified employee contracts, and now accurately reflects employee working periods based on their contract dates. This ensures accurate scheduling and resource allocation.
Original PR description
Steps to reproduce: - 1. Install Planning module. 2. Create a new employee without setting a contract start date. 3. Go to the Planning Gantt view by resource. Issue: - The Planning Gantt view…
Steps to reproduce:
-
1. Install Planning module.
2. Create a new employee without setting a contract start date.
3. Go to the Planning Gantt view by resource.
Issue:
-
The Planning Gantt view incorrectly grays out the entire schedule for newly created employees. It can also incorrectly gray out the initial days of a contract.
Cause:
-
1) With the introduction of `hr.version`, a version is now created for every employee by default. The logic to identify employees with a contract history was using a domain `[("employee_id", "in", ...)]`, which selects all employees, even those with no contract. This incorrectly flagged new employees as having a contract history, causing them to be marked as unavailable.
2) The view was using the computed `version.date_start` field. The computed `date_start` is calculated as the maximum of the version's creation date and the contract's start date. (e.g., contract starts Sep 1st, version created Sep 5th), the computed start date becomes Sep 5th, incorrectly graying out the period from Sep 1st to Sep 4th.
Fix:
-
1) The query that checks for an employee's contract history is now filtered by `('contract_date_start', '!=', False)`.
2) The Gantt view's working period calculation now uses the stored, `contract_date_start` and `contract_date_end` fields.
task-5058866
Forward-Port-Of: odoo/enterprise#94007This update resolves an issue where the reschedule button remained visible in projects with task dependencies disabled. The fix ensures the button is hidden when task dependencies are turned off, providing a cleaner and more intuitive user experience. This improves project management clarity.
Original PR description
Steps to reproduce: - Install the project_enterprise module. - Go to project configuration and enable task dependencies. - Open project settings and disable task dependencies. Issue: The reschedule button remains visible even when task dependencies are disabled for the project. Cause: The visibility check for the reschedule control did not consider the project’s task dependency. Fix: Hide the reschedule button when task dependencies are disabled at the project. task-5150621 Forward-Port-Of: odoo/enterprise#97088
This update fixes an issue where scanning a lot in a batch transfer incorrectly updated inventory lines. Specifically, when a subline without a lot was scanned after a related line was fully processed, the update prioritized the completed line instead of the intended subline. This change ensures that lotless lines are correctly updated during barcode scanning, maintaining accurate inventory tracking.
Original PR description
…f related line is complete ### Steps to reproduce: - In the settings enable Lots & Serials and Batch transfers - On the delivery operation types enable show reserved lots in the barcode tab - Create…
…f related line is complete ### Steps to reproduce: - In the settings enable Lots & Serials and Batch transfers - On the delivery operation types enable show reserved lots in the barcode tab - Create a storable product tracked by lots and put 10 x lot1 in stock - Create and confirm a delivery for 10 units - Create a batch transfer with your delivery - Process your transfer from the barcode app - Scan one unit of LOT1 and put in pack - Toggle sublines select the 0/9 subline without lots nor package - Scan LOT1 #### > The 1/1 LOT1 line with a pack is updated to 2/1 rather than the 0/9 ### Cause of the issue: Since e45249c2f6883d743a4e7d19e736c622e26a3d58 and 27bfb985a29e9f0abe94dec8a76bf6d08560fbc9 an override of the `_findLine` method has been introduced in `BarcodePickingBatchModel` to ensure that scanning a lot referenced by an already existing line of the batch transfer triggers an update of that line rather than an override of the lot of an other line. However, these lines should not priorities a completed line when there is line without a set lot. opw-5340865 Forward-Port-Of: odoo/enterprise#101908 Forward-Port-Of: odoo/enterprise#101611
This update resolves a technical issue that occurred when toggling the 'is scanner' setting. The problem stemmed from a change in how the system communicated with devices, and the original error handling wasn't updated. This fix ensures the keyboard scanner functionality works reliably.
Original PR description
When toggling the "is scanner" toggle, we were getting a traceback. This comes from the switch from longpolling to `iot_http`, but the error handling wasn't adapted. opw-5408986
This update fixes an issue where documents without access were incorrectly displaying 'Restricted Folder' in the kanban view. The change ensures that users without access to a document's folder see 'Restricted' instead, improving clarity and usability. This was initially a workaround for AI prompt generation but has now been corrected.
Original PR description
Bug === In documents, when we don't have access on the folder of a document, we show "Restricted Folder" in the kanban view. For AI, because we don't want to add "Restricted Folder" in the prompt when the user has no access on the folder, we skip that in the compute of the display_name when we are in sudo. But display_name are always computer in sudo, so we never show "Restricted Folder".
This update corrects a technical issue where the text displayed in the confirmation window of the mass mailing module was not included in the translation files. This meant the text wasn't available for translation into other languages, leading to a potentially inconsistent user experience. The fix ensures this text is now properly identified for translation, allowing for localization of the confirmation window.
Original PR description
Description of the issue/feature this PR addresses: The texts from the "confirm-title" attribute of a tag are missing from the POT files. Current behavior before PR: In this line there is a text (the caption of the confirmation window): https://github.com/odoo/odoo/blob/19.0/addons/mass_mailing/views/mailing_mailing_views.xml#L66 "Ready to unleash emails?" - This text is missing from the POT file. Desired behavior after PR is merged: * These texts will apeear in POT files * Someone needs to translated them * It will show up as translated texts in UI --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239328 Forward-Port-Of: odoo/odoo#239034
This update corrects a technical issue that was causing errors when processing accounts linked to companies that had been archived. The fix ensures that only active companies are considered during certain calculations, preventing the constraint error and maintaining data accuracy. This improves the stability of the accounting system.
Original PR description
When a company linked to an account is archived, it is filtered out from the `company_ids` many2many field due to the default `active=True` filter. As a result, `_read_group(groupby=['company_ids'])` groups such accounts under `False`, leading to a false-positive constraint error.
Add `('company_ids.active', '=', True)` to the domain in `_check_account_type_unique_current_year_earning` to consider only active companies.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves a bug where locking a Point of Sale (PoS) with employee login and a blackbox would sometimes cause an error. The fix ensures the system verifies an employee is selected before attempting to update the clock-in date, improving PoS stability and reliability.
Original PR description
When a PoS was configured with "login with employees" and a blackbox, locking the pos then trying to select an employee raised a traceback. The PoS was trying to update the clock in date, but the employee was undefined. This is now fixed checking whether if the employee is set.
This update fixes an issue where the Partena export file incorrectly used the active company's code when generating reports for inactive companies. The change ensures the correct Partena code is included in the file, resolving a potential reporting discrepancy. Tests have been added to verify this fix.
Original PR description
### Issue: In multicompany, when we generate the Partena export file of the 'not active' company, the partena code of the active company is inputted in the file. ### Steps to reproduce: - Install…
### Issue: In multicompany, when we generate the Partena export file of the 'not active' company, the partena code of the active company is inputted in the file. ### Steps to reproduce: - Install 'l10n_be_hr_payroll_partena' and switch to a Belgian company - Make sure the company has a "Partena Affiliation Number" - Create an employee for this company, with a "Partena code" - Create a contract for this employee, set it a running - Create a new Belgian company with a different "Partena Affiliation Number" - Activate both Belgian companies, but set the second one as active - Payroll > Reporting > Export work entries to Partena - Create a new one, populate it with the employee just created - Click "Generate Export File" ### Cause: When getting the data for the CSV file, we use `self.env.company` which is the active company. So when this company is not the one of the export record, we input the wrong code values. ### Solution: Use `self.company_id` instead of `self.env.company_id`. Also adds the test class with basic tests. opw-5345786 Forward-Port-Of: odoo/enterprise#101960 Forward-Port-Of: odoo/enterprise#101110
This update addresses an incompatibility issue between the 'Reset Password' and 'Remote Debug' buttons and Windows IoT. To ensure a seamless experience for Windows IoT users, these buttons have been hidden from the relevant records. This improves stability and usability for this specific deployment environment.
Original PR description
"Reset Password" and "Remote Debug" buttons are not compatible with Windows IoT, we then hide them on the corresponding records.