Daily updates from Odoo
Wednesday, January 28, 2026
92 changes
22 changes
New functionality added to Odoo
This update introduces a new module to help companies prepare CSRD and VSME sustainability reports. It leverages existing Odoo data (like emissions and employee information) and AI suggestions to streamline the reporting process, ensuring compliance with EU regulations and providing stakeholders with reliable ESG data.
Original PR description
In this PR, we add the possibility to create and manage a complete CSRD/VSME report, integrated with AI, knowledge, survey and HR. The Corporate Sustainability Reporting Directive (CSRD) is a legal…
In this PR, we add the possibility to create and manage a complete CSRD/VSME report, integrated with AI, knowledge, survey and HR. The Corporate Sustainability Reporting Directive (CSRD) is a legal framework in the EU that requires companies to report on their sustainability performance. It aims to standardize ESG reporting across the EU and make the information more comparable and reliable for investors and other stakeholders. On the other hand, the Voluntary Sustainability Reporting for Micro and Small Enterprises (VSME) is a framework designed to support smaller companies in reporting on their sustainability performance. It encourages clear, comparable, and meaningful ESG disclosures while remaining proportionate to the size and capacity of the business. Our reporting feature facilitates the steps involved in preparing a CSRD/VSME report by using the data we already have in Odoo, such as emissions (Scope 1, 2, 3), employee data, supplier and client information, or fleet metrics. As well as using AI to make suggestions, and integrating knowledge articles and surveys. More precisely, the feature is composed of two main models: - A new model (`esg.metric)` that is only used if the CSRD reporting is enabled (and only used in the context of CSRD reporting). It is linked to an ESRS data point (either Environmental, Social or Governance category) and can be of different types (Positive/Negative Impact, Risk or Opportunity). It is used to assess if a topic is material or not (Double Materiality Assessment), depending on the impact severity and financial severity scores. As well as scores obtained from the stakeholder reviews (we get those scores from surveys that have been completed, the surveys are sent with the action "Stakeholder Review"). To help the user to create relevant metrics, we added an AI feature allowing to generate suggestions of metrics. Provided that the user gives a description of the company (size, revenues, activity, etc) to give as much context as possible to the AI prompt (see action "AI Suggest"). - A new model (`esg.report`) where you can specify the type of the report (CSRD or VSME), the dates (reporting date and base reference date), and additional information about the company. Once created, the report is linked to a knowledge article that contains the template of a complete CSRD/VSME report that you can edit, fold/unfold sections, add content, etc. When printing it to PDF, a lot of information is automatically filled in (data about your employees, accounting data, etc), including the carbon report, dynamic tables. That is done by replacing placeholders from the knowledge article when generating the PDF (an appendix includes all available placeholders with a small explanation for each). For CSRD reports only, there is the ability to automatically fold/unfold the ESRS sections of the articles depending on whether the data points we get from the metrics are material or not (see action "Update Materiality"). For VSME reports only, there is a "Basic Module + Comprehensive Module" type that will include additional sections (C1-C9). Note that you can also load them manually from the root article with the "Load Template" action. task-5172829 Forward-Port-Of: odoo/enterprise#96759
This update introduces a new version of the Partner Ledger report specifically tailored for Indonesia. It now groups transactions by the PAN entity, a key requirement for Indonesian tax reporting. Previous duplicate code has been removed to improve report efficiency and accuracy.
Original PR description
Backport of :- https://github.com/odoo/enterprise/pull/105011 task-4975468
Enhancements to existing features
This update enhances the Point of Sale interface by providing a clear view of LNA permission status. A new button in the navigation bar displays the current status and opens a popup with detailed information, ensuring users understand access rights related to LNA functionality. This improves transparency and operational efficiency.
Original PR description
Before this commit it was not possible to know if LNA permission was granted, denied or not yet granted from the POS interface. This commit adds a button in the navbar to show the current LNA status and open a popup with more information. taskId: 5874947 Forward-Port-Of: odoo/odoo#245668
Resolved issues and error corrections
This update resolves several issues impacting the Point of Sale and Self-Order experiences. Specifically, customers can now successfully scan QR codes and pay orders, and deleting products followed by releasing a table now functions correctly. These fixes improve overall usability and prevent frustrating user experiences.
Original PR description
- FIXED: Scan QR code & pay order. Move to another table, stuck at previous table (client has to clear cache). - FIXED: Bug when you delete a product and click on release table, nothing happens. They have to validate the table with prices at 0. Forward-Port-Of: odoo/odoo#243894
This update resolves an issue where installing a new chart of account would automatically delete existing records. The change now allows for controlled deletion, ensuring data integrity during chart of account updates. This prevents data loss and maintains accurate financial records.
Original PR description
When installing a chart of account, previous records are deleted to be replaced by the one of the installed chart. Since odoo/odoo@4400130eb32, we need to explicitly check for force_delete flag. Use the renamed method _read_group
This update resolves an issue where the undo function in the website translation builder wouldn't work when a color code dialog was open. The fix ensures the dialog appears after hotkeys are bound, allowing the undo action to correctly revert changes. This improves the user experience for website translation editing.
Original PR description
The builder uses `useHotkey` to bind the shortcuts for undo/redo. But when entering translate mode, if the dialog about color code appears, the hotkeys are associated with the active element of the dialog, and thus are skipped on dispatch when in the builder (and the dialog is closed). This commit shows the dialog in `onMounted` of the builder, instead of `onWillStart`, so that the dialog appears just after (instead of just before) the hotkeys are bound to the active element. Steps to reproduce: - On a DB with a website in several languages - Open the website builder in translate mode - Discard the dialog explaining the color code. This is the dialog needed to trigger the bug. If the dialog does not appear, try with a new private window - Do some edits in the page - Click in the sidebar (otherwise keys are handled in the iframe) - Press `ctrl+z` - Bug: it does not "undo" task-5481935 Forward-Port-Of: odoo/odoo#245882 Forward-Port-Of: odoo/odoo#243137
This update resolves an issue where opening the Shop Floor from the replenishment flow caused a JavaScript error. The fix ensures the application name is correctly identified, preventing a 'null' error and ensuring smooth navigation. This improves the user experience when using the Shop Floor feature.
Original PR description
Opening the Shop Floor via the replenishment/forecast flow can raise a js traceback. **Steps to produce:** - Install `mrp` module. - Enable `multi-step routes` from the settings. - Inventory >…
Opening the Shop Floor via the replenishment/forecast flow can raise a js traceback. **Steps to produce:** - Install `mrp` module. - Enable `multi-step routes` from the settings. - Inventory > Configuration > Warehouse Management > Routes. - In Manufacture route, make sure route is Applicable On `products`. - Inventory > Products > Products > New. - Click on forcasted button on product > Click on replenish button > Confirm. - Click the Manufacturing Order shown in the notification. - Confirm the MO and click Shop Floor. **Issue:** A JavaScript error occurs: `TypeError: Cannot read properties of null.` **Root cause:** The Shop Floor view relies on the menu service to determine the current application name by calling `this.menu.getCurrentApp().name`. When the Shop Floor is opened from the replenishment/forecast flow, the navigation occurs through action-based triggers rather than through the main menu. As a result, no menu selection is performed and `setCurrentMenu()`[1] is not executed beforehand.This leaves the current application undefined, causing `menu.getCurrentApp()` to return undefined and leading to a js traceback when `.name` is accessed. [1]: https://github.com/odoo/odoo/blob/c646cb61d0752250b2600413d6d63deabd1d3e6d/addons/web/static/src/webclient/menus/menu_service.js#L57-L64 simillar fix : https://github.com/odoo/enterprise/pull/93043 Note: A tour is possible but unnecessary for this small use-case. opw-5462965 --- Forward-Port-Of: odoo/enterprise#104706
This update fixes a reporting issue where the Delivery Date wasn't displayed on the DIN 5008 sale order report and its preview. The change ensures that users can accurately see the commitment date when generating this report, as confirmed by functional experts. This improves data visibility for compliance reporting.
Original PR description
**Steps to reproduce:** 1. Install modules `sale_management` and `l10n_din5008_sale` 2. Go to Settings, Configure Document Layout and set layout to DIN 5008 3. Create a new Sale Order 4. Set a…
**Steps to reproduce:** 1. Install modules `sale_management` and `l10n_din5008_sale` 2. Go to Settings, Configure Document Layout and set layout to DIN 5008 3. Create a new Sale Order 4. Set a customer, add a product, and fill in the Delivery Date (Other Info) 5. Click on Print and Preview **Issue:** The Delivery Date (commitment_date) is not displayed on: - The DIN 5008 sale order report - The sale order preview (portal view) Functional experts confirmed that the Delivery Date must be visible when using the DIN 5008 layout. **Cause:** The `commitment_date` field was not included in the DIN 5008 sale order report template nor in the preview view. **Solution:** This commit adds the Delivery Date information to: - The DIN 5008 sale order report template - The sale order portal/preview view **opw-5490651** **Before:** <img width="560" height="145" alt="image" src="https://github.com/user-attachments/assets/fb29cda1-d668-4682-aa04-12c613f248d8" /> <img width="861" height="268" alt="image" src="https://github.com/user-attachments/assets/615f259f-e0ff-4fb5-9852-1fdd75cda4c9" /> **After:** <img width="589" height="145" alt="image" src="https://github.com/user-attachments/assets/3f1a8d25-783a-4600-b07e-11b547bb326b" /> <img width="824" height="271" alt="image" src="https://github.com/user-attachments/assets/46b37469-5c72-4556-95e2-eaea0824c166" /> Forward-Port-Of: odoo/odoo#244917
This update corrects an error that occurred when creating invoices with a document number containing non-numeric characters. The fix ensures that document numbers for Chilean invoices (known as 'folios') are strictly numeric, aligning with regulatory requirements. This prevents errors during invoice confirmation and ensures data integrity.
Original PR description
An error currently occurs when a user tries to confirm an account move using a document number that isn’t purely numeric and contains ASCII characters other than digits. Steps to replicate: - Install…
An error currently occurs when a user tries to confirm an account move using a document number that isn’t purely numeric and contains ASCII characters other than digits.
Steps to replicate:
- Install `l10n_cl` with demo and switch to CL company.
- Create a new invoice and add customer as `Andes Innovación SpA`.
- Add a move line > Add a product, price and tax.
- Give Document Number as `11-11`.
- Save and Confirm.
Error:
```
File /home/odoo/odoo18/enterprise/account_accountant/models/account_move.py, line 119, in action_post
res = super().action_post()
File /home/odoo/odoo18/community/addons/account/models/account_move.py, line 5478, in action_post
self._post(soft=False)
File /home/odoo/odoo18/enterprise/l10n_cl_edi/models/account_move.py, line 161, in _post
move._l10n_cl_create_dte()
File /home/odoo/odoo18/enterprise/l10n_cl_edi/models/account_move.py, line 646, in _l10n_cl_create_dte
folio = int(self.l10n_latam_document_number)
ValueError: invalid literal for int() with base 10: '11-11'
```
Cause:
- Trying to convert the document number to integer which includes some characters that are not numeric causes the error.
Solution:
- Specifically for Chile, the document number (folio) cant include anything other than numbers (Check the Sources listed below).
- Added a constraint on the field `l10n_latam_document_number` which only allows numbers using regex.
Sources:
- https://www.sii.cl/pagina/clave/folio.htm : The official Internal Revenue Service website for Chile provides information on the standard folio, along with a sample.
- https://www.sii.cl/factura_electronica/formato_dte.pdf : Refer to PG:11, Sr No:3, which specifies that the Folio should be of type NUM, meaning it must contain only numeric characters.
- The folio is created [here] that will be sent later to the authorities in the form of xml.
[here]: https://github.com/odoo/enterprise/blob/5a8bdb586e2d0bf9948a2d0b4c5e30b3849c0414/l10n_cl_edi/template/dte_template.xml#L8
No ID
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#241505This update resolves a technical issue preventing refunds from printing correctly on Italian fiscal printers. The problem stemmed from a missing method in a component used for invoices. The developers re-introduced this method, ensuring refunds now print accurately after a refund is processed. This ensures accurate reporting for Italian businesses using the POS system.
Original PR description
Step to reproduce: - install `l10n_it_pos` - setup Italian fiscal printer for a pos - refund a order and print receipt Observation: receives a traceback ```js Caused by: TypeError:…
Step to reproduce: - install `l10n_it_pos` - setup Italian fiscal printer for a pos - refund a order and print receipt Observation: receives a traceback ```js Caused by: TypeError: ctx.this.order.getRefundInfo is not a function at Header.template (eval at compile (https://97822380-19-0-design-theme.runbot118.odoo.com/web/assets/debug/point_of_sale.assets_prod.js:16388:20), <anonymous>:11:62) (/web/static/lib/owl/owl.js:5807) at Fiber._render (https://97822380-19-0-design-theme.runbot118.odoo.com/web/assets/debug/point_of_sale.assets_prod.js:12364:38) (/web/static/lib/owl/owl.js:1783) at Fiber.render (https://97822380-19-0-design-theme.runbot118.odoo.com/web/assets/debug/point_of_sale.assets_prod.js:12356:18) (/web/static/lib/owl/owl.js:1775) at ComponentNode.initiateRender (https://97822380-19-0-design-theme.runbot118.odoo.com/web/assets/debug/point_of_sale.assets_prod.js:13036:23) (/web/static/lib/owl/owl.js:2455) ``` Cause: - A <Header/> component is used in invoices, which requires a method `getRefundInfo`. - commit [1] removes <Header> and its related files, - commit [2] removes dead code, hence removed `getRefundInfo` - commit [3] brings back <Header>, but the method was not reintroduced [1] https://github.com/odoo/enterprise/commit/3d532f6ee99884bce58a577eb68464e670fb059a [2] https://github.com/odoo/enterprise/commit/1b03fe15916b7b86f79efcbb63895ae0c4363ef9 [3] https://github.com/odoo/enterprise/commit/d745a72e3f43febb3b39054dc9315eca13d86e36 Fix: - Add the method back After fix: **image from simulator** <img width="600" height="300" alt="image" src="https://github.com/user-attachments/assets/f6caccca-caf6-477f-bf37-f942090535cc" /> opw-5485350 Forward-Port-Of: odoo/enterprise#105048
This update resolves a bug where the 'Not Sent' filter in payment views incorrectly displayed or showed no payments. The fix ensures the filter accurately identifies and displays payments that haven't been processed, providing users with a reliable view of pending actions.
Original PR description
The "Not Sent" filter in Payments list view was not returning the expected records. This was due to an incorrect domain condition in the search view. This commit updates the filter logic to properly…
The "Not Sent" filter in Payments list view was not returning the expected records. This was due to an incorrect domain condition in the search view. This commit updates the filter logic to properly identify payments that haven't been processed or sent, ensuring the filter displays the correct records to the user. **Description of the issue/feature this PR addresses:** This PR fixes a bug in the "Not Sent" search filter within the Payment views (Account Payments). Currently, the filter fails to accurately identify and display records that have not been sent, leading to an empty or incorrect list of results regardless of the sending payment's actual status. **Current behavior before PR:** When a user applies the "Not Sent" filter in the Payments list view (including both Customer and Vendor payments), the system returns incorrect records or no records at all. This is caused by an inconsistent domain definition that doesn't align with the internal field tracking the "sent" status of the payment. **Desired behavior after PR is merged:** The "Not Sent" filter will correctly filter the list to show only those payments where the "Sent" status is not True. This will provide users with an accurate view of pending actions for both Customer and Vendor payments, ensuring consistency across the accounting module. **Steps to reproduce:** 1. Navigate to the Accounting (or Invoicing) module. 2. Go to Vendors > Payments or Customers > Payments (the issue is global). 3. Ensure there are several payments in the list, some marked as "Sent" and others not yet sent. 4. Click on the Filters dropdown menu in the search bar. 5. Select the "Not Sent" filter. 6. Observe the results: Notice that the list either becomes empty or continues to show records that do not match the "Not Sent" criteria, failing to filter the data correctly. **video** https://drive.google.com/file/d/1NTKQ1tHWyZWfs3CPolfDTOMrqaDD9OcN/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245487
This update fixes a calculation error in the SYSCOHADA Profit and Loss report. The report was incorrectly adding values instead of subtracting them, leading to inaccurate gross margin figures. This ensures the report aligns with the official SYSCOHADA guidelines and provides correct financial reporting.
Original PR description
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It…
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It is TA (701) - RA (601) +/- RB (6031). TA and RA should always be positive and negative, respectively.
In the report "Profit and Loss (SYSCOHADA)", the line RA is negated. XA then subtracts this value from TA, adding the two values instead of subtracting them.
Steps to reproduce:
1. Create a new company on runbot.
2. In Accounting > Configuration > Settings, set their Fiscal Localization to Ginea - SYSCOHADA for Companies.
3. Make a MISC journal entry.
1. Set a credit of 110,000,000 on account 701100 and balance it with 411100.
5. Set a debit of 75,000,000 on account 601100 and balance it with 401100.
6. Set a credit of 5,000,000 on account 603100 and balance it with 411100.
7. Post the entry.
8. Navigate to Accounting > Reports > Profit and Loss.
9. Set the l10n version, Profit and Loss (SYSCOHADA).
10. Set the current date.
11. See XA = 110 million + 75 million + 5 million = 190 million; this does not match the example given on pg 357 of Guide-d-application-du-SYSCOHADA.pdf, where XA = 40 million.
[opw-5482300](https://www.odoo.com/odoo/project.task/project.task/5482300)
Forward-Port-Of: odoo/enterprise#104736
Forward-Port-Of: odoo/enterprise#104479This update resolves issues preventing correct SAF-T file generation for Romanian companies when partner information (country or name) is incomplete. The fix ensures accurate invoice exports by correctly formatting registration numbers and handling missing partner details, improving compliance for Romanian businesses.
Original PR description
Fix SAF-T export errors when partners have no country or name. For Romanian companies, the RegistrationNumber should be generated as “04 + partner ID” for customers not subject to VAT and with unknown CNP, without including the country code. Steps to reproduce country issue: - Configure a Romanian company with l10n_ro_saft installed - Create a contact without a country - Create and validate an invoice for this contact - Export the SAF-T file from the General Ledger report You you will get a TypeError because you cant concatenate Bool and String. Steps to reproduce name issue: - Create a main contact - Add a child contact without a name - Change the child type to “Company” - Create and validate an invoice - Export the SAF-T file from the General Ledger report This prevents KeyError when printing the first 70 characters of the partner name in the report. opw-5499918 Forward-Port-Of: odoo/enterprise#105579 Forward-Port-Of: odoo/enterprise#105020
This update resolves an issue where sale orders in Mexico (MX) could fail to process payments due to incomplete customer address information. The fix automatically enables 'CFDI to Public' when the address is missing, ensuring proper payment confirmation and preventing silent transaction errors. This improves the reliability of online payments for Mexican customers.
Original PR description
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent…
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent error occurred during move validation: the transaction was created, but the payment was never recorded, and no error appeared in the portal or the SO chatter ### Cause: The CFDI validation error is raised internally but never surfaced to the user https://github.com/odoo/enterprise/pull/91655 The PO (MIAL) recommended automatically enabling `CFDI to Public` when the partner address is incomplete, forcing the user to complete the data This also ensures that the payment can be confirmed properly ### Steps to reproduce: - Install `l10n_mx_edi_sale` and switch to the MX company - Configure a Payment Provider and Payment Method (e.g., demo) - Create a customer without ZIP or country - Create a Sale Order for that customer - In Other Info, set Online Payment to 100% - Send the quotation and open the link in a private window - Sign and Pay Before the fix: the transaction is created, but no payment is recorded, and no error is shown opw-5023724 Forward-Port-Of: odoo/enterprise#101881
This update corrects a bug where sales orders using multi-step warehouse routes didn't always deliver products to the intended final location. Previously, the system relied solely on push rules, leading to products being delivered to a general location instead of the specified sublocation. This fix ensures accurate delivery based on the configured route steps.
Original PR description
### Issue: Applying a push rule in attempt to reach a precise sublocation will not adapt the destination of the move based on the `final_location_id` but solely base the destination based on the push…
### Issue: Applying a push rule in attempt to reach a precise sublocation will not adapt the destination of the move based on the `final_location_id` but solely base the destination based on the push rule. This is sub-optimal as the existence of an other push rule from this parent location to the sublocation is quite unlikely and validating that new move will therefore not push the product to its `location_final_id`. ### Concrete problematic example: For instance, the `property_stock_customer` (Customer location) provides a precise `final_dest_id` to deliver the customer. While, in one step delivery (not relying on push mechanic), confirming a delivery will generate a delivery with `location_dest` set to the precise Customer location because of pull rules, in two steps, the final delivery ends up targeting the general `Partner/Customer` location. This is particularly impactful in case of automatic batching based on destination location. ### Steps to reproduce: - In the settings enable: Multi-Steps routes - Inventory > Configuration > Warehouse Management > Warehouses - Set your warehouse to delivery in 2 steps - Create a contact say BOB and in the sale & purchase tab of its form set the Customer Location to a sublocation of Partners/Customers say: Partners/Customers/BOB - Create and confirm a sale order for BOB for 1 unit of a any product - Validate the pick #### > The delivery and its move have `Partner/Customer` as `move_dest_id`. ### Cause of the issue: During the `_run_push`, we only adapt the `location_dest_id` to match the `location_final_id` in the case where the new move skip push: https://github.com/odoo/odoo/blob/61d2fb3bb3281f3455490ac6033b95e3c50b4e2b/addons/stock/models/stock_rule.py#L241-L245 However, in the present case where you push to a parent location of `location_final_id` the move does not `skip_push`: https://github.com/odoo/odoo/blob/61d2fb3bb3281f3455490ac6033b95e3c50b4e2b/addons/stock/models/stock_move.py#L2034-L2037 and the `location_dest` is the one of the rule: https://github.com/odoo/odoo/blob/61d2fb3bb3281f3455490ac6033b95e3c50b4e2b/addons/stock/models/stock_rule.py#L241-L242 https://github.com/odoo/odoo/blob/61d2fb3bb3281f3455490ac6033b95e3c50b4e2b/addons/stock/models/stock_rule.py#L266 opw-5070855 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245701 Forward-Port-Of: odoo/odoo#243828
This update resolves an issue where tax reverse charges weren't properly accounted for in BIS3 invoices. The system now correctly identifies and handles these charges as 'Prepaid Amounts,' ensuring accurate tax calculations and compliance. This improves the reliability of invoice generation for international transactions.
Original PR description
There is no WithholdingTaxTotal node in BIS3. You cannot report any negative tax amount as taxes. You can only report VAT taxes but tax reverse charge are not considered as VAT. This commit reports the tax reverse charge amount as a PrepaidAmount instead. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245849 Forward-Port-Of: odoo/odoo#240525
This update resolves a problem where users with custom tax groups (like PPH) would prevent EFaktur printing. The change ensures that only the six standard Odoo tax groups are considered, allowing invoices with custom groups to print correctly. It also corrects how tax values are calculated for invoices with mixed tax groups.
Original PR description
Description of the issue/feature this PR addresses: This issue occured because in the previous update we add a condition to restrict multiple tax groups excluding the STLG. Apparently there is a case…
Description of the issue/feature this PR addresses: This issue occured because in the previous update we add a condition to restrict multiple tax groups excluding the STLG. Apparently there is a case where some users create their own tax groups (for example for PPH) so when they want to print an efaktur it will raise an error. Current behavior before PR: If a user create their own tax with a new tax group (outside of the 6 groups defined in `l10n_id`) and use it in invoice line along with one of the 6 tax groups excluding the STLG then it will blocked the print efaktur because it will raise an error Desired behavior after PR is merged: - The restriction in tax groups only applied for the 6 tax groups in l10n_id so if an invoice line has multiple tax groups as long as there no more than one of the 6 tax groups excluding the STLG then it should be able to print the efaktur. - Also when building the efaktur coretax value, the new tax group should not be included in the regular_tax variable which will cause the value to be 11/12 of the original value. - Add new condition to block the print efaktur if there is a tax inside the invoice but none of it belong to the 6 ppn tax groups (there is already a condition to block if no tax is given, but now since there are cases where they use tax group outside of the defined tax groups then it will print the efaktur) - If an invoice line does not have any ppn_tax_groups but there are other line in the same invoice that has it then it will still be able to print the efaktur, but the line without the ppn tax will have the OtherTaxBase and VATRate set to zero which will calculate the VAT as 0 too. [5434656](https://www.odoo.com/odoo/project.task/5434656) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245951 Forward-Port-Of: odoo/odoo#241979
This update enhances the monitoring of our AI-powered features by changing key logs from 'debug' to 'info' for easier tracking by our team and database administrators. Additionally, the system now accurately reports LLM token usage, providing a more precise understanding of AI service consumption. This improves operational efficiency and cost management.
Original PR description
In this commit we change some important llm api usage logs from debug to info so they can be more easily monitored by us and database admins. We also change the usage reporting from a naive estimation (which greatly under-reported the token usage) to the actual token usage given to us by the LLM prodivers in the response.
This update ensures accurate payslip updates by implementing a necessary security measure – running operations with elevated permissions (sudo). This prevents errors related to users modifying their own payroll information and resolves a technical issue that was previously causing system instability. It improves the reliability of payroll processing.
Original PR description
From a previous PR (103147), the payslip update logic was moved to the write function which gets called when a field is changed. In doing so, a sudo call is necessary to avoid problems with users modifying their own record (and not having access rights to read slip_ids). This also applies to tests and solves the following runbot error: Runbot Error: 237743 Forward-Port-Of: odoo/enterprise#105287
This update resolves an issue where Odoo would crash when receiving Stripe webhook notifications for transactions that didn't exist in the system. Now, Odoo gracefully handles these events, logging a warning and returning a standard response to Stripe, preventing payment disruptions. This ensures continued reliable online payments.
Original PR description
Prior to this commit, receiving a Stripe webhook notification for a transaction that does not exist in Odoo (e.g., Point of Sale "card_present" payments) would cause an Internal Server Error (500). The issue occurred because the controller attempted to call `_verify_signature(tx_sudo)` even when `tx_sudo` was empty. Inside `_verify_signature`, accessing `tx_sudo.provider_id` on an empty record triggered a "ValueError: Expected singleton" crash. Consequently, Stripe would interpret these 500 errors as a server failure and automatically disable the webhook endpoint, breaking online payments. This commit fixes the issue by checking if `tx_sudo` exists before proceeding with signature verification. If no transaction is found, Odoo now logs a warning and returns a 200 OK status to gracefully acknowledge and ignore the extraneous event. opw-5439528 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245777
This update corrects a problem where new work entries didn't properly remove older entries, and incorrectly linked versions. The fix ensures work entries are accurately generated and nullified across different Odoo versions, improving the reliability of the HR work entry process. This resolves inconsistencies in regeneration behavior.
Original PR description
Problem ---------- 3 issues : - If you generate work entries for a new version it will not nullify the already generated work entries for the previous active version. - The version_id on the work entry is not set to the active version at the date of the work entry - The regenerate hasn't the same behavior if you call it from the wizard or from the front. Fix ---------- Remove the skip of versions that ends before the date_start of the generation. To go through the nullify process. Remove the double nullify in the regenerate in the case we have slots (we don't come from the wizard) Correct the `_set_current_contract` to give the good version for the date. Forward-Port-Of: odoo/odoo#245863
This update resolves an issue in the website editor where deleting snippets could cause a selection error, specifically in Chrome. The fix ensures that offsets are validated when retrieving selection data, preventing errors when the selection becomes invalid due to user actions like deleting snippets. This improves the stability and reliability of the website editor.
Original PR description
**Description of the problem** In the website editor, the user can manipulate the page in such a way to generate a problematic `SelectionPlugin.activeSelection`, which still points to an existing…
**Description of the problem** In the website editor, the user can manipulate the page in such a way to generate a problematic `SelectionPlugin.activeSelection`, which still points to an existing `anchorElement`, but has an invalid `offset`. **How to reproduce** This seems to be reproducible only on Chrome. 1. Enter in the website edit mode 2. Drop the `s_newsletter` snippet 3. Drop the `s_popup` snippet 4. Click on the popup, and delete it 5. Click on the blank space inside the `s_newsletter` snippet 6. Delete the `s_newsletter` snippet 7. The error occurs Notes: 1. Snippet different than `s_newsletter` can be used to reproduce the problem, as long as they contain a blank space. 2. It is important to make sure that the movement of the mouse pointer does not trigger any preview when going from step 5 to step 6. **Why the problem happens** On Chrome, clicking on a blank area can cause `document.getSelection()` to return a selection with a null `anchorNode.` When this happens, `SelectionPlugin.getSelectionData()` will use the already existing `activeSelection` if `activeSelection.anchorNode` is still connected. Before this commit, this method only checked that `anchorNode` was connected, without validating offsets. This leads to the following edge case: 1. The user removes the `s_popup` 2. At this point, `document.getSelection()` would point to the `s_newsletter` snippet, so if the user just deletes the snippet nothing bad would happen. But instead, if: 3. The user clicks on a blank area in `s_newsletter`, `document.getSelection()` will now return a null `anchorNode` 4. The user delete the `s_newsletter` snippet, and `SelectionPlugin.getSelectionData()` is called by an handler after the deletion 5. At this point: `document.getSelection()` has a null `anchorNode`, so the method will check if `activeSelection.anchorNode` is still connected, WITHOUT validating the offsets. 6. Since `anchorNode` is still connected, this selection will be used, and an error will be triggered shortly after, because the offset is too high (pointing to `s_popup` which does not exist anymore). **Fix** After this commit, when `SelectionPlugin.getSelectionData()` checks that `activeSelection.anchorNode` is still connected it also checks that the offsets are valid (meaning that they are smaller than the number of nodes). task-5430500 Forward-Port-Of: odoo/odoo#245818 Forward-Port-Of: odoo/odoo#244331
5 changes
Resolved issues and error corrections
This update fixes an issue where dialog windows were hidden behind chat windows, making them difficult to use. Now, the AI chat window remains prominently displayed above all other dialogs, ensuring users can easily interact with both.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ Dialogs were rendered behind chat windows, making them difficult to see and interact with. **Current behavior before PR:** --------------------------------- - The dialog appears behind the chat window **Desired behavior after PR is merged:** ----------------------------------------- - Dialogs are displayed above all chat windows except AI - The AI chat window remains intentionally above dialogs **Task:** 5367135 Forward-Port-Of: odoo/enterprise#103076
This update fixes an error in the SYSCOHADA Profit and Loss report where the gross margin calculation was incorrectly adding instead of subtracting values. The change ensures the report accurately reflects the financial data as defined in the SYSCOHADA documentation, improving reporting accuracy for Ginea businesses using this localization.
Original PR description
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It…
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It is TA (701) - RA (601) +/- RB (6031). TA and RA should always be positive and negative, respectively.
In the report "Profit and Loss (SYSCOHADA)", the line RA is negated. XA then subtracts this value from TA, adding the two values instead of subtracting them.
Steps to reproduce:
1. Create a new company on runbot.
2. In Accounting > Configuration > Settings, set their Fiscal Localization to Ginea - SYSCOHADA for Companies.
3. Make a MISC journal entry.
1. Set a credit of 110,000,000 on account 701100 and balance it with 411100.
5. Set a debit of 75,000,000 on account 601100 and balance it with 401100.
6. Set a credit of 5,000,000 on account 603100 and balance it with 411100.
7. Post the entry.
8. Navigate to Accounting > Reports > Profit and Loss.
9. Set the l10n version, Profit and Loss (SYSCOHADA).
10. Set the current date.
11. See XA = 110 million + 75 million + 5 million = 190 million; this does not match the example given on pg 357 of Guide-d-application-du-SYSCOHADA.pdf, where XA = 40 million.
[opw-5482300](https://www.odoo.com/odoo/project.task/project.task/5482300)
Forward-Port-Of: odoo/enterprise#104736
Forward-Port-Of: odoo/enterprise#104479This update resolves errors in the SAF-T export process for Romanian companies when partner information (country or name) is incomplete. Specifically, it corrects issues related to generating the RegistrationNumber and prevents report errors caused by missing partner details, ensuring accurate financial reporting.
Original PR description
Fix SAF-T export errors when partners have no country or name. For Romanian companies, the RegistrationNumber should be generated as “04 + partner ID” for customers not subject to VAT and with unknown CNP, without including the country code. Steps to reproduce country issue: - Configure a Romanian company with l10n_ro_saft installed - Create a contact without a country - Create and validate an invoice for this contact - Export the SAF-T file from the General Ledger report You you will get a TypeError because you cant concatenate Bool and String. Steps to reproduce name issue: - Create a main contact - Add a child contact without a name - Change the child type to “Company” - Create and validate an invoice - Export the SAF-T file from the General Ledger report This prevents KeyError when printing the first 70 characters of the partner name in the report. opw-5499918 Forward-Port-Of: odoo/enterprise#105579 Forward-Port-Of: odoo/enterprise#105020
This update resolves an issue where sales orders with incomplete Mexican address information could prevent payment processing. The fix automatically enables 'CFDI to Public' when the address is missing, ensuring transactions are correctly validated and payments are recorded. This prevents silent errors and improves the reliability of online payments for Mexican customers.
Original PR description
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent…
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent error occurred during move validation: the transaction was created, but the payment was never recorded, and no error appeared in the portal or the SO chatter ### Cause: The CFDI validation error is raised internally but never surfaced to the user https://github.com/odoo/enterprise/pull/91655 The PO (MIAL) recommended automatically enabling `CFDI to Public` when the partner address is incomplete, forcing the user to complete the data This also ensures that the payment can be confirmed properly ### Steps to reproduce: - Install `l10n_mx_edi_sale` and switch to the MX company - Configure a Payment Provider and Payment Method (e.g., demo) - Create a customer without ZIP or country - Create a Sale Order for that customer - In Other Info, set Online Payment to 100% - Send the quotation and open the link in a private window - Sign and Pay Before the fix: the transaction is created, but no payment is recorded, and no error is shown opw-5023724 Forward-Port-Of: odoo/enterprise#101881
This update corrects a technical issue preventing accurate payslip updates, particularly for employees. By adding a 'sudo' call, the system now correctly accesses necessary data, resolving a previous error and ensuring payroll information is updated reliably. This improves the stability and accuracy of payroll processing.
Original PR description
From a previous PR (103147), the payslip update logic was moved to the write function which gets called when a field is changed. In doing so, a sudo call is necessary to avoid problems with users modifying their own record (and not having access rights to read slip_ids). This also applies to tests and solves the following runbot error: Runbot Error: 237743 Forward-Port-Of: odoo/enterprise#105287
15 changes
Resolved issues and error corrections
This update resolves an issue where sales orders in Mexico (CFDI) wouldn't process payments correctly if the customer's address was missing. The fix automatically enables 'CFDI to Public' when the address is incomplete, ensuring proper payment confirmation and preventing silent errors. This improves the reliability of online payments for Mexican customers.
Original PR description
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent…
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent error occurred during move validation: the transaction was created, but the payment was never recorded, and no error appeared in the portal or the SO chatter ### Cause: The CFDI validation error is raised internally but never surfaced to the user https://github.com/odoo/enterprise/pull/91655 The PO (MIAL) recommended automatically enabling `CFDI to Public` when the partner address is incomplete, forcing the user to complete the data This also ensures that the payment can be confirmed properly ### Steps to reproduce: - Install `l10n_mx_edi_sale` and switch to the MX company - Configure a Payment Provider and Payment Method (e.g., demo) - Create a customer without ZIP or country - Create a Sale Order for that customer - In Other Info, set Online Payment to 100% - Send the quotation and open the link in a private window - Sign and Pay Before the fix: the transaction is created, but no payment is recorded, and no error is shown opw-5023724 Forward-Port-Of: odoo/enterprise#101881
This update resolves an issue where AvaTax was failing due to orders lacking at least one line item. This prevented proper tax calculations and reporting, particularly in scenarios involving specific Odoo modules like industry_fsm_stock or subscription end dates. The fix ensures AvaTax only processes orders with valid line items.
Original PR description
Backport of https://github.com/odoo/enterprise/pull/101643. Original commit message for completeness: Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the…
Backport of https://github.com/odoo/enterprise/pull/101643. Original commit message for completeness: Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the taxes related to MXXX - SOXXX/XXX. Please check the status of `Sales Order XXX` in the AvaTax portal. Transactions must have at least one line. ``` There are various cases this can happen: 1/ if industry_fsm_stock is installed, empty orders are confirmed [1], 2/ if you put the end_date of a subscription before the next_invoice_date, then none of the lines are considered invoiceable [2] and you get the error when viewing the subscription in the portal This commit filters out orders without lines. It's also possible to filter this on the level of the models by doing it in _get_and_set_external_taxes_on_eligible_records(). However, this means doing it separately for each model, and requires every implementer do it manually. [1] https://github.com/odoo/enterprise/blob/703e7fd413e93a8287da98286aa93b9699ae3e96/industry_fsm_stock/models/project_task.py#L159 [2] https://github.com/odoo/enterprise/blob/c7bf4367a9bf6757a36a9f34a872a6e35a19a3a5/sale_subscription/models/sale_order_line.py#L475 opw-5214609 opw-5247727 opw-5311132 opw-5385960 Forward-Port-Of: odoo/enterprise#105587
This update resolves a problem where custom tax groups (beyond the standard 6) were preventing EFaktur reports from generating correctly. The fix ensures that invoices with a mix of standard and custom tax groups can now print without errors, while also correctly calculating VAT for invoices with varying tax configurations.
Original PR description
Description of the issue/feature this PR addresses: This issue occured because in the previous update we add a condition to restrict multiple tax groups excluding the STLG. Apparently there is a case…
Description of the issue/feature this PR addresses: This issue occured because in the previous update we add a condition to restrict multiple tax groups excluding the STLG. Apparently there is a case where some users create their own tax groups (for example for PPH) so when they want to print an efaktur it will raise an error. Current behavior before PR: If a user create their own tax with a new tax group (outside of the 6 groups defined in `l10n_id`) and use it in invoice line along with one of the 6 tax groups excluding the STLG then it will blocked the print efaktur because it will raise an error Desired behavior after PR is merged: - The restriction in tax groups only applied for the 6 tax groups in l10n_id so if an invoice line has multiple tax groups as long as there no more than one of the 6 tax groups excluding the STLG then it should be able to print the efaktur. - Also when building the efaktur coretax value, the new tax group should not be included in the regular_tax variable which will cause the value to be 11/12 of the original value. - Add new condition to block the print efaktur if there is a tax inside the invoice but none of it belong to the 6 ppn tax groups (there is already a condition to block if no tax is given, but now since there are cases where they use tax group outside of the defined tax groups then it will print the efaktur) - If an invoice line does not have any ppn_tax_groups but there are other line in the same invoice that has it then it will still be able to print the efaktur, but the line without the ppn tax will have the OtherTaxBase and VATRate set to zero which will calculate the VAT as 0 too. [5434656](https://www.odoo.com/odoo/project.task/5434656) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244760 Forward-Port-Of: odoo/odoo#241979
This update resolves an error that occurred when creating invoices in Chile due to an incorrect format for the document number (folio). The system now enforces that document numbers must be purely numeric, aligning with Chilean regulations. This ensures accurate invoice processing and avoids potential errors when submitting documents to tax authorities.
Original PR description
An error currently occurs when a user tries to confirm an account move using a document number that isn’t purely numeric and contains ASCII characters other than digits. Steps to replicate: - Install…
An error currently occurs when a user tries to confirm an account move using a document number that isn’t purely numeric and contains ASCII characters other than digits.
Steps to replicate:
- Install `l10n_cl` with demo and switch to CL company.
- Create a new invoice and add customer as `Andes Innovación SpA`.
- Add a move line > Add a product, price and tax.
- Give Document Number as `11-11`.
- Save and Confirm.
Error:
```
File /home/odoo/odoo18/enterprise/account_accountant/models/account_move.py, line 119, in action_post
res = super().action_post()
File /home/odoo/odoo18/community/addons/account/models/account_move.py, line 5478, in action_post
self._post(soft=False)
File /home/odoo/odoo18/enterprise/l10n_cl_edi/models/account_move.py, line 161, in _post
move._l10n_cl_create_dte()
File /home/odoo/odoo18/enterprise/l10n_cl_edi/models/account_move.py, line 646, in _l10n_cl_create_dte
folio = int(self.l10n_latam_document_number)
ValueError: invalid literal for int() with base 10: '11-11'
```
Cause:
- Trying to convert the document number to integer which includes some characters that are not numeric causes the error.
Solution:
- Specifically for Chile, the document number (folio) cant include anything other than numbers (Check the Sources listed below).
- Added a constraint on the field `l10n_latam_document_number` which only allows numbers using regex.
Sources:
- https://www.sii.cl/pagina/clave/folio.htm : The official Internal Revenue Service website for Chile provides information on the standard folio, along with a sample.
- https://www.sii.cl/factura_electronica/formato_dte.pdf : Refer to PG:11, Sr No:3, which specifies that the Folio should be of type NUM, meaning it must contain only numeric characters.
- The folio is created [here] that will be sent later to the authorities in the form of xml.
[here]: https://github.com/odoo/enterprise/blob/5a8bdb586e2d0bf9948a2d0b4c5e30b3849c0414/l10n_cl_edi/template/dte_template.xml#L8
No ID
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#241505This update fixes a bug where the Delivery Date wasn't appearing on the DIN 5008 sale order report and its preview. The change ensures that this critical date is now correctly displayed, as confirmed by functional experts, allowing for accurate reporting according to DIN 5008 standards. This impacts users generating these reports.
Original PR description
**Steps to reproduce:** 1. Install modules `sale_management` and `l10n_din5008_sale` 2. Go to Settings, Configure Document Layout and set layout to DIN 5008 3. Create a new Sale Order 4. Set a…
**Steps to reproduce:** 1. Install modules `sale_management` and `l10n_din5008_sale` 2. Go to Settings, Configure Document Layout and set layout to DIN 5008 3. Create a new Sale Order 4. Set a customer, add a product, and fill in the Delivery Date (Other Info) 5. Click on Print and Preview **Issue:** The Delivery Date (commitment_date) is not displayed on: - The DIN 5008 sale order report - The sale order preview (portal view) Functional experts confirmed that the Delivery Date must be visible when using the DIN 5008 layout. **Cause:** The `commitment_date` field was not included in the DIN 5008 sale order report template nor in the preview view. **Solution:** This commit adds the Delivery Date information to: - The DIN 5008 sale order report template - The sale order portal/preview view **opw-5490651** **Before:** <img width="560" height="145" alt="image" src="https://github.com/user-attachments/assets/fb29cda1-d668-4682-aa04-12c613f248d8" /> <img width="861" height="268" alt="image" src="https://github.com/user-attachments/assets/615f259f-e0ff-4fb5-9852-1fdd75cda4c9" /> **After:** <img width="589" height="145" alt="image" src="https://github.com/user-attachments/assets/3f1a8d25-783a-4600-b07e-11b547bb326b" /> <img width="824" height="271" alt="image" src="https://github.com/user-attachments/assets/46b37469-5c72-4556-95e2-eaea0824c166" /> Forward-Port-Of: odoo/odoo#244917
This update fixes an error in the SYSCOHADA Profit and Loss report that incorrectly calculated gross margin. The previous calculation added instead of subtracting RA, leading to inaccurate financial reporting. This ensures the report aligns with the official SYSCOHADA guidelines.
Original PR description
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It…
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It is TA (701) - RA (601) +/- RB (6031). TA and RA should always be positive and negative, respectively.
In the report "Profit and Loss (SYSCOHADA)", the line RA is negated. XA then subtracts this value from TA, adding the two values instead of subtracting them.
Steps to reproduce:
1. Create a new company on runbot.
2. In Accounting > Configuration > Settings, set their Fiscal Localization to Ginea - SYSCOHADA for Companies.
3. Make a MISC journal entry.
1. Set a credit of 110,000,000 on account 701100 and balance it with 411100.
5. Set a debit of 75,000,000 on account 601100 and balance it with 401100.
6. Set a credit of 5,000,000 on account 603100 and balance it with 411100.
7. Post the entry.
8. Navigate to Accounting > Reports > Profit and Loss.
9. Set the l10n version, Profit and Loss (SYSCOHADA).
10. Set the current date.
11. See XA = 110 million + 75 million + 5 million = 190 million; this does not match the example given on pg 357 of Guide-d-application-du-SYSCOHADA.pdf, where XA = 40 million.
[opw-5482300](https://www.odoo.com/odoo/project.task/project.task/5482300)
Forward-Port-Of: odoo/enterprise#104736
Forward-Port-Of: odoo/enterprise#104479This update resolves an issue where administrators couldn't view sales order information linked to serial numbers, preventing them from accurately tracking stock. The change expands access permissions to allow all users to see the relationship between serial numbers and sales orders, ensuring comprehensive inventory management. This was previously restricted by user permissions.
Original PR description
Steps to reproduce the bug - Create a storable product P1: - Tracking: Serial Number - Log in as Marc Demo - Create a sales order with 1 unit of P1 - Validate the delivery using serial number SN1 -…
Steps to reproduce the bug
- Create a storable product P1:
- Tracking: Serial Number
- Log in as Marc Demo
- Create a sales order with 1 unit of P1
- Validate the delivery using serial number SN1
- Log in as Mitchell Admin
- Go to Settings:
- Manage Users
- Mitchell Admin
- Sales: User: own documents only
- Go to the Serial Numbers list view:
- Try to open SN1
**Problem:**
An access error is triggered:
```
Uh-oh! Looks like you have stumbled upon some top-secret records.
Sorry, Mitchell Admin (id=2) doesn't have 'read' access to:
- Sales Order Line, S00025 - P1 (Deco Addict) (sale.order.line: 51)
Blame the following rules:
- Personal Order Lines
```
When clicking on SN1, the `stock.lot` form view.
it's contains the field "sale_order_count", which is a computed field that needs to access all `sale.order` records using the serial number in order to compute the count.
Since Mitchell Admin is restricted to his own sales orders only, an access error is raised during the computation.
There is also a many2many view widget that triggers an access errors. This widget can be removed since the smart button is now available. The widget has already been removed in v19.
**Solution:**
In this view, any stock user, admin or not, must be able to see how many sales orders use a given serial number, regardless of whether those sales orders belong to them or not.
opw-5400731
Forward-Port-Of: odoo/odoo#244570This update improves access for the Invoicing & Banks role within Odoo Enterprise. Previously, this role lacked access to key accounting reports like the General Ledger. Now, they have read-only access, enabling them to better monitor financial performance.
Original PR description
Before: The Invoicing & Banks role did not have access to important accounting reports such as General Ledger, Trial Balance, and Profit & Loss. After: The role now inherits read-only privileges, allowing access to all essential accounting reports. Task-5418541 Forward-Port-Of: odoo/enterprise#104868
This update resolves a bug where the 'Not Sent' filter in the Payments list view was incorrectly displaying payments. The fix ensures this filter accurately identifies and displays payments that haven't been processed, providing users with a reliable view of pending actions for both customer and vendor payments.
Original PR description
The "Not Sent" filter in Payments list view was not returning the expected records. This was due to an incorrect domain condition in the search view. This commit updates the filter logic to properly…
The "Not Sent" filter in Payments list view was not returning the expected records. This was due to an incorrect domain condition in the search view. This commit updates the filter logic to properly identify payments that haven't been processed or sent, ensuring the filter displays the correct records to the user. **Description of the issue/feature this PR addresses:** This PR fixes a bug in the "Not Sent" search filter within the Payment views (Account Payments). Currently, the filter fails to accurately identify and display records that have not been sent, leading to an empty or incorrect list of results regardless of the sending payment's actual status. **Current behavior before PR:** When a user applies the "Not Sent" filter in the Payments list view (including both Customer and Vendor payments), the system returns incorrect records or no records at all. This is caused by an inconsistent domain definition that doesn't align with the internal field tracking the "sent" status of the payment. **Desired behavior after PR is merged:** The "Not Sent" filter will correctly filter the list to show only those payments where the "Sent" status is not True. This will provide users with an accurate view of pending actions for both Customer and Vendor payments, ensuring consistency across the accounting module. **Steps to reproduce:** 1. Navigate to the Accounting (or Invoicing) module. 2. Go to Vendors > Payments or Customers > Payments (the issue is global). 3. Ensure there are several payments in the list, some marked as "Sent" and others not yet sent. 4. Click on the Filters dropdown menu in the search bar. 5. Select the "Not Sent" filter. 6. Observe the results: Notice that the list either becomes empty or continues to show records that do not match the "Not Sent" criteria, failing to filter the data correctly. **video** https://drive.google.com/file/d/1NTKQ1tHWyZWfs3CPolfDTOMrqaDD9OcN/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245487
This update resolves a technical issue that could cause live chat tabs to freeze or consume excessive resources. The fix prevents conflicting updates to local storage, ensuring a smoother and more reliable live chat experience for users. This improves overall system performance and stability.
Original PR description
A bad pattern has been used for some time in discuss for fields stored in localStorage. The field updates via the `onUpdate` function in the current tab and writes to localStorage. Other tabs use the `storage` event to update their field. This pattern can cause race conditions, leading to loops, high CPU usage, and freezes. When a tab receives a storage event, it may write back an outdated value, triggering further writes and conflicts across tabs. Storage events should be treated as read-only. Only user actions should update the local storage. This commit fixes the problematic fields. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245717
This update corrects a bug in Odoo's warehouse management system. When using multi-step delivery routes, the system now correctly pushes products to the intended final location (a sublocation) instead of defaulting to a general location. This ensures accurate product delivery, particularly important for automated batching based on destination.
Original PR description
### Issue: Applying a push rule in attempt to reach a precise sublocation will not adapt the destination of the move based on the `final_location_id` but solely base the destination based on the push…
### Issue: Applying a push rule in attempt to reach a precise sublocation will not adapt the destination of the move based on the `final_location_id` but solely base the destination based on the push rule. This is sub-optimal as the existence of an other push rule from this parent location to the sublocation is quite unlikely and validating that new move will therefore not push the product to its `location_final_id`. ### Concrete problematic example: For instance, the `property_stock_customer` (Customer location) provides a precise `final_dest_id` to deliver the customer. While, in one step delivery (not relying on push mechanic), confirming a delivery will generate a delivery with `location_dest` set to the precise Customer location because of pull rules, in two steps, the final delivery ends up targeting the general `Partner/Customer` location. This is particularly impactful in case of automatic batching based on destination location. ### Steps to reproduce: - In the settings enable: Multi-Steps routes - Inventory > Configuration > Warehouse Management > Warehouses - Set your warehouse to delivery in 2 steps - Create a contact say BOB and in the sale & purchase tab of its form set the Customer Location to a sublocation of Partners/Customers say: Partners/Customers/BOB - Create and confirm a sale order for BOB for 1 unit of a any product - Validate the pick #### > The delivery and its move have `Partner/Customer` as `move_dest_id`. ### Cause of the issue: During the `_run_push`, we only adapt the `location_dest_id` to match the `location_final_id` in the case where the new move skip push: https://github.com/odoo/odoo/blob/61d2fb3bb3281f3455490ac6033b95e3c50b4e2b/addons/stock/models/stock_rule.py#L241-L245 However, in the present case where you push to a parent location of `location_final_id` the move does not `skip_push`: https://github.com/odoo/odoo/blob/61d2fb3bb3281f3455490ac6033b95e3c50b4e2b/addons/stock/models/stock_move.py#L2034-L2037 and the `location_dest` is the one of the rule: https://github.com/odoo/odoo/blob/61d2fb3bb3281f3455490ac6033b95e3c50b4e2b/addons/stock/models/stock_rule.py#L241-L242 https://github.com/odoo/odoo/blob/61d2fb3bb3281f3455490ac6033b95e3c50b4e2b/addons/stock/models/stock_rule.py#L266 opw-5070855 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245314 Forward-Port-Of: odoo/odoo#243828
This update resolves an issue where embedded actions within documents were disappearing from the interface, preventing users from managing or deleting them. The fix ensures embedded child actions remain visible and accessible, streamlining the document action management process. This improves usability and reduces potential user frustration.
Original PR description
Server actions that were standalone (not a child) and embedded onto a documents folder cannot be executed anymore when they are linked to a parent action. Before saas-18.3, the embedded child action…
Server actions that were standalone (not a child) and embedded onto a documents folder cannot be executed anymore when they are linked to a parent action. Before saas-18.3, the embedded child action would still be in the documents' `available_embedded_actions`, and couldn't be removed, such that a fix was necessary. From saas-18.3 onwards, children embedded actions are no longer visible. As this precise case wasn't explicitly tested, we continue the FW-port with the (adapted) test. Furthermore, we add a garbage collection of the embedded actions for children actions, as they cannot be executed anymore. Initial FIX: ### ISSUE Certain embedded actions inside a folder may not appear in the folder’s server actions list (accessible via the gear icon), making them impossible to find or delete through the interface. This occurs because documents.document.get_documents_actions applies overly broad filtering that removes all child server actions, regardless of whether they are embedded in the folder. As a result, if two embedded actions are created in a folder and one is later set as a child of the other, the embedded child action disappears from the visible list but remains embedded in the folder, leaving no way to remove it from the UI. ### SOLUTION The method has been updated to exclude only non-embedded child actions. Embedded child actions are now preserved and correctly displayed in the folder’s actions list, allowing them to be managed and deleted as expected. opw-5213881 Forward-Port-Of: odoo/enterprise#101527 Forward-Port-Of: odoo/enterprise#100395
This update fixes a discrepancy in Odoo's Balance Sheet reports for several localized versions (CO, EC, KR, TW, and ZM). It ensures that 'Other Expenses' are correctly included in the unallocated earnings calculation, providing more accurate financial reporting. The change was triggered by a previous update and required adjustments to the localization-specific report data.
Original PR description
*= co, ec, kr, tw, zm Currently, the `Other Expense(expense_other)` account type, introduced in saas-18.3, is missing from the Balance Sheet reports of certain `localizations`, even though it's…
*= co, ec, kr, tw, zm Currently, the `Other Expense(expense_other)` account type, introduced in saas-18.3, is missing from the Balance Sheet reports of certain `localizations`, even though it's correctly implemented in the standard reports. **Steps to reproduce:** - Install the `l10n_co_reports` and `accountant` modules. - Switch to `CO company `and navigate to Accounting > Reporting > Balance Sheet. - Ensure the `report` smart button is set to `Balance Sheet (CO)`. - Equity > Previous Years Unallocated Earnings and click the `info icon`. - Observe the formula of `balance_domain`. **Observation:** The formula does not include the `expense_other` account type. **Root Cause:** After PR [1], at [2] `expense_other` was added to the Previous Years Unallocated Earnings balance domain only in the main `account_reports` module. The corresponding localization reports mentioned above were not updated accordingly, resulting in incomplete Balance Sheet formulas. **Fix:** This commit updates the Balance Sheet report and includes the `expense_other` account type in the Previous Years Unallocated Earnings balance domain, aligning them with the standard reports. [1]: https://github.com/odoo/enterprise/pull/101591 [2]: https://github.com/odoo/enterprise/blob/316a5965e5fae83bd7d901929160c87eb28d13cf/account_reports/data/balance_sheet.xml#L205 opw-5491639
This update resolves an issue where auto-batching wasn't triggered for deliveries with partially assigned moves. The fix ensures that a batch transfer is automatically created when a delivery is ready, regardless of the initial stock levels, improving inventory management efficiency. This change corrects a bug impacting delivery processing.
Original PR description
### Steps to reproduce: - In the settings enable: Batch, Wave & Cluster transfers - Inventory > Configuration > > Warehouse Management > Operation types - Enable Auto-batches, Batch grouping by…
### Steps to reproduce: - In the settings enable: Batch, Wave & Cluster transfers - Inventory > Configuration > > Warehouse Management > Operation types - Enable Auto-batches, Batch grouping by partner on Delivery orders - Create and confirm a delivery for 2 units of a storable product that you do not have in stock. - Change the quantity of the move to 1 unit #### > The delivery is not auto-batched ### Expected behavior: As the delivery becomes ready a batch transfer containing your delivery should be created. This is by the way what happens if you had at least 1 unit in stock when you confirm the deliver. ### Cause of the issue: The auto-batching is suppose to be applied on assigned pickings via the `_find_auto_batch` method: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_picking.py#L194-L198 That being said a picking is only batchable if it is Ready hence his state is 'assigned'. Now, the issue is that the `_find_auto_batch` is only callable in two places in our workflow: First at confirmation: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_picking.py#L138-L142 Which will fail in our case but wokrs in the use case where you have at least one unit in stock since the delivery is respectively not "assigned" or "assigned" at this point. And, else, wehn the sate of a move of the delivery is assigned: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_move.py#L30-L38 Now, the only issue with this call is that the picking becomes assigned if a move is partially assigned: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock/models/stock_picking.py#L841-L845 But since the move is not "assigned" but only "partially_vailable" this will not trigger a call of the `_find_auto_batch`. opw-5441718 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245542
This update fixes an issue where Odoo incorrectly exported negative discounts in Peppol BIS 3 invoices. The change ensures that negative discounts are now correctly classified as surcharges, aligning with PEPPOL standards and preventing calculation errors. This ensures accurate invoice generation and compliance with regulatory requirements.
Original PR description
In Peppol BIS 3 (UBL 2.1), negative discounts are logically treated as Surcharges (Charges) rather than Allowances. Previously, Odoo exported negative discounts as an Allowance with a negative amount and a numeric reason code (95). This violated: BR-CL-20 / PEPPOL-EN16931-CL003: Coded charge reasons must belong to the UNCL 7161 (alphabetic) list when ChargeIndicator is 'true'. PEPPOL-EN16931-R120: The line net amount calculation failed due to the negative sign in the calculation. Solution: Dynamically toggles ChargeIndicator based on the discount sign. Swaps AllowanceChargeReasonCode to 'ADK' (Surcharge) for negative discounts. task-5432024 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245136 Forward-Port-Of: odoo/odoo#244679
4 changes
Enhancements to existing features
This update grants the Invoicing & Banks role read-only access to critical accounting reports like General Ledger and Profit & Loss. Previously, this role lacked access, hindering their ability to perform essential financial analysis. This change improves reporting capabilities and streamlines workflows for this user group.
Original PR description
Before: The Invoicing & Banks role did not have access to important accounting reports such as General Ledger, Trial Balance, and Profit & Loss. After: The role now inherits read-only privileges, allowing access to all essential accounting reports. Task-5418541 Forward-Port-Of: odoo/enterprise#104868
Resolved issues and error corrections
This update fixes a calculation error in the SYSCOHADA Profit and Loss report. The report was incorrectly adding instead of subtracting the RA account, leading to inaccurate gross margin figures. This ensures the report aligns with the SYSCOHADA documentation and provides correct financial reporting.
Original PR description
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It…
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It is TA (701) - RA (601) +/- RB (6031). TA and RA should always be positive and negative, respectively.
In the report "Profit and Loss (SYSCOHADA)", the line RA is negated. XA then subtracts this value from TA, adding the two values instead of subtracting them.
Steps to reproduce:
1. Create a new company on runbot.
2. In Accounting > Configuration > Settings, set their Fiscal Localization to Ginea - SYSCOHADA for Companies.
3. Make a MISC journal entry.
1. Set a credit of 110,000,000 on account 701100 and balance it with 411100.
5. Set a debit of 75,000,000 on account 601100 and balance it with 401100.
6. Set a credit of 5,000,000 on account 603100 and balance it with 411100.
7. Post the entry.
8. Navigate to Accounting > Reports > Profit and Loss.
9. Set the l10n version, Profit and Loss (SYSCOHADA).
10. Set the current date.
11. See XA = 110 million + 75 million + 5 million = 190 million; this does not match the example given on pg 357 of Guide-d-application-du-SYSCOHADA.pdf, where XA = 40 million.
[opw-5482300](https://www.odoo.com/odoo/project.task/project.task/5482300)
Forward-Port-Of: odoo/enterprise#104736
Forward-Port-Of: odoo/enterprise#104479This update resolves a performance issue in the project timesheet report that was causing it to fail with large datasets. The team has optimized the query by using a more efficient join method, resulting in a faster loading time of approximately 2 seconds. This enhancement ensures the report remains responsive even with extensive project data.
Original PR description
After this commit https://github.com/odoo-dev/enterprise/commit/6c33bde74342b634d9f6fbda4ef407ffe9bac54f we introduced a new left join which seems that it slowed down the query a lot. So the report…
After this commit https://github.com/odoo-dev/enterprise/commit/6c33bde74342b634d9f6fbda4ef407ffe9bac54f we introduced a new left join which seems that it slowed down the query a lot. So the report doesn't load at all if we have a lot of records. In this PR we are introducing CROSS LATERAL JOIN as we want to generate only the the relevant dates not all dates between the min starting date and max ending date of all slots. Query plan after modification https://explain.dalibo.com/plan/eh5293ba2354f43c The testing cardinality of the tables: `planning.slot` 7178 rows `hr.employee` 332 rows `resource.resource` 332 rows `resource_calendar_leaves` 4061 rows `account_analytic_line` 267376 rows `generate_series()` will produce 206417 rows | Before | After | |-----------------------------------------|-------| | Query keep being active with no results | ~2s | opw-5089052 Forward-Port-Of: odoo/enterprise#105538 Forward-Port-Of: odoo/enterprise#102283
This update corrects a problem where payroll data wasn't being accessed correctly due to permission restrictions. By adding a 'sudo' call, the system now reliably retrieves the necessary data for payroll updates, preventing errors and ensuring accurate reporting. This resolves a previous technical issue.
Original PR description
From a previous PR (103147), the payslip update logic was moved to the write function which gets called when a field is changed. In doing so, a sudo call is necessary to avoid problems with users modifying their own record (and not having access rights to read slip_ids). This also applies to tests and solves the following runbot error: Runbot Error: 237743 Forward-Port-Of: odoo/enterprise#105287
25 changes
New functionality added to Odoo
This update introduces a new module to help businesses prepare and manage CSRD and VSME sustainability reports. By leveraging existing Odoo data and AI suggestions, companies can now easily track ESG metrics, assess materiality, and generate standardized reports for regulatory compliance and stakeholder transparency.
Original PR description
In this PR, we add the possibility to create and manage a complete CSRD/VSME report, integrated with AI, knowledge, survey and HR. The Corporate Sustainability Reporting Directive (CSRD) is a legal…
In this PR, we add the possibility to create and manage a complete CSRD/VSME report, integrated with AI, knowledge, survey and HR. The Corporate Sustainability Reporting Directive (CSRD) is a legal framework in the EU that requires companies to report on their sustainability performance. It aims to standardize ESG reporting across the EU and make the information more comparable and reliable for investors and other stakeholders. On the other hand, the Voluntary Sustainability Reporting for Micro and Small Enterprises (VSME) is a framework designed to support smaller companies in reporting on their sustainability performance. It encourages clear, comparable, and meaningful ESG disclosures while remaining proportionate to the size and capacity of the business. Our reporting feature facilitates the steps involved in preparing a CSRD/VSME report by using the data we already have in Odoo, such as emissions (Scope 1, 2, 3), employee data, supplier and client information, or fleet metrics. As well as using AI to make suggestions, and integrating knowledge articles and surveys. More precisely, the feature is composed of two main models: - A new model (`esg.metric)` that is only used if the CSRD reporting is enabled (and only used in the context of CSRD reporting). It is linked to an ESRS data point (either Environmental, Social or Governance category) and can be of different types (Positive/Negative Impact, Risk or Opportunity). It is used to assess if a topic is material or not (Double Materiality Assessment), depending on the impact severity and financial severity scores. As well as scores obtained from the stakeholder reviews (we get those scores from surveys that have been completed, the surveys are sent with the action "Stakeholder Review"). To help the user to create relevant metrics, we added an AI feature allowing to generate suggestions of metrics. Provided that the user gives a description of the company (size, revenues, activity, etc) to give as much context as possible to the AI prompt (see action "AI Suggest"). - A new model (`esg.report`) where you can specify the type of the report (CSRD or VSME), the dates (reporting date and base reference date), and additional information about the company. Once created, the report is linked to a knowledge article that contains the template of a complete CSRD/VSME report that you can edit, fold/unfold sections, add content, etc. When printing it to PDF, a lot of information is automatically filled in (data about your employees, accounting data, etc), including the carbon report, dynamic tables. That is done by replacing placeholders from the knowledge article when generating the PDF (an appendix includes all available placeholders with a small explanation for each). For CSRD reports only, there is the ability to automatically fold/unfold the ESRS sections of the articles depending on whether the data points we get from the metrics are material or not (see action "Update Materiality"). For VSME reports only, there is a "Basic Module + Comprehensive Module" type that will include additional sections (C1-C9). Note that you can also load them manually from the root article with the "Load Template" action. task-5172829 Forward-Port-Of: odoo/enterprise#96759
This update adds a required tax report (SICORE) for companies operating in Argentina, ensuring compliance with government regulations following the implementation of withholding taxes. Users can now generate this report and export it as a .txt file, providing a detailed record of earnings tax withholdings.
Original PR description
Purpose: The SICORE report is necessary for company to submit to the government monthly to comply with legal requirements since withholding was implemented for AR. The SICORE report is a tax report…
Purpose: The SICORE report is necessary for company to submit to the government monthly to comply with legal requirements since withholding was implemented for AR. The SICORE report is a tax report that provides a detailed overview of the withholdings performed in a given period. The user will also be able to export the report as a .txt file, containing formatted information about the earnings tax withholdings. Specification (this specification can be found in the SICORE application of the SIAP application): | No. | Desde | Hasta | Long | Tipo dato | Descripción | |-----|-------|-------|------|-----------|-----------------------------------------------------| | 1 | 1 | 2 | 2 | Entero | Código del comprobante | | 2 | 3 | 12 | 10 | Fecha | Fecha de emisión del comprobante (DD/MM/AAAA) | | 3 | 13 | 28 | 16 | Texto | Número del comprobante | | 4 | 29 | 44 | 16 | Decimal | Importe del comprobante | | 5 | 45 | 48 | 4 | Entero | Código de impuesto | | 6 | 49 | 51 | 3 | Entero | Código de régimen | | 7 | 52 | 52 | 1 | Entero | Código de operación | | 8 | 53 | 66 | 14 | Decimal | Base de cálculo | | 9 | 67 | 76 | 10 | Fecha | Fecha de emisión de la retención | | 10 | 77 | 78 | 2 | Entero | Código de condición | | 11 | 79 | 79 | 1 | Entero | Retención practicada a sujetos suspendidos según: | | 12 | 80 | 93 | 14 | Decimal | Importe de la retención | | 13 | 94 | 99 | 6 | Decimal | Porcentaje de exclusión | | 14 | 99 | 109 | 11 | Fecha | Fecha de emisión del boletín | | 15 | 110 | 111 | 2 | Entero | Tipo de documento del retenido | | 16 | 112 | 131 | 20 | Texto | Número de documento del retenido | | 17 | 132 | 145 | 14 | Entero | Número certificado original | task-4837110 Closes #86648
This update introduces a new tool to help companies comply with the EU's CSRD reporting requirements. The AI-powered tool guides users through the reporting process, leveraging existing Odoo data and providing intelligent suggestions for ESG data points and materiality assessments. This improves sustainability reporting accuracy and comparability.
Original PR description
In this PR, we add the possibility to create a complete CSRD reporting tool, integrated with AI. The Corporate Sustainability Reporting Directive (CSRD) is a legal framework in the EU that requires…
In this PR, we add the possibility to create a complete CSRD reporting tool, integrated with AI. The Corporate Sustainability Reporting Directive (CSRD) is a legal framework in the EU that requires companies to report on their sustainability performance. It aims to standardize ESG reporting across the EU and make the information more comparable and reliable for investors and other stakeholders. Our tool will guide the user towards the different steps of that specific report while using information they already have in Odoo (like scope 1,2 and 3 emissions, employee data, suppliers, clients or fleet). The tool is divided in multiple steps: - General: A complete description of the company (size, revenues, activity, etc) must be provided in order to give as much context as possible to the AI agent that will provide help and suggestions. To go to the next step, an action is available to generate relevant ESRS data points for the next step, and suggesting for each, some IROs (Impact, Risk, Opportunity) using AI generation. - ESRS: List of all relevant ESRS data points and their IROs for our company. We can add, remove, modify this list as we please. To go to the next step, an action button is provided in order to generate Double Materiality Assessement (AI generation), it will generate scores. - Materiality: List of relevant ESRS data points, their IROs and scores. The scores will help to know if a topic is material or not (useful to justify why it's the case in the report). There is also the possibility to ask stakeholders for reviews of those data points and score them, we will take the average of those score into account to compute the stakeholder score. A topic is considered as material if its `score >= (((impact_severity_score + financial_materiality_score) / 2) + stakeholder_score) / 2` Again, another action button is added to go to the next step and generate Quantitative data - Quantitative Data: Contains some interesting data about the company's emissions (scope 1, scope2, scope 3), HR related data (number of employees, pay gap, turnover rate, etc), environmental data, etc. It's interesting to mention this data in the final report. - The last step is simply the CSRD report generation, integrated with AI suggestions given all the data and context previously given. The generated report will be created as Knowledge articles (Introduction, General Disclosures, Environmental Disclosures, Social Disclosures and Governance Disclosures).
This update allows businesses to easily export sign request data in bulk for reporting and analysis. A new feature generates a linked Odoo Spreadsheet with responses, streamlining audit processes and eliminating manual data aggregation. The system automatically organizes these reports and ensures data persistence.
Original PR description
Businesses frequently need to extract sign request data in bulk for audit reporting and external analysis. Previously, users had to manually aggregate data from individual signature requests. This commit introduces a "View Answers" action on sign templates and a multi-record action on sign requests to generate a linked Odoo Spreadsheet. Key technical features: - Dynamic Schema: Automatically maps sign items (fields) to columns ordered by document position (Page, Y, X). - Static Data Injection: Data is injected as a static snapshot into the spreadsheet JSON to ensure performance and data persistence. - Auto-Organization: Stores generated reports in a dedicated 'Sign Request Answers' folder within the Documents app. - Multi-Tab Support: Handles multi-document templates by creating individual sheet tabs per document. Security: users can only export sign request that acl allows them to do so. task: 5424006
Enhancements to existing features
This update optimizes how Odoo's account reports process data, leading to faster report generation. By grouping related queries, the Generic Balance Sheet now runs significantly quicker – reducing processing time from 1 minute 35 seconds to 36 seconds. This improvement enhances the overall user experience and system efficiency.
Original PR description
Before this commit, the 'domain' engine was never batched: one expression to evaluate caused one SQL query to be run just for it. With this commit, we group domains that could be evaluated together. Essentially, when we have domains targetting the same many2one field of account.move.line (typically account_id, with conditions like 'account_id.code' or 'account_id.account_type'), we run only one SQL query for all of them, targetting all the move lines according to the report filters. Then, we iterate on its result for each domain to evaluate. When iterating over the results, we filter the ones we keep by searching separately on each traversing model (in our example, account.account), to isolate the ones that are actually targetted by each expression. Tested on our prod. With this, opening the Generic Balance Sheet goes from 1min 35s to 36s. opw-5130725 Forward-Port-Of: odoo/enterprise#105373 Forward-Port-Of: odoo/enterprise#101725
This update enhances the system administrator alerts displayed in Odoo Enterprise. It now allows for more flexible message formatting, including multiple alerts with different severity levels, improving communication about important server maintenance and operations. This change ensures system administrators receive timely and detailed notifications.
Original PR description
Tweak #102239 to allow more flexibility and display multiple messages with different alert level.
The ir.config_parameter is sysadmin.message and should be a json loadable. The format shoud be something like this:
{
"replace": false,
"warning_type": "user",
"message": "<div class='alert alert-info'>A maintenance operation is planned on your server on <strong>2026-01-15</strong> between 14h and 15h</div>"
}
Forward-Port-Of: odoo/enterprise#105157This update ensures that all users – internal and portal – adhere to the established document signing order. Previously, internal users could override this order, leading to inconsistencies. This change improves data integrity and compliance with signing protocols.
Original PR description
Signing Order currently controls the sequence in which recipients receive signature requests, but internal users can bypass this order and sign in any sequence. For example, a second signer may sign before the first one internally. This commit applies the same signing order rules to internal users as to portal users, ensuring the document signing order is always respected. task-5442663
This update enhances the usability of ECOs by streamlining the creation process and ensuring consistent product version visibility. Additionally, a change was made to prevent document uploads and removals once an ECO is applied, improving data integrity. This work addresses minor usability issues and improves the overall product management experience.
Original PR description
Improves ECO usability by: - Prefilling ECO type during creation - Making product version consistently visible on product and BOM forms and list views - Replacing date radio buttons with a clearer date field and placeholder - Replacing “Apply on” radio buttons with a selection field prefilled by context - Showing both Product-type and BOM-type ECOs in the product smart button - Fixing incorrect ECO count on the BOM smart button Improve Product Document: - Disable document upload and removal once an ECO is applied. - This is achieved by relying on `widget.deletable`: when an applied ECO is opened, it is in readonly mode, so the related documents kanban is also readonly; as a result, `widget.deletable` evaluates to false (`!props.readonly`), which hides the remove and undo actions. Task ID: 5358428
This update enhances the user experience for the 'itsme' authentication method in Odoo Sign by providing clearer visibility into available IAP credits and streamlining the process for purchasing more. The changes include a direct link to manage credits, a more informative email notification, and visual indicators in the Sign Editor, making it easier for users to complete transactions.
Original PR description
Prior to this commit, the integration of 'itsme' in Odoo Sign lacked visibility regarding IAP credits. Users could not easily see their balance when configuring roles, and the "insufficient credits"…
Prior to this commit, the integration of 'itsme' in Odoo Sign lacked visibility regarding IAP credits. Users could not easily see their balance when configuring roles, and the "insufficient credits" email was generic without actionable steps. Additionally, the Sign Editor sidebar did not visually distinguish between authentication methods (SMS vs itsme).
This commit improves the UX for the 'itsme' flow through the following changes:
1. Role Configuration (sign.item.role):
- Updates the form view to display the current available credits when 'itsme' is selected as the authentication method.
- Adds a direct link to the IAP service to manage credits.
2. Email Notification (mail.template):
- Refactors the 'sign_template_mail_not_enough_credits' template to use clearer wording ("due to insufficient credits") for all auth methods.
- Adds a specific condition for 'itsme': if verification fails due to lack of credits, the email now includes a direct link to the IAP purchase page.
3. IAP Account View (iap.account):
- Customizes the IAP account form specifically for the 'itsme_proxy' service.
- Relocates the credit balance display to a more prominent position under the account title.
- Hides the standard boolean status badges for this specific service to reduce clutter.
4. Sign Editor Sidebar (JS/XML):
- Adds visual badges to the signer list in the sidebar to indicate the selected authentication method (e.g., specific icon for itsme).
- Updates the backend model to inject 'auth_method' data into the sidebar props.
- Ensures the itsme badge remains visible in dark mode using inline styling.
Task: 5862540This update adds a new side panel to the Gantt view, mirroring the Calendar's scheduling features. Users can now easily schedule and unschedule tasks by dragging and dropping records between the list and the timeline, streamlining project management workflows.
Original PR description
This commit introduces a side panel to the Gantt view that mirrors the functionality of the Calendar view's scheduling section. The new panel displays a list of unscheduled records and supports drag-and-drop interactions, allowing users to easily: - Schedule records by dragging them from the list onto the Gantt timeline. - Unschedule records by dragging them from the timeline back into the side panel. task-5259058
This update simplifies the process of creating new accounting journals. Previously, a confusing 'New' button on the dashboard led to a separate wizard. Now, users can access the journal creation process through the cog menu on the dashboard or directly from the journal list view, streamlining the workflow.
Original PR description
In the accounting dashboard, clicking the "New" button would open the new journal creation wizard which was confusing, the button was completely removed and can now be accessed from the cog menu, the wizard is now also applied on the journal list view task-5422121
Resolved issues and error corrections
A previous issue prevented users with manufacturing admin access from completing work orders. This fix adds sudo access to the failing process, ensuring these users can now successfully 'Produce All' and complete manufacturing tasks. This resolves a workflow disruption for our manufacturing teams.
Original PR description
Steps to reproduce:
Create a user with admin access rights for Manufacturing and Quality only. Then, create a work center that has a cost per hour.
Create a product that has a BoM and create a MO then confirm it.
Add a work order that takes place in the created work center and has duration of 60 mins.
Using the created user, try to "Produce All".
Issue:
The user gets an access error when trying to "Produce All", eventhough they have manufacturing access rights.
Fix:
Add sudo access where the process fails to ensure that the workflow is as expected.
Note: a test will be added in anoher PR
opw-5480608
Forward-Port-Of: odoo/enterprise#104897This update resolves a technical issue where the VAT on bank payments (CFDI) was incorrectly reported when a bank account was missing or invalid. The fix ensures that VAT reporting is only triggered when a valid bank account with a country code is present, improving the accuracy of financial data. This impacts the l10n_mx_edi module.
Original PR description
This PR https://github.com/odoo/enterprise/pull/99418 broke the bank vat reported in payment cfdi. The vat should not be reported in case there is no bank account (or the bank has no country), but a foriegn bank vat was reported instead. This commit fixed this issue by checking the bank country along with its VAT before reporting its VAT. task-5745608
This update significantly speeds up the generation of budget reports by optimizing how data is filtered. Previously, a slow process involved generating a large table and filtering it afterward. Now, the filtering is applied directly within the underlying queries, reducing the amount of data processed and dramatically improving report generation times. This results in faster report loading and a better user experience.
Original PR description
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the…
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the UNION, any filtering (like on specific budget_line_ids) happened after the full, unfiltered table was generated. This post-filtering caused slowness, especially in nested loop joins with large tables like account.analytic.line. This commit optimizes performance by pushing the filter condition (using specific budget_line_ids) directly down into the three underlying queries. This reduces the number of budget.line records processed, speeding up joins and overall computation. The benchmark below is done on a database that has **66396** `budget.line` records and **928567** `account.analytic.line` records. Opening a budget report for a specific year, only applied the filter with **40** `budget.line` records. | Scenario | Execution Time | | :--- | :--- | | **Before this Commit** | **60.00 seconds** | **After this Commit** | **1.84 seconds** opw-5150569 Forward-Port-Of: odoo/enterprise#102918 Forward-Port-Of: odoo/enterprise#99096
This update addresses a bug where users weren't receiving warnings when exceeding a customer's sales credit limit within the Point of Sale (POS) system. The fix ensures that a warning indicator is displayed, preventing over-spending and potential financial issues. This improves accuracy and protects the business from exceeding credit limits.
Original PR description
Steps to reproduce: ------------------- 1. Install pos_settle_due and accountant 2. In Accounting settings, enable "Sales Credit Limit" 3. Create a new customer, enable its "Partner Limit" and set it…
Steps to reproduce: ------------------- 1. Install pos_settle_due and accountant 2. In Accounting settings, enable "Sales Credit Limit" 3. Create a new customer, enable its "Partner Limit" and set it to 100 4. Open PoS, select that partner, and select products such that the total exceeds 100 Notice that even though we have exceeded that partner's limit of 100, there are no indicators on the customer button (orange background on hover), nor there are warnings on the partners list modal nor on the payment page. Why the bug ----------- In `getPartnerCredit`, we are using `order.amount_total` to get the current ordre amount, however, this field is `undefined` for a new order and it's been assigned a value in `setOrderPrices`, which since [9538698](https://github.com/odoo/odoo/commit/9538698), is only called before sending the order to the backend. The fix ------- Now we read the total amount from the getter `order.priceIncl`, and round it as we would do in `setOrderPrices`. opw-5489975 Forward-Port-Of: odoo/enterprise#105548 Forward-Port-Of: odoo/enterprise#104591
This update resolves a JavaScript error that occurred when opening the Shop Floor from the replenishment flow. The fix ensures the application name is correctly identified, preventing a traceback and improving the reliability of this key workflow. This change enhances the user experience when managing manufacturing orders.
Original PR description
Opening the Shop Floor via the replenishment/forecast flow can raise a js traceback. **Steps to produce:** - Install `mrp` module. - Enable `multi-step routes` from the settings. - Inventory >…
Opening the Shop Floor via the replenishment/forecast flow can raise a js traceback. **Steps to produce:** - Install `mrp` module. - Enable `multi-step routes` from the settings. - Inventory > Configuration > Warehouse Management > Routes. - In Manufacture route, make sure route is Applicable On `products`. - Inventory > Products > Products > New. - Click on forcasted button on product > Click on replenish button > Confirm. - Click the Manufacturing Order shown in the notification. - Confirm the MO and click Shop Floor. **Issue:** A JavaScript error occurs: `TypeError: Cannot read properties of null.` **Root cause:** The Shop Floor view relies on the menu service to determine the current application name by calling `this.menu.getCurrentApp().name`. When the Shop Floor is opened from the replenishment/forecast flow, the navigation occurs through action-based triggers rather than through the main menu. As a result, no menu selection is performed and `setCurrentMenu()`[1] is not executed beforehand.This leaves the current application undefined, causing `menu.getCurrentApp()` to return undefined and leading to a js traceback when `.name` is accessed. [1]: https://github.com/odoo/odoo/blob/c646cb61d0752250b2600413d6d63deabd1d3e6d/addons/web/static/src/webclient/menus/menu_service.js#L57-L64 simillar fix : https://github.com/odoo/enterprise/pull/93043 Note: A tour is possible but unnecessary for this small use-case. opw-5462965 --- Forward-Port-Of: odoo/enterprise#104706
This update resolves a problem preventing refunds from printing correctly on Italian fiscal printers. The issue stemmed from a missing method in the POS system that was inadvertently removed during a recent update. The fix re-introduced this method, ensuring refunds now print as expected.
Original PR description
Step to reproduce: - install `l10n_it_pos` - setup Italian fiscal printer for a pos - refund a order and print receipt Observation: receives a traceback ```js Caused by: TypeError:…
Step to reproduce: - install `l10n_it_pos` - setup Italian fiscal printer for a pos - refund a order and print receipt Observation: receives a traceback ```js Caused by: TypeError: ctx.this.order.getRefundInfo is not a function at Header.template (eval at compile (https://97822380-19-0-design-theme.runbot118.odoo.com/web/assets/debug/point_of_sale.assets_prod.js:16388:20), <anonymous>:11:62) (/web/static/lib/owl/owl.js:5807) at Fiber._render (https://97822380-19-0-design-theme.runbot118.odoo.com/web/assets/debug/point_of_sale.assets_prod.js:12364:38) (/web/static/lib/owl/owl.js:1783) at Fiber.render (https://97822380-19-0-design-theme.runbot118.odoo.com/web/assets/debug/point_of_sale.assets_prod.js:12356:18) (/web/static/lib/owl/owl.js:1775) at ComponentNode.initiateRender (https://97822380-19-0-design-theme.runbot118.odoo.com/web/assets/debug/point_of_sale.assets_prod.js:13036:23) (/web/static/lib/owl/owl.js:2455) ``` Cause: - A <Header/> component is used in invoices, which requires a method `getRefundInfo`. - commit [1] removes <Header> and its related files, - commit [2] removes dead code, hence removed `getRefundInfo` - commit [3] brings back <Header>, but the method was not reintroduced [1] https://github.com/odoo/enterprise/commit/3d532f6ee99884bce58a577eb68464e670fb059a [2] https://github.com/odoo/enterprise/commit/1b03fe15916b7b86f79efcbb63895ae0c4363ef9 [3] https://github.com/odoo/enterprise/commit/d745a72e3f43febb3b39054dc9315eca13d86e36 Fix: - Add the method back After fix: **image from simulator** <img width="600" height="300" alt="image" src="https://github.com/user-attachments/assets/f6caccca-caf6-477f-bf37-f942090535cc" /> opw-5485350 Forward-Port-Of: odoo/enterprise#105048
This update addresses a recurring issue causing tours to fail in several Odoo modules, impacting around 300 tours. The change introduces a mechanism to handle delays within tours, ultimately aiming to eliminate random errors and ensure a more reliable user experience. This improves the stability of key feature walkthroughs.
Original PR description
Add special key for tours that require a delay between steps to not crash. It concerns more or less 220 tours on average 1600. The goal is to remove this key and fix the tour to make it deterministic (remove random errors).
This update fixes an error in the SYSCOHADA Profit and Loss report where the gross margin calculation was incorrectly adding instead of subtracting account values. The change ensures the report accurately reflects the Ginea - SYSCOHADA fiscal localization requirements as defined in the official documentation, leading to more reliable financial reporting.
Original PR description
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It…
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It is TA (701) - RA (601) +/- RB (6031). TA and RA should always be positive and negative, respectively.
In the report "Profit and Loss (SYSCOHADA)", the line RA is negated. XA then subtracts this value from TA, adding the two values instead of subtracting them.
Steps to reproduce:
1. Create a new company on runbot.
2. In Accounting > Configuration > Settings, set their Fiscal Localization to Ginea - SYSCOHADA for Companies.
3. Make a MISC journal entry.
1. Set a credit of 110,000,000 on account 701100 and balance it with 411100.
5. Set a debit of 75,000,000 on account 601100 and balance it with 401100.
6. Set a credit of 5,000,000 on account 603100 and balance it with 411100.
7. Post the entry.
8. Navigate to Accounting > Reports > Profit and Loss.
9. Set the l10n version, Profit and Loss (SYSCOHADA).
10. Set the current date.
11. See XA = 110 million + 75 million + 5 million = 190 million; this does not match the example given on pg 357 of Guide-d-application-du-SYSCOHADA.pdf, where XA = 40 million.
[opw-5482300](https://www.odoo.com/odoo/project.task/project.task/5482300)
Forward-Port-Of: odoo/enterprise#104736
Forward-Port-Of: odoo/enterprise#104479This update resolves issues in the Romanian SAF-T export process that occurred when partner information (country or name) was incomplete. Specifically, it corrects errors related to invoice generation and ensures accurate SAF-T file creation, improving compliance for Romanian companies.
Original PR description
Fix SAF-T export errors when partners have no country or name. For Romanian companies, the RegistrationNumber should be generated as “04 + partner ID” for customers not subject to VAT and with unknown CNP, without including the country code. Steps to reproduce country issue: - Configure a Romanian company with l10n_ro_saft installed - Create a contact without a country - Create and validate an invoice for this contact - Export the SAF-T file from the General Ledger report You you will get a TypeError because you cant concatenate Bool and String. Steps to reproduce name issue: - Create a main contact - Add a child contact without a name - Change the child type to “Company” - Create and validate an invoice - Export the SAF-T file from the General Ledger report This prevents KeyError when printing the first 70 characters of the partner name in the report. opw-5499918 Forward-Port-Of: odoo/enterprise#105579 Forward-Port-Of: odoo/enterprise#105020
This update enhances the monitoring of our AI integrations by changing key log levels to 'info' for easier tracking by our team and database administrators. Additionally, the system now accurately reports token usage from LLM providers, addressing a previous underreporting issue. This provides better insights into AI costs and performance.
Original PR description
In this commit we change some important llm api usage logs from debug to info so they can be more easily monitored by us and database admins. We also change the usage reporting from a naive estimation (which greatly under-reported the token usage) to the actual token usage given to us by the LLM prodivers in the response. Forward-Port-Of: odoo/enterprise#105627 Forward-Port-Of: odoo/enterprise#105364
This update resolves a bug that prevented successful NFC-e refunds in Point of Sale (PoS). The fix corrects a logic error in how the system checks for existing invoices, ensuring that refund requests are processed correctly. This improves the reliability of NFC-e transactions.
Original PR description
**Steps to reproduce:**
- Setup a database that supports NFC-e
- Go to PoS, make a purchase, then refund it
- A traceback appears, saying we couldn't find the original invoice
**Why the fix:**
Before this commit the way we checked if there was already an invoice in the payload we give to the API was wrong, as it was always true. This happens because before the
*def _get_l10n_br_avatax_service_params(self):* call, we set res['invoice_refs'] as {}, then we were supposed to fill it. But if we check https://github.com/odoo/enterprise/blob/32b73b12f9f8f5600b820d9a938bfbb0cf10054d/l10n_br_edi_pos/models/account_move.py#L13 'invoice_refs' is found in res, even though it is empty, so we never entered the if statement.
We now check if there is a value in res['invoice_refs'] and if not we set it.
opw-5359407
Forward-Port-Of: odoo/enterprise#104987
Forward-Port-Of: odoo/enterprise#102770This update resolves an issue where contact information wasn't consistently displayed when receiving incoming calls. The team corrected a missing piece of code in the 'getOrCreateCall' function, ensuring that contact details are now correctly fetched and shown. This improves the user experience when managing calls.
Original PR description
In https://github.com/odoo/enterprise/pull/105036, some part of the code in getOrCreateCall was forgotten. Consequently, on an incoming call, contact info could sometimes not be displayed.
This update resolves an issue where sale orders with missing address information in Mexico prevented successful online payments. The fix automatically enables 'CFDI to Public' when the address is incomplete, ensuring transactions are validated and payments are recorded as required by Mexican regulations. This improves payment processing reliability for Mexican customers.
Original PR description
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent…
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent error occurred during move validation: the transaction was created, but the payment was never recorded, and no error appeared in the portal or the SO chatter ### Cause: The CFDI validation error is raised internally but never surfaced to the user https://github.com/odoo/enterprise/pull/91655 The PO (MIAL) recommended automatically enabling `CFDI to Public` when the partner address is incomplete, forcing the user to complete the data This also ensures that the payment can be confirmed properly ### Steps to reproduce: - Install `l10n_mx_edi_sale` and switch to the MX company - Configure a Payment Provider and Payment Method (e.g., demo) - Create a customer without ZIP or country - Create a Sale Order for that customer - In Other Info, set Online Payment to 100% - Send the quotation and open the link in a private window - Sign and Pay Before the fix: the transaction is created, but no payment is recorded, and no error is shown opw-5023724 Forward-Port-Of: odoo/enterprise#101881
This update resolves a bug that prevented the Gantt chart from correctly rescheduling tasks when using new Date fields instead of DateTime fields. The fix ensures that date-based rescheduling functions properly, improving the usability of the Gantt chart for project planning. This change was implemented after addressing a related issue in a previous pull request.
Original PR description
…atetime
Steps to reproduce
==================
- Install web_studio,project
- Open a project task
- Open studio
- Add a new Date field in the form view
- Switch to the gantt view
- Change the Start Date Field to the newly create Date field
- Exit studio
- Open a task
- Set a value for the date field
- Switch to the gantt view
- Drag the record
```
start_date_field_name in vals and datetime.strptime(vals[start_date_field_name], '%Y-%m-%d %H:%M:%S')
^^^^^^^^
ValueError: time data '2025-12-22' does not match format '%Y-%m-%d
```
Cause of the issue
==================
Since https://github.com/odoo/enterprise/pull/84820 , it only works for DateTime fields
opw-5345470
Forward-Port-Of: odoo/enterprise#104751
Forward-Port-Of: odoo/enterprise#1030687 changes
Resolved issues and error corrections
This update fixes an error in the SYSCOHADA Profit and Loss report where the gross margin calculation was incorrectly adding instead of subtracting values. The change ensures the report accurately reflects the financial data as defined in the SYSCOHADA guidelines, preventing reporting discrepancies.
Original PR description
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It…
The SYSCOHADA gross margin is defined on page 330 - 331 of the document [Guide-d-application-du-SYSCOHADA.pdf](https://www.ohada.com/uploads/actualite/3504/Guide-d-application-du-SYSCOHADA.pdf). It is TA (701) - RA (601) +/- RB (6031). TA and RA should always be positive and negative, respectively.
In the report "Profit and Loss (SYSCOHADA)", the line RA is negated. XA then subtracts this value from TA, adding the two values instead of subtracting them.
Steps to reproduce:
1. Create a new company on runbot.
2. In Accounting > Configuration > Settings, set their Fiscal Localization to Ginea - SYSCOHADA for Companies.
3. Make a MISC journal entry.
1. Set a credit of 110,000,000 on account 701100 and balance it with 411100.
5. Set a debit of 75,000,000 on account 601100 and balance it with 401100.
6. Set a credit of 5,000,000 on account 603100 and balance it with 411100.
7. Post the entry.
8. Navigate to Accounting > Reports > Profit and Loss.
9. Set the l10n version, Profit and Loss (SYSCOHADA).
10. Set the current date.
11. See XA = 110 million + 75 million + 5 million = 190 million; this does not match the example given on pg 357 of Guide-d-application-du-SYSCOHADA.pdf, where XA = 40 million.
[opw-5482300](https://www.odoo.com/odoo/project.task/project.task/5482300)
Forward-Port-Of: odoo/enterprise#104736
Forward-Port-Of: odoo/enterprise#104479This update resolves issues preventing accurate SAF-T file generation for Romanian companies when partner information (country or name) is incomplete. Specifically, it corrects errors related to generating the RegistrationNumber and prevents report errors caused by missing partner details, ensuring compliance with Romanian accounting regulations.
Original PR description
Fix SAF-T export errors when partners have no country or name. For Romanian companies, the RegistrationNumber should be generated as “04 + partner ID” for customers not subject to VAT and with unknown CNP, without including the country code. Steps to reproduce country issue: - Configure a Romanian company with l10n_ro_saft installed - Create a contact without a country - Create and validate an invoice for this contact - Export the SAF-T file from the General Ledger report You you will get a TypeError because you cant concatenate Bool and String. Steps to reproduce name issue: - Create a main contact - Add a child contact without a name - Change the child type to “Company” - Create and validate an invoice - Export the SAF-T file from the General Ledger report This prevents KeyError when printing the first 70 characters of the partner name in the report. opw-5499918 Forward-Port-Of: odoo/enterprise#105579 Forward-Port-Of: odoo/enterprise#105020
This update resolves an issue where sale orders with missing customer address information in Mexico prevented successful online payments. The fix automatically enables 'CFDI to Public' when the address is incomplete, ensuring proper payment confirmation and preventing silent transaction errors. This improves the reliability of Mexican sales transactions.
Original PR description
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent…
### Issue: On a Mexican sale order, it was possible to have an invalid partner address while `CFDI to Public` was not enabled In this situation, an online payment could be initiated, but a silent error occurred during move validation: the transaction was created, but the payment was never recorded, and no error appeared in the portal or the SO chatter ### Cause: The CFDI validation error is raised internally but never surfaced to the user https://github.com/odoo/enterprise/pull/91655 The PO (MIAL) recommended automatically enabling `CFDI to Public` when the partner address is incomplete, forcing the user to complete the data This also ensures that the payment can be confirmed properly ### Steps to reproduce: - Install `l10n_mx_edi_sale` and switch to the MX company - Configure a Payment Provider and Payment Method (e.g., demo) - Create a customer without ZIP or country - Create a Sale Order for that customer - In Other Info, set Online Payment to 100% - Send the quotation and open the link in a private window - Sign and Pay Before the fix: the transaction is created, but no payment is recorded, and no error is shown opw-5023724 Forward-Port-Of: odoo/enterprise#101881
This update fixes an issue where dialog windows were hidden behind chat windows, making them difficult to use. Now, the AI chat window remains prominently displayed above all other dialogs, ensuring users can easily interact with both. This improves the overall user experience for the Enterprise platform.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ Dialogs were rendered behind chat windows, making them difficult to see and interact with. **Current behavior before PR:** --------------------------------- - The dialog appears behind the chat window **Desired behavior after PR is merged:** ----------------------------------------- - Dialogs are displayed above all chat windows except AI - The AI chat window remains intentionally above dialogs **Task:** 5367135 Forward-Port-Of: odoo/enterprise#103076
This update resolves an issue where signed documents were sometimes displayed incorrectly, showing fields that hadn't been filled in. The change ensures the document is refreshed after loading, guaranteeing a complete and accurate view of the signed document for users. This improves the user experience and prevents confusion.
Original PR description
Ensure sign items are refreshed after the PDF iframe is fully loaded to avoid displaying partially signed documents without fields when not in sign mode. task-5877678
This update fixes an issue where editing component quantities on the shop floor incorrectly displayed all internal locations instead of just the source location. The fix ensures that only the intended source location is considered when updating component quantities, improving accuracy in work order management. This resolves a previous bug impacting inventory tracking.
Original PR description
In the shop floor when you edit the quantity of components, all the components for the internal localization will appear instead of only the one from the source location
Steps to reproduce:
-------------------
- Active lot/serial number in settings
- Create component A tracked by lot, and add quantities in two location (WH/stock and WH/random)
- Create a product with a bom that use component A
- Create an operation for that bom
- Update the bom to consume the component during the operation
- Create a workorder for the product, confirm it and go to the shop floor
- Click on the operation
- Edit the quantity of components
-> all internal localisation appear (WH/{stock/random})
Observation:
-------------
The domain consider all localisation where the usage is internal: https://github.com/odoo/enterprise/blob/e99c20547528f6664d091cd230ce94cf76a08eb1/mrp_workorder/static/src/mrp_display/mrp_record_line/stock_move.js#L119
opw-5268989This update ensures salary configuration personal information is automatically populated using the employee's most recent version, regardless of whether it's a standard offer or a contract template. This eliminates inconsistencies and provides a more accurate and up-to-date salary setup process for all employees.
Original PR description
The personal informations in the salary config is prefilled using the version selected in the offer. When making a new offert for an already employed person, the default version is the last active version, the address and other personal info are already set on that version and the salary has the last up-to-date data. But when selecting a contract template in an offer, the version does not have the personal info from the employee (as it's a template). In this commit, we force to use the employee itself (from the active version of the employee, or the employee linked to the contract template copy - created during the offer creation). may it be an applicant or an existing employee, when an offer is generated, an employee is created (or re-used) and set on the contract template. So it works in every case. Taks-5162703 Forward-Port-Of: odoo/enterprise#99908
12 changes
Resolved issues and error corrections
This update resolves an issue where AvaTax was failing due to orders lacking at least one line item. This prevented proper tax calculations and reporting, particularly in scenarios involving specific Odoo modules like industry_fsm_stock or subscription settings. The fix ensures that AvaTax only processes orders with valid line items.
Original PR description
Backport of https://github.com/odoo/enterprise/pull/101643. Original commit message for completeness: Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the…
Backport of https://github.com/odoo/enterprise/pull/101643. Original commit message for completeness: Calling Avatax without lines results in an error and blocks flows: ``` Odoo could not fetch the taxes related to MXXX - SOXXX/XXX. Please check the status of `Sales Order XXX` in the AvaTax portal. Transactions must have at least one line. ``` There are various cases this can happen: 1/ if industry_fsm_stock is installed, empty orders are confirmed [1], 2/ if you put the end_date of a subscription before the next_invoice_date, then none of the lines are considered invoiceable [2] and you get the error when viewing the subscription in the portal This commit filters out orders without lines. It's also possible to filter this on the level of the models by doing it in _get_and_set_external_taxes_on_eligible_records(). However, this means doing it separately for each model, and requires every implementer do it manually. [1] https://github.com/odoo/enterprise/blob/703e7fd413e93a8287da98286aa93b9699ae3e96/industry_fsm_stock/models/project_task.py#L159 [2] https://github.com/odoo/enterprise/blob/c7bf4367a9bf6757a36a9f34a872a6e35a19a3a5/sale_subscription/models/sale_order_line.py#L475 opw-5214609 opw-5247727 opw-5311132 opw-5385960 Forward-Port-Of: odoo/enterprise#105587
This update resolves an issue where customer claims weren't being processed correctly due to a limitation in how the system matched invoices based on VAT numbers. Specifically, when a child invoice shared the same VAT number as the parent, the system would incorrectly select a partner, leading to missed account move updates. This fix ensures accurate claim processing.
Original PR description
When we process new customer claims, we need to search for the corresponding account moves in order to update their `l10n_cl_dte_acceptation_status`. Currently, we only expect 1 partner per VAT number when searching for a partner to match with the account move. However, this is not always true. For instance, a child invoice contact will share the same VAT number than the parent partner. This can lead to the selection of the wrong partner in the search domain and consequently, the account move not being found. Related ticket: opw-5257481 Forward-Port-Of: odoo/enterprise#103366
This update resolves an issue where product attributes and values within the Purchase Product Matrix weren't being translated into the correct language for the vendor's location. The fix ensures that all product information, including attribute names and values, are displayed in the appropriate language when a purchase order is created. This improves the accuracy and usability of the Purchase Product Matrix for international vendors.
Original PR description
When adding a product with never variant, their name and values are not translated in the language of the partner. ### Steps to reproduce: * Activate the setting Variants and Variant Grid Entry. *…
When adding a product with never variant, their name and values are not translated in the language of the partner. ### Steps to reproduce: * Activate the setting Variants and Variant Grid Entry. * Create a product , add a translation for its name. * Create a attribute and a translation for its name, with variant creation set to never. * Create values for the attribute and add translation for their name. * Add the attribute and it's values to the product . * Create a contact and change it's language to the language of the translation. * Create a purchase order set the contact as the vendor * Add the product, and set the grid number to 1 -> the attribute and attribute value is not translated. ### Observation: When adding a product via the variant grid, the attribute and value names are added. For other attribute creation types, this information is retrieved directly from the product: https://github.com/odoo/odoo/blob/f95bcc097fd7e70af8d28a66c010ae9b9490f439/addons/purchase/models/purchase_order_line.py#L283-L288 But in case of never attribute, the name it retrieved after and we don't set the context: https://github.com/odoo/odoo/blob/f95bcc097fd7e70af8d28a66c010ae9b9490f439/addons/purchase_product_matrix/models/purchase.py#L173-L174 -> we retrieve the information but in the wrong language opw-5396058
This update resolves a regression that prevented new participant registrations within the PEPPOL system. The issue stemmed from an outdated configuration that required existing EDI proxy users, leading to failures for new registrations. This fix ensures smooth and successful participant onboarding.
Original PR description
Fix regression of participant fetch cron introduced in forward port odoo/odoo#245038 Indeed self might be a record set in lots of different cases, which leads to users at least 1 existing edi proxy user in their company, all future registrations will fail
This update resolves an issue preventing Odoo payments using Swedbank's Bankgiro accounts. Swedbank requires a specific 'RfdDocAmt' field in payment XMLs, which was missing in Odoo's generated batches. This fix adds this field, ensuring successful payment processing and avoiding bank rejections.
Original PR description
**PROBLEM** Swedbank requires the RfdDocAmt Element for Bankgiro account. [documentation](https://internetbank.swedbank.se/ConditionsEarchive/download?bankid=1111&id=WEBDOC-PRODE211415244). Payment batches generated by Odoo don't contains this fields, meaning they are refused by the bank. **REPRO STEPS** We can't reproduce the error the client have because it would require a valid bankgiro account. To generate the payment batch xml you have to: 1. Install l10n_se. 2. Create a vendor bank account of type bankgiro. 3. Create a vendor payment with this vendor bank account. 4. Create a batch payment and validate it. 5. There should be a xml in the chatter, you can look at it to see there is no RfdDocAmt element. opw-5427505
This update resolves an issue where auto-batching wasn't triggered for deliveries with partially assigned moves. The fix ensures that a batch transfer is automatically created when a delivery is ready, regardless of the initial stock levels, improving inventory management efficiency.
Original PR description
### Steps to reproduce: - In the settings enable: Batch, Wave & Cluster transfers - Inventory > Configuration > > Warehouse Management > Operation types - Enable Auto-batches, Batch grouping by…
### Steps to reproduce: - In the settings enable: Batch, Wave & Cluster transfers - Inventory > Configuration > > Warehouse Management > Operation types - Enable Auto-batches, Batch grouping by partner on Delivery orders - Create and confirm a delivery for 2 units of a storable product that you do not have in stock. - Change the quantity of the move to 1 unit #### > The delivery is not auto-batched ### Expected behavior: As the delivery becomes ready a batch transfer containing your delivery should be created. This is by the way what happens if you had at least 1 unit in stock when you confirm the deliver. ### Cause of the issue: The auto-batching is suppose to be applied on assigned pickings via the `_find_auto_batch` method: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_picking.py#L194-L198 That being said a picking is only batchable if it is Ready hence his state is 'assigned'. Now, the issue is that the `_find_auto_batch` is only callable in two places in our workflow: First at confirmation: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_picking.py#L138-L142 Which will fail in our case but wokrs in the use case where you have at least one unit in stock since the delivery is respectively not "assigned" or "assigned" at this point. And, else, wehn the sate of a move of the delivery is assigned: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock_picking_batch/models/stock_move.py#L30-L38 Now, the only issue with this call is that the picking becomes assigned if a move is partially assigned: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/stock/models/stock_picking.py#L841-L845 But since the move is not "assigned" but only "partially_vailable" this will not trigger a call of the `_find_auto_batch`. opw-5441718 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where subcontract quantities weren't being split correctly, leading to inaccurate production tracking. The fix ensures that the quantity of products produced under subcontracting is accurately reflected in the system, improving the reliability of production reports and inventory management. This update impacts the MRP and subcontracting modules.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where quantity calculations were incorrect for subcontracting processes within the MRP module. The fix ensures accurate tracking and reporting of materials used in subcontracted production, improving the reliability of production data and reducing potential errors in costing.
This update resolves an issue where Odoo was incorrectly including a UETR tag in ISO 20022 payment files, causing rejection by strict banks. The change ensures compliance with SEPA regulations, preventing errors and guaranteeing successful payment processing. This improves compatibility with major banking systems.
Original PR description
In Odoo 18.0, when a user selects the pain.001.001.09 format (ISO 20022), Odoo systematically includes the <UETR> (Unique End-to-end Transaction Reference) tag for every transaction. While valid under the general ISO 20022 XML schema, the <UETR> tag is not authorized by the EPC (European Payments Council) within the standard SEPA Credit Transfer (SCT) Rulebook. Strict banks (e.g., UBS, German banks) reject the entire file with errors such as: "No child element is expected at this point" when an UETR is detected in a domestic or intra-SEPA flow. Task: 5871528
This update fixes an issue where the virtual keyboard would cover bottom sheets in the Point of Sale module, preventing users from seeing their input. The change ensures the bottom sheet correctly resizes with the viewport, resolving this visibility problem and improving the user experience.
Original PR description
Before this commit, when you clicked on an input that didn’t have focus inside a bottom sheet, the virtual keyboard popped up on top of the bottom sheet, hiding the input. As a result, you couldn’t…
Before this commit, when you clicked on an input that didn’t have focus inside a bottom sheet, the virtual keyboard popped up on top of the bottom sheet, hiding the input. As a result, you couldn’t see what you were typing. This happens because, in this case, the browser opens the virtual keyboard in overlay mode and does not resize the viewport. This seems to be a common behavior for inputs inside fixed or overlay-based layouts such as bottom sheets. Strangely, when you clicked on an input that was already the active element, the keyboard still popped up, but the viewport was resized and the bottom sheet remained visible. In this situation, the browser treats the keyboard appearance as a viewport change and recomputes the layout to keep the active element visible (safe mode?). To fix this inconsistency, we now explicitly control how the virtual keyboard affects the layout by forcing the bottom sheet to resize with the viewport. This is done by using `interactive-widget: resizes-content`, which ensures the viewport is resized when the keyboard appears and prevents the bottom sheet from being covered. Note that we should probably apply this change on the web as well, but it seems that we currently don’t have any inputs inside bottom sheets there. Since this is a fix, we prefer to apply it only where it is necessary for now. https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/meta/name/viewport#interactive-widget opw-5491343 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where negative procurement quantities were not being processed correctly, specifically within MTO product workflows. The change impacts the creation of purchase orders when a user reduces the quantity of an MTO product. This ensures accurate procurement quantities are generated.
Original PR description
Steps to reproduce ----- - Enable routes - Unarchive MTO - Create a MTO product with a vendor - Create a final product - Create a MO for final product - Confirm MO - Open catalog - Add 0.5 of the MTO…
Steps to reproduce ----- - Enable routes - Unarchive MTO - Create a MTO product with a vendor - Create a final product - Create a MO for final product - Confirm MO - Open catalog - Add 0.5 of the MTO product - Open the linked purchase > Quantity on the PO is 1 Cause ----- The catalog creates a move with a default quantity of 1 when the product is clicked. Then, when the user updates the quantity in the catalog, it triggers a `write` of the `product_uom_qty` (which triggers a procurement). Error comes from the code added in commit c0f00e4, which changed the `_run_procurement` of `stock.move` to avoid creating returns for done moves. https://github.com/odoo/odoo/blob/07198521ea1defb6abb9a6e619b8824bbb1d16a7/addons/mrp/models/stock_move.py#L493-L497 In our case, all of the conditions are met: - the quantity update is negative - the move is MTO - `move_orig_ids` is empty, so the `all()` is also true This means the move gets skipped for procurement, although that was not the goal of the commit. Even if we were to fix this last condition, there is also a problem with https://github.com/odoo/odoo/blob/07198521ea1defb6abb9a6e619b8824bbb1d16a7/addons/mrp/models/stock_move.py#L505-L507 that was also affected by the mentioned commit. Since `move_orig_ids` is empty, `possible_reduceable_qty` is 0. And because `procurement_qty` is negative, taking the max of the 2 will always mean `procurement_qty` is 0. This again does not match the goal of the original commit. ----- Ticket: opw-5440296
This update fixes an issue where refund calculations for Mexican VAT (l10n_mx_edi_pos) were inaccurate due to incorrect summing of line items. The change ensures that refunds are compared against the original order total correctly, preventing errors and ensuring proper processing of multi-line orders. This improves the reliability of refund transactions.
Original PR description
Before this commit, the some of individual line amounts were being summed to compare against the original order total when processing a refund. This could lead to incorrect comparisons due to rounding issues, resulting in errors when attempting to refund orders with multiple lines. <img width="626" height="288" alt="image" src="https://github.com/user-attachments/assets/e1bdc126-64d9-4b9a-bd16-2b97ac75e40c" /> opw-5433201
2 changes
Resolved issues and error corrections
This update fixes an issue where text within the cart summary card was difficult to read on dark website themes, particularly on mobile. The change ensures sufficient contrast between text and background colors, improving the user experience and making the checkout process clearer.
Original PR description
Steps: - Switch the website background to a dark color - Add a product to the cart - Go to cart checkout page - Switch to mobile view - Observe the text next to amounts (Subtotal, Taxes, Total) inside cart summary card. <img width="322" height="493" alt="image" src="https://github.com/user-attachments/assets/eb04ded2-bd5d-4b19-9707-be7ca8bd2953" /> Issue: - Text next to amounts becomes unreadable on dark backgrounds in mobile view Cause: - The cart summary block is a card which was using a fixed background color, while text colors are dynamically adapted to the website theme colors, leading to contrast issues. Fix: - Update the card background color to rely on the website color palette to ensure proper contrast and readability opw-5386622
This update resolves a bug where the timer stopped appearing for survey participants after submitting their answers in live sessions. The fix ensures the timer correctly displays for the duration of the session, improving the participant experience and data accuracy. This change was made to align the survey logic with live session behavior.
Original PR description
Description of the issue/feature this PR addresses: Fixes timer not showing to participants of a live session after submitting an answer. Current behavior before PR: Steps to reproduce: Create a…
Description of the issue/feature this PR addresses: Fixes timer not showing to participants of a live session after submitting an answer. Current behavior before PR: Steps to reproduce: Create a Survey with two questions of any type. Set some Question Time Limit on both. Create Live Session for that Survey. Access Live Session as a participant. Start Survey as the host. The first question appears to the participant, with the timer on the top right. Answer the question as the participant and click Submit or press Enter. On the host side move to the next question. Bug: timer for the second question does not appear to the participant. Desired behavior after PR is merged: Fix: The logic to hide the timer is on `survey_form.js`. In the `_nextScreen` function. Specifically, when `options.isFinish` is set to `true`. It is set to `true` in the `_onSubmit` function. This function triggers when the participant submits an answer. The fix: only set that flag to `true` if there isn't a session in progress. This aligns with the other calls to `_nextScreen` for live sessions. That is, when a timer expires and the form is submitted: `'isFinish': !this.options.sessionInProgress` and when a notification is received for the session: `isFinish: nextPageEvent.type === 'end_session'` Meaning that for live sessions the only time `isFinish` should be set to `true`, is when the `end_session` notification is received. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr