Daily updates from Odoo
Navigate
Branch
Monday, November 17, 2025
229 changes
11 changes
Resolved issues and error corrections
This update corrects how withholding taxes on payments are reflected in Philippine report amounts. It ensures the reported figures match the expected totals, reducing discrepancies in compliance and financial reporting.
Original PR description
Partially backport the rework from 19 in order to ensure withholding taxes on payment affect the amounts as expected. Community PR: odoo/odoo#226794 Ref 19.0 Community: odoo/odoo#218090 Ref 19.0 Enterprise: odoo/enterprise#89830 Task [link](https://www.odoo.com/odoo/project.task/5081387) task-5081387 Forward-Port-Of: odoo/enterprise#94541
This update fixes how withholding taxes are applied when a payment is made, so the reported amounts now match the expected values. It helps ensure Philippine tax reports are more accurate and consistent with payment processing.
Original PR description
Partially backport the rework from 19, in order to ensure withholding taxes on payment affect the amounts as expected. Enterprise PR: odoo/enterprise#94541 Ref 19.0 Community: odoo/odoo#218090 Ref 19.0 Enterprise: odoo/enterprise#89830 Task [link](https://www.odoo.com/odoo/project.task/5081387) task-5081387 Forward-Port-Of: odoo/odoo#226794
This update fixes an error that could appear when users enter certain barcode numbers in the barcode scanning screen. It ensures the system returns the expected information format, preventing crashes and allowing barcode scans to be processed normally.
Original PR description
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature`…
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature` - Barcode > click on `Scan or tap` > Enter a barcode(barcode number should startwith `urn` (eg: "urn:epc:tag:sgtin-96 : 3.0614141.038656.0")) > Apply Traceback: --- `KeyError: 'rule'` (with GS1 Nomenclature) `AttributeError: 'list' object has no attribute 'get'` (without GS1 Nomenclature) At [1], we expect the key `rule` to be present in the result, but this key is never set in the return statement at [2]. Since [1] also relies on the result’s type, a new key value `type` has been added in this [commit] to address that. This commit ensures that the correct keys are passed in the result dictionary. [1]- https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/stock_barcode/controllers/stock_barcode.py#L29-L31 [2]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/barcodes/models/barcode_nomenclature.py#L174-L189 [commit]: https://github.com/odoo/odoo/commit/1394fa161a6fcf77b4443cbf784ad7dd635e7f9e#diff-be2a58d0591614180295c070396ff487f4bc04bf33aad2829d7bfab4671a792cR60 sentry-6992944243 Forward-Port-Of: odoo/enterprise#98761
This change brings back missing contact information in the Swiss payroll transmission flow. It helps ensure employee records are complete when payroll data is sent, reducing the risk of issues caused by incomplete contact details.
Original PR description
task-5248986 Forward-Port-Of: odoo/enterprise#99401
Regular users can now create Global Invoices in Mexico without running into an access error on attachments. This prevents a blocked workflow for demo and other non-admin users while keeping the invoice creation process working as expected.
Original PR description
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the…
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the attachment creation to use the SUPERUSER: https://github.com/odoo/enterprise/pull/95197 However, updating `attachment.res_id` then required `base.group_system` access rights, preventing regular users from modifying the attachment As a result, non-admin users (like demo) triggered an access error during Global Invoice creation ## Steps to reproduce: - Switch to the MX company - Create a product with an UNSPSC Category (Accounting Tab) - Create and Confirm an Invoice for the product (enable CFDI to public) - Connect as Demo - Go in Accounting > Customers > Invoices - Toggle the last created invoice checkbox - Actions > Create Global Invoice - Before the fix, the Access Error is displayed - Check in the invoice Chatter for the Global CFDI document creation success opw-5181925 Forward-Port-Of: odoo/enterprise#98218
The VoIP contact search now skips the mobile-phone lookup until the user has typed at least three characters. This prevents an error from appearing when someone starts typing a phone number and makes the search feel smoother and more reliable.
Original PR description
`phone_mobile_search` doesn't allow you to search for less than 3 characters. This commit excludes `phone_mobile_search` from the search domain when there are less than 3 characters. This avoids triggering an UserError on the first characters typed. Forward-Port-Of: odoo/enterprise#99548
This change prevents large memory spikes when importing French accounting files (FEC). Odoo now loads only the partner information needed to match records, instead of preloading all partner data, which helps the import complete more reliably on large databases.
Original PR description
### Description: When importing an FEC, Odoo will fetch all the partners to link the new imported records to the existing partners. The issue is that it triggers the prefetching of all the fields of the partners (304k partners in their case), causing a memory error. To avoid that, we can just fetch the field that we need (e.g. "name" and "ref"). ### Reference: opw-5153555 Forward-Port-Of: odoo/enterprise#98483
This fix resolves an error that could happen when users add a shape to an image picked from Unsplash after searching with multiple words. The image link is now handled correctly, so the editor can process the image without failing.
Original PR description
Steps to reproduce: =================== - Connect Unsplash to your database - Add a snippet on your website page like "Feature wall" for example - Double click on an existing image - type at least…
Steps to reproduce: =================== - Connect Unsplash to your database - Add a snippet on your website page like "Feature wall" for example - Double click on an existing image - type at least two words separated by a space like "Sleeping cat" - select any image from the list. - Add a shape to this image -> Traceback Cause: ====== When an image is chosen from Unsplash using a multi-word search, its URL contains encoded characters (e.g., `%20` for a space). The image processing utility was extracting the `pathname` directly from the image's URL. This path, however, remained URL-encoded. This encoded path was then used in a subsequent RPC call to fetch the original image data before applying the shape. https://github.com/odoo/odoo/blob/b9435baa1948f54e19f2dd5702a39d073e8eb57d/addons/html_editor/static/src/utils/image_processing.js#L204 This caused the fetch operation to fail, returning an `undefined` value. The attempt to apply a shape to this `undefined` result is what triggered the traceback. Solution: ========= The `srcUrl.pathname` is now wrapped in `decodeURIComponent()`. This function correctly decodes URL-encoded sequences (like `%20`) back into their original characters before the path is sent to the server. The backend now receives a clean, valid path, resolving the traceback. opw-5241317 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents AI chat issues when a user closes a conversation before the answer arrives. Instead of crashing or sending the reply to a new, unrelated chat, the system now handles the closed conversation correctly.
Original PR description
If a user sends a message to an ai agent and then closes the chat channel before receving the response, - For AI composer channels (channels opened through AI chatter button) an error occurs. - For…
If a user sends a message to an ai agent and then closes the chat channel before receving the response, - For AI composer channels (channels opened through AI chatter button) an error occurs. - For other AI channels, A new ai chat channel gets created and the response is posted to that channel instead of the deleted one. Cause of the Issue : When the channel is deleted, a serialization error occurs because one transaction is trying to delete the channel while the other is trying to post the ai response to the channel. The delete transaction finishes execution and the response generation transaction is retried. - For AI composer channels some fields of the deleted channel are accessed inside `_ai_add_message_to_context` and `_ai_create_response` which raises an error. - For other AI channels, when generate_response is retried,_get_or_create_ai_chat is called and given that the old channel has already been deleted, a new one is created and the response is posted to that channel. Note: No issue will happen if the response generation transaction is executed and the deletion transaction is retried, because it will delete the channel after the response was posted which is a normal behavior. task-5063221 Forward-Port-Of: odoo/enterprise#93877
This update corrects the way fixed local taxes are written into Mexican electronic invoices (CFDI). It prevents the tax amount from being multiplied by 100, ensuring the XML shows the right value and reducing the risk of rejected or incorrect invoices.
Original PR description
Steps to reproduce: 1. With an MX Company setup configure a new tax as follows - Tax Computation: Fixed - SAT Tax Type: Local - Factor Type: Cuota - Amount: 5 2. Create a customer invoice with the tax 3. Generate CFDI Issue: In the XML the ImpuestosLocales node contains `<implocal:TrasladosLocales ImpLocTrasladado="VAT 0%" Importe="20.00" TasadeTraslado="500.00"/>` The tax fixed amount was multiplied by 100 This occurs because we don't check if the tax is fixed when normalizing the amount opw-5132807 Forward-Port-Of: odoo/enterprise#99431 Forward-Port-Of: odoo/enterprise#98988
Invoice generation for subscriptions now works even if a previously invoiced order line was deleted. This prevents a billing error that could stop customers from creating new invoices, while keeping the existing partial credit note behavior intact.
Original PR description
**Issue** When a subscription order line is deleted after being invoiced, attempting to create a new invoice for the subscription raises a UserError about UoM category mismatch. Video:…
**Issue** When a subscription order line is deleted after being invoiced, attempting to create a new invoice for the subscription raises a UserError about UoM category mismatch. Video: https://drive.google.com/file/d/11-CV7wcEHQJFoVEQM5o5YBkZuTXPYDqL/view **Steps to Reproduce** 1. Create and confirm a subscription with a recurring product (e.g., Car Leasing) 2. Generate and post the invoice for the subscription 3. Add a new product line to the subscription (e.g., Office Cleaning Service) 4. Delete the original invoiced line (Car Leasing) 5. Attempt to create an invoice for the new product line → Error: "The unit of measure Units defined on the order line doesn't belong to the same category as the unit of measure False defined on the product. Please correct the unit of measure defined on the order line or on the product, they should belong to the same category." (https://drive.google.com/file/d/11-CV7wcEHQJFoVEQM5o5YBkZuTXPYDqL/view) **Root Cause** Commit https://github.com/odoo/enterprise/commit/22e49fca1e0fbfefac974c562491d170b8d70025 introduced quantity tracking per period in _get_max_invoiced_date() to fix partial credit note handling. The implementation accesses `sale_line_ids.product_uom` assuming sale_line_ids is always populated. However, when a sale order line is deleted, the related account.move.line remains in the system with empty sale_line_ids. Accessing `sale_line_ids.product_uom` on an empty recordset returns False, causing the UoM validation to fail during invoice creation. **Fix** Add a fallback to use the invoice line's own product_uom_id when sale_line_ids is empty. This preserves the partial credit note fix from https://github.com/odoo/enterprise/commit/22e49fca1e0fbfefac974c562491d170b8d70025 while handling the edge case of deleted subscription lines. If no valid UoM is found, the line is skipped in the calculation. Forward-Port-Of: odoo/enterprise#99497 Forward-Port-Of: odoo/enterprise#99231
14 changes
Resolved issues and error corrections
This fix updates how Philippine withholding taxes are handled when payments are made, so the reported amounts are calculated as expected. It helps ensure financial reports and tax figures stay accurate when payment-based withholding applies.
Original PR description
Partially backport the rework from 19, in order to ensure withholding taxes on payment affect the amounts as expected. Enterprise PR: odoo/enterprise#94541 Ref 19.0 Community: odoo/odoo#218090 Ref 19.0 Enterprise: odoo/enterprise#89830 Task [link](https://www.odoo.com/odoo/project.task/5081387) task-5081387 Forward-Port-Of: odoo/odoo#226794
This update corrects how withholding taxes on payments are reflected in Philippine tax reports. It ensures the reported amounts match what businesses expect, reducing discrepancies in tax reporting and reconciliation.
Original PR description
Partially backport the rework from 19 in order to ensure withholding taxes on payment affect the amounts as expected. Community PR: odoo/odoo#226794 Ref 19.0 Community: odoo/odoo#218090 Ref 19.0 Enterprise: odoo/enterprise#89830 Task [link](https://www.odoo.com/odoo/project.task/5081387) task-5081387 Forward-Port-Of: odoo/enterprise#94541
This change fixes an error that could occur when users entered specific barcode numbers in the barcode scanning screen. It ensures the system reads the barcode result correctly, preventing crashes and allowing the scanning flow to continue normally.
Original PR description
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature`…
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature` - Barcode > click on `Scan or tap` > Enter a barcode(barcode number should startwith `urn` (eg: "urn:epc:tag:sgtin-96 : 3.0614141.038656.0")) > Apply Traceback: --- `KeyError: 'rule'` (with GS1 Nomenclature) `AttributeError: 'list' object has no attribute 'get'` (without GS1 Nomenclature) At [1], we expect the key `rule` to be present in the result, but this key is never set in the return statement at [2]. Since [1] also relies on the result’s type, a new key value `type` has been added in this [commit] to address that. This commit ensures that the correct keys are passed in the result dictionary. [1]- https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/stock_barcode/controllers/stock_barcode.py#L29-L31 [2]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/barcodes/models/barcode_nomenclature.py#L174-L189 [commit]: https://github.com/odoo/odoo/commit/1394fa161a6fcf77b4443cbf784ad7dd635e7f9e#diff-be2a58d0591614180295c070396ff487f4bc04bf33aad2829d7bfab4671a792cR60 sentry-6992944243 Forward-Port-Of: odoo/enterprise#98761
This fix removes an access problem that could stop non-admin users from creating Global Invoices in the Mexican e-invoicing flow. It ensures the process completes normally for standard users, so teams can generate these documents without needing elevated permissions.
Original PR description
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the…
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the attachment creation to use the SUPERUSER: https://github.com/odoo/enterprise/pull/95197 However, updating `attachment.res_id` then required `base.group_system` access rights, preventing regular users from modifying the attachment As a result, non-admin users (like demo) triggered an access error during Global Invoice creation ## Steps to reproduce: - Switch to the MX company - Create a product with an UNSPSC Category (Accounting Tab) - Create and Confirm an Invoice for the product (enable CFDI to public) - Connect as Demo - Go in Accounting > Customers > Invoices - Toggle the last created invoice checkbox - Actions > Create Global Invoice - Before the fix, the Access Error is displayed - Check in the invoice Chatter for the Global CFDI document creation success opw-5181925 Forward-Port-Of: odoo/enterprise#98218
The FEC import process now retrieves only the partner details it needs instead of loading all partner data at once. This prevents memory errors on very large databases and makes imports more reliable.
Original PR description
### Description: When importing an FEC, Odoo will fetch all the partners to link the new imported records to the existing partners. The issue is that it triggers the prefetching of all the fields of the partners (304k partners in their case), causing a memory error. To avoid that, we can just fetch the field that we need (e.g. "name" and "ref"). ### Reference: opw-5153555 Forward-Port-Of: odoo/enterprise#98483
This change ensures the Uruguay EDI always calculates exchange rates against the Uruguayan Peso (UYU), no matter which currency the company uses. It prevents inconsistent tax and invoice reporting by making the rate calculation reliable for all non-UYU currencies.
Original PR description
This PR fixes the currency rate calculation in the Uruguay EDI module to always compute the rate relative to UYU (Uruguayan Peso) regardless of the company's base currency. * Replaces the previous logic that calculated rates based on company currency with a direct UYU conversioni * Simplifies the rate calculation by removing the amount-based fallback logic * Ensures consistent UYU rate computation for all non-UYU currencies LATAM Task 1358 / Adhoc task 51716 Forward-Port-Of: odoo/enterprise#99374 Forward-Port-Of: odoo/enterprise#93144
This update prevents an error that could block invoicing when a previously billed subscription line has been deleted. It keeps invoice generation working normally by using the available product unit information, so subscriptions can continue without interruption.
Original PR description
**Issue** When a subscription order line is deleted after being invoiced, attempting to create a new invoice for the subscription raises a UserError about UoM category mismatch. Video:…
**Issue** When a subscription order line is deleted after being invoiced, attempting to create a new invoice for the subscription raises a UserError about UoM category mismatch. Video: https://drive.google.com/file/d/11-CV7wcEHQJFoVEQM5o5YBkZuTXPYDqL/view **Steps to Reproduce** 1. Create and confirm a subscription with a recurring product (e.g., Car Leasing) 2. Generate and post the invoice for the subscription 3. Add a new product line to the subscription (e.g., Office Cleaning Service) 4. Delete the original invoiced line (Car Leasing) 5. Attempt to create an invoice for the new product line → Error: "The unit of measure Units defined on the order line doesn't belong to the same category as the unit of measure False defined on the product. Please correct the unit of measure defined on the order line or on the product, they should belong to the same category." (https://drive.google.com/file/d/11-CV7wcEHQJFoVEQM5o5YBkZuTXPYDqL/view) **Root Cause** Commit https://github.com/odoo/enterprise/commit/22e49fca1e0fbfefac974c562491d170b8d70025 introduced quantity tracking per period in _get_max_invoiced_date() to fix partial credit note handling. The implementation accesses `sale_line_ids.product_uom` assuming sale_line_ids is always populated. However, when a sale order line is deleted, the related account.move.line remains in the system with empty sale_line_ids. Accessing `sale_line_ids.product_uom` on an empty recordset returns False, causing the UoM validation to fail during invoice creation. **Fix** Add a fallback to use the invoice line's own product_uom_id when sale_line_ids is empty. This preserves the partial credit note fix from https://github.com/odoo/enterprise/commit/22e49fca1e0fbfefac974c562491d170b8d70025 while handling the edge case of deleted subscription lines. If no valid UoM is found, the line is skipped in the calculation. Forward-Port-Of: odoo/enterprise#99497 Forward-Port-Of: odoo/enterprise#99231
This fix brings back missing contact information in the Swiss payroll employee transmission screen. It helps ensure the data needed for payroll communication and submission is available again without manual workarounds.
Original PR description
task-5248986 Forward-Port-Of: odoo/enterprise#99401
This change fixes a crash that could happen when users pressed backspace while editing the people assigned to a task. It helps prevent unexpected errors during everyday task management and keeps the interface stable.
Original PR description
How to reproduce: - Go to project tasks - Edit the list of people assigned to a task - Press backspace Current behavior: Traceback Expected behavior: No traceback task-5189783
This change sends the database identifier to Odoo's internal service when SMS-related requests are made. It helps support teams more quickly identify and troubleshoot customer issues without changing the user experience.
Original PR description
Send the db_uuid to IAP such that we can more easily debug and support our users in case of a problem. task-none Forward-Port-Of: odoo/odoo#235540 Forward-Port-Of: odoo/odoo#233912
When a lead’s sales team is changed, its stage is now automatically refreshed so it stays compatible with that team. This prevents leads from remaining in stages that should no longer be available, making team-based workflows more consistent and accurate.
Original PR description
**Steps to reproduce:** - Install CRM and set the Leads configuration setting - Go to CRM > Configuration > Sales Teams - Create two Sales Teams - Go to CRM > Configuration > Stages - Create multiple stages specific to each team - Make the current user belong to both teams - Go to CRM > Leads - Create a new lead (stage is assigned here) - Change its Sales Team - Lead stage is not updated according to the team **Issue:** The `stage_id` of `crm.lead` is never updated after it is set. This means that changing the related team will not modify the possible stages of the lead (even if it should not be available to the current team). **Fix:** Check if the team of the lead is the same as the one of its current stage during `_compute_stage_id`. opw-4901009 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232136
Users can now mention any member of a group chat even when replying inside one of its threads. This fixes a limitation that previously allowed mentioning only oneself in that context, making threaded conversations easier and more complete.
Original PR description
Before this commit, when inside a thread of a group chat, it would not be possible to mention channel members that are not inside said thread. Steps to reproduce: 1. Create group chat 2. Create a thread 3. Try to mention -> can only mention self This commit fixes the issue by: 1. In the `get_mention_suggestions_from_channel`: correctly adding in the store all partners inside the parent channel 2. In the suggestion service: taking the `channel_member_ids` from the `parent_channel_id` when present task-5233010 Forward-Port-Of: odoo/odoo#234887
The IoT box installation has been adjusted so it no longer tries to reinstall packages that are already provided by the system on newer Python versions. This helps the setup work more reliably on the latest Debian release and also updates a network component to reduce disconnects.
Original PR description
This commit stops installing the following packages when using Python 3.13 on the IoT box (they are already installed via apt): - num2words - polib - freezegun - PyKCS11 - PyPDF2 - urllib3 - zeep --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235748
Work order costs are now properly recorded even when an operation is marked as done directly from the status widget. This ensures project margin and analytic accounting reflect the true labor cost, preventing understated costs in reporting.
Original PR description
Backport of: 223ec6ac83ba2ec94f7ea394458aee0972bb8b44 **Original msg commit:** This commit fixes the problem of adding the hourly cost of the work center when marking an operation as done from the status widget. To reproduce the bug: 1- Create a work center with an hourly cost > 0. 2- Create an MO with 1 operation in that work center, expected time > 0. 3- Create and set a project on the MO. 4- Make sure that project has an analytic account. 5- Mark the operation as done from the status widget. (click on it and choose done, don't use the start button) 6- Go to the analytic account of the project and check the gross margin. = No cost of the workorder was added. Now, this commit takes into account the duration of the WO first when marking it as done directly from the status widget. opw-5170664 Forward-Port-Of: odoo/enterprise#99439
9 changes
New functionality added to Odoo
This update adds support for Uruguay’s electronic delivery guides (e-Remitos) in stock operations. Users can now generate and send compliant delivery documents, including corrections and addenda, with the resulting PDF returned through the EDI flow.
Original PR description
This pull request introduces a new Odoo module, which adds support for compliant electronic delivery guides (e-Remitos) for Uruguay, integrating with the EDI system and enhancing stock picking…
This pull request introduces a new Odoo module, which adds support for compliant electronic delivery guides (e-Remitos) for Uruguay, integrating with the EDI system and enhancing stock picking operations. The main changes include configuration for managing and generating e-Remitos according to Uruguayan fiscal requirements. **Steps to create an e-Remito** 1. Install l10n_uy_edi_stock 2. Create a new delivery order. 3. Select a value for the field "Type of Operation". This will indicate that we are creating the electronic document, and also add a tab named "UY EDI" with some configurations for the e-Remito. <img width="1231" height="585" alt="image" src="https://github.com/user-attachments/assets/c4c0baa8-8f9b-4453-b0c0-ce1b1503c536" /> <img width="1211" height="565" alt="image" src="https://github.com/user-attachments/assets/c827f787-27ed-4d55-a660-42a6b617e7df" /> The field "Addenda and disclosures" works as in invoices, the user will be able to select the addenda to add to the e-Remito report. The field "EDI Reference" is used to indicate that the e-Remito is a correction of another, so it will suggest previous e-Remitos made for the same partner, and it will add "Correction of e-Rem XXX" on the addenda. 4. Validate the delivery order and click on "Create Delivery Guide" button. This will send the document to DGI for validation and add the PDF returned by Uruware. <img width="1705" height="618" alt="image" src="https://github.com/user-attachments/assets/8bb36b08-ab08-4240-b3bb-f593a7f2a462" /> Odoo Task 1334 Adhoc Task 53147 Forward-Port-Of: odoo/enterprise#89706
Enhancements to existing features
This update prevents FEC imports from using excessive memory when matching imported entries to existing partners. Odoo now loads only the partner details needed for the match, which helps large imports complete more reliably.
Original PR description
### Description: When importing an FEC, Odoo will fetch all the partners to link the new imported records to the existing partners. The issue is that it triggers the prefetching of all the fields of the partners (304k partners in their case), causing a memory error. To avoid that, we can just fetch the field that we need (e.g. "name" and "ref"). ### Reference: opw-5153555 Forward-Port-Of: odoo/enterprise#98483
Resolved issues and error corrections
This update fixes how withholding taxes on payments are reflected in Philippine tax reports. It helps ensure the reported amounts match the actual taxes applied, reducing discrepancies in accounting and compliance reporting.
Original PR description
Partially backport the rework from 19 in order to ensure withholding taxes on payment affect the amounts as expected. Community PR: odoo/odoo#226794 Ref 19.0 Community: odoo/odoo#218090 Ref 19.0 Enterprise: odoo/enterprise#89830 Task [link](https://www.odoo.com/odoo/project.task/5081387) task-5081387 Forward-Port-Of: odoo/enterprise#94541
This change fixes an error that could appear when users enter a barcode manually in the barcode scanning flow, especially with GS1 barcodes. It ensures the barcode data is interpreted consistently so the barcode screen no longer crashes and users can continue their work normally.
Original PR description
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature`…
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature` - Barcode > click on `Scan or tap` > Enter a barcode(barcode number should startwith `urn` (eg: "urn:epc:tag:sgtin-96 : 3.0614141.038656.0")) > Apply Traceback: --- `KeyError: 'rule'` (with GS1 Nomenclature) `AttributeError: 'list' object has no attribute 'get'` (without GS1 Nomenclature) At [1], we expect the key `rule` to be present in the result, but this key is never set in the return statement at [2]. Since [1] also relies on the result’s type, a new key value `type` has been added in this [commit] to address that. This commit ensures that the correct keys are passed in the result dictionary. [1]- https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/stock_barcode/controllers/stock_barcode.py#L29-L31 [2]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/barcodes/models/barcode_nomenclature.py#L174-L189 [commit]: https://github.com/odoo/odoo/commit/1394fa161a6fcf77b4443cbf784ad7dd635e7f9e#diff-be2a58d0591614180295c070396ff487f4bc04bf33aad2829d7bfab4671a792cR60 sentry-6992944243 Forward-Port-Of: odoo/enterprise#98761
This fix removes an access error that could block non-admin users when creating a Global Invoice in the Mexican e-invoicing flow. Regular users can now complete the process successfully without needing elevated permissions, improving day-to-day accounting operations.
Original PR description
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the…
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the attachment creation to use the SUPERUSER: https://github.com/odoo/enterprise/pull/95197 However, updating `attachment.res_id` then required `base.group_system` access rights, preventing regular users from modifying the attachment As a result, non-admin users (like demo) triggered an access error during Global Invoice creation ## Steps to reproduce: - Switch to the MX company - Create a product with an UNSPSC Category (Accounting Tab) - Create and Confirm an Invoice for the product (enable CFDI to public) - Connect as Demo - Go in Accounting > Customers > Invoices - Toggle the last created invoice checkbox - Actions > Create Global Invoice - Before the fix, the Access Error is displayed - Check in the invoice Chatter for the Global CFDI document creation success opw-5181925 Forward-Port-Of: odoo/enterprise#98218
This update fixes an issue in the VoIP softphone where pressing backspace could fail when a phone number selection started at the first character. It restores the expected behavior so users can delete highlighted digits normally while keeping typing protection intact.
Original PR description
This commit fixes a regression introduced in commit [1] prevented deleting when a selection began at index 0; extend the guard so the numpad (keypad) backspace still removes the highlighted characters while keeping the cursor-safety logic. [1]: https://github.com/odoo/enterprise/commit/73b01fa5e1f56d4ab71d67760b15942fb2fa0e31 task-5217676 Forward-Port-Of: odoo/enterprise#99437 Forward-Port-Of: odoo/enterprise#99358
This update brings back contact information in the Swiss payroll eLM transmission form. It ensures the needed employee details are available again when preparing payroll communications, reducing the risk of incomplete submissions.
Original PR description
task-5248986 Forward-Port-Of: odoo/enterprise#99401
This change corrects how exchange rates are calculated in the Uruguay EDI module. It now always uses the Uruguayan Peso as the reference currency, which keeps electronic invoice data consistent no matter what currency the company uses internally.
Original PR description
This PR fixes the currency rate calculation in the Uruguay EDI module to always compute the rate relative to UYU (Uruguayan Peso) regardless of the company's base currency. * Replaces the previous logic that calculated rates based on company currency with a direct UYU conversioni * Simplifies the rate calculation by removing the amount-based fallback logic * Ensures consistent UYU rate computation for all non-UYU currencies LATAM Task 1358 / Adhoc task 51716 Forward-Port-Of: odoo/enterprise#99374 Forward-Port-Of: odoo/enterprise#93144
Fixed an issue where finishing a work order directly from the status widget could skip its labor cost. With this update, the system correctly includes the work order duration in project accounting, so margin and cost figures are accurate.
Original PR description
Backport of: 223ec6ac83ba2ec94f7ea394458aee0972bb8b44 **Original msg commit:** This commit fixes the problem of adding the hourly cost of the work center when marking an operation as done from the status widget. To reproduce the bug: 1- Create a work center with an hourly cost > 0. 2- Create an MO with 1 operation in that work center, expected time > 0. 3- Create and set a project on the MO. 4- Make sure that project has an analytic account. 5- Mark the operation as done from the status widget. (click on it and choose done, don't use the start button) 6- Go to the analytic account of the project and check the gross margin. = No cost of the workorder was added. Now, this commit takes into account the duration of the WO first when marking it as done directly from the status widget. opw-5170664 Forward-Port-Of: odoo/enterprise#99439
44 changes
New functionality added to Odoo
Spain’s Intrastat localization now includes the required filing schedules and deadlines for tax returns. This helps Spanish companies prepare Intrastat declarations on time and keeps the localization aligned with national reporting rules.
Original PR description
Introduce the country-specific periodicities and deadlines for Intrastat returns in the Spain localization, as part of the new tax return feature added in 18.3. This ensures that Spanish Intrastat reports comply with the national requirements and aligns the localization with other European implementations. Task-4987876 Forward-Port-Of: odoo/enterprise#92852
Enhancements to existing features
Payroll labels and descriptions were updated to improve clarity and consistency across the core payroll app and several country-specific payroll localizations. This helps payroll users see more accurate translated wording in day-to-day payroll setup and processing.
Original PR description
task-4571722
The point of sale payment screen now hides the remaining or change status when the amount is zero. This reduces unnecessary information at checkout and makes the payment flow clearer for cashiers.
Original PR description
Before this commit : ------------ - Payment screen always showed Remaining or Change even when the amount was 0. After this commit : --------------- - Payment screen no longer shows the status section when the amount is 0. ------------------------------------------------- Task-5266175 Related PR-https://github.com/odoo/odoo/pull/235929
Users now see a clear banner when a spreadsheet is in the trash, and they can restore it directly from the spreadsheet view. Trashed spreadsheets are protected from edits, helping prevent accidental work on files that were meant to be removed.
Original PR description
Current behavior before PR: - When a spreadsheet was moved to trash, it remained editable. - No banner or notification indicated that the file was in trash. - Users could not restore a trashed spreadsheet directly from the view. Desired behavior after PR is merged: - Rename `isReadonly` variable to `hasWriteAccess` for clarity - Trashed spreadsheets become read-only. - A banner is displayed indicating the file is in trash, with a button to take it out of trash. - Updates are not real-time for other active users, but editing a trashed file raises a UserError. Task: [5030282](https://www.odoo.com/odoo/2328/tasks/5030282)
Adds realistic sample data for field service tasks covered by warranty. This helps teams demonstrate and test how warranty-related service work should be handled in the system.
Original PR description
This commit introduces demo data specifically designed for tasks that are covered under warranty within the industry_fsm_sale module. The purpose of this addition is to enhance the testing and demonstration capabilities by providing realistic examples of how warranty-related tasks should be managed within the system. task: 3853356
Field service users can now open an itinerary or call a customer directly from Gantt and calendar schedule popovers. This reduces extra clicks and helps teams coordinate visits faster without opening each task form.
Original PR description
_ *: industry_fsm, voip, gantt In this commit, we have made the process smoother for FSM users. Now, they can directly open the map or make a call from the Gantt popover, so there is no need to open the form view. task-3617833
Field service task chatter now shows how far timer start and stop times are from the planned task dates. This makes it easier for users and managers to quickly see whether work time was tracked in line with the schedule.
Original PR description
Added the time difference between start and stop times in the FSM task chatter.this helps users easily identify whether the timer was used according to the planned dates. Example: - Timer started at: 01/23/2025 15:11:29 AM (hh:mm before/after the start date) - Timer stopped at: 01/23/2025 15:11:43 AM (hh:mm before/after the end date) task-4510245
When users enable Do Not Disturb, incoming calls no longer make the softphone pop up, reducing interruptions during focused work. The calling status text was also clarified so users can better understand when a call is still being placed.
Original PR description
Before this commit, enabling `Do Not Disturb` mode only muted incoming rings, but the softphone still popped up on incoming calls, which could be distracting. Now, when `Do Not Disturb` is active, the softphone is not displayed at all. task-5262271 Forward-Port-Of: odoo/enterprise#99409
Knowledge article links now open a preview popover instead of immediately navigating away, helping users confirm the target content before opening it. The update also improves article link previews by showing the correct title, supporting summaries and cover previews where available, and preventing crashes in link handling.
Original PR description
This PR addresses the following: - Updated command link appearance to use btn-secondary styling. - Fixed /link to correctly display titles in previews and prevent crashes. - Ensured clicking on article links triggers a proper link preview popover. Task-4624296
This update modernizes internal VoIP calling code by replacing an outdated programming utility. It helps keep call handling and AI-related VoIP features compatible with the latest platform standards without changing the user experience.
Original PR description
Commit [1] deprecated the `Deferred` util. This commit replaces its usage in voip apps. [1]: https://github.com/odoo/odoo/commit/2067b860d2168ff581434f21b49355af92d09780
UAE payroll now applies the latest GPSSA and ADPF pension contribution rules for national employees. Contributions are calculated using the employee enrolment date, company sector, salary thresholds, and the company’s emirate, improving compliance and payroll accuracy.
Original PR description
Purpose: - Update UAE social insurance calculation for nationals to comply with the latest GPSSA and ADPF rules, ensuring correct contribution rates based on employee enrolment date, sector type, gross salary thresholds, and emirate of the company. Changes: - Updated "Social Insurance Company Contribution" and "Social Insurance Employee Contribution" salary rules logic. - Changed emirate determination to use the company address instead of the employee's personal address. GPSSA (All Emirates except Abu Dhabi): - If Pension Enrolment Date is before 31 Oct 2023 → Employee: 5%, Company: 15% (non-private) / 12.5% (private). - If on or after 31 Oct 2023 → Employee: 11%, Company: 15% (non-private) / 12.5% (private, gross < 20k). ADPF (Abu Dhabi): - If Pension Enrollment Date is before 1 Dec 2023 → Employee: 5%, Company: 15%. - If on or after 1 Dec 2023 → Employee: 11%, Company: 15%. Task-4991327
The Attendance Gantt view has been adjusted so the right fields are shown or hidden based on the newly introduced access group. This helps ensure users see the attendance information appropriate to their permissions without changing core workflows.
Original PR description
Update the Gantt form view's visibility attributes to accommodate the newly added field based on the new access group. Task: 4815633
The Twitter/X user search in Odoo Social now uses a search-focused endpoint instead of only checking for an exact username match. This makes it easier for users to find and select the correct Twitter/X account when setting up or managing social accounts.
Original PR description
This commit changes the endpoint used in the twtitter_get_user_by_username method to allow the user to properly search for a user on Twitter/X. The old endpoint didn't allow a proper search as it only returned a singular element. This means that we didn't do a proper search per se but only checked if the username provided existed. By now using `/2/users/search`, the user can properly search for a specific user on Twitter/X. task-5170291
The Indian payroll dashboard now warns when employees are missing required LWF numbers, helping payroll teams catch compliance data gaps earlier. Demo data was also adjusted and a dashboard pay run label was clarified for a cleaner user experience.
Original PR description
Add a dashboard warning for missing employees with LWF numbers. Remove the ESIC number from the demo data of employee Alisha Sharma. Change the string of the dashboard payrun. task-5222433
Payroll officers can now see and manage employee contract offers directly from the employee form. This removes the need to grant recruitment permissions just so payroll teams can handle offer-related work.
Original PR description
Previously, the "Offers" smart button on the employee form was only available to recruitment users. This limited visibility for payroll officers who also need access to contract offers. This commit: - Changes the button visibility to `hr_payroll.group_hr_payroll_user` in `hr_employee_views.xml`. - Adds missing access rights in `ir.model.access.csv` for `hr.group_hr_user` (inherited by payroll users). - Updates the module manifest to include the new security CSV. The goal is to ensure payroll users can access and manage offers directly without requiring recruitment rights. task-5085078
The payroll dashboard warning now checks for duplicate payslips across all relevant payslips, not just those in the latest batch. This helps payroll teams spot potential duplicate payments more reliably before processing payroll.
Original PR description
- update the warning to include all the payslip not only the ones on the last batch Task: 5186729
Companies can now choose whether employee payslips are emailed when they are validated, when they are paid, or not sent automatically. This helps payroll teams align payslip delivery with local practices and company policies.
Original PR description
Currently, employees receive the payslips through email right when the payslip is validated (When the journal entry is created), but in some countries, that should not be the case, as they expect receiving the payslip after it is actually paid. This commit allows the company to decide when payslips are sent, either on validation or on payment or never. Task-ID: 5168943
The fleet mobility card field is now limited to Belgian payroll and fleet localization screens. This keeps country-specific employee and fleet information visible only where it applies, reducing confusion for users in other countries.
Original PR description
Added a the mobility card field to the belgian localisation to make it exclusive to belgium after removing it from the hr_employee common vue. task - 5176316 Community PR : 232873
The Payroll work entry type screens have been reorganized to make setup easier to understand, with clearer sections, labels, tooltips, placeholders, and useful list filters. The change also removes redundant internal fields and updates related payroll, attendance, planning, holidays, and localization logic so the new category-based setup stays consistent.
Original PR description
The Work Entry Type form view needed to be refactored. The form view is now split into new groups (computation, display, exports code, benegit eligibility and description). Tooltips and placeholders…
The Work Entry Type form view needed to be refactored. The form view is now split into new groups (computation, display, exports code, benegit eligibility and description). Tooltips and placeholders have been added to avoid further confusion of the fields, and some naming repetition has been removed (e.g.: "Partena Code" under the "Exports Code" group). Some hidden columns and some filters have been added to the list view. Here is a visualization of all the visual changes that needed to be done: https://app.excalidraw.com/l/65VNwvy7c4X/4LJSOZo8W3D `_is_unforeseen` (and anything related to it) has been deleted, since it was not used anywhere. After the UI cleanup, some views became unused. I had to remove them in migrations. `is_leave` (and its mirrror, `is_work`) are redundant, especially now that we want to use a selection field instead. So I had to remove them both and replace every single one of their occurences in the code by a new selection field named `category`. A migration making sure `category` reflects the old `is_leave` needed to be put in place. Due to having to do some back and forth in how to handle `is_work`, I found some issues (unused file, bad `querySelector`, etc.) with the `boolean_radio` widget. Fixes of this widget are thus included in this PR. task-5162567
Indonesian payroll benefit inputs are now handled through salary rules, aligning them with the newer flexible benefits system. This makes payroll configuration more consistent and keeps related payroll inputs together for easier administration.
Original PR description
purpose: adapting the new system of flexible benefits coming from salary rules for id localization - removed the records in `hr.payslip.input.type` and converted them into corresponding salary rules - changed the tests in `test_salary_rule` to use salary rules instead of other inputs task-id: 5122371
The Documents module tests now wait more reliably for error messages before checking them. This reduces random test failures in automated checks, helping teams trust build results and avoid unnecessary investigation time.
Original PR description
The `unhandledrejection` event is triggered asynchronously in JS. Once this event is triggered, the error is handled and an error dialog might be displayed, depending on the type or error being thrown. In several tests, after throwing an error, we only waited for an animation frame before asserting the presence of the error dialog. This only works if the `unhandledrejection` event is fired before the next animation frame, which isn't guaranteed. When it is not the case, the test fails because the error dialog is not there yet. We already had to fix that kind of issues multiple times, after impacted tests were caught failing non deterministically on runbot (e.g. [1][2][3]). This commit fixes several other occurrences of the faulty pattern, which haven't been spotted yet but could have non deterministically failed as well. [1] https://github.com/odoo/odoo/pull/178491 [2] https://github.com/odoo/odoo/pull/235446 [3] https://github.com/odoo/odoo/pull/235464
Removed unused access group markers from accounting-related client-side templates because they were not being applied there. This simplifies the code without changing what users see or how permissions work.
Original PR description
The `groups` attribute in used in the QWeb template to display nodes based on access groups. This attribute is only available on server-side templates. This commit removes the useless `groups` attributes from client-side (aka. `static`) templates as they are not applied anyway.
The payroll wording has been updated from "Salary Structure" to "Pay Structure" across payroll-related screens and documents. This makes the terminology clearer and more consistent for HR and payroll users without changing payroll calculations or business processes.
Original PR description
*: hr_contract_salary_payroll, l10n_in_hr_payroll - Renamed the "Salary Structure" label to "Pay Structure". task-5262042
This update refreshes the UAE payroll setup with clearer company demo data, adjusted payroll structures and salary rules, and an Emirati working schedule aligned with the local timezone. It also improves how work addresses are determined so payroll settings better follow the logged-in company.
Original PR description
The cleanup includes: -Changing the company name to "My Emirati company". -Adjustments in payroll structures and salary rules. -New working schedule for Emirati company has been created to follow the Emirati timezone. -Improvements in the payroll module description. -Editing the logic behind the work address calculation to follow the logged-in company.
The Belgian payroll 273S report is easier to use with clearer year display, faster line creation, and improved generate buttons. These changes reduce confusion and streamline report preparation for payroll users, while ensuring records are linked to the correct company.
Original PR description
- Corrected display of Year field (removed thousand separators formatting) - New button now adds a new line directly - Extended binary_field widget to a custom widget for generate buttons - Added company id field - task-5167073
The Indian Payroll Reports menu has been reorganized so report entries appear in alphabetical order. This makes the list cleaner, easier to scan, and more consistent for payroll users.
Original PR description
Before: - The menu item of Indian Payroll Reports was not in order. After: - Arranged all Indian Payroll Reports in alphabetical order. Impact: - Keeps the reports list clean and consistent. task-5222845
Resolved issues and error corrections
Regular users can now receive VoIP calls without the system crashing when contact details are matched to the call. The fix keeps call records protected from user tampering while allowing the application to update the linked contact safely.
Original PR description
In order to prevent users from tampering with their voip.call records, they aren't given direct write access to them. This leads to crashes in the get_contact_info function, which attempts to update the partner_id field of call records. This commit resolves the issue by switching to sudo mode for setting the partner_id. Forward-Port-Of: odoo/enterprise#99429
Fixed an issue where entering certain barcode values, especially URN-style codes, could cause the barcode scanning screen to fail. This improves reliability for warehouse and manufacturing users when manually entering or scanning barcodes.
Original PR description
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature`…
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature` - Barcode > click on `Scan or tap` > Enter a barcode(barcode number should startwith `urn` (eg: "urn:epc:tag:sgtin-96 : 3.0614141.038656.0")) > Apply Traceback: --- `KeyError: 'rule'` (with GS1 Nomenclature) `AttributeError: 'list' object has no attribute 'get'` (without GS1 Nomenclature) At [1], we expect the key `rule` to be present in the result, but this key is never set in the return statement at [2]. Since [1] also relies on the result’s type, a new key value `type` has been added in this [commit] to address that. This commit ensures that the correct keys are passed in the result dictionary. [1]- https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/stock_barcode/controllers/stock_barcode.py#L29-L31 [2]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/barcodes/models/barcode_nomenclature.py#L174-L189 [commit]: https://github.com/odoo/odoo/commit/1394fa161a6fcf77b4443cbf784ad7dd635e7f9e#diff-be2a58d0591614180295c070396ff487f4bc04bf33aad2829d7bfab4671a792cR60 sentry-6992944243 Forward-Port-Of: odoo/enterprise#98761
The journal audit report now matches the selected filter for draft entries. This ensures users who enable draft entries can review the expected journal items instead of seeing an empty result.
Original PR description
* In a new journal, create a draft entry * Open the journal audit: Accounting > Review > Journal Audit * Activate the "With draft Entries" option. * The journal should display 1 entry to review * Click on the review button, there is nothing to display We should be consistent in the filters selected is the search view and what is displayed on the report. Forward-Port-Of: odoo/enterprise#99381
French FEC imports now use less memory when matching imported records to existing partners. This helps companies with very large partner databases avoid import failures and complete the process more reliably.
Original PR description
### Description: When importing an FEC, Odoo will fetch all the partners to link the new imported records to the existing partners. The issue is that it triggers the prefetching of all the fields of the partners (304k partners in their case), causing a memory error. To avoid that, we can just fetch the field that we need (e.g. "name" and "ref"). ### Reference: opw-5153555 Forward-Port-Of: odoo/enterprise#98483
This fixes an issue where regular users could be blocked from signing a document because the system looked up the wrong user record. The signing flow tests now run as a regular user as well, helping catch permission problems that administrators would not see.
Original PR description
By running the test_sign_flow tour as a regular user, a typo is detected by the tests in the sign.send.request wizard. The issue is that, on the model `res.partner`, the field `user_id` is the…
By running the test_sign_flow tour as a regular user, a typo is detected by the tests in the sign.send.request wizard.
The issue is that, on the model `res.partner`, the field `user_id` is the Salesperson associated to this Contact, whereas the field `user_ids` contain the `res.users` that inherit this Contact, and `main_user_id` is the most appropriate User of `user_ids` when we need only one.
When testing as admin, all fields are the admin user, whereas when testing as Laurie Poiret (or any regular user), the Salesperson is still the admin while `main_user_id` is Laurie Poiret.
A regular user can access only its own `sign_signature` field, while an administrator can access the `sign_signature` of all users, so this bug remained undetected:
On a runbot, log in as `admin` to change the sales person of Marc Demo to Mitchel Admin, then log in as `demo` and click on "Sign Now" on the `Rental_Agreement.pdf` template.
You do not have enough rights to access the field "sign_signature" on User (res.users). Please contact your system administrator.
Operation: read
User: 5
Groups: allowed for groups 'Role / Administrator'
Forward-Port-Of: odoo/enterprise#99408Helpdesk refunds now create credit notes for only the product chosen by the user, instead of including every product from the original sales order. Product selection is also narrowed to items related to the sales order, reducing mistakes and speeding up after-sales processing.
Original PR description
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we…
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we click on refund. Even if we specify the product to refund, this action creates a credit note containing both products (previously present on the SO) instead of only the one to refund. Additionally, when selecting the product, we could see in the dropdown of suggestions all the existing products, instead of only the ones related to the SO. ## Reproduction Steps 1. Create a SO containing 2 different products and confirm it. 2. Create a regular invoice and confirm. 3. Go to Helpdesk. Click on the configuration tab, and helpdesk teams. 4. Click on your helpdesk team, scroll down. In After-Sales, check "Refunds". 5. Create a ticket and specify the customer who wants to refund. Make sure the correct helpdesk team is assigned. 6. Click on refund. It opens the wizard. Specify the product to refund and the Invoices to Refund. 7. Click on reverse. ### Expected behavior A credit note containing only the specified product to refund should be created. ### Unexpected behavior The created credit note contains both products originally present on the SO. ## Origin of the issue When issuing a refund from helpdesk_stock_account, this piece of code is called: https://github.com/odoo/enterprise/blob/2051e84c55618c64179c4b9f3e99f4e795bacd32/helpdesk_stock_account/wizard/account_move_reversal.py#L16-L17 which calls the ```reverse_moves``` method in the helpdesk_account.py file, which itself calls the ```reverse_moves``` method in the account_move_reversal.py file, in the account module, and so on. Finally, we arrive in the account_move.py file. In the ```_reverse_moves``` of this file, we can see the code: https://github.com/odoo/odoo/blob/bee7fc1f955c52a88b527ad9a2ddf0021529bbc7/addons/account/models/account_move.py#L4937-L4947 where we simply copy all the lines of the move in the SO without filtering them. As a result, we get the lines of the product we don't want to refund __ opw-5148789 Forward-Port-Of: odoo/enterprise#99477 Forward-Port-Of: odoo/enterprise#98771
Fixed an access problem that blocked non-admin users from creating Mexico Global Invoices. Regular accounting users can now complete the process and generate the required Global CFDI document without needing administrator permissions.
Original PR description
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the…
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the attachment creation to use the SUPERUSER: https://github.com/odoo/enterprise/pull/95197 However, updating `attachment.res_id` then required `base.group_system` access rights, preventing regular users from modifying the attachment As a result, non-admin users (like demo) triggered an access error during Global Invoice creation ## Steps to reproduce: - Switch to the MX company - Create a product with an UNSPSC Category (Accounting Tab) - Create and Confirm an Invoice for the product (enable CFDI to public) - Connect as Demo - Go in Accounting > Customers > Invoices - Toggle the last created invoice checkbox - Actions > Create Global Invoice - Before the fix, the Access Error is displayed - Check in the invoice Chatter for the Global CFDI document creation success opw-5181925 Forward-Port-Of: odoo/enterprise#98218
Archiving a company no longer causes access errors when users open the Documents app. The change ensures document folders are filtered to those the user is allowed to access, improving reliability in multi-company setups.
Original PR description
**Steps to reproduce:** - Add some folders - Create a new company - Assign some folders to the new company - Archive the company - Click on Documents app - AccessError is raised when opening it…
**Steps to reproduce:** - Add some folders - Create a new company - Assign some folders to the new company - Archive the company - Click on Documents app - AccessError is raised when opening it **Issue:** The issue seems to be related to caching issue on the field `type` when fetching the documents with `search_panel_select_range` and going through `_compute_display_name`: `folders = accessible_records.filtered(lambda d: d.type == 'folder')` This error was quite inconsistent and might be related to the cache missing some prefetched data on a record it shouldn't have been able to read. There is a need to ensure only the folders available to the user are able to be fetched. **Fix:** Added the `type` field in the `search_panel_fields` but this might not be needed if the issue comes from elsewhere. For now the issue was mitigated by explicitly checking for the user companies in the domain of the searchs, but it needs to be checked as this behavior might break other flows. opw-4931278 Forward-Port-Of: odoo/enterprise#99126 Forward-Port-Of: odoo/enterprise#96817
Creating an offer from an existing employee's Offers button no longer incorrectly fails because an applicant is missing. The field visibility rules were adjusted so HR teams can generate offers in this scenario without interruption.
Original PR description
-When creating a new offer for an existing employee through the smart button "Offers", an error appears showing that the applicant is missing. -The issue has been fixed by changing the visibility conditions for the fields.
Mexican electronic invoices now report local fixed-amount taxes using the configured amount instead of multiplying it by 100. This prevents incorrect tax values in CFDI XML files and helps businesses issue compliant invoices.
Original PR description
Steps to reproduce: 1. With an MX Company setup configure a new tax as follows - Tax Computation: Fixed - SAT Tax Type: Local - Factor Type: Cuota - Amount: 5 2. Create a customer invoice with the tax 3. Generate CFDI Issue: In the XML the ImpuestosLocales node contains `<implocal:TrasladosLocales ImpLocTrasladado="VAT 0%" Importe="20.00" TasadeTraslado="500.00"/>` The tax fixed amount was multiplied by 100 This occurs because we don't check if the tax is fixed when normalizing the amount opw-5132807 Forward-Port-Of: odoo/enterprise#99431 Forward-Port-Of: odoo/enterprise#98988
Belgian payroll employee version fields now correctly record change history. This restores expected audit visibility and prevents related automated checks from failing.
Original PR description
The test_hr_version_fields_tracking was failing because the Belgian Dimona fields in hr.version model were missing tracking=True. task-5122440 Forward-Port-Of: odoo/enterprise#99144 Forward-Port-Of: odoo/enterprise#95735
The sample data ribbon setting was removed from shared action helper screens. This prevents an outdated visual marker from appearing in affected views and keeps the interface consistent for users.
Original PR description
This commit fully removes the prop `showRibbon` from the `ActionHelper` component.
Quick replace actions in the work entries Gantt view now show the proper error when users try to change validated entries. This prevents silent failures and makes it clear whether a validated entry cannot be modified or deleted.
Original PR description
Issue: Work entry quick replace buttons in gantt view didn't show error messages when trying to modify validated entries. The JavaScript was filtering out validated entries client-side and preventing server-side validation from triggering. Steps to Reproduce: - Open work entries gantt view - Select validated work entries - Click quick replace buttons (work entry type change) - No error message appears, operation silently fails Fixes: - Removed client-side filtering to allow all entries (including validated) to reach server validation - Added server-side check to distinguish modification vs deletion operations - Server now shows appropriate error message: "This work entry is validated. You can't modify it." for modifications vs "This work entry is validated. You can't delete it." for deletions Task ID: 5075615
This change prevents installation errors when Saudi Payroll and Salary Package modules are loaded in different orders. Employee cost fields are now added from the module that has the correct dependencies, making setup more reliable without changing day-to-day payroll behavior.
Original PR description
Reproduce Issue : loading hr_contract_salary after l10n_sa_hr_payroll causes this error Element '<xpath expr="//separator[@name='employer_costs']">' cannot be located in parent view Issue : in the hr_employee_view of the l10n_sa_hr_payroll , we inject three fields in the seperator "employer_costs" which is defined in hr_contract_salary , because there is no dependecy between the two modules , this causes the error to happen if the l10n_sa_hr_payroll is loaded first. Fix : Create another view to add these fields in the l10n_sa_hr_contract_salary module which depends on both l10n_sa_hr_payroll and hr_contract_salary task - 5258832 related PR : enterprise#98239
This update prevents salary configurator tests from failing when the Belgian localization is not installed. It removes assumptions about Belgium-specific employee fields from the general salary module and keeps those settings handled only in the Belgian flow.
Original PR description
This fix targets an issue introduced by PR [odoo/enterprise#96415]. Steps to reproduce: Install the hr_contract_salary module on its own or with a localization other than BE, then run the test TestEmployeeSalaryConfigurator.test_employee_salary_configurator_flow. You will get the following error: ValueError. Cause: The fields mobile and internet are only defined on hr.employee under the Belgian localization. However, when creating test employees in hr_contract_salary, these fields were being referenced directly. Therefore, when testing without the BE localization, the fields were missing. Solution: Remove the fields from the hr_contract_salary test. Since mobile_invoice and internet_invoice are hidden when the fields are not available, we now set their values manually in the extention of the tour of the BE localization to avoid dependency on BE-specific fields. Related PR: enterprise#96415 Task: 5249282
This fix reverts a recent change that moved Belgium private car benefits into salary rules because that approach could not support required manual and folded benefit handling. Belgian payroll and salary package flows now use the previous field-based behavior, reducing the risk of incorrect or confusing car benefit calculations.
Original PR description
*: l10n_be_hr_contract_salary,l10n_be_hr_payroll,
l10n_be_hr_payroll_fleet,test_l10n_be_hr_payroll_account
In this PR, the migration of private car benefit from a field into a salary rule was reverted, since it caused issues because a salary rule cannot currently be folded or manual, since these are fields, and the salary rules currently don't allow that(salary rules depending on normal fields). In the future, when we have a structure for manual and fold salary rule for other salary rule, this might be readdressed. (Note: This might still not be possible, since other benefits that are fields have a manual on a field, and this benefit also needs this field as manual field/rule).
task-5236589This update fixes a visual issue in Odoo Studio where sidebar elements could overlap or scroll above other page headers. By aligning the sidebar layering with the header, the Studio interface behaves more consistently and is easier to use.
Original PR description
With Commit[^1], the `.o_web_studio_component` `z-index` was set to `$zindex-modal (1055)`. While a high value is probably needed, this introduced an issue related to the `z-index` value of `.o_notebook_headers`, which is arbitrary and lower than that of `.o_web_studio_component`, causing the elements to scroll above it. With this commit, we decrease the `z-index` value and align it with the header one, ensuring a clearer relationship between these two elements. task-5241146 <img width="571" height="507" alt="image" src="https://github.com/user-attachments/assets/483b6ce6-8edd-47ff-aa45-39829758d44b" /> [^1]: https://github.com/odoo/enterprise/commit/8489b760dd601d2a5196c8323eb0e1929c0f2132
Fixed an issue that could prevent active employees with valid contracts from showing in the pay run wizard, especially in newly created databases. This helps payroll teams prepare pay runs reliably without missing eligible employees.
Original PR description
Addressed the issue where employees were missing in the pay run wizard for new databases. Fixed _get_valid_version_ids to use self.env.company.id as a fallback when self.company_id is empty. task-5240136
9 changes
Resolved issues and error corrections
Users on mobile can now add emoji reactions in chat without the picker being hidden behind the conversation window. The update also adjusts the discuss app so chat bubbles are no longer shown there, improving the mobile chat experience and preventing a confusing blocked action.
Original PR description
[FIX] mail: can add message reaction in mobile Before this commit, mobile uses could not practically add reactions. Steps to reproduce: - open a discuss conversation on mobile device - post a message…
[FIX] mail: can add message reaction in mobile Before this commit, mobile uses could not practically add reactions. Steps to reproduce: - open a discuss conversation on mobile device - post a message - click on "..." - click on "Add a reaction" => No emoji picker is shown. This happens because the emoji picker opens in a modal in mobile. The modal has a z-index lower than chat window, and because of this it is actually shown below the chat window. The chat window being above modal is sometimes desirable, like for AI chat windows triggered from a modal in desktop, but sometimes the opposite is desirable, like in mobile. Chat window had z-index for desktop use of above modal, but in mobile the opposite is desirable. This commit fixes the issue by reducing the chat window z-index in mobile, so that modals are above chat windows. Note that current desktop style for chat window being necessarily above modals is not exactly correct, but this is a tricker part to fix therefore this PR focuses on the immediate usability issue in mobile that makes using any modal in chat window unusable. Task-5208322 Task-5261880 This PR also disables the showing of chat bubbles in discuss app similarly to the desktop counter-part. Task-4607436 https://github.com/odoo/enterprise/pull/99588
This fix restores the ability to add emoji reactions to messages on mobile devices in Discuss. It improves the mobile messaging experience so users can respond to conversations the same way they do on desktop.
Original PR description
Task-4607436 Task-5261880 https://github.com/odoo/odoo/pull/235852
This fix makes the QRIS configuration fields visible again in the Indonesian bank form. It corrects where the fields are inserted so they no longer end up inside a hidden section, improving the setup experience for users who need to configure QRIS payments.
Original PR description
**Description of the issue/feature this PR addresses:** This issue occurs because the XPath targeting the `currency_id` field is placed inside a `<div>` that becomes invisible under certain conditions. The `view_partner_bank_form_inherit_hr` view is loaded first due to its sequence, and the `l10n_id` view is applied afterward, causing the QRIS fields to be inserted into that hidden `<div>` from `view_partner_bank_form_inherit_hr`. **Current behavior before PR:** The fields l10n_id_qris_api_key and l10n_id_qris_mid are not visible. **Desired behavior after PR is merged:** The fields l10n_id_qris_api_key and l10n_id_qris_mid are visible by changing XPath target Task: [5247678](https://www.odoo.com/odoo/project.task/5247678) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an error that could occur when users enter certain barcodes in the barcode app. It ensures the barcode data is interpreted correctly so scanning and applying barcodes works without crashing in both standard stock and manufacturing flows.
Original PR description
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature`…
This error occurs while entering the barcode number. Steps to reproduce: --- - Install `stock_barcode` module(without demo) - Setting > Barcode > Set Barcode Nomenclature = `Default GS1 Nomenclature` - Barcode > click on `Scan or tap` > Enter a barcode(barcode number should startwith `urn` (eg: "urn:epc:tag:sgtin-96 : 3.0614141.038656.0")) > Apply Traceback: --- `KeyError: 'rule'` (with GS1 Nomenclature) `AttributeError: 'list' object has no attribute 'get'` (without GS1 Nomenclature) At [1], we expect the key `rule` to be present in the result, but this key is never set in the return statement at [2]. Since [1] also relies on the result’s type, a new key value `type` has been added in this [commit] to address that. This commit ensures that the correct keys are passed in the result dictionary. [1]- https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/stock_barcode/controllers/stock_barcode.py#L29-L31 [2]- https://github.com/odoo/odoo/blob/f8f72b15598576f5870e49879e96fc5c127a6100/addons/barcodes/models/barcode_nomenclature.py#L174-L189 [commit]: https://github.com/odoo/odoo/commit/1394fa161a6fcf77b4443cbf784ad7dd635e7f9e#diff-be2a58d0591614180295c070396ff487f4bc04bf33aad2829d7bfab4671a792cR60 sentry-6992944243 Forward-Port-Of: odoo/enterprise#98761
This change prevents AI chats from breaking when a user closes the conversation before the answer arrives. It also avoids sending the reply to a new, unrelated chat, ensuring the response is either handled correctly or safely ignored if the chat is gone.
Original PR description
If a user sends a message to an ai agent and then closes the chat channel before receving the response, - For AI composer channels (channels opened through AI chatter button) an error occurs. - For…
If a user sends a message to an ai agent and then closes the chat channel before receving the response, - For AI composer channels (channels opened through AI chatter button) an error occurs. - For other AI channels, A new ai chat channel gets created and the response is posted to that channel instead of the deleted one. Cause of the Issue : When the channel is deleted, a serialization error occurs because one transaction is trying to delete the channel while the other is trying to post the ai response to the channel. The delete transaction finishes execution and the response generation transaction is retried. - For AI composer channels some fields of the deleted channel are accessed inside `_ai_add_message_to_context` and `_ai_create_response` which raises an error. - For other AI channels, when generate_response is retried,_get_or_create_ai_chat is called and given that the old channel has already been deleted, a new one is created and the response is posted to that channel. Note: No issue will happen if the response generation transaction is executed and the deletion transaction is retried, because it will delete the channel after the response was posted which is a normal behavior. task-5063221 Forward-Port-Of: odoo/enterprise#93877
This change removes leftover database sequences created for Point of Sale sessions after those sessions are closed. It helps keep the system tidier and avoids unnecessary buildup of database objects over time.
Original PR description
to avoid having too many postgres sequences, this make sure the sequence used by the pos session is cleaned up after being closed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235875 Forward-Port-Of: odoo/odoo#235500
Work orders now correctly include their time-based cost when they are marked as done directly from the status control. This ensures project profitability and margin calculations reflect the real manufacturing cost, even when the work order is not started first.
Original PR description
Backport of: 223ec6ac83ba2ec94f7ea394458aee0972bb8b44 **Original msg commit:** This commit fixes the problem of adding the hourly cost of the work center when marking an operation as done from the status widget. To reproduce the bug: 1- Create a work center with an hourly cost > 0. 2- Create an MO with 1 operation in that work center, expected time > 0. 3- Create and set a project on the MO. 4- Make sure that project has an analytic account. 5- Mark the operation as done from the status widget. (click on it and choose done, don't use the start button) 6- Go to the analytic account of the project and check the gross margin. = No cost of the workorder was added. Now, this commit takes into account the duration of the WO first when marking it as done directly from the status widget. opw-5170664 Forward-Port-Of: odoo/enterprise#99439
This fix corrects how Point of Sale order totals are displayed in the backend. The Tax Excl amount now shows the full subtotal before tax, instead of incorrectly showing the unit price, which improves the accuracy of order review and reporting.
Original PR description
**Steps to reproduce:** * Install the **Point of Sale** module with demo data. * Open the POS interface and create a new order. * Add a product that has **taxes applied** and set its quantity to more…
**Steps to reproduce:** * Install the **Point of Sale** module with demo data. * Open the POS interface and create a new order. * Add a product that has **taxes applied** and set its quantity to more than one. * Confirm the order by proceeding to payment and Validate payment. * Go to the backend: **Point of Sale → Orders → Orders**. * Open the created order and check the value displayed under **Tax Excl**. **Issue:** * The **Tax Excl** field shows the *unit price* of the product instead of the *subtotal without tax*. - *Example -* *Unit Price*: 10 *Quantity*: 3 *Tax*: 10% **Expected Value -** **Tax Excl**(price_subtotal) : 30 **Tax Incl**(price_subtotal_incl): 33 **Current Value -** **Tax Excl**(price_subtotal) : 3 **Tax Incl**(price_subtotal_incl): 33 **Cause:** * The POS code incorrectly assigns `price_subtotal` using the displayed unit price instead of the actual tax-excluded subtotal. **Fix:** * Assign `price_subtotal` using the correct **PriceExcl** value so the subtotal without tax is accurately reflected. --- opw-5252340 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix restores the normal record limit when returning to a Kanban view after removing a grouping. It helps avoid the page slowing down or crashing when too many records would otherwise be loaded at once.
Original PR description
Steps to reproduce ================== - Add a group by in the kanban product view - Switch to the list view - Remove the group by - Switch back to the kanban view -> No limit is applied, and the webclient can crash if too many records are returned. Cause of the issue ================== The groupsLimit is set as MAX_SAFE_INTEGER in the kanban view https://github.com/odoo/odoo/blob/df959e05ac9cf3136d1724bc80b7597a70932225/addons/web/static/src/views/kanban/kanban_controller.js#L168 Which is then reused as the limit https://github.com/odoo/odoo/blob/df959e05ac9cf3136d1724bc80b7597a70932225/addons/web/static/src/model/relational_model/relational_model.js#L368 Solution ======== There is already a code path to reset the limit when switching from grouped to ungrouped, but is wasn't called on the first load (when this.root isn't set yet) opw-5167769 Forward-Port-Of: odoo/odoo#235794 Forward-Port-Of: odoo/odoo#235232
10 changes
Enhancements to existing features
The Peppol registration wizard now shows the warning only after an endpoint has been entered, reducing unnecessary alerts during setup. It also removes an outdated placeholder and a migration-related change, making the registration flow clearer and easier to use.
Original PR description
In the Peppol Registration Wizard: - Warning banner should only show up when endpoint as been filled - Remove placeholder - Remove the "in" migration Ref PR for master: odoo/odoo#234088 Task [link](https://www.odoo.com/odoo/project/967/tasks/5170831?debug=assets) task-5170831 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This change prevents regular users from being blocked when creating a Global Invoice in the Mexican localization. It ensures the required document attachments can be handled correctly, so the process completes without access errors for users like Demo.
Original PR description
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the…
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the attachment creation to use the SUPERUSER: https://github.com/odoo/enterprise/pull/95197 However, updating `attachment.res_id` then required `base.group_system` access rights, preventing regular users from modifying the attachment As a result, non-admin users (like demo) triggered an access error during Global Invoice creation ## Steps to reproduce: - Switch to the MX company - Create a product with an UNSPSC Category (Accounting Tab) - Create and Confirm an Invoice for the product (enable CFDI to public) - Connect as Demo - Go in Accounting > Customers > Invoices - Toggle the last created invoice checkbox - Actions > Create Global Invoice - Before the fix, the Access Error is displayed - Check in the invoice Chatter for the Global CFDI document creation success opw-5181925 Forward-Port-Of: odoo/enterprise#98218
The FEC import process was loading too much partner data into memory, which could cause failures on very large databases. This update limits the lookup to only the information needed, making imports more reliable and less resource-intensive.
Original PR description
### Description: When importing an FEC, Odoo will fetch all the partners to link the new imported records to the existing partners. The issue is that it triggers the prefetching of all the fields of the partners (304k partners in their case), causing a memory error. To avoid that, we can just fetch the field that we need (e.g. "name" and "ref"). ### Reference: opw-5153555 Forward-Port-Of: odoo/enterprise#98483
This fix corrects where the QRIS bank details are inserted in the bank form, so the API key and MID fields now appear properly for users. It resolves a visibility issue caused by the fields being added into a hidden section of the form.
Original PR description
**Description of the issue/feature this PR addresses:** This issue occurs because the XPath targeting the `currency_id` field is placed inside a `<div>` that becomes invisible under certain conditions. The `view_partner_bank_form_inherit_hr` view is loaded first due to its sequence, and the `l10n_id` view is applied afterward, causing the QRIS fields to be inserted into that hidden `<div>` from `view_partner_bank_form_inherit_hr`. **Current behavior before PR:** The fields l10n_id_qris_api_key and l10n_id_qris_mid are not visible. **Desired behavior after PR is merged:** The fields l10n_id_qris_api_key and l10n_id_qris_mid are visible by changing XPath target Task: [5247678](https://www.odoo.com/odoo/project.task/5247678) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change prevents account setup from failing when multiple inactive companies each have their own "Current Year Earnings" account. It ensures these accounts are treated separately per company, so company data can load correctly without unexpected errors.
Original PR description
# Description of the issue/feature this PR addresses: Currently, the constraint `account.account._check_account_type_unique_current_year_earning` raises a validation error when there are more than…
# Description of the issue/feature this PR addresses:
Currently, the constraint `account.account._check_account_type_unique_current_year_earning` raises a validation error when there are more than one accounts of type "Current Year Earnings" in the same company. This is expected behaviour.
However, the ORM will throw an exception if it finds two or more accounts of this type across multiple inactive companies. Example:
```sql
lare_3183476=>
SELECT COUNT(account.id), account.company_id, company.active
FROM account_account account
JOIN res_company company
ON account.company_id = company.id
WHERE account.account_type = 'equity_unaffected'
GROUP BY account.company_id, company.active;
count | company_id | active
-------+------------+--------
1 | 1 | t
1 | 2 | f --
1 | 3 | t
1 | 4 | f --
1 | 5 | t
1 | 6 | t
(6 rows)
```
# Current behavior before PR:
When the above constraint retrieves accounts of type "Current Year Earnings" grouped by their companies, those records belonging to inactive companies are grouped together into an "empty" company, res.company(). This raises an exception due to the definition of the constraint even though the accounts belong to a different company, and therefore, don't break the condition.
# Desired behavior after PR is merged:
To address this issue, we will modify the context of the environment to consider inactive records in the search by disabling the flag `active_test`. Since only two models are involved in the query, and account.account doesn't have a field for active records, this addition will correctly group the accounts in their correct company.
---
upg-3185680
upg-3143424
Thanks to @jlom-odoo for providing initial insights on the problems as well as additional examples.
---
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/18.0/odoo/service/server.py", line 1361, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-13>", line 2, in new
File "/home/odoo/src/odoo/18.0/odoo/tools/func.py", line 97, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/18.0/odoo/modules/registry.py", line 129, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 523, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/src/odoo/18.0/odoo/modules/migration.py", line 222, in migrate_module
exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
File "/home/odoo/src/odoo/18.0/odoo/modules/migration.py", line 259, in exec_script
mod.migrate(cr, installed_version)
File "/home/odoo/src/odoo/18.0/addons/l10n_mx/migrations/2.2/end-migrate.py", line 7, in migrate
env['account.chart.template'].try_loading('mx', company, force_create=False)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 160, in try_loading
return self._load(template_code, company, install_demo, force_create)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 228, in _load
self._post_load_data(template_code, company, template_data)
File "/home/odoo/src/enterprise/18.0/account_reports/models/chart_template.py", line 10, in _post_load_data
super()._post_load_data(template_code, company, template_data)
File "/home/odoo/src/odoo/18.0/addons/stock_account/models/account_chart_template.py", line 12, in _post_load_data
super()._post_load_data(template_code, company, template_data)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 681, in _post_load_data
self._setup_utility_bank_accounts(template_code, company, template_data)
File "/home/odoo/src/odoo/18.0/addons/account/models/chart_template.py", line 874, in _setup_utility_bank_accounts
self.env['account.account']._load_records([
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5503, in _load_records
data['record']._load_records_write(data['values'])
File "/home/odoo/src/odoo/18.0/addons/account/models/account_account.py", line 1103, in _load_records_write
super()._load_records_write(values)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5421, in _load_records_write
self.write(values)
File "/home/odoo/src/odoo/18.0/addons/account/models/account_account.py", line 1036, in write
res = super(AccountAccount, self.with_context(defer_account_code_checks=True, prefetch_fields=not any(field in vals for field in ['code', 'account_type']))).write(vals)
File "/home/odoo/src/odoo/18.0/addons/mail/models/mail_thread.py", line 343, in write
return super(MailThread, self).write(values)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4830, in write
real_recs._validate_fields(vals, inverse_fields)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 1631, in _validate_fields
check(self)
File "/home/odoo/src/odoo/18.0/addons/account/models/account_account.py", line 42, in _check_account_type_unique_current_year_earning
raise ValidationError(_('You cannot have more than one account with "Current Year Earnings" as type. (accounts: %s)', [a.code for a in account_unaffected_earnings]))
odoo.exceptions.ValidationError: You cannot have more than one account with "Current Year Earnings" as type. (accounts: [False, False])
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis change brings back contact information in the Swiss payroll transmission form. It helps ensure the payroll data sent to external systems remains complete and avoids missing employee details during processing.
Original PR description
task-5248986 Forward-Port-Of: odoo/enterprise#99401
This change fixes a payment failure that could occur when customers pay subscriptions in Indonesian rupiah using a card that needs 3D Secure authentication. The payment request now uses the amount format required by Xendit, helping payments complete successfully.
Original PR description
When trying to pay a subscription (tokenization enforced) in IDR with a card that require the 3DS flow in Xendit, the following error is raised: `"amount" must be an integer.` So following 46166e25f049, when creating then token authentication we must use the rounded amount (introduced by b3f4e08cea6c) to meet Xendit specific currencies requirements. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a customer’s portal access is revoked, this change makes sure that account is no longer mistaken for a website’s default public user. This avoids exposing customer-related activity or assigning anonymous website actions to the wrong person, protecting privacy and reducing confusion.
Original PR description
**Steps to reproduce:** - Go to a Contact - Go to the actions dropdown menu of the record - Grant Portal Access - Revoke that Access - Create a new Website in the same Company that Portal Access was…
**Steps to reproduce:**
- Go to a Contact
- Go to the actions dropdown menu of the record
- Grant Portal Access
- Revoke that Access
- Create a new Website in the same Company that Portal Access was granted
- That Contact's user will be set as the Public User for the new Website
- New orders and other default public user behavior will be assigned to this user
- The user will be mentionned in non-logged interactions
**Issue:**
Archived portal user are set as public user when revoked, and the default public user of a website is set on create to the first public user it finds in `_get_public_user`:
```
public_users = self.env.ref('base.group_public').sudo().with_context(active_test=False).users
public_users_for_company = public_users.filtered(lambda user: user.company_id == self)
if public_users_for_company:
return public_users_for_company[0]
```
This seems to be an issue as such user can be reactivated or be assigned to some transactions it has not made (confidentiality issue).
**Fix:**
Not sure of the best way to fix this. We could ensure new website always creates a new public user, or find a better way to use by default the `self.env.ref('base.public_user')` (or its company-specific copies) for the company of the website during creation (or in `_get_public_user`).
For now the fix remove the public group on the revoked portal user, to still be able to reactivate it later on, without mistaking it for the default public user of a company.
Also we can't remove the `with_context(active_test=False)` as default public user always seems to be disabled.
related: https://github.com/odoo/odoo/commit/83e22fd0636748c4fe1058fb93adfad2623fc31b
opw-4760550
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233757We removed a validation that was too strict on tax group accounts. This lets users keep working with existing tax groups, change the account type when needed, and copy tax groups without errors.
Original PR description
**Issue:** A constraint has been added to "account.tax.group" model some month ago, forcing a type for "Tax Payable Account" and "Tax Receivable Account" fields. However, some users had changed the type of these accounts or selected another one and they cannot do it anymore. They can't copy these tax groups neither. The constraint is too restrictive as we want to be more permissive. It's still possible to change the type of the account after selecting it for the tax group. Therefore, the constraint has some flaws. **Solution:** Remove the constraint. **Community PR:** https://github.com/odoo/odoo/pull/235548 opw-5231379
This change removes an overly strict rule on tax group accounts, allowing users to keep or choose payable and receivable accounts even if their type has changed. It also restores the ability to copy affected tax groups, reducing friction when managing tax settings.
Original PR description
**Issue:** A constraint has been added to "account.tax.group" model some month ago, forcing a type for "Tax Payable Account" and "Tax Receivable Account" fields. However, some users had changed the type of these accounts or selected another one and they cannot do it anymore. They can't copy these tax groups neither. The constraint is too restrictive as we want to be more permissive. It's still possible to change the type of the account after selecting it for the tax group. Therefore, the constraint has some flaws. **Solution:** Remove the constraint. **Enterprise PR:** https://github.com/odoo/enterprise/pull/99421 opw-5231379 --- 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 change restores tab switching in module information pages when the page content includes multiple tabs. It makes these pages behave consistently with the Odoo Apps Store, improving the browsing experience for users reviewing modules.
Original PR description
* Before: if we have a block contain multiple tab in index.html file we can not click on it to switch between tab, unlike the behiviour in odoo apps store description https://github.com/user-attachments/assets/ab7f8213-2112-46e2-bb72-5e01cc1f7883 * After: Make the nav tabs work as it should be https://github.com/user-attachments/assets/12c05abc-84f6-495e-ae5b-b6eca4d81a92 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
The event dot for unpublished or hatched calendar items is now easier to see. The styling was also moved so it works consistently in related views, including planning, even when the calendar module is not installed.
Original PR description
When pills are hatched (unpublished event) in the calendar view (eg. planning) the `o_event_dot` is barely visible. Additionally the styling to display the dot as outlined on hatched event is wrongly scoped in `/calendar` with the calendar status styling. It should be in the view instead. Otherwise, for the planning module which doesn't depend on calendar, the styling is not applied if calendar is not installed, rendering the filled dot. task-3916768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now export records even when the list is grouped by a property field. This fixes a crash that happened during export and restores a normal workflow for grouped task lists.
Original PR description
Step to reproduce
- open a task
- add a property field , say test
- add values for this field in few records
- go to list view and group by test
- select a record from result and export it (from Action btn)
Observation:
- traceback
```
File "/home/odoo/17.0/addons/web/controllers/export.py", line 486, in base
groupby_type = [Model._fields[x.split(':')[0]].type for x in groupby]
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
KeyError: 'task_properties.b60ee9baefee14a8'
```
Cause:
- The issue is caused by splitting, which didn't considered property field
- it tried to look for `task_properties.b60ee9baefee14a8` in _fields which causes KeyError
FIx:
- split the field name properly to bring out actual field name while considering granularity as well as the property fields
opw-5159155
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr