Daily updates from Odoo
Tuesday, January 27, 2026
184 changes
29 changes
Resolved issues and error corrections
A bug was causing a multi-company error when generating offers for new applicants in the recruitment process. This fix created a specific demo data record for the 'Experienced Developer' role in Belgium, resolving the issue and ensuring correct offer generation for Belgian users. This was a backport of a previous task.
Original PR description
## Issue: When we go to recruitment and try to generate offer for a new applicant for job position 'Experienced Developer', it shows multi company error. ## Steps to reproduce: 1. Go to recruitment for US company 2. Make a new applicant for the position 'Experienced Developer'. 3. Then generate offer for that applicant, multi company error will come. ## Cause: The job was inherited and given `contract_template_id`. ## Fix: Made a new record for Belgium Job position 'Experienced Devloper(BE)'. backport of task-4885755 task-5445798 Forward-Port-Of: odoo/enterprise#104013 Forward-Port-Of: odoo/enterprise#102991
This update resolves an issue where country-based filtering within work entries wasn't functioning correctly, leading to errors. The fix ensures accurate country filtering, eliminating module loader errors and improving the usability of this feature.
Original PR description
Issue: The country_id related field on work entries was not stored, causing domain filters and search on this field to fail and triggering client-side errors. Fix: Use search parameter on field to write function so field can be used safely in search domains and filters. Impact: Country-based filtering now works correctly without triggering module loader errors. Task: 5406904 Forward-Port-Of: odoo/odoo#243564 Forward-Port-Of: odoo/odoo#239573
This update resolves an issue where country-based filtering on payslips and payslip runs wasn't functioning properly, leading to errors. The fix ensures accurate country filtering, preventing module loading problems and improving the reliability of payroll reporting.
Original PR description
Issue: The country_id related field on payslip and payslip run was not stored, causing domain filters and search on this field to fail and triggering client-side errors. Fix: Use search parameter to write function so field can be used safely in search domains and filters. Impact: Country-based filtering now works correctly without triggering module loader errors. Task: 5406904 Forward-Port-Of: odoo/enterprise#104167 Forward-Port-Of: odoo/enterprise#103318
This update adds a 'View' button to the package history list, allowing users to directly access the associated package records. Previously, users couldn't open these records from the package history, which has now been resolved to improve tracking and management of stock packages. This enhancement streamlines the process of reviewing package details.
Original PR description
Steps to reproduce: - Enable packages - Do a reception with a product and put it in a pack - Open the 'Packages' stat button - View button is at the end of every line, to open the package - Go back to the picking and validate it - Open the 'Packages' stat button again Issue: There isn't any 'View' button, so we can't open the package records from here. It was done somewhat on purpose, as it's a list of `stock.package.history` and not `stock.package`, so we wouldn't open the right record. But we can simply add a button that opens the linked package instead. opw-5436847 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245238
This update ensures that employee leave dates are automatically recalculated when their working schedule (calendar) changes. Previously, changes to an employee's schedule didn't correctly update their leave entitlements. This fix maintains accurate leave tracking for employees with dynamic work calendars.
Original PR description
purpose: Accepted leaves should be recomputed upon working schedule change. - made the `resource_calendar_id` change on the leave when it's changed on the corresponding employee/contract, then forced recomputation of its dates from the new resource calendar task-id: 5424312 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243425 Forward-Port-Of: odoo/odoo#241284
This update resolves a bug that prevented the Gantt chart from correctly rescheduling tasks when using Date fields instead of DateTime fields. The fix ensures that the Gantt chart can now handle rescheduling tasks with Date fields, improving usability and flexibility for project management. This was caused by a previous limitation in the system.
Original PR description
…atetime
Steps to reproduce
==================
- Install web_studio,project
- Open a project task
- Open studio
- Add a new Date field in the form view
- Switch to the gantt view
- Change the Start Date Field to the newly create Date field
- Exit studio
- Open a task
- Set a value for the date field
- Switch to the gantt view
- Drag the record
```
start_date_field_name in vals and datetime.strptime(vals[start_date_field_name], '%Y-%m-%d %H:%M:%S')
^^^^^^^^
ValueError: time data '2025-12-22' does not match format '%Y-%m-%d
```
Cause of the issue
==================
Since https://github.com/odoo/enterprise/pull/84820 , it only works for DateTime fields
opw-5345470
Forward-Port-Of: odoo/enterprise#103068This update resolves an issue where image selections in the website builder were not consistently updating across related components. The fix ensures that the correct image element is always used when processing snippets, resulting in a more reliable and accurate website design experience. This improves the overall user experience when adding images to the website.
Original PR description
[FIX] html-builder, *: update snippet at each snippet dropped handler *: website In the `ImageSnippetOptionPlugin`, at the `on_snippet_dropped_handlers` call, the `snippetEl` received as argument is replaced by the image selected by the user in the media dialog. The problem is that the call to subsequent handlers is done with `snippetEl` that is not an element of the DOM anymore. This commit fixes this by updating `snippetEl` if needed after each call to a `on_snippet_dropped_handlers` handler. task-5785233 Forward-Port-Of: odoo/odoo#245594 Forward-Port-Of: odoo/odoo#243766
This update fixes a critical accounting error related to Deferred GST (DGST) reporting in Australia. By reversing the tax rate, the system now correctly identifies DGST as a liability, ensuring accurate financial reporting. The changes also improve the display of BAS statements and add support for a key reporting line.
Original PR description
Prior to this commit, the Deferred GST (DGST) tax was configured with a positive rate. When applied to a Vendor Bill, this generated a Debit entry, incorrectly treating the tax as a Receivable rather…
Prior to this commit, the Deferred GST (DGST) tax was configured with a positive rate. When applied to a Vendor Bill, this generated a Debit entry, incorrectly treating the tax as a Receivable rather than a Liability to the ATO. This commit corrects the accounting and reporting logic by: - Inverting the tax rate: The tax now generates a Credit entry on Vendor Bills, correctly recording the Deferred GST as a liability in the General Ledger. - Adjusting BAS formulas: Updated the formulas for labels 7 and 7A to display a positive liability amount on the statement following the change in 1. - Adding Label 7A: Added support for the Deferred GST (7A) line to BAS variations where it was missing. - Reordering WET: Updated the Wine Equalisation Tax (WET) sequence so it no longer appears at the top of the list, as it is not applicable to all businesses. Task-5870092 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245368
This update resolves an issue where negative lines on invoices generated for Ecuador (l10n_ec) were not correctly formatted in the XML export. The change aligns the process with Mexico (l10n_mx) to accurately distribute discounts and avoid rounding discrepancies, ensuring accurate tax calculations and invoice generation.
Original PR description
In **l10n_ec**, negative lines are not accepted in the XML. They must be dispatched as discounts on positive lines. The dispatching logic implemented in `60e1b41734f76a2d9268edc41286462a9d01a501` can…
In **l10n_ec**, negative lines are not accepted in the XML. They must be dispatched as discounts on positive lines. The dispatching logic implemented in `60e1b41734f76a2d9268edc41286462a9d01a501` can cause rounding issues when the decimal accuracy for `price_unit` is increased. ## Steps to reproduce With **l10n_ec**: 1. Change the decimal accuracy to 6 digits. 2. Set the rounding method to *global rounding*. 3. Create an invoice with the following lines: | Quantity | Price | Taxes | |-----------|----------|-----------| | 20 | 1.4235 | VAT 0% G | | 20 | 1.6425 | VAT 0% G | | 20 | 1.2337 | VAT 0% G | | 20 | 1.2337 | VAT 0% G | | 20 | 1.4235 | VAT 0% G | | 6 | 3.747768 | VAT 15% G | | 6 | 3.747768 | VAT 15% G | In the generated XML, some product lines show a `descuento` of `0.01` or `-0.01`. This happens due to rounding differences in how the `descuento` is computed in the `common_details_info_template` from **l10n_ec_edi**: format_num_2(line_edi_values['price_discount'] + abs(line.balance) - line_items[1]['base_amount']) where `line.balance` and `line_items[1]['base_amount']` can differ by 0.01 due to global rounding applied during tax aggregation, and that difference must be redistributed somewhere. This commit changes how negative lines are dispatched onto positive ones, aligning the behavior with **l10n_mx**. Instead of using `tax_details_per_record` to build the XML, we now use `base_lines`, where the negative lines have already been distributed. opw-5128612 Forward-Port-Of: odoo/enterprise#104659 Forward-Port-Of: odoo/enterprise#97337
A bug was preventing manufacturing administrators from completing work orders. This update adds sudo access to the failing process, ensuring these users can correctly finalize production tasks. This resolves a workflow issue and improves the usability of the manufacturing module for key personnel.
Original PR description
Steps to reproduce:
Create a user with admin access rights for Manufacturing and Quality only. Then, create a work center that has a cost per hour.
Create a product that has a BoM and create a MO then confirm it.
Add a work order that takes place in the created work center and has duration of 60 mins.
Using the created user, try to "Produce All".
Issue:
The user gets an access error when trying to "Produce All", eventhough they have manufacturing access rights.
Fix:
Add sudo access where the process fails to ensure that the workflow is as expected.
Note: a test will be added in anoher PR
opw-5480608
Forward-Port-Of: odoo/enterprise#104897This update fixes a bug where the sitemap generated for eCommerce categories included products that were marked as archived. The system now correctly filters out categories containing only archived products, ensuring the sitemap accurately reflects the live, active products available for sale. This improves the accuracy of our website's sitemap and helps search engines prioritize the correct products.
Original PR description
To reproduce:
- Connect as "admin"
- Go to "Website / eCommerce / Products / eCommerce Category"
- Create a new category "Test With Archived Products"
- Go to "Website / eCommerce / Products"
- Create a product:
- name it "Test Archived"
- in "Sales" tab, under "eCommerce Shop" section, set category to:
"Test With Archived Products"
- then archive the product
- Clear the sitemap attachment and go to /sitemap.xml
The sitemap has an entry for "Test With Archived Products" but it should should not be visible as there are only archived products for that category.
Since odoo/odoo@d3fd767b0568, access rules domain are always optimized with `active_test=False`, so ensure we only return public category that have active products.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#236256This update ensures the Helpdesk dashboard's styling is consistent with other Odoo dashboards. Specifically, the conditional formatting for the Top Customers pivot has been extended to include all rows, and border styles have been aligned. This improves the overall visual appearance and user experience.
Original PR description
## Description - The Top Customers pivot shows 10 rows, but the conditional format covered only 9. Extend the CF range so the last row is formatted. - Adjust border ranges so the helpdesk dashboard matches the styling used in other dashboards. Task: [5448434](https://www.odoo.com/odoo/project/2328/tasks/5448434) Forward-Port-Of: odoo/enterprise#103793 Forward-Port-Of: odoo/enterprise#103019
This update fixes an issue where pricelist rules weren't correctly applied to product variants. Previously, rules only worked when editing in 'expanded' mode and would reset the display name. Now, when a variant is selected, the pricelist rule is properly applied, ensuring accurate pricing in sales quotations. This improves the reliability of pricing calculations.
Original PR description
Description of the issue/feature this PR addresses: - A pricelist rule never apply to a product variant, always its template when edited in "expanded" mode - This is because the `applied_on` field is…
Description of the issue/feature this PR addresses: - A pricelist rule never apply to a product variant, always its template when edited in "expanded" mode - This is because the `applied_on` field is missing on the `product.pricelist.item` form view. Current behavior before PR: - Install `sale_management` - Enable "Pricelist" setting - Go to Sales - Products - Pricelists and create a new "Sample" Pricelist. - Create 3 rules for the same product (template), one with price at 6666, a second one at 6667 and the last one at 3333 <img width="1416" height="649" alt="image" src="https://github.com/user-attachments/assets/1d50499e-cb49-4341-971c-5a2a5111b9ca" /> - Next step, edit 2 first rules for price 6666 and 6667 to set a variant **BUT before starting editing, open the form in expanded mode using two-arrows button** <img width="1416" height="889" alt="image" src="https://github.com/user-attachments/assets/056cb862-3dc6-4868-b6d3-a0917f3e7242" /> - Set the variant to the first price rule (as you can see, the rule name is immediately updated with "Variant: [REF] Product name" <img width="1421" height="428" alt="image" src="https://github.com/user-attachments/assets/168ad5fb-902b-494f-888a-419983324607" /> - Save the price rule (_note that the display name incorrectly resets to default_) <img width="634" height="370" alt="image" src="https://github.com/user-attachments/assets/ec915985-b1a3-4a69-9153-7384abdb190d" /> - Same thing for second rule <img width="695" height="375" alt="image" src="https://github.com/user-attachments/assets/69b9ae62-493c-4f0e-ae87-438975e1bceb" /> <img width="621" height="369" alt="image" src="https://github.com/user-attachments/assets/e1dc0342-7b87-42df-bf7d-6a3aace61253" /> - Create a new sale quotation with pricelist set to our "Sample" - Add product [6666] <img width="1207" height="420" alt="image" src="https://github.com/user-attachments/assets/07d4fb94-03b3-45ae-aeb4-feca4fee9c2c" /> - Add product [6667] <img width="1209" height="431" alt="image" src="https://github.com/user-attachments/assets/03e3a76a-2bb1-44e9-a819-ce3ca35703c7" /> - Incorrect prices in sale order <img width="1415" height="828" alt="image" src="https://github.com/user-attachments/assets/3626028d-31d0-4687-b09d-094c0212042a" /> Desired behavior after PR is merged: - Each variant must have its own price. - The added test simply edit the pricelist item using its own form. - The `applied_on` field is added to the pricelist item form to ensure that its value is saved. - If we edit the rule without expanded mode, it works fine only because the `applied_on` field exists in the list view as an invisible column. _Note 1_: `applied_on` is updated by `_onchange_rule_content` using `update` instead of `write` (for caching ?). But if the `applied_on` field is not on the form, then its value is never sent to low level `_write_multi`. _Note 2_: to clear the field value with the Form test component, we must set `=self.env["product.product"]` instead of `=False` .... --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245603 Forward-Port-Of: odoo/odoo#245444
This update resolves a minor rounding discrepancy in the calculation of withholding taxes for AR transactions. Specifically, the withholding amount was slightly off, resulting in a difference of 0.01. The fix ensures accurate tax calculations for purchases, improving financial reporting precision.
Original PR description
Steps to reproduce: - Set company to (AR) Responsable Inscripto - In Accounting > Settings, choose Round per Tax as the rounding method. - Go to Accounting > Taxes, duplicate IIBB WTH CABA 0%, and set Amount to 4.5%. - Open partner ADHOC SA, in the accounting tab add the new tax in Purchase Withholding - Create a new vendor Bill to vendor ADHOC SA with unit price 156,087.00 - Confirm and open Payment wizard Issue: Withholding amount is 7023.91, but it should be 7023.92 It occurs that the computed amount is 7023.915. Then when the tax repartition values are computed, the value is rounded and rounding difference are redistributed in the tax lines, so it seems the value has been rounded down. opw-5154585 Forward-Port-Of: odoo/odoo#241633
This update resolves a problem where the VoIP demo tour wasn't functioning correctly with the standard demo data. The code was adjusted to ensure the correct contact and activity are selected during the tour, and the tour file was moved to the appropriate location for better organization.
Original PR description
Make sure we select correct contact/activity when with demo data. Also move the tour to correct file.
This update resolves a potential error that could occur during the uninstallation process when an `ir.model.data` record has a zero `res_id`. The fix adds a filter to ensure only valid record IDs are processed, preventing a traceback and ensuring smoother uninstallation workflows. This improves stability and reliability.
Original PR description
linked to https://github.com/odoo/odoo/pull/245469, there is another case in the uninstallation flow that can raises a traceback in case of a `ir.model.data` where `res_id = 0` This commit adds an…
linked to https://github.com/odoo/odoo/pull/245469, there is another case in the uninstallation flow that can raises a traceback in case of a `ir.model.data` where `res_id = 0`
This commit adds an additional filter to the domain used to browse `ir.model.data` in `_module_data_uninstall` in order to avoid selecting any that would contain a falsy `res_id` and thus cause the above-mentioned assertion to fail.
One way to reproduce this in a new trial:
- Create a new trial with several modules: `account`, `crm`, `project`, `sales`
- Install `web_studio`
- Uninstall `base_automation`
- Traceback
```
File “/home/odoo/src/odoo/saas-19.1/odoo/orm/models.py”, line 5200, in browse
assert all(ids) or all(isinstance(x, NewId) or x for x in ids), “Invalid falsy real id”
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Invalid falsy real id
```
This is due to an `ir.model.data` containing a falsy res_id in the internal code of `saas_trial` (`installed-17`)
This fix will avoid any additional traceback like this one.
opw-5865316This update resolves a technical issue causing performance problems in the Mail app. Previously, field updates across tabs were creating a loop, leading to slow performance and potential system freezes. This fix prevents unnecessary updates to local storage, ensuring smoother and more reliable field synchronization.
Original PR description
Diccuss fields have a `localStorage` option. The field updates via the `onUpdate` function in the current tab and writes to the local storage. Other tabs use the `storage` event to update their field. This pattern can cause race conditions, leading to loops, high CPU usage, and freezes. When a tab receives a storage event, it may write back an outdated value, triggering further writes and conflicts across tabs. This commit ensures we don't trigger `storage` events recursively: upon the reception of a `storage` event, field is updated but local storage is untouched. 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
This update fixes an issue where new partners, particularly those in EU countries, were incorrectly assigned a specific pricelist. Previously, all partners received a default pricelist, even when it matched the standard one. This change ensures that EU partners automatically use the standard pricelist, simplifying pricing and eliminating manual assignments.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a way to check the `specific_property_product_pricelist` field; 2. create a pricelist for EU countries; 3. delete all other regional pricelists; 4.…
Versions -------- - 18.0+ Steps ----- 1. Have a way to check the `specific_property_product_pricelist` field; 2. create a pricelist for EU countries; 3. delete all other regional pricelists; 4. create a new partner in a EU country; 5. create a new partner outside a EU country; 6. create a new partner without a country. Issue ----- Inconsistent behavior: - EU partner has no `specific_property_product_pricelist` value set, as it's identical to the default `property_product_pricelist`. - The other partners do have a `specific_property_product_pricelist` value set to the default value, as if a user manually assigned them. Cause ----- In the `_inverse_product_pricelist` method, the `default_for_country` pricelist is an empty recordset if the partner has no `country_id` or none of the pricelists have a country groups with the partner's `country_id` in it. Solution -------- Introduce a `_get_country_pricelist_multi` method that can be used by `_get_partner_pricelist_multi` and `_inverse_product_pricelist` to ensure that they both return the same result for any given country (including none), and use this as the `default_for_country`. > [!Note] > An alternative approach could be to replace the `_inverse_product_pricelist` method with an `onchange` method, as the docstring of the `_get_partner_pricelist_multi` method states: >> First, the pricelist of the specific property (res_id set), this one is created when saving a pricelist on the partner form view. > > This suggests a behavior that more closely resembles the purpose of an `onchange` method, instead of an `inverse`. opw-5385213 Enterprise PR: https://github.com/odoo/enterprise/pull/103116 (only modifies a test) Forward-Port-Of: odoo/odoo#245681 Forward-Port-Of: odoo/odoo#241736
This update corrects a discrepancy in a sales subscription test. The test previously incorrectly prioritized pricelists based on default partner settings. The fix ensures consistent pricelist ordering, resolving a minor issue that could have affected subscription pricing calculations. This change improves test reliability.
Original PR description
Versions -------- - 18.0+ Issue ----- Commit a840e4250666 changed a `sale_subscription` test as pricelist ordering was changed. Before, it was `sequence asc, id desc`, now it is `sequence asc, id asc`. However, in the updated tests, it expects the first pricelist created with sequence 4 to be before the second pricelist with sequence 2. This was only happening due to default pricelists getting set as the `specific_property_product_pricelist` if the partner has no country assigned to them. Solution -------- As the behavior is now identical for partners with or without a country assigned to them, we can resolved the test setup by giving both pricelists an identical sequence, making the ordering fall back on `id` like a840e4250666 intended. opw-5385213 Related: https://github.com/odoo/odoo/pull/241736 Forward-Port-Of: odoo/enterprise#105475 Forward-Port-Of: odoo/enterprise#103116
This update fixes a technical detail related to the translation of Odoo's Greek language support. The incorrect language code ('gr') was replaced with the correct code ('el') in several configuration files. This ensures accurate translations and proper functionality for Greek-speaking users.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245617 Forward-Port-Of: odoo/odoo#244684
This update corrects a critical issue where newly added modules to the Odoo Enterprise stable release were not properly included in the translation files (.weblate.json). This meant that the Greek language version of the software was unavailable. The fix adds the necessary module definitions to the .weblate.json file, guaranteeing proper translation support.
Original PR description
Modules added into stable without being properly added to .weblate.json file = never translatable. Forward-Port-Of: odoo/enterprise#105413 Forward-Port-Of: odoo/enterprise#104890
This update fixes a bug where customers exceeding their credit limits in the Point of Sale (PoS) system weren't receiving warnings. The fix ensures that the system accurately calculates order totals and displays appropriate alerts when a customer's spending exceeds their established credit limit, improving financial control.
Original PR description
Steps to reproduce: ------------------- 1. Install pos_settle_due and accountant 2. In Accounting settings, enable "Sales Credit Limit" 3. Create a new customer, enable its "Partner Limit" and set it…
Steps to reproduce: ------------------- 1. Install pos_settle_due and accountant 2. In Accounting settings, enable "Sales Credit Limit" 3. Create a new customer, enable its "Partner Limit" and set it to 100 4. Open PoS, select that partner, and select products such that the total exceeds 100 Notice that even though we have exceeded that partner's limit of 100, there are no indicators on the customer button (orange background on hover), nor there are warnings on the partners list modal nor on the payment page. Why the bug ----------- In `getPartnerCredit`, we are using `order.amount_total` to get the current ordre amount, however, this field is `undefined` for a new order and it's been assigned a value in `setOrderPrices`, which since [9538698](https://github.com/odoo/odoo/commit/9538698), is only called before sending the order to the backend. The fix ------- Now we read the total amount from the getter `order.priceIncl`, and round it as we would do in `setOrderPrices`. opw-5489975 Forward-Port-Of: odoo/enterprise#104591
This update resolves several minor issues within the IoT driver component of Odoo. Specifically, it prevents logging errors when exceptions occur, shortens a debugging token to avoid problems, and clarifies communication types for actions on the IoT device. These changes ensure smoother operation and stability of the IoT integration.
Original PR description
This PR adds minor fixes 1) We avoid logging the receipt in case of exception 2) We trim the remote debug token to avoid errors. 3) We add the communication type (websocket/controller) for actions on the iot box task-5881030
This update addresses a confusing warning displayed on voice channels when users didn't have camera permissions. The fix ensures that the camera button isn't highlighted in red or with a warning unless the channel is specifically set up for video conferencing. This simplifies the user experience and avoids unnecessary alerts.
Original PR description
Only channels that have cameraPermission of `prompt` should show the red and warning. If the permission is `denied` or `granted`, no badge should be shown. task-5263066 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236297
This update fixes a technical issue where subcontracting manufacturing orders (MOs) were sometimes incorrectly identified as having multiple destination receipts. Previously, older versions of the system could create MOs with multiple receipt destinations, leading to a single destination being recorded. This change ensures accurate tracking of subcontracting MOs, resolving a potential data inconsistency.
Original PR description
Since commit fc66e2d4eb638f1486e69cd5920f02c787055da1 , a subcontracting MO only has one destination receipt. However, Subcontracting MOs created in previous versions can still have multiple move_dest_ids, hence `is_subcontract` must be accessed in a filter or after an `ensure_one()` OPW-5493343 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243742
This update enhances the monitoring of our AI usage by changing key logs from 'debug' to 'info', making them easier for our team and database administrators to track. Additionally, the system now accurately reports token usage from the LLM providers, resolving an issue where previous estimates were significantly inaccurate.
Original PR description
In this commit we change some important llm api usage logs from debug to info so they can be more easily monitored by us and database admins. We also change the usage reporting from a naive estimation (which greatly under-reported the token usage) to the actual token usage given to us by the LLM prodivers in the response. Forward-Port-Of: odoo/enterprise#105364
This update resolves an issue preventing electronic invoices in Latin American countries (Argentina, etc.) from printing correctly. The fix ensures that invoice headers and footers are dynamically generated based on the customer's fiscal country code, rather than relying on outdated chart templates. This guarantees accurate invoice formatting for all users.
Original PR description
This commit fixes a bug introduced here https://github.com/odoo/odoo/commit/3f7d79731fd5e5a751f7f1aeae63379c6211de5c because some old databases do not have set the chart template so it is needed to render the header and footer of the report template layouts taking in consideration the account fiscal country code instead of the chart template. Replicate printing the pdf of a customer electronic invoice on an argentinen company without chart template. Ticket Adhoc side: 105739 Task latam: 1373 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244102 Forward-Port-Of: odoo/odoo#238033
This update resolves a potential issue where tracking numbers in the POS Self Order module could collide. Because we couldn't add new fields directly to the main Odoo version, a simple method was used to generate unique tracking numbers by adding a random letter prefix. This ensures order tracking remains accurate and reliable.
Original PR description
Since we cannot add fields in stable we use a little trick to avoid collisions in tracking numbers for POS Self Order module. We do a modulo operation on the ID of the PoS config to select a random letter from A-Z and prepend it to the tracking number. Forward-Port-Of: odoo/odoo#245476
This update resolves an issue where gift cards were being printed repeatedly during point-of-sale transactions. Now, gift cards are only printed once when initially created, streamlining the process and preventing unnecessary printing. This improves efficiency and reduces potential printing costs.
Original PR description
*: pos_loyalty Gift card are now printed only one time at the creation not after each use. Forward-Port-Of: odoo/odoo#244089
3 changes
Resolved issues and error corrections
This update resolves a problem in the payroll testing process where contract end dates weren't being calculated correctly. The fix ensures contracts automatically end after two years, aligning with standard payroll practices. This improves the reliability of payroll calculations and reporting.
Original PR description
### Cause: Apparently the contract ends automatically after a period if `contract_date_end == False` ### Solution: Set `contract_end_date` to ` Date.today() + relativedelta(years=2)` like in `hr_payroll/tests/common.py` runbot-237945 runbot-237894
This update resolves an issue where users without superuser privileges could encounter access errors when generating global invoices in the Mexican CFDI module. The fix addresses a caching problem and ensures proper access rights are managed when creating or retrieving invoice sequences, preventing unexpected errors and improving stability.
Original PR description
**PROBLEM** 1. When generating a global invoice with a user without super user access, a access error may occur on the ir.sequence model. 2. There is an issue with the cache of the field…
**PROBLEM** 1. When generating a global invoice with a user without super user access, a access error may occur on the ir.sequence model. 2. There is an issue with the cache of the field `l10n_mx_edi_global_invoice_sequence_id`. (this is why problem can sometimes resolves itself on restarting the odoo instance). **STEP TO REPRODUCE** 1. Create 1 invoice with CFDI to public checked. 2. Goes to the list view for invoices, select the invoice, and apply the action "create global invoice" to it. 4. A access error may appear (depending on cache value). **CAUSE** 1. In `_get_global_invoice_cfdi_sequence()`, we get or create the ir.sequence used for global invoices. We are creating it with sudo(), so a user without sudo privilege can write to it. But, when we are retrieving a ir.sequence record that already exist, when don't use sudo(), this causes an access error for user without sudo privilege. 2. In `_get_global_invoice_cfdi_sequence()`, we try to get the computed field `l10n_mx_edi_global_invoice_sequence_id`. If it doesn't exist, we create a ir.sequence, but we forget to assign it to the field. Because we already trigger the compute method of the field by trying to access it, there is a None value in cache for it. This means we will always create a ir.sequence, despite one already existing for the company until the cache expires or the compute method is re-triggered. opw-5472552 Forward-Port-Of: odoo/enterprise#104181
This update resolves an issue in Odoo's Web Studio where it could incorrectly link fields to non-searchable data types. This caused warnings and errors, particularly in business settings. The change ensures that Web Studio only creates relational fields with searchable data, improving stability and reliability.
Original PR description
Before this commit studio allowed to make a related field with a non-searchable field (ie standard computed fields) in the the chain. This triggered a warning at creation (at fields.py:resolve_depends) and errors when using in a business setting. After this commit, the filter to build the relational field is modified to take into account this. opw-5436158 Forward-Port-Of: odoo/enterprise#105607
9 changes
Resolved issues and error corrections
This update fixes an issue where the quantity delivered on sale orders wasn't accurately updated after a partial refund with a 'Ship Later' option. Previously, the system incorrectly reported zero delivered quantities. The fix ensures that delivered quantities are correctly calculated, including those associated with refunded orders, to provide accurate inventory tracking.
Original PR description
The qty_delivered on sale.order.line was not correctly computed when the original order was refunded with a ship later. Steps to reproduce: ------------------- * Create a sale order for 5 quantities of any product * Confirm the sale order * Settle the order in the PoS * At this point the qty_delivered on the sale order line is 5 * Now go back to the PoS and refund partially the order for 3 quantities and use the "Ship Later" option > Observation: The qty_delivered is 0 instead of 2 Why the fix: ------------ We group the pos.order.line by procurement group and then check if all pickings related to these lines are done before adding the qty to the qty_delivered. We also make sure to include the refund lines in the computation opw-5059560 Forward-Port-Of: odoo/odoo#244008 Forward-Port-Of: odoo/odoo#240945
This update resolves a bug in the website editor that occurred when users manipulated the page, leading to incorrect selection offsets. Specifically, clicking on blank spaces could cause errors. The fix ensures that selection offsets are validated, preventing these errors and improving the stability of the website editor, particularly in Chrome.
Original PR description
**Description of the problem** In the website editor, the user can manipulate the page in such a way to generate a problematic `SelectionPlugin.activeSelection`, which still points to an existing…
**Description of the problem** In the website editor, the user can manipulate the page in such a way to generate a problematic `SelectionPlugin.activeSelection`, which still points to an existing `anchorElement`, but has an invalid `offset`. **How to reproduce** This seems to be reproducible only on Chrome. 1. Enter in the website edit mode 2. Drop the `s_newsletter` snippet 3. Drop the `s_popup` snippet 4. Click on the popup, and delete it 5. Click on the blank space inside the `s_newsletter` snippet 6. Delete the `s_newsletter` snippet 7. The error occurs Notes: 1. Snippet different than `s_newsletter` can be used to reproduce the problem, as long as they contain a blank space. 2. It is important to make sure that the movement of the mouse pointer does not trigger any preview when going from step 5 to step 6. **Why the problem happens** On Chrome, clicking on a blank area can cause `document.getSelection()` to return a selection with a null `anchorNode.` When this happens, `SelectionPlugin.getSelectionData()` will use the already existing `activeSelection` if `activeSelection.anchorNode` is still connected. Before this commit, this method only checked that `anchorNode` was connected, without validating offsets. This leads to the following edge case: 1. The user removes the `s_popup` 2. At this point, `document.getSelection()` would point to the `s_newsletter` snippet, so if the user just deletes the snippet nothing bad would happen. But instead, if: 3. The user clicks on a blank area in `s_newsletter`, `document.getSelection()` will now return a null `anchorNode` 4. The user delete the `s_newsletter` snippet, and `SelectionPlugin.getSelectionData()` is called by an handler after the deletion 5. At this point: `document.getSelection()` has a null `anchorNode`, so the method will check if `activeSelection.anchorNode` is still connected, WITHOUT validating the offsets. 6. Since `anchorNode` is still connected, this selection will be used, and an error will be triggered shortly after, because the offset is too high (pointing to `s_popup` which does not exist anymore). **Fix** After this commit, when `SelectionPlugin.getSelectionData()` checks that `activeSelection.anchorNode` is still connected it also checks that the offsets are valid (meaning that they are smaller than the number of nodes). task-5430500 Forward-Port-Of: odoo/odoo#244331
This update fixes a rounding error in the calculation of withholding taxes for Argentine businesses. Specifically, the withholding amount was slightly off, resulting in a discrepancy. The change ensures accurate tax calculations for purchase withholdings, improving financial reporting accuracy.
Original PR description
Steps to reproduce: - Set company to (AR) Responsable Inscripto - In Accounting > Settings, choose Round per Tax as the rounding method. - Go to Accounting > Taxes, duplicate IIBB WTH CABA 0%, and set Amount to 4.5%. - Open partner ADHOC SA, in the accounting tab add the new tax in Purchase Withholding - Create a new vendor Bill to vendor ADHOC SA with unit price 156,087.00 - Confirm and open Payment wizard Issue: Withholding amount is 7023.91, but it should be 7023.92 It occurs that the computed amount is 7023.915. Then when the tax repartition values are computed, the value is rounded and rounding difference are redistributed in the tax lines, so it seems the value has been rounded down. opw-5154585 Forward-Port-Of: odoo/odoo#241633
This update fixes an issue where dialog windows were hidden behind the AI chat window, making them difficult to use. Now, dialogs are consistently displayed above all chat windows except the AI chat window, ensuring a clearer and more intuitive user experience.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ Dialogs were rendered behind chat windows, making them difficult to see and interact with. **Current behavior before PR:** --------------------------------- - The dialog appears behind the chat window **Desired behavior after PR is merged:** ----------------------------------------- - Dialogs are displayed above all chat windows except AI - The AI chat window remains intentionally above dialogs **Task:** 5367135
This update resolves an issue where users without administrative privileges could encounter errors when generating global invoices in the Mexican CFDI module. The fix addresses a caching problem and incorrect access control within the invoice generation process, ensuring reliable global invoice creation for all users.
Original PR description
**PROBLEM** 1. When generating a global invoice with a user without super user access, a access error may occur on the ir.sequence model. 2. There is an issue with the cache of the field…
**PROBLEM** 1. When generating a global invoice with a user without super user access, a access error may occur on the ir.sequence model. 2. There is an issue with the cache of the field `l10n_mx_edi_global_invoice_sequence_id`. (this is why problem can sometimes resolves itself on restarting the odoo instance). **STEP TO REPRODUCE** 1. Create 1 invoice with CFDI to public checked. 2. Goes to the list view for invoices, select the invoice, and apply the action "create global invoice" to it. 4. A access error may appear (depending on cache value). **CAUSE** 1. In `_get_global_invoice_cfdi_sequence()`, we get or create the ir.sequence used for global invoices. We are creating it with sudo(), so a user without sudo privilege can write to it. But, when we are retrieving a ir.sequence record that already exist, when don't use sudo(), this causes an access error for user without sudo privilege. 2. In `_get_global_invoice_cfdi_sequence()`, we try to get the computed field `l10n_mx_edi_global_invoice_sequence_id`. If it doesn't exist, we create a ir.sequence, but we forget to assign it to the field. Because we already trigger the compute method of the field by trying to access it, there is a None value in cache for it. This means we will always create a ir.sequence, despite one already existing for the company until the cache expires or the compute method is re-triggered. opw-5472552 Forward-Port-Of: odoo/enterprise#104181
This update fixes an issue preventing Latin American electronic invoices from printing correctly in PDF format. The change ensures the invoice header and footer are accurately displayed, regardless of whether a chart template is set up in the database, addressing a problem with older systems. This ensures accurate invoice generation for businesses in Argentina, Chile, Brazil, and other Latin American countries.
Original PR description
This commit fixes a bug introduced here https://github.com/odoo/odoo/commit/3f7d79731fd5e5a751f7f1aeae63379c6211de5c because some old databases do not have set the chart template so it is needed to render the header and footer of the report template layouts taking in consideration the account fiscal country code instead of the chart template. Replicate printing the pdf of a customer electronic invoice on an argentinen company without chart template. Ticket Adhoc side: 105739 Task latam: 1373 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244102 Forward-Port-Of: odoo/odoo#238033
This update resolves an issue where customer invoices sent via Peppol were generating duplicate attachments, causing clutter in the system. The fix ensures that attachments are updated instead of created again, streamlining the invoice process and improving the user experience. This prevents confusion and ensures consistent attachment management.
Original PR description
When sending a customer invoice via Peppol, the system creates duplicate attachments (4 instead of 2 expected), cluttering the chatter and the attachment sidebar. This commit: - Implements a search-and-update logic for attachments to ensure idempotency (updates existing instead of creating duplicates). task-5438951 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#245370 Forward-Port-Of: odoo/odoo#241130
A previous issue prevented users from adding attachments when sending emails to large contact lists (501+ contacts). This update corrects a technical error related to how the system handles large contact selections, ensuring attachments can now be successfully added during mass email campaigns. This improves the reliability of the email sending process.
Original PR description
Steps to reproduce: 1. Install 'contact' 2. Create 501+ contacts (e.g. by duplicating existing one) 3. Select all contacts in list view and click Send Email (from Action menu) 4. Try to add an attachment Issue: - A traceback is raised in the mail composer: `SyntaxError: Unexpected end of JSON input` Cause: `res_ids` is not set on the composer when more than 500 records are selected. This is expected, as the compute method `_compute_res_ids()` does not write `res_ids` when the number of active_ids exceeds 500 (to avoid storing large payloads on the field). Because of this, the code trying to JSON.parse(res_ids) fails. see: https://github.com/odoo/odoo/blob/abc8417413faf598fb83106de4328571d71888aa/addons/mail/wizard/mail_compose_message.py#L400 Solution: - Fallback to context.active_ids when res_ids is not available opw-5351374 Forward-Port-Of: odoo/odoo#238311
This update enhances the security and reliability of our Peppol integration by safely handling server deregistration when a client leaves. The system now allows for a controlled reset of configurations, enabling users to re-register without disruption. This change was prompted by a previous incident and improves the overall stability of the Peppol connection.
Original PR description
Reintroduce server-initiated deregistration on `client_gone`, but only for implementations that explicitly handle it. The base proxy client now just raises the error. Peppol opts in by soft-resetting its configuration so users can re-register. See the IAP postmortem for the rationale and incident history. https://github.com/odoo/iap-apps/pull/1317 no-task Forward-Port-Of: odoo/odoo#245567 Forward-Port-Of: odoo/odoo#239254
5 changes
Resolved issues and error corrections
This update fixes an issue where the Gantt chart controls would overlap the user interface, particularly when using custom date ranges or smaller screen sizes. The change ensures that Gantt controls are displayed correctly, improving usability and preventing visual clutter, especially on mobile devices.
Original PR description
Steps to reproduce ================== - Switch to dutch - Emulate an iPhone SE viewport in the browser settings - Open a project - Switch to the gantt view - Use a custom date range -> The gantt controls are displayed on top due to the daterange format being to long | Before | After | |--------|--------| | <img width="736" height="1542" alt="image" src="https://github.com/user-attachments/assets/7c573ab1-fbf8-4f31-83ba-21d66ebc504d" /> | <img width="736" height="1542" alt="image" src="https://github.com/user-attachments/assets/62ab3d47-701e-4e2d-aaef-5c92675236cb" /> | opw-5340869 Forward-Port-Of: odoo/enterprise#104821
This update fixes an issue where the IoT Box was incorrectly downloading standard drivers, potentially causing conflicts and reintroducing previous problems. To allow custom driver development, a checkbox was added, but this was corrected to prevent unnecessary driver downloads and ensure stability.
Original PR description
The stable IoT Box uses drivers from git repository: it doesn't download them from the database as it used to do. However, sh/on premise clients might want to develop custom drivers that the IoT Box would download. For that, they have to enable a checkbox on the IoT homepage, making the IoT Box download handlers as before. The issue is it will also download standard drivers that are already present on the IoT Box: on newer databases it would simply overwrite them, but on older ones, it would duplicate as names might have changed. Also, it would introduce issues back that were already fixed. To avoid this, we avoid adding drivers from standard modules to the downloaded archive, to prevent issues with the main ones. Forward-Port-Of: odoo/enterprise#105531
This update resolves an issue where users without administrative privileges could encounter access errors when creating global invoices (CFDI). The fix addresses a caching problem and ensures proper access rights are managed when retrieving existing invoice sequences, preventing errors and improving stability.
Original PR description
**PROBLEM** 1. When generating a global invoice with a user without super user access, a access error may occur on the ir.sequence model. 2. There is an issue with the cache of the field…
**PROBLEM** 1. When generating a global invoice with a user without super user access, a access error may occur on the ir.sequence model. 2. There is an issue with the cache of the field `l10n_mx_edi_global_invoice_sequence_id`. (this is why problem can sometimes resolves itself on restarting the odoo instance). **STEP TO REPRODUCE** 1. Create 1 invoice with CFDI to public checked. 2. Goes to the list view for invoices, select the invoice, and apply the action "create global invoice" to it. 4. A access error may appear (depending on cache value). **CAUSE** 1. In `_get_global_invoice_cfdi_sequence()`, we get or create the ir.sequence used for global invoices. We are creating it with sudo(), so a user without sudo privilege can write to it. But, when we are retrieving a ir.sequence record that already exist, when don't use sudo(), this causes an access error for user without sudo privilege. 2. In `_get_global_invoice_cfdi_sequence()`, we try to get the computed field `l10n_mx_edi_global_invoice_sequence_id`. If it doesn't exist, we create a ir.sequence, but we forget to assign it to the field. Because we already trigger the compute method of the field by trying to access it, there is a None value in cache for it. This means we will always create a ir.sequence, despite one already existing for the company until the cache expires or the compute method is re-triggered. opw-5472552 Forward-Port-Of: odoo/enterprise#104181
This update resolves an issue where sales orders with missing address information in Mexico prevented online payments from being correctly processed. The fix automatically enables ‘CFDI to Public’ when the address is incomplete, ensuring transactions are validated and payments are recorded as required by Mexican regulations. This improves payment reliability and compliance.
Original PR description
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent…
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent error occurred during move validation: the transaction was created, but the payment was never recorded, and no error appeared in the portal or the SO chatter ### Cause: The CFDI validation error is raised internally but never surfaced to the user https://github.com/odoo/enterprise/pull/91655 The PO (MIAL) recommended automatically enabling `CFDI to Public` when the partner address is incomplete, forcing the user to complete the data This also ensures that the payment can be confirmed properly ### Steps to reproduce: - Install `l10n_mx_edi_sale` and switch to the MX company - Configure a Payment Provider and Payment Method (e.g., demo) - Create a customer without ZIP or country - Create a Sale Order for that customer - In Other Info, set Online Payment to 100% - Send the quotation and open the link in a private window - Sign and Pay Before the fix: the transaction is created, but no payment is recorded, and no error is shown opw-5023724 Forward-Port-Of: odoo/enterprise#101881
This update resolves an issue where AvaTax was failing due to orders lacking at least one line item. This prevented proper tax calculations and reporting, particularly in scenarios involving subscription management or the industry_fsm_stock module. The change automatically filters out orders without lines, ensuring accurate tax processing.
Original PR description
Backport of https://github.com/odoo/enterprise/pull/101643. Original commit message for completeness: Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the…
Backport of https://github.com/odoo/enterprise/pull/101643. Original commit message for completeness: Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the taxes related to MXXX - SOXXX/XXX. Please check the status of `Sales Order XXX` in the AvaTax portal. Transactions must have at least one line. ``` There are various cases this can happen: 1/ if industry_fsm_stock is installed, empty orders are confirmed [1], 2/ if you put the end_date of a subscription before the next_invoice_date, then none of the lines are considered invoiceable [2] and you get the error when viewing the subscription in the portal This commit filters out orders without lines. It's also possible to filter this on the level of the models by doing it in _get_and_set_external_taxes_on_eligible_records(). However, this means doing it separately for each model, and requires every implementer do it manually. [1] https://github.com/odoo/enterprise/blob/703e7fd413e93a8287da98286aa93b9699ae3e96/industry_fsm_stock/models/project_task.py#L159 [2] https://github.com/odoo/enterprise/blob/c7bf4367a9bf6757a36a9f34a872a6e35a19a3a5/sale_subscription/models/sale_order_line.py#L475 opw-5214609 opw-5247727 opw-5311132 opw-5385960 Forward-Port-Of: odoo/enterprise#105587
16 changes
Resolved issues and error corrections
This update resolves a bug in the holiday scheduling Gantt chart that was introduced during a previous refactoring. The fix ensures that holiday intervals are calculated correctly, preventing inaccurate display of employee time off. This improves the reliability of the holiday calendar.
Original PR description
The bug was introduced following this refactor PR: https://github.com/odoo/odoo/pull/229706 This commit fixes the issue by computing correctly the interval with the correct type Runbot build error: https://runbot.odoo.com/odoo/runbot.build.error/238017 task-5788459
This update resolves an issue where the VoIP ringtone played incorrectly due to multiple tabs receiving notifications. A new system directs incoming call notifications to a central SharedWorker, ensuring only one tab plays the ringtone and addressing potential problems with connection loss or tab inactivity. This enhances the reliability of the Odoo VoIP system.
Original PR description
Each Odoo tab establishes a WebSocket connection with the VoIP provider. This causes problems with incoming calls: each tab receives the notification, which leads to the associated callbacks being…
Each Odoo tab establishes a WebSocket connection with the VoIP provider. This causes problems with incoming calls: each tab receives the notification, which leads to the associated callbacks being called as many times as there are open tabs. This used to be particularly annoying with the ringtone, which would play in unison. To solve this problem, we decided that only the "main tab" should be responsible for playing the ringtone. Since there can only be one main tab at a time, there can only be one ringtone at a time. Problem solved. This seemed to be an easy and effective solution. However, we were informed that sometimes the call wouldn't ring at all 🤬 This called the reliability of the system into question. What would happen if: - The main tab loses the WebSocket connection? - The main tab is throttled? - The main tab was never interacted with, preventing us from playing audio? - The notification arrives after the main tab is killed and before a new main tab is elected? This commit attempts a new approach ⋆✴︎˚。⋆ All tabs receiving incoming call notifications will now send a message to a central authority—The _SharedWorker_ 🙀—along with information about whether or not they can play audio. The SharedWorker then selects the first tab that can play audio and assigns it the task of playing the incoming ringtone. This is expected to solve the problems mentioned above, as it guarantees that the "player tab" is a tab that: - effectively received the incoming call notification - is allowed to play audio [Task-5411760](https://www.odoo.com/odoo/project.task/5411760)
This update fixes an issue where employees with multiple bank accounts for salary distribution were receiving payment advice that only showed the first account and incorrectly allocated the full salary. Now, the payment advice (PDF and XLSX) accurately reflects all bank accounts and salary amounts, ensuring accurate payment reporting.
Original PR description
Issue: When an employee had multiple bank accounts with salary distribution, the payment advice (PDF and XLSX) was displaying only the first bank account and assigning the full salary amount to that account. This resulted in incorrect payment information being generated. Fix: When multiple bank accounts are configured with salary distribution, the payment advice now displays the correct information in both PDF and XLSX reports. task-5390429 Forward-Port-Of: odoo/enterprise#104073 Forward-Port-Of: odoo/enterprise#101818
This update corrects a technical error in the l10n_au_hr_payroll module that was causing a warning message to appear incorrectly on the TFN dashboard. The fix ensures that the dashboard accurately reflects TFN status information, preventing potential confusion for payroll users. This resolves a data inconsistency.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_au_hr_payroll. 2. Enable multi-company and switch to an AU company. 3. Change an existing employee’s company to the AU company ([employee…
Steps to reproduce:
-------------------
1. Install l10n_au_hr_payroll.
2. Enable multi-company and switch to an AU company.
3. Change an existing employee’s company to the AU company
([employee created more than 28 days ago](https://github.com/odoo/enterprise/blob/7adab8bfdccf5f0e97eb2894e065b63ea8200d20/l10n_au_hr_payroll/data/hr_payroll_dashboard_warning_data.xml#L31)).
4. Under the payroll tab, set the TFN Status to:
"Employee applied for TFN but didn't receive it yet, less than 28 days ago".
5. Open Payroll.
Issue:
--------
A traceback occurred:
```
Error: NameError("name 'invalid_employees' is not defined")
```
Cause:
------
The evaluation code computes `warning_count` using
an undefined `invalid_employees` variable.
Solution:
---------
Define `invalid_employees` before using it to compute
`warning_count` and `warning_records`.
**NOTE:**
The [upgrade script](https://github.com/odoo/upgrade/blob/ed5bc3fd99ef6fba4bc7162934df36396ae9fc3f/migrations/l10n_au_hr_payroll/saas~18.4.1.0/end-migrate.py#L30) is already available from version 18 to 19.
opw-5459998
Forward-Port-Of: odoo/enterprise#103777This update prevents unnecessary email reminders for timesheet approvals. The system now only sends reminders when there are actual timesheets awaiting approval, ensuring users aren't overwhelmed with notifications. This change optimizes the approval workflow and reduces email clutter.
Original PR description
prevent cron from sending approver reminder if no timesheet assigned to approver Send the reminder email if: - there are timesheets to validate - AND if the user is set as either the manager or timesheet approver of an employee with timesheets left to be validated - OR if the said employee has no manager or timesheet approver set Task-3624610 Forward-Port-Of: odoo/enterprise#103911 Forward-Port-Of: odoo/enterprise#52355
This update fixes an issue where the 'Inventory Reason' entered during barcode inventory counts wasn't being recorded. Now, when completing an inventory count via the Barcode app, the specified reason is correctly saved and visible in the inventory history. This ensures accurate tracking of inventory adjustments.
Original PR description
## Issue When completing an *Inventory Count* from the Barcode app, the *Inventory Reason* requested to the user is not registered anywhere. ## Steps to reproduce 1. Install the *Barcode* app…
## Issue
When completing an *Inventory Count* from the Barcode app, the *Inventory Reason* requested to the user is not registered anywhere.
## Steps to reproduce
1. Install the *Barcode* app (`stock_barcode`)
2. In the *Barcode* app, click *Count Inventory*
3. Add a product and set a quantity for it
4. Click *Confirm* (do not scan to confirm)
5. Write an *Inventory Reason* and click *Apply Now*
6. Go to Inventory > Reporting > Moves History
- **The _Inventory Reason_ given in step 5 does not appear anywhere**
If the inventory adjustment is done through Inventory > Operations > Physical Inventory, the user can also provide an *Inventory Reason*, but this time, it will appear in the *Moves History* in the *Reference* (`stock.move.line.reference`) column.
## Cause
Since https://github.com/odoo/enterprise/commit/3efea75a88120519ef4be1a41c8faa7278bc332c, the value provided by the user is never passed to the Python side.
opw-5423934
Forward-Port-Of: odoo/enterprise#104763This update fixes a potential issue where the system didn't correctly process weight readings from the scale, particularly when using the 'read_once' action. Now, the system reliably handles all weight readings, ensuring accurate data capture and reporting for IoT scale data.
Original PR description
This commit adjusts the callback when a new weight is received from the scale to also handle the case where it is the response to the `read_once` action. In this case, the `status` key is `success`. Forward-Port-Of: odoo/enterprise#105324
This update fixes a bug where tax return names and status indicators weren't correctly translated when a new language was installed in Odoo. The solution automatically generates translations for all existing tax return names upon language installation, ensuring consistent and accurate translations across all supported languages. This improves the user experience for international users.
Original PR description
**Commit 1:** [FIX] account_reports: translation of account returns states Steps to reproduce: - Open the tax returns - Set an account opening date to generate some returns - Add another language to…
**Commit 1:** [FIX] account_reports: translation of account returns states Steps to reproduce: - Open the tax returns - Set an account opening date to generate some returns - Add another language to the database and select it -> The states of the returns (the little bubble in the kanban cards) aren't translated even though the translation is present in the pot and po files. **Commit 2:** [FIX] account_reports: translation of date in returns title Steps to reproduce: - Have 2 languages on the db - Generate the tax returns by going to Accounting/Tax Returns and set the opening date - Switch to the second language -> The period displayed in the name of each return isn't translated **Commit 3:** [FIX] account_reports: translate account returns name after lang installation Steps to reproduce: - Generate the tax returns by going to Accounting/Tax Returns and set the opening date - Install another language -> The names of the returns aren't translated in the new language. Solution: When installing a new language, generates the translation of the title for all existing returns task-5421659 Forward-Port-Of: odoo/enterprise#102559
This update addresses a limitation in the account online synchronization process where access tokens expire quickly. We've replaced the token system with a consent token, a unique identifier linked to the user, ensuring a more reliable and persistent consent management experience. This change improves the stability and functionality of the online synchronization feature.
Original PR description
In this commit:bf5b7d0 we introduce a message on the account_online_link to be able to manage the consent. (one needed fix in this commit:https://github.com/odoo/enterprise/commit/1c84804fd3f0c0d1d23916b9f6a388616f66ac7e) This commit will change the way we manage the consent since the access token is in fact available only for 30 min, so the link in the chatter would not work. We decided to have a consent token which is a uuid4 encoded in base64 (url safe) and link it to the odoofin user. task-5187621 Forward-Port-Of: odoo/enterprise#105392 Forward-Port-Of: odoo/enterprise#105202
This update ensures that new partners created during shared sign requests automatically use the signer's name instead of their email address. This improves data consistency and makes it easier to identify signers within the system. It resolves an issue where new signers were created with only their email as a name.
Original PR description
Version: - saas-18.2 Steps to reproduce: - Create a shared sign request. - Open the shared signing link and complete the signature process. - During signing, a new partner gets created for the signer if not already exists. Before: - When the user signs the shared sign request and a new partner is created, the partner name is not set and email is used as name. After: - Now, when a user signs a shared sign request and a new partner is created, the system automatically sets the partner name using the signer name. task-5776339 Forward-Port-Of: odoo/enterprise#105271 Forward-Port-Of: odoo/enterprise#104869
This update ensures that LNA (a key technology) is consistently used for IoT devices across all Point of Sale systems, including Kiosks. Previously, LNA was only active in the POS, limiting functionality. This change improves the overall performance and reliability of IoT-enabled Kiosk POS operations.
Original PR description
Before this commit, LNA was being used for IoT devices in the POS but not in the Kiosk when `point_of_sale.use_lna` was enabled. After this commit, LNA will also be enabled for IoT devices in the Kiosk. task-5874663 Forward-Port-Of: odoo/enterprise#105520 Forward-Port-Of: odoo/enterprise#105460
This update corrects a compatibility issue with the Bulgarian National Bank (BNB) exchange rate provider. Due to Bulgaria's adoption of the Euro, the BNB now provides rates in EUR, not BGN. This fix ensures that companies using EUR as their main currency can correctly sync exchange rates without errors.
Original PR description
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the…
The `_parse_bnb_data` method assumed that the Bulgarian National Bank (BNB) provides exchange rates against BGN (Bulgarian Lev). However, since Bulgaria joined the Eurozone on January 1, 2026, the BNB now provides rates against EUR. This caused the error "Your main currency (EUR) is not supported by this exchange rate provider" when Bulgarian companies with EUR as their main currency tried to sync exchange rates. refs: We can compare the data here from 31 December using the WayBackMachine: https://web.archive.org/web/20251231193558/https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm Compared to today: https://www.bnb.bg/Statistics/StExternalSector/StExchangeRates/StERForeignCurrencies/index.htm And see the comparison used to be to BGN but is now for EUR Steps To Reproduce: 1. Create a company for Bulgaria with EUR as the main currency. 2. Go to Accounting Settings -> Automatic Currency Rates. 3. Select "[BG] Bulgaria National Bank" as the service provider. 4. Click the sync button. 5. Error appears: "Your main currency (EUR) is not supported by this exchange rate provider. Please choose another one." The fix updates the base currency from BGN to EUR, matching the current BNB XML format which now provides rates against EUR. Note: Companies with BGN as main currency will now get the same error, which is expected since the BNB no longer provides BGN-based rates. This behavior was discussed and confirmed with the PO. Ticket [link](https://www.odoo.com/odoo/project.task/5483771) opw-5483771 Forward-Port-Of: odoo/enterprise#105074
This update fixes an issue where the basic salary was incorrectly calculated for employees in Saudi Arabia. The system now verifies the presence of 'WORK100' in employee workdays, ensuring the basic salary is only applied when appropriate, aligning with payroll regulations. This prevents overpayment and improves payroll accuracy.
Original PR description
purpose: we should check if there are WORK100 in the worked days, but as of now, we dont, and that results in having the basic salary triggered even when it shouldn't. - made basic salary only computed when work entry source is calendar or WORK100 in the worked days (there are attendances for the employee) and made its amount adapt with the worked days task-id: 5472853 Forward-Port-Of: odoo/enterprise#104090 Forward-Port-Of: odoo/enterprise#103493
This update resolves an issue where country-based filtering on payslips wasn't functioning properly, leading to errors. The fix ensures that country selections are correctly stored and used for filtering, eliminating module loader problems and improving payroll accuracy.
Original PR description
Issue: The country_id related field on payslip and payslip run was not stored, causing domain filters and search on this field to fail and triggering client-side errors. Fix: Use search parameter to write function so field can be used safely in search domains and filters. Impact: Country-based filtering now works correctly without triggering module loader errors. Task: 5406904 Forward-Port-Of: odoo/enterprise#104167 Forward-Port-Of: odoo/enterprise#103318
This update enables users to create returns for previously archived accounting periods without needing to reactivate or overwrite existing archived returns. This provides greater flexibility in managing returns and simplifies the reporting process. A new test case has been added to ensure the functionality works as expected.
Original PR description
Archived returns are ignored when manually creating returns, allowing a new return to be created for the same period without reactivating or overwriting the archived one. Also a test case has been added for the same task-5440965 Forward-Port-Of: odoo/enterprise#102928
This update fixes a visual inconsistency in the Helpdesk dashboard by extending the conditional formatting and aligning border styles to match other Odoo dashboards. This ensures a more uniform and professional appearance for users accessing the Helpdesk data.
Original PR description
## Description - The Top Customers pivot shows 10 rows, but the conditional format covered only 9. Extend the CF range so the last row is formatted. - Adjust border ranges so the helpdesk dashboard matches the styling used in other dashboards. Task: [5448434](https://www.odoo.com/odoo/project/2328/tasks/5448434) Forward-Port-Of: odoo/enterprise#103793 Forward-Port-Of: odoo/enterprise#103019
8 changes
Resolved issues and error corrections
This update fixes an issue where the VoIP ringtone played incorrectly across multiple Odoo tabs. The system now uses a central SharedWorker to intelligently select a tab to play the ringtone, ensuring it only plays once and addressing potential problems with connection loss or tab inactivity. This enhances the overall reliability of incoming call notifications.
Original PR description
Each Odoo tab establishes a WebSocket connection with the VoIP provider. This causes problems with incoming calls: each tab receives the notification, which leads to the associated callbacks being…
Each Odoo tab establishes a WebSocket connection with the VoIP provider. This causes problems with incoming calls: each tab receives the notification, which leads to the associated callbacks being called as many times as there are open tabs. This used to be particularly annoying with the ringtone, which would play in unison. To solve this problem, we decided that only the "main tab" should be responsible for playing the ringtone. Since there can only be one main tab at a time, there can only be one ringtone at a time. Problem solved. This seemed to be an easy and effective solution. However, we were informed that sometimes the call wouldn't ring at all 🤬 This called the reliability of the system into question. What would happen if: - The main tab loses the WebSocket connection? - The main tab is throttled? - The main tab was never interacted with, preventing us from playing audio? - The notification arrives after the main tab is killed and before a new main tab is elected? This commit attempts a new approach ⋆✴︎˚。⋆ All tabs receiving incoming call notifications will now send a message to a central authority—The _SharedWorker_ 🙀—along with information about whether or not they can play audio. The SharedWorker then selects the first tab that can play audio and assigns it the task of playing the incoming ringtone. This is expected to solve the problems mentioned above, as it guarantees that the "player tab" is a tab that: - effectively received the incoming call notification - is allowed to play audio [Task-5411760](https://www.odoo.com/odoo/project.task/5411760) Backport of https://github.com/odoo/enterprise/pull/104885
This update resolves an issue where outdated sign requests were incorrectly sending notifications to users with mismatched email addresses. The fix ensures that 'next documents to be signed' are only sent to signees with verified email contacts, improving the accuracy and reliability of the sign request process. This prevents unnecessary notifications and streamlines communication.
Original PR description
This commits fix the problem where the `signer_email` field of old sign items don't have a value defined then showed up as "next documents to be signed" for other users, even when the email doesn't match. task-5487349
This update resolves an issue where duplicate order warnings appeared when upselling subscriptions. The change specifically excludes upsell quotes from the duplicate order check, ensuring that these quotes are correctly processed without unnecessary alerts. This improves the user experience and prevents potential disruptions to the sales workflow.
Original PR description
Version: - 19.0 Steps to reproduce: 1. Create a subscription. 2. Set a customer reference 3. Confirm the subscription and create an invoice. 4. Upsell the subscription to generate a upsell quote (state '7_upsell'). Issue: A duplicate order warning is displayed when upsell a subscription Solution: Exclude upsell quotes (`subscription_state == '7_upsell'`) from the duplicate order check in `_fetch_duplicate_orders`. This prevents incorrect warnings when creating or opening upsell quotes. taskid-5438769
This update fixes an issue where applicant stage changes weren't correctly displayed in the recruitment reports module. The fix ensures that stage change messages appear with the correct 'Stage changed' label and uses the accurate stage name 'Qualification' instead of 'Initial Qualification'.
Original PR description
…records in hr_recruitment_reports demo data Steps to reproduce: 1. Load demo data for hr_recruitment_reports module 2. Check applicant records in chatter 3. Observe that stage change messages don't…
…records in hr_recruitment_reports demo data Steps to reproduce: 1. Load demo data for hr_recruitment_reports module 2. Check applicant records in chatter 3. Observe that stage change messages don't show "Stage changed" label 4. Review mail.tracking.value records for applicant stage changes 5. Observe incorrect stage name "Initial Qualification" instead of "Qualification" Bug cause: mail.message records for applicant stage changes were missing the subtype_id field, which defaults to an incorrect subtype (mt_note instead of mt_applicant_stage_changed). This caused the messages to be treated as internal notes rather than stage change notifications. Additionally, mail.tracking.value records used "Initial Qualification" as the old_value_char or new_value_char, which doesn't match the actual stage name defined in hr_recruitment module. The correct stage name is simply "Qualification" (ref: hr_recruitment.stage_job1). Solution: - Add subtype_id field with reference to hr_recruitment.mt_applicant_stage_changed to all mail.message records that track applicant stage transitions - This ensures stage change events are properly identified and displayed in chatter with the correct "Stage changed" label - Update old_value_char and new_value_char fields in mail.tracking.value records to use the correct stage name "Qualification" instead of "Initial Qualification" - Ensures consistency with actual stage names and proper display in applicant chatter history Affected records: 20 mail.message records in hr_recruitment_reports_demo.xml Task Id:5454691
This update resolves a technical issue that could cause errors when generating Peruvian VAT (PE) reports. The fix ensures that the system handles cases where a required text field is missing, preventing a traceback and ensuring accurate report generation. This improves the reliability of the odoo Enterprise module for businesses operating in Peru.
Original PR description
Forward-Port-Of: odoo/enterprise#105462
This update resolves a JavaScript error that occurred when opening the Shop Floor through the replenishment/forecast flow. The fix ensures the application name is correctly identified, preventing a traceback and allowing users to consistently access the Shop Floor functionality. This improves the reliability of the manufacturing process.
Original PR description
Opening the Shop Floor via the replenishment/forecast flow can raise a js traceback. **Steps to produce:** - Install `mrp` module. - Enable `multi-step routes` from the settings. - Inventory >…
Opening the Shop Floor via the replenishment/forecast flow can raise a js traceback. **Steps to produce:** - Install `mrp` module. - Enable `multi-step routes` from the settings. - Inventory > Configuration > Warehouse Management > Routes. - In Manufacture route, make sure route is Applicable On `products`. - Inventory > Products > Products > New. - Click on forcasted button on product > Click on replenish button > Confirm. - Click the Manufacturing Order shown in the notification. - Confirm the MO and click Shop Floor. **Issue:** A JavaScript error occurs: `TypeError: Cannot read properties of null.` **Root cause:** The Shop Floor view relies on the menu service to determine the current application name by calling `this.menu.getCurrentApp().name`. When the Shop Floor is opened from the replenishment/forecast flow, the navigation occurs through action-based triggers rather than through the main menu. As a result, no menu selection is performed and `setCurrentMenu()`[1] is not executed beforehand.This leaves the current application undefined, causing `menu.getCurrentApp()` to return undefined and leading to a js traceback when `.name` is accessed. [1]: https://github.com/odoo/odoo/blob/c646cb61d0752250b2600413d6d63deabd1d3e6d/addons/web/static/src/webclient/menus/menu_service.js#L57-L64 simillar fix : https://github.com/odoo/enterprise/pull/93043 Note: A tour is possible but unnecessary for this small use-case. opw-5462965 ---
This update corrects a technical issue preventing proper validation of vendor bills on ARCA. The 'CodAutorizacion' field was incorrectly named, causing errors and preventing the system from correctly processing invoices. This ensures accurate bill validation and avoids disruptions to the accounting process.
Original PR description
In this commit https://github.com/odoo/enterprise/pull/103370/changes#diff-2459e118c605cf039bb94c62561285ad753b6a27c571f10a25547ee9b01aa318R289 where a refactor has been made, the field 'CodAutorizacion' was left as 'invCodAutorizacion' on _l10n_ar_edi_get_request_data_verify. This leads to errors when validating vendor bills on ARCA, since the organism could not find the required field. <img width="640" height="163" alt="image" src="https://github.com/user-attachments/assets/74a0cdc6-c007-474c-a67b-fd12d484838f" /> Forward-Port-Of: odoo/enterprise#105362
This update addresses a potential issue where deleted records in Odoo could still be accessed, leading to errors. The fix ensures that related records are checked for existence before accessing data from deleted records, primarily due to how cascade deletions are handled in the database. This enhances data integrity and stability.
Original PR description
In order to be defensive we have to check records linked to messages, notifications or activities exist before checking related information like display_name, or even to skip them in various flows. This happens notably due to DB-level cascade deletion that does not remove side records linked through (model, res_id) pairs. It implies some additional exist queries. Task-5138556 Forward-Port-Of: odoo/enterprise#104538 Forward-Port-Of: odoo/enterprise#101185
11 changes
Resolved issues and error corrections
This update resolves an access issue preventing administrators from viewing serial numbers linked to sales orders. Previously, restrictions on user permissions caused errors when calculating the number of sales orders associated with a serial number. This change ensures all users, regardless of their sales order ownership, can access this critical inventory information.
Original PR description
Steps to reproduce the bug - Create a storable product P1: - Tracking: Serial Number - Log in as Marc Demo - Create a sales order with 1 unit of P1 - Validate the delivery using serial number SN1 -…
Steps to reproduce the bug
- Create a storable product P1:
- Tracking: Serial Number
- Log in as Marc Demo
- Create a sales order with 1 unit of P1
- Validate the delivery using serial number SN1
- Log in as Mitchell Admin
- Go to Settings:
- Manage Users
- Mitchell Admin
- Sales: User: own documents only
- Go to the Serial Numbers list view:
- Try to open SN1
**Problem:**
An access error is triggered:
```
Uh-oh! Looks like you have stumbled upon some top-secret records.
Sorry, Mitchell Admin (id=2) doesn't have 'read' access to:
- Sales Order Line, S00025 - P1 (Deco Addict) (sale.order.line: 51)
Blame the following rules:
- Personal Order Lines
```
When clicking on SN1, the `stock.lot` form view.
it's contains the field "sale_order_count", which is a computed field that needs to access all `sale.order` records using the serial number in order to compute the count.
Since Mitchell Admin is restricted to his own sales orders only, an access error is raised during the computation.
There is also a many2many view widget that triggers an access errors. This widget can be removed since the smart button is now available. The widget has already been removed in v19.
**Solution:**
In this view, any stock user, admin or not, must be able to see how many sales orders use a given serial number, regardless of whether those sales orders belong to them or not.
opw-5400731This update fixes a bug where the Delivery Date wasn't appearing on the DIN 5008 sale order report and its preview. The change ensures that this critical date is now correctly displayed, as confirmed by functional experts, allowing for accurate reporting according to DIN 5008 standards. This improves data visibility for sales and accounting processes.
Original PR description
**Steps to reproduce:** 1. Install modules `sale_management` and `l10n_din5008_sale` 2. Go to Settings, Configure Document Layout and set layout to DIN 5008 3. Create a new Sale Order 4. Set a…
**Steps to reproduce:** 1. Install modules `sale_management` and `l10n_din5008_sale` 2. Go to Settings, Configure Document Layout and set layout to DIN 5008 3. Create a new Sale Order 4. Set a customer, add a product, and fill in the Delivery Date (Other Info) 5. Click on Print and Preview **Issue:** The Delivery Date (commitment_date) is not displayed on: - The DIN 5008 sale order report - The sale order preview (portal view) Functional experts confirmed that the Delivery Date must be visible when using the DIN 5008 layout. **Cause:** The `commitment_date` field was not included in the DIN 5008 sale order report template nor in the preview view. **Solution:** This commit adds the Delivery Date information to: - The DIN 5008 sale order report template - The sale order portal/preview view **opw-5490651** **Before:** <img width="560" height="145" alt="image" src="https://github.com/user-attachments/assets/fb29cda1-d668-4682-aa04-12c613f248d8" /> <img width="861" height="268" alt="image" src="https://github.com/user-attachments/assets/615f259f-e0ff-4fb5-9852-1fdd75cda4c9" /> **After:** <img width="589" height="145" alt="image" src="https://github.com/user-attachments/assets/3f1a8d25-783a-4600-b07e-11b547bb326b" /> <img width="824" height="271" alt="image" src="https://github.com/user-attachments/assets/46b37469-5c72-4556-95e2-eaea0824c166" />
This update prevents users from selecting payment method lines from archived journals when creating or editing contacts. Previously, users could inadvertently use outdated payment methods. Now, archiving a journal automatically removes it from the selectable options, simplifying journal management and preventing data inconsistencies.
Original PR description
**Description of the issue/feature this PR addresses:** When selecting a payment method line on a contact, lines related to journals still appear even if the journal has been archived. This can lead…
**Description of the issue/feature this PR addresses:**
When selecting a payment method line on a contact, lines related to journals still appear even if the journal has been archived. This can lead to the accidental use of payment method lines that should no longer be available. There should be no need to delete payment method lines when archiving a journal; doing so causes a loss of configuration if the journal is reactivated later, and leads to data duplication when having to recreate them.
**Current behavior before PR:**
When selecting a payment method line on a contact, lines from archived journals are still visible. Currently, payment method lines must be manually deleted from archived journals to prevent them from appearing in the selection list.
Payment Method Line domain doesn't include `('journal_id.active', '=', True)` domain part.
**Desired behavior after PR is merged:**
Archiving a journal is now sufficient to stop its payment method lines from appearing as selectable options on contacts.
https://www.loom.com/share/05981419c7dd4584b67d27d84e27892a
OPW-5413309 MT-13011 @moduon @rafaelbn @EmilioPascual @Gelojr @yajo please review if you want 😄
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update corrects a bug in the l10n_es_edi_facturae module that resulted in incorrect tax calculations when negative amounts (like discounts) were used on invoices. The previous fix introduced an issue where the absolute value of amounts was incorrectly applied, leading to inaccurate VAT and withholding tax totals. This change ensures accurate tax calculations for all invoice scenarios, including those with discounts.
Original PR description
Issue: When using negative amounts, for example to explicitly show a discount, the tax calculation is incorrect due to the application of the `abs` function. Furthermore, the way to find out if a tax…
Issue:
When using negative amounts, for example to explicitly show a discount, the tax calculation is incorrect due to the application of the `abs` function. Furthermore, the way to find out if a tax is of the withholding type is based on the sign of the value, which can lead to error in these cases.
Cause:
A previous change (#237235) added the `abs` function so the `TotalTaxesWithheld` would be always with positive value. But this also affects the calculation of taxes `TotalTaxOutputs` in some cases, such as if the invoice line has negative values.
Steps to reproduce:
- Install `l10n_es_edi_facturae`
- With the ES company, create an invoice with some standard lines and one line with negative amounts, as an explicit discount
- Confirm the invoice and send (facturae)
- Open the XML attached in the chatter
- Observe that the taxes amounts (VAT and WITHHOLDING) are erroneous
A correct invoice should be for example:
```
Product Price Taxes Amount
---------------------------------------------
PRODUCT-A 1000 21%VAT 15%WHI 1000
Discount -100 21%VAT 15%WHI -100
---------------------------------------------
Untaxed amount 900
Withholding 15% -135
VAT 21% 189
-----------------------
TOTAL 954
```
This PR replaces #240808
---
I confirm I have signed the [CLA](https://github.com/odoo/odoo/pull/157955) and read the PR guidelines at www.odoo.com/submit-prThis update resolves a performance issue in the timesheet report that prevented it from loading with large datasets. The team optimized the query by using a more efficient join method (CROSS LATERAL JOIN) to reduce the amount of data processed, resulting in a faster loading time of approximately 2 seconds. This improves the user experience for reports with many records.
Original PR description
After this commit https://github.com/odoo-dev/enterprise/commit/6c33bde74342b634d9f6fbda4ef407ffe9bac54f we introduced a new left join which seems that it slowed down the query a lot. So the report doesn't load at all if we have a lot of records. In this PR we are introducing CROSS LATERAL JOIN as we want to generate only the the relevant dates not all dates between the min starting date and max ending date of all slots. Query plan after modification https://explain.dalibo.com/plan/eh5293ba2354f43c The testing cardinality of the tables: `planning.slot` 7178 rows `hr.employee` 332 rows `resource.resource` 332 rows `resource_calendar_leaves` 4061 rows `account_analytic_line` 267376 rows `generate_series()` will produce 206417 rows | Before | After | |-----------------------------------------|-------| | Query keep being active with no results | ~2s | opw-5089052 Forward-Port-Of: odoo/enterprise#102283
This update fixes an issue where the IoT Box was incorrectly downloading standard drivers, leading to potential conflicts and outdated versions. To allow custom driver development, a checkbox was added, but this caused unnecessary duplication and the risk of reintroducing previous bugs. Now, the system avoids downloading standard drivers to ensure stability.
Original PR description
The stable IoT Box uses drivers from git repository: it doesn't download them from the database as it used to do. However, sh/on premise clients might want to develop custom drivers that the IoT Box would download. For that, they have to enable a checkbox on the IoT homepage, making the IoT Box download handlers as before. The issue is it will also download standard drivers that are already present on the IoT Box: on newer databases it would simply overwrite them, but on older ones, it would duplicate as names might have changed. Also, it would introduce issues back that were already fixed. To avoid this, we avoid adding drivers from standard modules to the downloaded archive, to prevent issues with the main ones. Forward-Port-Of: odoo/enterprise#105531
This update fixes an issue where the product quantity and unit of measure fields on the MRP production kanban cards would shrink and become unreadable when product names were long. The changes ensure these fields remain consistently sized regardless of product name length, improving readability and usability.
Original PR description
Description of the issue/feature this PR addresses: On MRP production kanban, if the name of the product is too long, `product_qty` and `product_uom_id` fields on the card shrink and become unreadable. This adds proper classes to keep those fields from shrinking no matter how long product's name is. Current behavior before PR: <img width="1561" height="303" alt="image" src="https://github.com/user-attachments/assets/08e299be-c6e2-4241-b289-aaa2fab9a94f" /> Desired behavior after PR is merged: - The size of the product's name should be fine no matter how long the name of the product is. - The `product_qty` and `product_uom_id` should not shrink if the name of the product is long. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a bug that occurred when scheduling repair orders without a product assigned to a move line. Specifically, updating the scheduled date triggered an error related to unit of measure calculations. This fix ensures repair scheduling functions correctly, preventing disruptions to the repair workflow.
Original PR description
An error occurs when the product is not set in the repair move line, and the Scheduled Date is being updated. **Steps to Reproduce:** - Install the **Repairs** module. - Create a new **Repair Orders**. - Add a product and confirm the repair. - In the **Parts** tab, **add a new line** and change the **demanded** quantity without selecting a product. - Update the **Scheduled Date**. **Error:** `AssertionError: precision_rounding must be positive, got 0.0` `ValueError: Expected singleton: uom.uom()` (v19.0) When the move line has no `product_id`, its Unit of Measure (uom_id) is also empty. Updating the scheduled date triggers a computation, which leads to the error.
This update resolves an issue where sale orders with incomplete partner addresses in Mexico prevented online payments. The fix automatically enables 'CFDI to Public' when the address is missing, ensuring transactions are validated and payments are correctly recorded. This improves the reliability of payment processing for Mexican customers.
Original PR description
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent…
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent error occurred during move validation: the transaction was created, but the payment was never recorded, and no error appeared in the portal or the SO chatter ### Cause: The CFDI validation error is raised internally but never surfaced to the user https://github.com/odoo/enterprise/pull/91655 The PO (MIAL) recommended automatically enabling `CFDI to Public` when the partner address is incomplete, forcing the user to complete the data This also ensures that the payment can be confirmed properly ### Steps to reproduce: - Install `l10n_mx_edi_sale` and switch to the MX company - Configure a Payment Provider and Payment Method (e.g., demo) - Create a customer without ZIP or country - Create a Sale Order for that customer - In Other Info, set Online Payment to 100% - Send the quotation and open the link in a private window - Sign and Pay Before the fix: the transaction is created, but no payment is recorded, and no error is shown opw-5023724
This update resolves an issue where Odoo couldn't connect to printers with overly long names. The fix truncates the printer name to a maximum of 127 characters, preventing a CUPS error and ensuring reliable printer connectivity. This improves the overall usability of the printer functionality.
Original PR description
CUPS has a limit on printer names of 127 characters, which means that if a device has a very long device URI, it can exceed this limit and cause an error when we try to add it to CUPS:
```
Failed to add printer 'dnssdPhotosmart%207520%20series%20%40%20Guillaume%E2%80%99s%20MacBook%20Air%20(2)_ipp_tcplocalcups?96d0de60-096c-3d08-5e2d-893393e10c2b'
Traceback (most recent call last):
File "/home/pi/odoo/addons/iot_drivers/iot_handlers/interfaces/printer_interface_L.py", line 242, in set_up_printer_in_cups
self.conn.addPrinter(name=device['identifier'], device=device['url'], **ppdname_argument)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cups.IPPError: (1024, 'client-error-bad-request')
```
We fix this error by truncating the identifier to 127 characters maximum.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves a bug where the 'Not Sent' filter in payment views incorrectly displayed or returned no results. The fix ensures this filter accurately identifies and displays payments that haven't been processed, providing users with a reliable view of pending actions.
Original PR description
The "Not Sent" filter in Payments list view was not returning the expected records. This was due to an incorrect domain condition in the search view. This commit updates the filter logic to properly…
The "Not Sent" filter in Payments list view was not returning the expected records. This was due to an incorrect domain condition in the search view. This commit updates the filter logic to properly identify payments that haven't been processed or sent, ensuring the filter displays the correct records to the user. **Description of the issue/feature this PR addresses:** This PR fixes a bug in the "Not Sent" search filter within the Payment views (Account Payments). Currently, the filter fails to accurately identify and display records that have not been sent, leading to an empty or incorrect list of results regardless of the sending payment's actual status. **Current behavior before PR:** When a user applies the "Not Sent" filter in the Payments list view (including both Customer and Vendor payments), the system returns incorrect records or no records at all. This is caused by an inconsistent domain definition that doesn't align with the internal field tracking the "sent" status of the payment. **Desired behavior after PR is merged:** The "Not Sent" filter will correctly filter the list to show only those payments where the "Sent" status is not True. This will provide users with an accurate view of pending actions for both Customer and Vendor payments, ensuring consistency across the accounting module. **Steps to reproduce:** 1. Navigate to the Accounting (or Invoicing) module. 2. Go to Vendors > Payments or Customers > Payments (the issue is global). 3. Ensure there are several payments in the list, some marked as "Sent" and others not yet sent. 4. Click on the Filters dropdown menu in the search bar. 5. Select the "Not Sent" filter. 6. Observe the results: Notice that the list either becomes empty or continues to show records that do not match the "Not Sent" criteria, failing to filter the data correctly. **video** https://drive.google.com/file/d/1NTKQ1tHWyZWfs3CPolfDTOMrqaDD9OcN/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
3 changes
Resolved issues and error corrections
This update ensures that when a user confirms an upsell on a subscription, all remaining alternative quotations are automatically cancelled. Previously, only the confirmed upsell was processed, leaving other upsells in a pending state. This improves the subscription management process and prevents unnecessary orders.
Original PR description
Currently, when creating multiple upsells for a specific subscription, confirming one of them leaves the others in the sent state instead of cancelling them. This fix ensures that all other upsells for the same subscription are cancelled once one upsell is confirmed. task-5270139
This update corrects a formatting issue that occurred when removing fields from view security access. Previously, text after the removed field was not preserved, leading to inconsistent view layouts. This change ensures that views remain properly formatted even after security restrictions are applied.
Original PR description
In a view, if a field is removed due to security access restrictions, the text that follows it is not preserved. This leads to inconsistencies in the view. opw-5798852
This update resolves a memory issue that occurred when exporting large financial reports (FEC) from Odoo. By streaming the export data instead of loading the entire file into memory, the system now handles large databases more efficiently, preventing errors and improving performance.
Original PR description
On large databases (millions of account moves), The FEC exported file can be huge. This resulted in memory error since at some point we have the entire file in memory. This commit aims to overcome this issue by streaming the content of the file to the user. task-5404142 Forward-Port-Of: odoo/odoo#240981