Tuesday, September 15, 2026
13 changes · saas-19.2
Enhancements to existing features
The VoIP recruitment integration now includes needed access information during the initial session load. This avoids an extra background request when the web client starts, helping the app open a little faster without changing user workflows.
Original PR description
The voip app needs this group at startup: https://github.com/odoo/enterprise/blob/203c85cade63a6564f5051d318916aaf0ea87df5/voip_hr_recruitment/static/src/softphone/softphone_model_patch.js#L14 This commit adds the group inside the session info to avoid extra RPCs at webclient startup. The exact same thing is done for other voip_* bridge modules task-6565730 Forward-Port-Of: odoo/enterprise#131210
The VoIP project app now includes required access group information during the initial user session load. This avoids an extra background request when the web client starts, helping the app open a little faster and reducing unnecessary server calls.
Original PR description
The voip app needs this group at startup: https://github.com/odoo/enterprise/blob/c50de485ab5c0fa7927652d4129629b5b674ca37/voip_project/static/src/softphone/softphone_model_patch.js#L14 This commit adds the group inside the session info to avoid extra RPCs at webclient startup. The exact same thing is done for `voip_crm` task-6565730
Resolved issues and error corrections
The QFPay point-of-sale payment test has been updated to include the required Send action before waiting for card payment. This prevents the automated test from timing out and helps ensure QFPay terminal payments remain reliably validated.
Original PR description
Commit 7a208335fa84 ("[IMP] point_of_sale: avoid fast payments") removed the automatic sending of the transaction to the terminal, so the user now has to click on "Send" to trigger the payment request.
The tours of the other payment terminals (adyen, razorpay, safaricom, viva_com) were adapted accordingly, but pos_qfpay was missed. As a result, the payment line never reaches the 'waitingCard' status and the tour times out waiting for the "Waiting for card" step.
Add the missing PaymentScreen.clickSendButton() step to fix the tour.
runbot-940270Documentation and clarification updates
Mina Adel has signed the Individual Contributor License Agreement, allowing their contributions to be accepted under Odoo's licensing process. This is an administrative legal update needed for related enterprise work and does not change product functionality.
Original PR description
Individual Contributor License Agreement signature for Mina Adel (minallegend@gmail.com, https://github.com/minaonlyone). Needed for odoo/enterprise#131352 (19.0). Replaces #287992, whose branch name made runbot diff it against master. Forward-Port-Of: odoo/odoo#288010
This fix limits the payment methods shown in expense settings to those that match the company context. It helps prevent users from selecting inconsistent payment data, reducing configuration mistakes in expense management.
Original PR description
Add domain to company_expense_allowed_payment_method_line_ids field to avoid selecting inconsistent data @Tecnativa TT64416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287131
This fixes an issue where spreadsheet formulas using a single linked record amount could fail in locales that use commas as decimal separators, such as French. Users can now calculate with those single values normally, reducing spreadsheet errors in localized environments.
Original PR description
Steps to reproduce:
- insert a sale.order list into a spreadsheet
- change the locale to FR_fr
- add the formula in A1: =ODOO.LIST(1, 1, "invoice_ids.amount_total"
- in A2: =A1+1 => error
The value for the "amount_total" is stringified
to something like "4.5" because of the `[].join(",")` but "4.5" is not interpreted as a number in the FR locale where the decimal separator is "," and it should be "4,5"
With this commit, when there's a single record in the x2many, we fallback on the "normal" case and return the real value.
When there are multiple values, we volontarily keep the current behavior. We can't "just format it" because we join with "," and it wouldn't work if "," is also the decimal separator. This is a known and accepted limitation, especially in stable
Task: 6307092
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#270279Spanish OSS sales are now reported in the correct VAT declaration box, moving the amounts from box 124 to box 123. This helps ensure Spanish tax reports reflect the required casilla for these transactions and reduces reporting errors.
Original PR description
OSS sales were being mapped to mod_303_casilla_124_balance where it should be mapped to mod_303_casilla_123_balance. These amounts must be reported values in casilla 123. This commit updates es_assec, es_common, es_full and es_pymes tax templates from 124 to 123 and updates test_country_tag_from_spain. task-6360387 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284984
This fix prevents spreadsheet values for multiple linked records from being converted into plain text. It helps keep document spreadsheets accurate and avoids display or calculation issues when working with related business data.
Original PR description
See community PR task-6307092 Forward-Port-Of: odoo/enterprise#120701
Fixed an issue where dragging an image onto its current position in the HTML editor could trigger an error, especially in Chrome. This improves editing reliability and prevents users from losing momentum while working with image content.
Original PR description
Steps to reproduce: - Insert an image as the last child of a paragraph. - Drag and drop it below or after itself. Description of the issue: - A traceback occurs. Cause: - When dropping an image below or after itself `document.caretPositionFromPoint()` computes a drop offset equal to the current node size. - The image is then removed from the DOM before being reinserted. Since it is the last child of its parent, removing it shrinks the parent, making the previously computed offset out of bounds. - Restoring the selection at that stale offset results in a traceback. Solution: - Treat dropping the image at its current position as a no-op and skip the remove/reinsert process, since it would not change the DOM. - Clamp the drop offset to the current node size before restoring the selection preventing out-of-bounds offsets. task-6435091 Forward-Port-Of: odoo/odoo#286613 Forward-Port-Of: odoo/odoo#280612
List columns can now be resized properly on tablets and other touch devices. This prevents the resize action from being interrupted by normal touch scrolling behavior, making list views easier to use on mobile hardware.
Original PR description
Steps to reproduce ================== - Use a tablet (touch screen) - Open any list view - Try to resize a column by dragging the column header's right edge => The resize doesn't work properly: it gets interrupted an we can only move a few pixels at a time Cause of the issue ================== The resize handle relies on pointerdown/pointermove/pointerup to run and stop the drag, but nothing tells the browser to opt out of its native touch gestures. On a tablet, the drag can get hijacked as a page scroll, which fires pointercancel instead of pointerup. That event was not listened to, leaving the pointermove handler attached and the resize state stuck. Solution ======== - Set touch-action: none on the resize handle so a touch drag isn't interpreted as scrolling - Listen to pointercancel to properly stop the resize when the browser takes over the gesture anyway Forward-Port-Of: odoo/odoo#288046
The shop page wishlist heart button now keeps a consistent size in Safari. This prevents product cards from looking misaligned, improving the shopping experience for Safari users.
Original PR description
The wishlist button on the shop page is misaligned in Safari Steps to reproduce: (in Safari) 1. Install eCommerce 2. Go to the shop 3. The wishlist button (heart icon in the top right corner of each product) is misaligned Issue: The wishlist button (`.o_add_wishlist`) is positioned with `position: absolute` with only top and right offsets set (through the `o-position-absolute` mixin), leaving its width and height on `auto`. https://github.com/odoo/odoo/blob/c4de5361fb207916175332dcf6815c0814ecf09c/addons/website_sale_wishlist/static/src/scss/website_sale_wishlist.options.scss#L62-L65 In other browsers, the button resolves to a 38 x 38px square box but in Safari, it is not a square which misaligns it in the product grid. Solution: Force width and height on `.o_add_wishlist`, so the button resolves to the same box size in every browser. opw-6456552 Forward-Port-Of: odoo/odoo#287940 Forward-Port-Of: odoo/odoo#281935
Odoo now correctly carries payment reference information from imported CII XML invoices into the resulting vendor bill. This helps accounting teams keep supplier payment details accurate and reduces manual correction after invoice import.
Original PR description
### Issue before this commit: When importing a CII XML invoice containing a PaymentReference, the value is not transferred to the generated vendor bill in Odoo. ### Steps to reproduce the issue: 1. Download Accounting 2. Try to import the invoice in the ticket 3. See that in the tab other info the payment reference is not imported ### Cause of the issue: During a previous refactoring (ffbdf29a816d0ff4136488d26b55b9707fc37fc6), the helper function responsible for extracting the payment reference during the import process was omitted. ### Reason to introduce the fix: Add the missing extraction logic to ensure the payment reference is correctly retrieved from the XML and assigned to the Odoo invoice. opw-6530627 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287216
FedEx shipping labels generated in ZPLII format now download with a standard .zpl file extension instead of being saved as a text file. This prevents confusion and helps users send downloaded labels directly to compatible label printers.
Original PR description
TL;DR When downloading a `.zplii` shipping label from the chatter on a Delivery Order (using FedEx), the browser automatically adds .txt to the end of the filename, saving it as `.zplii.txt` Step to…
TL;DR
When downloading a `.zplii` shipping label from the chatter on a Delivery Order
(using FedEx), the browser automatically adds .txt to the end of the filename,
saving it as `.zplii.txt`
Step to reproduce:
- install `delivery_fedex_rest` with demo
- open shipping method menu -> Fedex Us -> label format = `zplii` -> save
- create a SO, click on 'Add Shipping",
- select fedex as shipping method -> get rate -> add -> confirm SO
- go to delivery and validate
- notice, in thread, a attachment with ZPLII extension appears
- download (.txt is appended to file)
Issue:
- `fedex_rest_send_shipping` post message with documents with extension as
`fedex_rest_label_file_type` i.e. `ZPLII`
https://github.com/odoo/enterprise/blob/735490d7ba9bdc6d0df7a0bd07c0d4e36d1ed2d4/delivery_fedex_rest/models/delivery_fedex.py#L193-L195
- when the attachment is created for this document , it's mimetype is computed
to be `text/plain` from [guess_mimetype](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/tools/mimetypes.py#L192) method, as data is plain ASCII code
- moreover, when downloading, [_get_stream_from](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/addons/base/models/ir_binary.py#L89) tries to guess extension
using [get_extension](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/tools/mimetypes.py#L210) which return `None` as len('zplii') > 4, [see](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/tools/mimetypes.py#L221)
- finally, as we got `None`, and mimetype is `text/plain`, `.txt` is appended [here](https://github.com/odoo/odoo/blob/5de4a5f6caee09881e7e147062f9eab9f8916a61/odoo/addons/base/models/ir_binary.py#L149)
Fix:
- we use `zpl` as extension for file instead of `zplii` as there is not
difference between them from printing perspective
- as length of 'zpl' is <=4 , `get_extension` will considered it as valid
opw-6410968
Forward-Port-Of: odoo/enterprise#126620