Daily updates from Odoo
Wednesday, March 18, 2026
22 changes · master
New functionality added to Odoo
This update introduces a new report for French businesses, specifically the '2033-B Simplified P&L' (Compte de résultat simplifié) and Liasse fiscale, aligning with French tax regulations. This addition enhances Odoo Enterprise's reporting capabilities for French users, simplifying their financial reporting obligations.
Original PR description
This commit adds the Liasse fiscale, 2033-B Compte de résultat simplifié, report And fix a typo in the base report Task 5417358
This update introduces a new report for Polish businesses that still need to generate JPK_FA XML reports even when using the KSeF online invoicing system. This report ensures compliance with Polish tax regulations by listing invoices and lines not yet validated by KSeF, aligning with JPK-FA(4) standards.
Original PR description
In Poland, if a business chooses to keep B2C invoicing outside of KSeF (online platform), the JPK_FA obligation remains. It is a XML report that lists all the invoices and the invoice lines that have not been validated by KSeF during a desired period of time. The report follows the JPK-FA(4) norms. task-5166047 Forward-Port-Of: odoo/enterprise#103000
This update enables direct electronic invoicing for POS sales and returns in Colombia, streamlining the process for businesses. It adapts existing DIAN EDI functionality to work with POS data, reducing manual steps and improving efficiency. A key feature is sharing a single DIAN sequence, optimizing costs for businesses.
Original PR description
In Colombia, all POS Sales/Returns must be supported by an Electronic Document. Currently, the only way to connect the DIAN EDI and POS flows is to manage invoices directly in the Accounting App.…
In Colombia, all POS Sales/Returns must be supported by an Electronic Document. Currently, the only way to connect the DIAN EDI and POS flows is to manage invoices directly in the Accounting App. This pr adds the possibility to generate and send the electronic documents directly to DIAN without leaving the POS store. This pr will not create intermediate invoices/credit notes that are supposed to be sent to DIAN, instead we adapted the already existing ubl-generation implementation (in `l10n_co_dian`) to be able to generate the correct files using data from `pos.order` models (implementation can be found in `models/account_edi_xml_ubl_dian.py`). During this process we created some 'common' functions that generate data for the ubl file independent of what model is used (`account.move` or `pos.order`), these common functions are a first step for the future refactoring of the ubl models. An important thing to note here is that the common functions are only used for the pos orders, generating documents for invoices is still done using the original implementation. Another important feature of this implementation is the possibility to share a single sequence, defined on the journal, between pos orders and account moves. This was implemented because in Colombia (and other latam countries) the sequence gets assigned to a company by the government, and can therefore be expensive. Important to note is that sharing a sequence is only possible if the company has never sent documents to DIAN before (~ no existing edi documents). task-4038651 Forward-Port-Of: odoo/enterprise#78742
This update introduces a new wage type option within Odoo's payroll system, allowing businesses to calculate and pay employees based on a daily wage rate. This expands payroll flexibility to accommodate various employment models and ensures accurate compensation calculations for daily workers. The change impacts multiple international payroll modules.
Original PR description
Task: 5852568
Enhancements to existing features
This update brings the Balance Sheet and Profit & Loss reports for Chinese businesses in line with the latest accounting standards (ASBE and ASSBE). The changes improve report consistency and accuracy, ensuring compliance and reliable financial reporting.
Original PR description
### [IMP] l10n_cn_reports: update BS & PnL We update the Balance Sheet and Profit & Loss reports to be consistent with updated ASBE and ASSBE standards odoo-[251681](https://github.com/odoo/odoo/pull/251681) task-[5939988](https://www.odoo.com/odoo/all-tasks/5939988) --- We encountered an issue where setting `groupby = False` still resulted in an error (no groupby and children lines). This was resolved by setting a co-dependent variable `user_groupby = False`. The reports has lines with "Includes:" and sibling lines' name are expected to be aligned with it. Hierarchy lines and using various space characters (CJK space ` `, and "en" space ` `) was a maintenance nightmare. We instead chose to remove `includes:` as it's implied by the natural indentation of grouped lines. Forward-Port-Of: odoo/enterprise#109175
This update significantly enhances the map view by automating route calculations using the latest technology, providing a more efficient way to plan routes. It also cleans up the pin list UI, isolating unlocated records and improving the overall user experience. This streamlines operations for users relying on map-based data.
Original PR description
*: planning_field_service, project_enterprise, stock_fleet_enterprise, web_studio This commit acts as a follow-up to https://github.com/odoo/enterprise/pull/104618, heavily improving the map view's…
*: planning_field_service, project_enterprise, stock_fleet_enterprise, web_studio This commit acts as a follow-up to https://github.com/odoo/enterprise/pull/104618, heavily improving the map view's routing capabilities and pin list UI: **Routing & Optimization:** * **Automated Routing:** Manual record resequencing has been completely removed. Routing now utilizes the Mapbox Optimization API to automatically calculate the most efficient point-to-point route, including a return to the starting point. * **Dynamic Starting Point:** Added a new input for the starting (and returning) address. It uses the Mapbox or OpenStreetMap API for autocomplete and coordinate fetching. It defaults to the user's location (if available) or falls back to the active company's address. A toggler allows users to quickly reset to their location or clear the input. **Pin List & UI Improvements:** * **Unlocated Records:** Records without coordinates are now isolated in a dedicated group and can be clicked to open their form view directly. * **Empty Groups:** Groups containing only unlocated records are no longer displayed in the pin list to reduce clutter. * **Formatting:** The route duration tooltip now uses the latest duration formatter for a cleaner display. task-5930464
This update enhances the payrun review process by introducing a new warning dialog to highlight unreviewed employee records and pending time-offs. This allows HR staff to proactively address these items, ensuring accurate payroll processing and compliance. The change also includes translations for improved usability.
Original PR description
Task: 5965128
This update automatically populates Partena codes for common work entry types in Odoo, streamlining the payroll setup process for Belgian companies. Previously, users had to manually enter these codes, leading to inefficiencies and potential errors. This change simplifies compliance and reduces administrative burden.
Original PR description
Problem --------- Work entry types for Belgian companies currently lack default Partena codes, forcing users to manually input them, which is inefficient and prone to errors. Objective ---------- Provide pre-configured Partena codes for both common and Belgium-specific work entry types to automate the setup process. Solution ---------- Identified the required records and mapped our internal work entry types to the official Partena documentation, populating the 'Partena code' field with these default values. task-5411465
Resolved issues and error corrections
This update resolves several issues within the timesheet grid component, primarily focusing on the systray interface. Key improvements include fixing display errors, enhancing usability with expanded descriptions and clearer labels, and streamlining the user experience for time entry and record management.
Original PR description
Task-5956044 Forward-Port-Of: odoo/enterprise#109651
This update resolves an issue where the Point of Sale system in Mexico incorrectly flagged invoices as invalid when the customer was missing a ZIP code or country. The fix ensures the 'Invoice to Public' setting is correctly transmitted to the ORM, preventing the error and allowing users to properly set invoices to public status.
Original PR description
## Issue In the POS of a Mexican company, when requesting an invoice, the user is asked to set the invoice to public or not. If the customer is missing a recognized ZIP code or country, setting the…
## Issue
In the POS of a Mexican company, when requesting an invoice, the user is asked to set the invoice to public or not. If the customer is missing a recognized ZIP code or country, setting the invoice to public **should not** raise an error, but it does. This is because the `l10n_mx_edi_cfdi_to_public` field is not correctly updated in the ORM, which leads to the UserError below being triggered, as `l10n_mx_edi_cfdi_to_public` is always set to `False` if it's not updated by its `_compute` method.
https://github.com/odoo/enterprise/blob/dd89c2c72039c9910cc0a303bca332f4103c08f6/l10n_mx_edi/models/account_move_send.py#L54-L55
## Cause
The said field is not properly updated because it is a *compute field*. Such fields are not transferred to the ORM because of the two following conditions from the POS:
1. https://github.com/odoo/odoo/blob/5c2280d089f248dff67df980bee1ce6a4156f2c9/addons/point_of_sale/static/src/app/models/related_models.js#L205-L206
2. https://github.com/odoo/odoo/blob/5c2280d089f248dff67df980bee1ce6a4156f2c9/addons/point_of_sale/static/src/app/models/related_models.js#L895-L896
## Solution
To minimize behavioral changes, the required field (`l10n_mx_edi_cfdi_to_public`) is simply added at the end of the
serialization process.
Once this field is correctly shared with the ORM, the UserError is not longer raised when the *Invoice to Public* field is set to "Yes" in the POS.
## Versions >= 19.1
Since https://github.com/odoo/odoo/pull/216523, the error would only be displayed **after** moving onto the FeedbackScreen. Since then, the validation is only computed after moving the POS to the next screen.
**To correctly prevent the user from confirming an order with invalid data, we now check the constraints everytime the customer or the invoicing method is updated:**
- If a customer is selected, trying to set *"Invoice to public"* to *"No"*
will raise an error if the user does not have a ZIP code and a country set.
- If *"Invoice to public"* is set to *"No"*, trying to remove the current
customer or select a customer with a missing ZIP code or country will raise an error.
## Steps to reproduce the initial error:
1. Install the following app and module:
- Point of Sale (`point_of_sale`)
- Mexican Localization for the Point of Sale (`l10n_mx_edi_pos`)
2. Set the company to a Mexican one (e.g., *ESCUELA KEMPER URGATE*)
3. Open the POS app
4. Open a register
5. Select a product and click *Add*
6. Click *Payment*
7. Set the Customer to a new customer with only a name
(no Country/ZIP Code)
- Click "Cash" to set the Remaining to 0
8. Toggle the *Invoice* button, set the *Invoice to Public* to *"Yes"* and click *Ok*
9. Click *Validate*.
10. An error *"Invalid Operation, CFDI not set to Public"* appears.
opw-5171035
Forward-Port-Of: odoo/enterprise#101365
Forward-Port-Of: odoo/enterprise#99871This update restores essential VAT checks within the Belgian tax reporting module, addressing previous issues that caused warnings during XML uploads to Intervat. A new check has been added to ensure returns only pass if all VAT validation warnings are cleared, improving data accuracy and compliance.
Original PR description
Since the implementation of returns, some VAT checks were no longer being executed. This led to warnings when uploading the XML to Intervat. To catch these issues beforehand, this commit: - Restores the warning checks directly on the report. - Adds a new check on the VAT return that passes only if no warnings are raised. task-5883037 Forward-Port-Of: odoo/enterprise#107152
This update fixes an issue where reporting queries were using outdated currency rates, leading to inaccurate financial reports. The change ensures that the correct, same-day currency rate is used in all CTA queries, improving the reliability and accuracy of financial data. This impacts the trial balance and other account reports.
Original PR description
We use currency rate at day x - 1 to be applicable at a date x, which shouldn't be applicable in the cta queries. Use same-day rate for the CTA query. task-5969168 Forward-Port-Of: odoo/enterprise#108879
This update ensures shift emails are automatically sent to employees in their preferred language, regardless of the user's settings. Previously, emails defaulted to the current user's language, causing confusion. This change improves communication and user experience for international teams.
Original PR description
Steps to reproduce: ------------------------- 1. Install Planning and Contacts. 2. Install any language other than English (e.g., Arabic). 3. Change an employee's contact language to that language.…
Steps to reproduce: ------------------------- 1. Install Planning and Contacts. 2. Install any language other than English (e.g., Arabic). 3. Change an employee's contact language to that language. 4. Create a shift for that employee and click "Send". 5. Check the message in Settings > Technical > Discuss > Messages. Issue: --------- The email is sent in the language of the current user rather than the language of the employee receiving the shift. Cause: --------- The mail template rendering logic ([_render_lang](https://github.com/odoo/odoo/blob/0dbfa8b99d5c28a7d84e781a7f23b226fd964e95/addons/mail/models/mail_render_mixin.py#L549-L566)) fails to determine a valid language on the planning slot record because it is not directly linked to a `partner_id`. As a result, it falls back to the current user's language. Solution: ------------ Explicitly pass the employee partner's language in the mail context so that the email is sent in the correct language. opw-5928676 Forward-Port-Of: odoo/enterprise#110778 Forward-Port-Of: odoo/enterprise#109619
This update ensures that quality checks are only performed on tracked products when a lot or serial number is assigned. Previously, users could initiate quality checks without this information, leading to an error message prompting assignment. Additionally, the quality check display now intelligently filters checks based on whether any moves have been picked.
Original PR description
This commit fixes the behavior when the user tries to do quality checks for tracked products without setting their lot/sn on the picking. Before this commit: Nothing happens if the user tries to do quality checks if lots are not set on the tracked products. After this commit: A User Error is raised telling the user to assign lots/sn to the tracked products. Additional improvement: Before this commit, when having quality checks and user click on `Quality Checks` button, all quality checks appear regardless of whether all moves are picked or only some of them are picked. After this commit, clicking on `Quality Checks` button will only show quality checks related to picked move lines if at least one move line is picked, otherwise it will show all quality checks. Task-5730239 Forward-Port-Of: odoo/enterprise#110697 Forward-Port-Of: odoo/enterprise#104945
This update fixes a problem causing incorrect stock synchronization for Amazon listings, leading to phantom orders. The fix allows users to manually specify the fulfillment channel (FBA or FBM) for listings, resolving a known 'ghost listing' issue. This ensures accurate stock management and order fulfillment.
Original PR description
When configuring a listing on Amazon Seller Central, the user must choose **one** of the available fulfillment channels that Amazon offers. We distinguish two kinds: Fulfillment by Amazon (FBA) and…
When configuring a listing on Amazon Seller Central, the user must choose **one** of the available fulfillment channels that Amazon offers. We distinguish two kinds: Fulfillment by Amazon (FBA) and Fulfillment by Merchant (FBM). However, Amazon suffers from a known issue of ghost listings. A ghost listing occurs when an offer is presumably sold via FBA, but in fact stores stock information for both FBM and FBA creating unwanted FBM orders. To avoid ghost listings, the first solution was to disable stock synchronization as soon as an offer contained stock in the Amazon location of Odoo. However, if a merchant decided to change the fulfillment channel, it became impossible to sync the stock anymore. See also e7c01c7097d90e731c5408cee4d3595ed810c8fa. To resolve this issue, we decided to use the Amazon API to fetch information about the fulfillment channel of a listing. However, Amazon doesn't give a clear answer for a given listing. Therefore, after some research, the assumption was that an offer was FBM if the listing contained a `merchant_shipping_group`, as the merchant shipping group is a setting specific to FBM listings. See also e6d620e4b200cadabb00ce37ab03289cfeb4ae58. However, this assumption was flawed because Amazon can keep the shipping group even if the listing switches to FBA. This in turn enabled stock synchronization, leading to ghost listings. To fix this issue we give the possibility to users to manually set the correct fulfillment channel of an offer when it becomes ambiguous. opw-5480254 See also: - https://github.com/odoo/upgrade/pull/9692 Forward-Port-Of: odoo/enterprise#106662
This update fixes an issue where barcode-created manufacturing orders incorrectly used product UoMs instead of the specified BoM UoMs. Now, MOs created through the barcode app accurately reflect the BoM's component quantities, ensuring correct inventory tracking. This resolves a previous traceback and improves order accuracy.
Original PR description
Previous behaviour: * Traceback if MO created with a BoM whose lines have UoMs that don't correspond to those of the products, then UoM setting disabled and MO viewed in the barcode app. * BoM line UoMs ignored in favour of product UoMs when creating MO in the barcode app. New behaviour: * No traceback. * Stock moves in MOs properly created with the corresponding BoM line UoMs. Task ID: [4674196](https://www.odoo.com/odoo/my-tasks/4674196) Forward-Port-Of: odoo/enterprise#110740 Forward-Port-Of: odoo/enterprise#90408
This update corrects a bug in the DIAN invoice processing workflow that was causing original invoices to be accidentally deleted. The previous logic incorrectly protected the oldest document, leading to the deletion of the current invoice. This fix ensures invoices are properly protected during the update process, preventing data loss.
Original PR description
**PROBLEM** In some configurations, `_l10n_co_dian_cron_update_event_status()` would delete the original document of the invoice. **CAUSE** The logic that tried to exclude the original document from the code that unlinks duplicated documents is wrong. It protect the oldest document of `self` instead of `move`. So the document of the move we are currently working on is not protected, and could be deleted. **STEP TO REPRODUCE** 1. Setup DIAN. 2. Create multiples invoices and send them to DIAN. 3. Run _l10n_co_dian_cron_update_event_status() If the original document of the invoice have the same commercial_status as some other document, it could be destroyed. opw-5447147 Forward-Port-Of: odoo/enterprise#110455
An error preventing users from downloading audit reports as PDFs has been resolved. This was caused by removing compatibility shims used in the PDF generation process. The update corrects a migration issue, allowing users to successfully export audit reports without encountering errors.
Original PR description
Currently, the user gets an error page when exporting an audit report to PDF. This occurs because the compatibility shims that converted the old PyPDF (1.x) syntax to the new API were recently removed, and one instruction in `accountant_knowledge` was incorrectly migrated.
Steps to reproduce:
1. Create an audit report
2. Open the audit report
3. In the Knowledge editor, click on the "More Actions" button
4. In the dropdown, click on "Download Annual Report"
=> The user gets an error and the following message is printed in the console:
```
File "/home/odoo/src/enterprise/accountant_knowledge/controller/main.py",
line 484, in export_article_to_pdf
page.merge_page(empty_pdf_for_page_numbers[k])
~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
TypeError: 'PdfReader' object is not subscriptable
```
To fix the issue, we update the incorrect call so the user can export an audit report to PDF without errors.
Reference: odoo/enterprise#107138This update corrects a previous issue where overtime records weren't being properly processed when an employee had multiple overtime entries within a single interval. The change ensures accurate tracking of all overtime hours, leading to more reliable employee time reporting. This improves the accuracy of payroll and attendance data.
Original PR description
Overtime intervals can contain multiple overtime records. Iterate over each overtime in the interval instead of unpacking a single record. Task Id : 6014640
This update fixes an issue where orders created through the MPS weren't being grouped correctly into RFQs. The fix ensures that all related orders are combined into a single RFQ, improving order management and reporting. This resolves a discrepancy in RFQ listings.
Original PR description
Issue ----- Orders created through the MPS aren't grouped in a single RFQ. Steps to reproduce ----- - Create a product with a vendor - Add it to the MPS with the buy route - Change the forecast to 2…
Issue ----- Orders created through the MPS aren't grouped in a single RFQ. Steps to reproduce ----- - Create a product with a vendor - Add it to the MPS with the buy route - Change the forecast to 2 - Order - Change the forecast to 5 - Order - Go to RFQs > There are 2 different RFQs Cause ----- When doing `_run_buy`, no existing PO is found https://github.com/odoo/odoo/blob/98e3020bcffaf449291d1e6664ba613761f37331/addons/purchase_stock/models/stock_rule.py#L102 so a new one gets created. The reason why the existing PO is not found is because we add `date_planned_mps` to the search domain https://github.com/odoo/enterprise/blob/42102423069c2cebbc01eb4d1d8f9b6215358639/mrp_mps/models/stock_rule.py#L10-L15 However, `values['date_planned']` is a datetime.date, whereas `date_planned_mps` is a datetime.datetime in DB. https://github.com/odoo/enterprise/blob/42102423069c2cebbc01eb4d1d8f9b6215358639/mrp_mps/models/purchase_order.py#L10 This poses some problems with timezones, as the client and db dates might differ. We can avoid the problem by converting the date to datetime. ----- Ticket: opw-5171041 Forward-Port-Of: odoo/enterprise#110068 Forward-Port-Of: odoo/enterprise#106968
This update fixes a critical issue where AI chat failures resulted in confusing error messages for users. The changes now provide more user-friendly 'oops' messages for initial fetch failures and a clear 'Connection Interrupted' dialog for stream interruptions. It also ensures the AI spinner stops spinning when messages fail to post.
Original PR description
Steps to reproduce: 1. Open the Website Editor 2. Select some text 3. Click the AI tool from the toolbar 4. Send a message in the chat window 5. Observe a non-standard error dialog showing 500 HTTP…
Steps to reproduce:
1. Open the Website Editor
2. Select some text
3. Click the AI tool from the toolbar
4. Send a message in the chat window
5. Observe a non-standard error dialog showing 500 HTTP error
The AI chat was not properly handling server errors and connection
interruptions, causing unhandled exceptions to be thrown to the user.
This commit improves error handling for both public and internal AI chat
by:
- The generator function handles error, such that it still yields data
even in error.
- Simulate RPCError for both the fetch of the streaming endpoint and during
error when streaming (error data is converted to RPCError).
- Properly provide error handler for StreamInterruptedError.
- Use a dedicated cursor for the LLM agent loop, wrapped in try/finally. When
the loop crashes, a new cursor is opened in the finally block to persist the
last text response. This ensures the loop cursor can roll back DB updates from
already-executed tool calls without losing the response message.
The following behavior will now be observed during error in the UI.
- Public AI chat:
- Initial fetch failed: shows "oops" message
- Stream interrupted:
- Server handled: shows "oops" message
- Server stopped: shows "Connection Interrupted" dialog
- Internal AI chat:
- Initial fetch failed: show RPCError dialog
- Stream interrupted:
- Server handled: shows RPCError dialog
- Server stopped: shows "Connection Interrupted" dialog
We also include a fix in the livechat where the ai spinner never goes away
when posting of message failed.
TASK-ID: 5886825
Forward-Port-Of: odoo/enterprise#110478
Forward-Port-Of: odoo/enterprise#105875This update fixes an issue where users were receiving blank PDF reports when attempting to print the planning report. The fix ensures the report data is correctly prepared before printing, guiding users to use the designated Print button for accurate report generation.
Original PR description
**Problem:** When users in debug mode manually add the planning report action through Settings/Technical/Reports and then print from the list or form view, they receive a blank/invalid PDF report.…
**Problem:** When users in debug mode manually add the planning report action through Settings/Technical/Reports and then print from the list or form view, they receive a blank/invalid PDF report. **Steps to reproduce:** 1. Go to Settings app and enable debug mode 2. Navigate to Technical → Reports 3. Search for "slot_report" 4. Click "Add to print menu" button 5. Refresh the browser 6. Go to Planning app and switch to list view 7. Select a few planning.slot records 8. Click Print → Planning **Current behavior:** A blank or invalid PDF is generated. **Expected behavior:** Users should receive a clear error message directing them to use the correct print method from the calendar view. **Cause of the issue:** The planning report requires a pre-processed data structure (weeks, grouped slots per day/week, and group-by mappings) that is only prepared by the action_print_plannings() method called from the custom Print button in the calendar view. The standard print menu invokes _render_qweb_pdf() directly without this data preparation, and there is no mechanism to pass this complex data structure through the standard print workflow. This results in the template receiving empty data contexts, producing blank reports. **Fix:** Block the planning report from being printed through _render_qweb_pdf() when called without the proper data context. This is done by checking if the report name is 'planning.slot_report' and raising a UserError with a clear message directing users to use the Print button in the calendar view instead. This prevents the generation of invalid reports while guiding users to the correct workflow that properly prepares the required data. opw-5477184 Forward-Port-Of: odoo/enterprise#108772 Forward-Port-Of: odoo/enterprise#105168