Thursday, February 26, 2026
20 changes · 18.0
Enhancements to existing features
This update streamlines bank account creation for trusted partners, prompting manual verification to ensure accuracy and prevent errors. It simplifies the process by automatically finding suitable bank accounts and preventing duplicate entries, improving reconciliation and payment accuracy.
Original PR description
Forward-Port-Of: odoo/odoo#249983
This update incorporates changes required by the Uruguayan tax authority (DGI) regarding Electronic Fiscal Document (CFE) reporting. Specifically, a new selection option is added for export transactions, and the transmission of key invoice details (date, amount, currency, and exchange rate) from existing account moves is now mandatory to ensure legal compliance.
Original PR description
Purpose: The DGI introduced changes in CFE version 25. The following changes below needs to be implemented for legal compliance.
Required Changes:
- Introduce a new selection value,("91", "Export under Mandate")for field, l10n_uy_edi_cfe_sale_mode. This option is required when documenting export operation performed as a mandating entity, where the definitive export will be carried out by a third party.
- The reference document(credit note or debit note) of an existing account move will need to send:
- Amount (MntCFEref)
- Currency (TpoMonedaRef)
- Exchange Rate (TpoCambioRef) if the currency is not Uruguayan Pesos
task-5419331
task-5419331
Forward-Port-Of: odoo/enterprise#103881Resolved issues and error corrections
This update fixes a recurring issue where posting multiple images to Instagram failed due to delays in the image carousel processing. The change ensures Odoo waits for the carousel to fully load before posting, aligning with Facebook's documentation. This improves the reliability of Instagram posting for users.
Original PR description
Bug === When posting many images on Instagram, it fails most of the time. The reason is that Instagram takes some times to process our carousel, and according to the documentation we can wait for it to be ready. See https://developers.facebook.com/docs/instagram-platform/content-publishing#carousel-posts Task-5972197
This update resolves an issue causing table menu buttons to appear incorrectly or not at all within the HTML Editor. The fix ensures proper display and positioning of these buttons, improving the user experience when working with tables.
Original PR description
Description of the issue: Commit [1] replaces `overlay` with `localOverlay` for the table menu. However, studio uses its own `wysiwyg` instance and config, which does not define `localOverlayContainers`, causing a traceback when `table_menu` accesses `this.config.localOverlayContainers.key`. Solution: - Define `localOverlayContainers` and its corresponding key in studio’s `wysiwyg` config. - Additionally, adjust the table menu position calculation when the table cell is inside an iframe. ENT PR: https://github.com/odoo/enterprise/pull/108724 [1]: https://github.com/odoo/odoo/commit/7d523d6402c9bff3c2e4bcd0329f486a2d0f45ec
This update resolves an issue where rejected E-Faturas (Romania's electronic invoices) couldn't be corrected or resubmitted to the SPV. Now, if an invoice is flagged as invalid by the SPV, users can reset the invoice to draft and re-send it, streamlining the invoicing process and reducing manual intervention.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_ro_edi - Switch to a Romanian company (e.g. RO Company) - In Accounting settings, configure Romanian E-Factura - Create an invoice for a Romanian customer - Confirm the invoice - Send E-Factura to SPV **Issue:** If the document is rejected by SPV due to a validation error, it is not possible to: 1) reset the invoice to draft in order to fix the error in the invoice because the button is hidden 2) resend the new E-Factura to SPV because the option is disabled **Solution:** Check if there are Romanian E-Factura documents linked to the invoice and if they are all rejected. If it is the case, then allow to reset the invoice to draft and to resend E-Factura to SPV. opw-5936668 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A customer reported a significant delay (8 minutes) when adding attribute values to products. This update replaces inefficient code with faster filtering methods, reducing the process to 2-3 minutes. This improves performance for users managing large numbers of product attributes.
Original PR description
opw-4876370 Issue: A customer who uses many attribute values complained that the "add to products" button on product attribute values in their database was really slow (8 minutes or so). Upon investigation I found parts of the involved functions used iteration over a set of records, which proved notably slower to psql searches. Fix: Replacing the code with what I believe is equivalent operations making use of the `search` method to filter through the sets much quicker. Behaviour after fix: The process takes 2-3 minutes when running this commit on the aforementioned database, but it's still a major improvement compared to the previous time. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where rapidly clicking the 'Back' button during barcode internal transfer creation resulted in duplicated quantities being added to the transfer. The fix ensures that multiple 'Back' clicks don't trigger redundant saving operations, preventing incorrect quantity calculations.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By…
**Steps to reproduce:** * Install `stock` module. * Go to the > Settings*, enable *Packages* and *Storage Locations*(warehouse). * Create a storable product and set *Tracking Inventory* to **By Quantity** and set some *barcode* * Update the on-hand quantity for the product and assign it to one packages. * Open *Barcode > Operations > Internal Transfer* and create a new transfer. * Click the *gear icon* in the top-right corner to open the barcode scanning flow. * manually enter the created product barcode and apply it. * Click the **Back** button multiple times in quick succession. * Go to the backend and open the created internal transfer. **Observed behavior:** * The internal transfer is created with *double quantities* compared to what was added in the barcode interface. **Cause:** * When clicking the *Back* button, the following flow is triggered: `exit()` → `beforeQuit()` → `save()`. https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/components/main.js#L406-L414 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L473-L475 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_picking_model.js#L828-L832 https://github.com/odoo/enterprise/blob/07ede9bda567d94da27da79b945e2189fa5aca6e/stock_barcode/static/src/models/barcode_model.js#L477-L483 * If the button is clicked multiple times rapidly, `exit()` is called again before the previous `save()` RPC completes. * This results in multiple `save()` calls being executed, causing duplicated quantities on the picking. reference - https://github.com/odoo/enterprise/pull/103999/changes/b791239c154deb6a25f85d65ebc72e3ac53b6c74 **Fix:** * Prevent rapidly clicking the Back button multiple times does not multiply quantities. --- opw-5375899 Forward-Port-Of: odoo/enterprise#103130
This update fixes an issue where sales team members couldn't see stages they were assigned to within their CRM pipeline. The change ensures that team-specific stages are correctly displayed for all users, improving workflow visibility and collaboration within the sales process. This resolves a previous limitation where only administrators could view these stages.
Original PR description
**Steps to reproduce:** 1. Install `crm` 2. Assign a user to the sales team from crm > sales team 3. Now, create a stage and add that team to this stage from crm > Stages **Issue:** - The stage assigned to a Sales Team is not visible in "My Pipeline" for users belonging to that team. The stage is only visible to admin users if they have records **Cause:** - The stage domain in the pipeline view only considers the `default_team_id` from the context. This ignores the Sales Teams of the current user, causing team-specific stages to be incorrectly filtered out for non-admin users. **Solution:** - Extend the stage domain to include all Sales Teams of the current user when explicitly requested via context. like we did in v19 https://github.com/odoo/odoo/commit/0c0ccde96facfd6c4f823da33c52e3994b36a028 opw-5444009 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a Peppol invoice validation error caused by an incorrect code scheme identifier for UNSPSC products. The fix ensures invoices comply with Peppol standards, preventing rejection by external systems. This improves the reliability of our Peppol-compliant invoices.
Original PR description
**Steps to reproduce:** * Install the **product_unspsc** module. * Create a product with a **UNSPSC category**. * Create and post an invoice for this product. * Send the invoice via **Peppol**.…
**Steps to reproduce:** * Install the **product_unspsc** module. * Create a product with a **UNSPSC category**. * Create and post an invoice for this product. * Send the invoice via **Peppol**. **Observed behavior:** * Peppol validation fails with error **[BR-CL-13]**: *“Item classification identifier identification scheme identifier MUST be coded using one of the UNTDID 7143 list.”* * The XML uses `listID='UNSPSC'` in `cbc:ItemClassificationCode`. **Cause:** * The `listID` attribute was set to the literal string **'UNSPSC'**. * According to the **UNCL7143** code list, the correct scheme identifier for UNSPSC is **'TST'**, not 'UNSPSC'. **Fix:** * Replace `listID='UNSPSC'` with `listID='TST'` when generating the commodity classification node. * Update and extend tests to validate the correct scheme identifier. * Same for CPV code from the documentation i's code is also changed to 'STI'. ref: https://docs.peppol.eu/poacc/billing/3.0/codelist/UNCL7143/ opw-5948723
This update corrects an issue where time tracking data wasn't properly handling time zones, leading to potential inaccuracies in employee attendance records. The fix ensures all time entries are consistently recorded with the correct time zone, improving the reliability of HR data and reporting. This enhances the accuracy of payroll and workforce management.
Original PR description
TODO
This update corrects a visual issue in the planning app and related modules where employees with flexible calendars incorrectly displayed unavailable days. The fix ensures that flexible resources are shown as available unless public holidays or leaves are present, improving accuracy and usability. This resolves a discrepancy in how Odoo interprets work schedules.
Original PR description
### Issue: When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible…
### Issue:
When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible calendar should not have any grayed out days other than public holidays.
### Steps to reproduce:
- Create a new work schedule:
- Flexible Hours
- 24 hours per week
- 8 average hours per day
- Create an employee with this work schedule
- Open Planning app
- Only the three first days of the week are not grayed out
### Cause:
With 24 hours per week, the worked time can be done in three days. Odoo considers that the first three days of the given time frame are worked, but the others aren't. This result is returned by `_work_intervals_batch()`. In `_unavailable_intervals_batch()` we then build the unavailabilities by taking the inverse of the work intervals. The only exception was for fully flexible resources (i.e. without a calendar).
### Solution:
The case we need to consider is for flexible resources: they are available anytime, all week long except on public holidays and leaves.
To do this we fix the method `_unavailable_intervals_batch()` which is then called by each module. If the resource is flexible, then we only return the interval of the public holidays overlapping with the time frame.
Works in `appointment`, `hr_holiday_gantt`and `project_enterprise`.
In `planning`, we need to skip the case where nothing is returned in `leaves_mapping` otherwise it will consider the `company_leaves` during weeks with no public holiday or leaves.
In `hr_attendances_gantt`, `_unavailable_intervals_batch()` is not called. So we change the way the unavailabilities were computed to call `_unavailable_intervals_batch()` instead.
opw-4879481This update fixes an issue where flexible calendar employees were incorrectly displaying unavailable days in planning and related modules. The change ensures that only public holidays are reflected as unavailable, providing a more accurate representation of employee availability. This improves the usability of the planning app for employees with flexible work schedules.
Original PR description
### Issue: When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible…
### Issue:
When an employee has a flexible calendar, its gantt view in planning and other modules, like project or time off, shows incorrect grayed-out days. In general, employees with a flexible calendar should not have any grayed out days other than public holidays.
### Steps to reproduce:
- Create a new work schedule:
- Flexible Hours
- 24 hours per week
- 8 average hours per day
- Create an employee with this work schedule
- Open Planning app
- Only the three first days of the week are not grayed out
### Cause:
With 24 hours per week, the worked time can be done in three days. Odoo considers that the first three days of the given time frame are worked, but the others aren't. This result is returned by `_work_intervals_batch()`. In `_unavailable_intervals_batch()` we then build the unavailabilities by taking the inverse of the work intervals. The only exception was for fully flexible resources (i.e. without a calendar).
### Solution:
The case we need to consider is for flexible resources: they are available anytime, all week long except on public holidays and leaves.
To do this we fix the method `_unavailable_intervals_batch()` which is then called by each module. If the resource is flexible, then we only return the interval of the public holidays overlapping with the time frame.
Works in `appointment`, `hr_holiday_gantt`and `project_enterprise`.
In `planning`, we need to skip the case where nothing is returned in `leaves_mapping` otherwise it will consider the `company_leaves` during weeks with no public holiday or leaves.
In `hr_attendances_gantt`, `_unavailable_intervals_batch()` is not called. So we change the way the unavailabilities were computed to call `_unavailable_intervals_batch()` instead.This update enhances the reliability of self-order transactions within Odoo Point of Sale. By aligning the data validation rules with standard POS orders, the system now catches more errors and ensures data accuracy for self-order processes. This improves the overall customer experience and reduces potential issues during transactions.
Original PR description
*: pos_online_payment_self_order, pos_restaurant, pos_self_order This commit improves the data validation of pos self order by using the same validation as the one used for regular pos order.
This update fixes a validation issue in the self-order point of sale module by aligning its data checks with the standard point of sale system. This ensures greater data accuracy and reliability for self-order transactions, reducing potential errors and improving the overall customer experience.
Original PR description
This commit improves the data validation of pos self order by using the same validation as the one used for regular pos order.
This update fixes a bug where employees with future attendance records couldn't check out. The fix ensures that only past attendance records are considered when determining the employee's status, preventing incorrect 'checked-out' states. This improves the kiosk experience and prevents workflow disruptions.
Original PR description
### Issue: When having an attendance in the future, the employee cannot checkout anymore. ### Steps to reproduce: - In Attendances, create an attendance in the future for an employee - Go in the kiosk mode - Manually select the employee to check in - Do the same to check out - An error pops up ### Cause: The field `last_attendance_id` of the employee contains his future attendance. The field `attendance_state` use `last_attendance_id` in its computation, so it's always "checked_out", even if an attendance is curently open for the employee. So when trying to check out an exception is raised in [`_check_validity()`](https://github.com/odoo/odoo/blob/fee6b32a8a57577bd8229c80dff6f93964f9f556/addons/hr_attendance/models/hr_attendance.py#L224-L234). ### Solution: Add a condition in the domain of `_compute_last_attendance_id()` to only consider the last **past** attendance. opw-5491867
This update resolves an issue where users wouldn't receive a helpful error message when attempting to process after departure payments. Now, the system displays a clear validation error if a previous payslip isn't linked, ensuring accurate payroll processing and preventing potential data discrepancies.
Original PR description
For after departure payment to work, a previous payslip is required in the system. So, instead of having a traceback, display an informative message to the user. task-5933607
This update corrects an issue with how VAT tax schemes are calculated for Romanian customers. Previously, an empty company registry caused calculation failures. The fix re-introduces specific logic for Romanian CIUSRO invoices, ensuring accurate VAT scheme determination based on the default VAT setting.
Original PR description
Problem --------- If the customer has not VAT set up on it record, we use the DEFAULT_VAT value. However, the scheme to be used is computed using the partner company_registry (which might be empty), which fails. Secondly, the piece of logic that compute the VAT/NON_EU_VAT for the Tax Scheme node was removed during the refactor. However, this is needed in Romania. Solution --------- Compute the scheme using the DEFAULT_VAT and add back the VAT/NON_EU_VAT logic for the Romanian CIUSRO only. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where Avatax taxes weren't being correctly calculated during Stripe Express Checkout, particularly when using Google Pay. The fix ensures that all applicable taxes, including those from Avatax, are accurately reflected in the order total, improving payment accuracy and financial reporting. This impacts sales transactions utilizing the Stripe payment gateway.
Original PR description
## Versions 17.0+ ## Issue Avataxes are not computed during express checkout leading to discrepancies between customer payments and effective price including Avalara taxes. ## Steps to reproduce…
## Versions
17.0+
## Issue
Avataxes are not computed during express checkout leading to discrepancies between customer payments and effective price including Avalara taxes.
## Steps to reproduce
*Ensure the Stripe account has activated Google Pay* *This requires a complete Google profile on Google Chrome (with a valid payment method)*
- Setup Stripe payment method in test mode with Express Checkout;
- In the Settings, in the Accounting section:
- Setup Avatax;
- Set main Sales/Purchase taxes to 0.
- Create a new product with 0% selling taxes and any Avatax category;
- Activate fiscal position and enable automatic detection;
- Open a Chrome session with the Google profile:
- Go to the shop;
- Add the product you created to the cart;
- Enter the cart;
- Click the "Buy with GPay" button:
- The amount is equal to the sales price excluding taxes.
- Go to the Sales app and open the newly created order:
- The total amount differs from the amount paid (cf. transaction).
opw-5020793
Forward-Port-Of: odoo/enterprise#101579This update resolves an issue where users were encountering errors when processing after-departure payments. Now, the system clearly displays a validation error if a previous payslip isn't linked, guiding users to correctly complete the payment process. This improves user experience and data accuracy.
Original PR description
For after departure payment to work, a previous payslip is required in the system. So, instead of having a traceback, display an informative message to the user. task-5933607 Forward-Port-Of: odoo/enterprise#107801
This update fixes a technical issue that was disrupting automated payment flows within Odoo. The previous version was encountering errors due to uncertain data, which has now been resolved by simply removing the problematic information. This ensures smoother and more reliable processing of incoming payments.
Original PR description
The last iteration[^1] was preventing automated flows from running smoothly because it was raising an error. Instead, we now just remove the unsure data. [^1]: 1794fce234735ed174599891435d4e2accc1632 Forward-Port-Of: odoo/odoo#250941