Daily updates from Odoo
Friday, December 26, 2025
23 changes · saas-19.1
New functionality added to Odoo
This update adds support for Chrome's Local Network Access (LNA) feature, simplifying connections to our Point of Sale systems and Epson printers. Previously, certificate issues prevented direct HTTP connections, but LNA now eliminates this requirement, improving reliability and ease of use. This change enhances the overall customer experience and streamlines operations.
Original PR description
*: pos_self_order, pos_epson_printer Feature: https://chromestatus.com/feature/5152728072060928 Since Chrome 142, a new feature called “Local Network Access” has been added, allowing local IPs to be contacted via HTTP without mixed content errors. This means that certificates are no longer required to contact Epson printers or the black box. Forward-Port-Of: odoo/odoo#237034 Forward-Port-Of: odoo/odoo#235702
Enhancements to existing features
This update ensures the IoT boxes automatically align with the latest database version, improving data consistency. To activate this change, existing IoT boxes require a restart. This process only updates the IoT boxes during database version changes, not through regular scheduled updates.
Original PR description
This PR adds the code which checks every midnight to see if the version of the database has changed. If so, it will update the iot box's code to align it to the database version Note: 1) the existing iot boxes will need to restart to get this cron job 2) Outside of database upgrade the code won't be upgraded with the cron Forward-Port-Of: odoo/odoo#240467 Forward-Port-Of: odoo/odoo#239049
This update adjusts how equity-unaffected accounts are calculated in reports. Previously, they included prior year balances, which is now corrected to align with standard income and expense account behavior. This ensures more accurate and consistent reporting.
Original PR description
This commit changes the computation and search of the field include_initial_balance so equity_unaffected accounts do not include the previous fiscal year's balance. With this change, equity_unaffected accounts behave like income and expense accounts in the reports. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240742
This update ensures a more reliable and predictable refresh of return data. Previously, the update range was inconsistent depending on the fiscal year, leading to potential confusion. Now, returns are refreshed with a consistent one-year past and one-year future window, providing more accurate reporting.
Original PR description
Previously, the minimum date used for the refresh period in `_try_create_returns_for_fiscal_year` was the fiscal year itself, which caused confusion. Depending on whether we were at the beginning or the end of the fiscal year, the amount of past data being updated was inconsistent. The new behavior refreshes a fixed window of one year in the past and one year in the future, making the update range predictable and consistent. task-5388423 Forward-Port-Of: odoo/enterprise#101935 Forward-Port-Of: odoo/enterprise#101484
Resolved issues and error corrections
This update fixes a reporting issue where the Expected Arrival Date wasn't displayed on DIN 5008 Purchase Order reports. The fix adds this crucial information to the report template, aligning with previous versions and confirmed requirements from internal teams. This ensures accurate reporting for DIN 5008 transactions.
Original PR description
**Steps to reproduce:** 1. Install l10n_din5008 and purchase modules. 2. Switch the Document Layout template to DIN 5008. 3. Create or open an existing Purchase Order. 4. Print the Purchase Order…
**Steps to reproduce:** 1. Install l10n_din5008 and purchase modules. 2. Switch the Document Layout template to DIN 5008. 3. Create or open an existing Purchase Order. 4. Print the Purchase Order report. **Issue:** The Expected Arrival Date does not appear on the DIN 5008 Purchase Order report. Both functional experts and PO (CHKL) confirmed that the Expected Arrival Date should appear by default on the Purchase Order report in DIN 5008. **Cause:** The date_planned (Expected Arrival) field was introduced in standard Purchase Order report in v18.0, but DIN 5008 report template was not updated accordingly **Fix:** Add the Expected Arrival information to the DIN 5008 Purchase Order template. Before: <img width="606" height="162" alt="image" src="https://github.com/user-attachments/assets/e11f5b1f-5898-4ec9-a4f2-087db5dfeced" /> After: <img width="605" height="147" alt="image" src="https://github.com/user-attachments/assets/57419d00-50c9-4508-9bfc-307c0a54dc67" /> **opw-5376176** Forward-Port-Of: odoo/odoo#239619
This update resolves an issue where the 'Select All' button in the document control panel only selected the first 40 files. Now, all selected files are correctly included when performing actions like duplication or moving to the trash. This ensures consistent and reliable functionality for managing large document sets.
Original PR description
Steps to Reproduce =================== 1. Upload more than 40+ files in a folder. (One page displays upto 40 docs) 2. Use the checkbox to select all files on the page (this selects only 40 files) 3.…
Steps to Reproduce =================== 1. Upload more than 40+ files in a folder. (One page displays upto 40 docs) 2. Use the checkbox to select all files on the page (this selects only 40 files) 3. Click the 'Select All' button in the control panel to select all 40+ files. 4. Now, try duplicating or moving them to the trash. => Only the first 40 selected files (on the single page) are considered for action, not all the selected files. Technical ========== For documents control panel action we have custom handling for selecting records and executing action. We use `model.root.selection` which only consider records in current page, case of select all records from other pages is missed here. After this PR ================== - All selected records are considered for the actions - Added custom `getResIds` method to get filtered `resIds` as per domain. Note: `getResIds` in DynamicList doesn't have custom domain feature so create our own as per use case Task-4700841 Forward-Port-Of: odoo/enterprise#101996 Forward-Port-Of: odoo/enterprise#87634
This update corrects a previous error in the Profit & Loss report's Gross Profit calculation, now accurately reflecting the impact of stock levels. Additionally, the report's layout has been simplified for better readability and user experience. This ensures more reliable financial reporting.
Original PR description
Previously, the Gross Profit calculation did not include the stock effect, which resulted in incorrect values. With this PR, the Gross Profit is now computed including the stock effect, ensuring accurate results. In addition, some UI adjustments have been made to simplify and improve the readability of the report. task-5357539 opw-5163207 master PR: https://github.com/odoo/enterprise/pull/101650 Forward-Port-Of: odoo/enterprise#101649
This update enhances security by granting necessary permissions to the account batch payment process. Previously, a restriction prevented non-HR users from accessing employee address information, now addressed by using 'sudo' to ensure proper functionality. This change improves data access and avoids potential issues.
Original PR description
In commit a6ed1bd, new logic for handling employee addresses was introduced. However, the _get_all_addr function requires employee_ids, which implicitly requires access to the Employees model and, therefore, be in HR groups. During the compute process, _get_all_addr is only used to check whether an employee has an address; no address data is exposed. To fix this issue, the call to _get_all_addr should be executed with sudo(). OPW-5428523 Forward-Port-Of: odoo/enterprise#102851
This update allows users to easily copy and paste error messages from the Point of Sale interface. Previously, users couldn't copy these messages, making it difficult to report issues or troubleshoot problems. This change improves usability and support efficiency.
Original PR description
Before this commit, it was not possible to select and copy text from the error popup shown in the POS interface. This limitation hindered users from easily copying error messages for reporting or troubleshooting purposes. task-id: 5411067 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240570
This update fixes an issue preventing payment lines from being printed on Italian POS receipts. The problem was due to a technical error in the system's configuration, which is now resolved. This ensures that all payment information is accurately reflected on the printed receipts for Italian businesses.
Original PR description
Currently payment lines are not sent to the italian printer. Steps to reproduce: ------------------- * Install l10n_it_pos * Switch to italian company * Set up italian printer for a shop * Make an order and pay it * Print italian receipt > Observation: no matter the payment used it is not sent to the italian printer Why the fix: ------------ This condition is currently always true: https://github.com/odoo/enterprise/blob/41e9fcd162cd51f93c98a0f0f6922d5faaf8914d/l10n_it_pos/static/src/app/documents/fiscal_document/body/body.xml#L27-L29 because `this.priceIncl` is always undefined. Therefore we would never use the payment lines: https://github.com/odoo/enterprise/blob/41e9fcd162cd51f93c98a0f0f6922d5faaf8914d/l10n_it_pos/static/src/app/documents/fiscal_document/body/body.xml#L30-L36 opw-5428027 Forward-Port-Of: odoo/enterprise#102793
This update addresses a technical error that prevented some USB printer devices from working correctly within Odoo. The fix handles a device incompatibility issue, ensuring broader printer support and preventing disruptions to printing workflows. This improves the reliability of the IoT drivers.
Original PR description
This PR fixes the exception thrown by the usb devices incompatible with escpos code.
It fixes the following exception:
```
2025-12-22 14:49:59,724 1433 ERROR ? odoo.addons.iot_drivers.exception_logger: File "/home/pi/odoo/addons/iot_drivers/iot_ha
ndlers/drivers/printer_driver_L.py", line 42, in init
self._init_escpos(device)
2025-12-22 14:49:59,724 1433 ERROR ? odoo.addons.iot_drivers.exception_logger: ValueError: The device has no langid (permission issue, no string descriptors supported or device error)
```
Forward-Port-Of: odoo/odoo#240976This update fixes an issue where the survey session link copy button wasn't working correctly, displaying 'Copied!' without actually copying the link. Additionally, repeated clicks on the button caused a system error. The fix ensures the link is reliably copied and prevents errors related to the session management component.
Original PR description
Issue 1: Steps to reproduce =============== 1. Go to the survey. 2. Create a live session for any survey. 3. On the session screen, click the copy button after the url. ------> Popover will show…
Issue 1: Steps to reproduce =============== 1. Go to the survey. 2. Create a live session for any survey. 3. On the session screen, click the copy button after the url. ------> Popover will show `Copied!` but nothing is copied. Issue 2: Steps to reproduce ================ 1, 2: same as issue 1. 3. Click the copy button 2,3 times. 4. Click the button start survey. ------> TypeError: Cannot read properties of null (reading 'closest') Technical ======== Issue 1: The event listener callback `onCopySessionLink` was using `event.target.textContent` to insert into clipboard of the browser. As the event.target is icon with no text content, the empty string is _copied_. Issue 2: At each click of the copy button, we register cleanup to dispose the _same_ instance of `window.Popover` component. Therefore more than one click will register the cleanup each time. While cleaning, the second cleanup will actually dispose the already disposed instance raising an error at this [line] because the instance has `this._element` null. This commit makes the `onCopySessionLink` to copy the text of the element with the url and makes sure the cleanup is registered only once. [line]: https://github.com/odoo/odoo/blob/058212e12b5079eba870bde9775fe98f27928935/addons/web/static/lib/bootstrap/js/dist/tooltip.js#L173 Task-5347197r Forward-Port-Of: odoo/odoo#239621
This update fixes an error in how VAT is calculated for transactions using Reverse Charge taxes, particularly when combined with non-deductible tax configurations. Previously, the output VAT was incorrectly reduced. Now, the full VAT amount (21%) is correctly declared as due, aligning with standard accounting practices for Reverse Charge scenarios.
Original PR description
When combining a Reverse Charge tax (e.g., Intra-Community Acquisition) with a Non-Deductible tax configuration (e.g., 60% Professional Use), the resulting accounting entry for the VAT Payable…
When combining a Reverse Charge tax (e.g., Intra-Community Acquisition) with a Non-Deductible tax configuration (e.g., 60% Professional Use), the resulting accounting entry for the VAT Payable (Output Tax) was incorrect. Steps to reproduce: 1. Create a Vendor Bill. 2. Use a Tax configured as both Reverse Charge (e.g., 21%) and partially Non-Deductible (e.g., 40% non-deductible). 3. Set the price to 100.00. Observed behavior: - VAT Deductible (Input): 12.60 (Correct: 60% of 21). - Non-Deductible Expense: 8.40 (Correct: 40% of 21). - VAT Payable (Output): 12.60 (Incorrect: it was reduced by the non-deductible part). Expected behavior: - VAT Payable (Output) should be 21.00. In a Reverse Charge mechanism, the full tax amount must be declared as due, regardless of the deductibility on the input side. Solution: Post process the taxes_data in case of professional with reverse-charge so wie will have the Payable part with the hole amount 21 in the previous example task-5418096 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240955
This update adjusts financial reports for Mexico to correctly handle initial balances when the 'include_initial_balance' setting is disabled. It also simplifies the process of customizing how undistributed lines are handled, making future adjustments easier. This ensures more accurate reporting for Mexican businesses using Odoo Enterprise.
Original PR description
Following the changes introduced in odoo#240742 and in enterprise#95062, this commit adapts the l10n_mx_reports_closing tests, as the equity_unaffected account amounts change if include_initial_balance = False. This commit also moves the domain logic for the Undistributed Line to a dedicated function, making it simpler to customize this behavior if needed. no-task Forward-Port-Of: odoo/enterprise#102549
This update resolves a technical issue causing tracebacks when managing overtime rulesets, specifically related to employee leave and attendance. It also significantly improves the performance of generating overtime attendance lines, ensuring smoother and more reliable attendance tracking for employees.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240019
This update enhances the accuracy and speed of calculating overtime hours within the attendance system. The changes address previous testing issues and optimize the generation of overtime lines, ensuring more reliable and efficient payroll processing. This improves the overall user experience for employees and HR staff.
Original PR description
Forward-Port-Of: odoo/enterprise#102125
This update fixes an issue where the displayed price in the Point of Sale system was showing the total price instead of the unit price. The fix ensures that the correct unit price is shown, improving accuracy and clarity for users. This resolves a display discrepancy related to currency calculations.
Original PR description
Steps to reproduce ------------------ 1. Insall `l10n_fr_pos_cert` and set the company to the french one 2. Open PoS, and select a product, it will have a price say X 3. Using the numpad, change the price of that product to Y Observe that the line now says "Old price unit: Y * Qty / Unit", instead of it being "X / Unit". Why it's happening: ------------------- We were displaying the `currencyDisplayPrice`, which is the total amount to be paid, instead. The fix ------- We add a getter on the product model `displayPriceUnit`, it shows the original product unit price. We therefore introduce a new getter that compute the unit price using the original lst price. opw-5365735 opw-5378158 Forward-Port-Of: odoo/odoo#238135
This update resolves an issue where the cursor disappeared when using the VoIP softphone on a mobile device. The fix restores the cursor's functionality and prevents the mobile keyboard from appearing unexpectedly, ensuring a smooth user experience for making calls.
Original PR description
Steps to reproduce: - Open the VoIP softphone on a mobile device - Enter a number - Place the cursor in the middle of the number - Tap on the *odoo* backspace button => The character before the…
Steps to reproduce:
- Open the VoIP softphone on a mobile device
- Enter a number
- Place the cursor in the middle of the number
- Tap on the *odoo* backspace button
=> The character before the cursor is removed but then the cursor jumps
to the end of the input.
Note: this also happens when trying to add a number in the middle of
the typed number, using the softphone buttons, but this message focuses
the explanation on the backspace button.
Commit [1] introduced the bug while revamping VoIP and its keypad.
Before that commit, there was a simple `t-on-click` defined on that
backspace button. After the update, that `t-on-click` is still there but
alongside a weird `t-on-touchend.prevent="(ev) => ev.target.click()"`,
which is actually there to prevent zoom-in behavior on double-tap,
although, retesting it does not seem necessary (at least on Android).
In any case, this is the original cause of the bug.
Since [2], the keypad input is using the mail's `useSelection` hook,
which, among other things, manages what happens on click outside of the
input. Before [1], this happened when clicking on the backspace button:
1. The click is handled during its *capture* phase by the `useSelection`
hook. It checks if clicked location should be considered, the answer
is yes.
2. The next part of the handler is done in the next microtask (as the
check is done asynchronously (?? that looks like a bad idea, but
that's another issue)).
3. That "in the next microtask" part occurs before the event starts
bubbling: the capture handler saves the cursor position as being at
the end of the input (?? not sure why, but that's another issue).
4. The click is handled during its *bubbling* phase by the backspace
button's `t-on-click`, which removes the character before the cursor,
and sets the cursor position accordingly for the `useSelection` hook.
The actual cursor position is untouched since [3] on mobile "because
otherwise it would open the mobile keyboard", but there are other
ways that would have prevented that I think... to confirm later for
master via task-5366961 (this actually causes issues in HOOT tests
but that's another issue).
5. The dialer/numpad component handles the input's focus/cursor. For
that, it forces a focus and ask the `useSelection` hook to "restore
the selection", which "restores" it to what step (4) asked.
After [1], this changed to:
1'. Same as step (1)
2'. Same as step (2)
3'. As the click was simulated instead of being the "natural" one
triggered by the browser touchend handling, the `t-on-click` handler
is called now, before the "in the next microtask" part of the
capture handler is done. That means what step (4) did happens now.
4'. Now what step (3) did happens now.
5'. Same as step (5)... but since step (3) and (4) were basically
swapped, the cursor is now restored as the way it was last saved:
at the end of the input (again don't know why step the
`useSelection` hook would want to save it like that though).
There are multiple solutions to fix this:
A. Remove the `t-on-touchend` handler, letting the browser do what it
naturally does. Although, it might be needed to prevent the mentioned
zoom behaviors on some phones?
B. Review why the `useSelection` hook wants to save the cursor at the
end of the input on external click, the point is valid but I am not
sure that should be this hook's job to enforce it.
C. Review why the `useSelection` hook wants to check if the click has to
be considered asynchronously, there should be a better way.
D. Configure the `useSelection` hook to consider a click on the
backspace button as to be ignored, as handled manually by its own
handlers anyway.
Option (A) should probably be done, by confirming zoom behaviors can be
prevented another way, but it cannot be done in stable anyway. The (B)
and (C) options should be investigated but would also not be stable to
change; also that would modify an exposed hook's behavior so more risky.
Option (D) can probably be done either way and is targeted on fixing the
bug described only, so this is the solution this commit went for.
In master, option (A) will be investigated in the forward-ported version
of this fix.
However... the bug was actually solved 3 months after [1], at [4] thanks
to secret option (E): not removing the `t-on-touchend` but changing it
entirely to call the same handler as the `t-on-click` one. A bit more
stable than option (A) but still not stable.
However... that solution (E) was broken 1 month later, again, by commit
[5] which destroyed step (5) while fixing an unrelated bug. Without that
step, the input cursor is not repositioned after OWL changes the value,
and by default OWL places it back at the end.
The solution is to restore step (5): the problem was that we were
checking if the user was not typing in another input before re-focusing
the keypad input... but the code considered the keypad input itself as
"another input". This commit still adds solution (D) on top of fixing
that, for good measures.
Note that in 19.0+, there is at least another cursor-related bugs,
related to commit [6]. It will be fixed in the forward-port of this one
as they need each other's fix to both work. Really there should be
better ways to handle that cursor position in OWL... might be done in a
future refactoring.
This commit adds a test to hopefully keep the bug fixed, as inspired by
commit [7].
[1]: https://github.com/odoo/enterprise/commit/52b3065993c41c6b7c65dda586a66fdd865b3afd
[2]: https://github.com/odoo/enterprise/commit/2e8f18801156a8069e26fb3d61d4f8d84893e891
[3]: https://github.com/odoo/odoo/commit/adc5448adf863b99b9b2be29985e560f5c12dbd4
[4]: https://github.com/odoo/enterprise/commit/668467678312632b5b9ecf234280690151bf3078
[5]: https://github.com/odoo/enterprise/commit/db82135fd73d5077fc26be7206105192a845c2bc
[6]: https://github.com/odoo/enterprise/commit/a06c02e8e163ed052c1c4d25a56bea9b6409abde
[7]: https://github.com/odoo/enterprise/commit/613ef7332b0d21e947871e9d33b68d069f1412c2
Related to task-5366961
Forward-Port-Of: odoo/enterprise#102728
Forward-Port-Of: odoo/enterprise#101856This update prevents Point of Sale from loading all invoice records to the client, which was causing performance slowdowns in databases with many invoices. This change improves the speed and responsiveness of the Point of Sale module, leading to a better user experience.
Original PR description
Before this commit, when loading the PoS all of the account.move records were loaded to the client side, which could lead to performance issues in databases with a large number of invoices. opw-5409082 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240222
This update resolves an error that occurred when creating invoices with journal items that lacked labels. The fix ensures the code handles missing label values gracefully, preventing a traceback and allowing invoices to be validated correctly. This improves invoice processing reliability.
Original PR description
Creating an invoice containing journal items without a label triggers a traceback because the code unconditionally slices the 'name' field (line.name[:64]) without ensuring it is not False. Since 'name' is not a required field on account.move.line, it must be safely handled.
This commit ensures that the label is always a string by falling back to an empty string when the value is missing.
Steps to reproduce the bug:
- Create a storable product
- Create an invoice:
- Add the product to the invoice
- Set any customer
- Go to the journal items tab
- Remove the label of the journal item corresponding to the product
- Try to validate the invoice
- A traceback is raised
opw-5360602
Forward-Port-Of: odoo/odoo#240150
Forward-Port-Of: odoo/odoo#239188This update fixes an issue where the standard product price wasn't correctly reflecting the exchange rate at the time of receipt validation. Previously, the system used the purchase order date instead, leading to inaccurate currency conversions. Now, the system uses the validation date for currency conversion, ensuring accurate pricing and stock valuation.
Original PR description
Steps to reproduce:
- Go to Accounting / Configuration / Accounting / Currencies
- Enable EUR
- Add two rates:
- Date: December 15 → 1 EUR = 1 USD
- Date: December 23 → 1 EUR = 2 USD
- Create a storable product "P1"
- Costing method: AVCO
- Create a Purchase Order:
- Vendor: any
- Currency: EUR
- Product: 1 unit of P1 at 10 EUR
- Order Deadline / Expected Arrival: December 15
- Confirm the PO
- Validate the receipt on December 23
Problem:
The product standard price is computed as 10 USD instead of 20 USD.
The stock move value is computed using the purchase order date instead of the stock move validation date, causing the currency conversion to use an outdated exchange rate.
Solution:
Use the stock move validation date when converting the purchase price to the company currency.
opw-5402545
Forward-Port-Of: odoo/odoo#241127This update resolves a potential error in the Point of Sale system that could occur when reloading data. Specifically, if certain records were inaccessible due to security restrictions, it would trigger an error. This change prevents these errors, ensuring a smoother and more reliable Point of Sale experience for users.
Original PR description
Before this commit, when reloading the PoS, during the filtering of local data, if some records to be filtered were inaccessible due to record rules, an AccessError was raised. opw-5394929 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#239028
This update now displays the full list of industry modules (available through Apps > Industries) instead of a limited selection of 80. The change removes a technical restriction that previously prevented users from seeing all available industry modules, improving navigation and usability.
Original PR description
Before this commit, when displaying the list of industry modules (from Apps > Industries), it is not possible to display more than 80 modules. This is because the override of web_search_read is not handling the full count of modules, as it was relying on the number of modules returned from the appstore, ignoring there is a limit (80 by default). This commit removes the limit on the query to appstore so that all modules are retrieved, allowing the users to navigate through all modules. This solution is acceptable since the number of industry modules is rather limited for now (around 100). Forward-Port-Of: odoo/odoo#241147