Wednesday, May 20, 2026
10 changes · 18.0
Resolved issues and error corrections
This update corrects a typographical error in the CSV file defining account groups used in Odoo's Mexican localization (l10n_mx). The fix ensures accurate reporting and compliance with Mexican tax regulations, as outlined in the latest SAT guidelines. This ensures the system correctly categorizes financial transactions according to Mexican standards.
Original PR description
Source: https://www.sat.gob.mx/minisitio/NormatividadRMFyRGCE/documentos2026/rgce/anexos/Anexo24delasRGCEpara2026.pdf opw-6174385 Forward-Port-Of: odoo/odoo#262549
This update fixes an issue where tip payments, even with a 0% tip, weren't always being processed by Stripe. The change ensures that a capture payment is always initiated, regardless of the tip amount, aligning with Stripe's requirements and preventing pending payments from being automatically cancelled.
Original PR description
Currently, the `pos_restaurant` module only calls capture payment within `validateTip` if there is an amount to tip. Since Stripe requires a capture for all payments and we defer that to later if it can be adjusted, this means that if customers have tip after payment enabled and enter a tip of 0%, it will never be captured, stay pending, and then be automatically cancelled later down the line. This commit catches that by hooking into the `validateTip` method and calling capture anyway on 0% tips. opw-6082596
This update corrects a validation issue within the l10n_pl_edi module, ensuring that a specific flag (TWybor1) always accepts only the value '1'. It also clarifies that the KursWaluty field is optional when it matches PLN, simplifying invoice creation. This ensures compliance with Polish tax regulations.
Original PR description
Legal ref: https://ksef.podatki.gov.pl/media/4u1bmhx4/information-sheet-on-the-fa-3-logical-structure.pdf
- KursWaluty is optional and doesn't need to be included if it's the same as PLN.
- The following flags accept only "1" as a valid value.
See their type being etd:TWybor1:
http://crd.gov.pl/wzor/2025/06/25/13775/schemat.xsd
http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2020/07/06/eD/DefinicjeTypy/ElementarneTypyDanych_v7-0E.xsd
```xsd
<xsd:simpleType name="TWybor1">
<xsd:annotation>
<xsd:documentation>Pojedyncze pole wyboru</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:byte">
<xsd:enumeration value="1"/>
</xsd:restriction>
</xsd:simpleType>
```This update fixes an issue where refreshing a timesheet record from the 'My Timesheets' grid view incorrectly displayed the generic 'Analytic Items' form. The fix ensures the correct timesheet-specific form view is consistently shown after a page refresh, providing a more accurate and user-friendly experience.
Original PR description
**Problem** When opening a timesheet record from the *My Timesheets* grid view (via the magnifier icon that appears on cell hover) and refreshing the page, the wrong form view is loaded: the generic…
**Problem** When opening a timesheet record from the *My Timesheets* grid view (via the magnifier icon that appears on cell hover) and refreshing the page, the wrong form view is loaded: the generic "Analytic Items" form on `account.analytic.line` instead of the timesheet-specific form. **Steps to reproduce** 1. Go to *Timesheets* → *My Timesheets* → switch to **Grid** view. 2. Hover a cell with a timesheet entry and click the magnifier (search) icon. 3. The list opens; click a record to open its form view. 4. Observe the URL: `/odoo/timesheets/<id>`. 5. Refresh the page (F5). **Expected** The same timesheet form view is shown after refresh. **Actual** The "Analytic Items" form view (`analytic.view_account_analytic_line_form`) is shown instead, exposing the wrong layout/fields. **Cause** The grid renderer's `openRecords` builds an inline `ir.actions.act_window` with no `path` and no `id`. When the page is refreshed, the action service reconstructs the action from the URL state alone — model + resId — and resolves the form view by priority. Two priority-1 form views exist on `account.analytic.line` (`analytic.view_account_analytic_line_form` and `hr_timesheet.hr_timesheet_line_form`); the lower-id one wins, which is the analytic one. **Fix** Override `openRecords` in `TimesheetGridRenderer` to carry the current action's `path` (or `id`, for non-pathed database actions) onto the inline action. The URL then stays anchored to the original act_window (e.g. `/odoo/timesheets/<id>`), and on refresh the action service rebuilds it with the correct views, including the timesheet-specific form. opw-6133602
This update corrects a formatting error in invoices where extra decimal places were being added to the displayed price. The fix reduces the precision calculations to prevent these unnecessary digits from appearing in the PDF output, ensuring invoices display correctly.
Original PR description
Issue: - Create an invoice with a line having a price of `528,000,000.00` - Print the invoice -> pdf displays `528,000,000.000001` Cause: In `value_to_html` from `ir.qweb.field.float`, we compute the maximum precision that we can get from the value, to avoid parasite digits. The maximum is 15, so if a number has 11 digits, we won't ask for a precision higher than 4. But in `float_round`, they multiple the value with its precision, then add `epsilon` (a small value). So we're now working with a 16 digits float, which is what we want to avoid. Solution: Reduce the maximum precision from one digit before calling `float_round`. opw-6012129
A recent update inadvertently removed a key test related to product margins. This change has been corrected to ensure continued testing and maintain the quality of the product margin calculations. Restoring this test helps guarantee the accuracy and reliability of our product margin features.
Original PR description
Commit e61403f5a3 accidentally removed test_aggregates while resolving a forward-port conflict. Restoring the test to maintain coverage. no task-id
This update resolves an issue where Jofotara was rejecting invoices due to extremely small negative discount amounts. The fix ensures that discount amounts are always non-negative by applying an absolute value function, preventing errors related to floating-point calculations and improving invoice processing with Jofotara.
Original PR description
Before this commit: 1. Create a POS order with no discount and a quantity that does not divide evenly into the unit price (e.g. price=10.0, qty=3) 2. Send the order to Jofotara Jofotara rejects the…
Before this commit:
1. Create a POS order with no discount and a quantity that does not divide evenly into the unit price (e.g. price=10.0, qty=3)
2. Send the order to Jofotara
Jofotara rejects the invoice because the AllowanceCharge/Amount on the invoice line is a small negative value like -0.000000001 with the error `"EINV_MESSAGE":"discount cannot be negative"`
This happens because _add_document_line_gross_subtotal_and_discount_vals computes the discount as: gross_subtotal - total_excluded_currency
where gross_subtotal goes through two independent rounding steps (round unit price, then round unit_price * qty). When the quantity is indivisible, the reconstituted gross_subtotal can land just below total_excluded_currency by a floating-point epsilon, producing a tiny negative discount. The same subtraction also produces a legitimate negative value for refund lines (negative quantity), which was already handled by abs() in _add_pos_order_discount_vals for the document-level total but was left unguarded at the per-line level.
After this commit:
Apply abs() to vals[f'discount_amount{currency_suffix}'] in _add_pos_order_line_allowance_charge_nodes so that discount_amount_currency is always non-negative.
opw-6183423This update fixes an issue where combo prices were incorrectly duplicated in sale orders when all combo components had a zero list price. The fix ensures the combo price is accurately distributed across its items, preventing double-reporting and improving order accuracy. This impacts how combo prices are displayed to users.
Original PR description
**Problem:** When a combo product has a price but all of its combo components have a zero list price, the quotation shows the combo's price twice: once on the combo line itself and once on the last…
**Problem:** When a combo product has a price but all of its combo components have a zero list price, the quotation shows the combo's price twice: once on the combo line itself and once on the last combo item line. **Steps to reproduce:** 1. Create a combo product with a non-zero price and two or more combo groups whose component products have a zero list price. 2. Create a sale order, add the combo, pick one item per group. 3. Look at the quotation/order: the combo line total and the last combo-item line both show the full combo price. **Current behavior:** The full combo price ends up on the last combo item line; the other combo items show 0. The combo line then displays the same total via `_get_combo_totals`, so the same amount appears twice. **Expected behavior:** The combo's price is spread across its combo items so no single line duplicates the combo total. **Cause of the issue:** `_get_combo_item_display_price` prorates the combo price by each combo's base price. When every base price is 0, every prorated price is 0, so `combo_price_delta` equals the full combo price and is added to the last combo as a rounding correction, concentrating the whole price there instead of spreading it. **Fix:** Treat an all-zero base case as "no proration signal" and split the combo price evenly across combos before the delta adjustment runs. The delta correction then only handles rounding, as intended. opw-6217945
A recent update to Odoo's PDF processing caused errors when downloading signed documents. This fix corrects a misplacement of the PDF compression step, ensuring compatibility with newer versions of the pypdf library. This resolves an issue that prevented successful document downloads from the Sign app.
Original PR description
This [related PR] introduced a compression pass after calls to mergePage(). However in newer versions of pypdf (>=3.5.2), compress_content_streams() can only be called on pages of PdfWriter. An error would be raised when called on pages of a PdfReader. Steps to reproduce ----- 1. Run Odoo with pypdf>=3.5.2 2. Sign and download a document in the Sign app 3. Traceback occurs Fix ---- This commit moves the compression to the writer object, after the merged page has been added. Related pr: https://github.com/odoo/odoo/pull/261879 runbot-937761 Forward-Port-Of: odoo/odoo#265304
A recent update to the Sign app caused errors when downloading documents. This fix resolves a compatibility issue with a newer version of the pypdf library, ensuring documents can be downloaded correctly. The change ensures compression happens only on the page being written to, preventing errors.
Original PR description
This [related PR] introduced a compression pass after calls to mergePage(). However in newer versions of pypdf (>=3.5.2), compress_content_streams() can only be called on pages of PdfWriter. An error would be raised when called on pages of a PdfReader. Steps to reproduce ----- 1. Run Odoo with pypdf>=3.5.2 2. Sign and download a document in the Sign app 3. Traceback occurs Fix ---- This commit moves the compression to the writer object, after the merged page has been added. Related pr: https://github.com/odoo/odoo/pull/261879 runbot-937761 Forward-Port-Of: odoo/enterprise#117756