Daily updates from Odoo
Friday, November 14, 2025
155 changes
8 changes
Resolved issues and error corrections
This change fixes an issue where certain images, such as SVG or GIF files, could cause the loading spinner in Masonry-style website blocks to stay visible indefinitely. Users can now replace images in these blocks without the editor getting stuck, improving reliability when working with website content.
Original PR description
Steps to reproduce: ==================== 1. Add a snippet with Masonry blocks (e.g., Punchy Image). 2. Edit an image and select an SVG or GIF file. 3. The loading spinner will appear and never disappear. Cause: ======= Certain image types like SVG and GIF are not processed by `onImageInfoLoaded`. So the _imageProcess call will be canceled https://github.com/odoo/odoo/blob/3dadb15555b96ad22dfd2799c05415f07b03d027/addons/html_editor/static/src/main/media/image_post_process_plugin.js#L27-L28 The code would then try to add a `load` event listener, but the event had already fired. This caused an unresolved promise. Solution: ========= Before attaching the `load` event listener, add a check for the `imageEl.complete` property. If the image is already loaded, we can bypass the listener entirely. opw-5167545 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change ensures invoices sent to ZATCA use the correct API when the customer is part of a company hierarchy. Previously, some invoices were incorrectly treated as simplified invoices; now they are routed through the clearance process when appropriate, helping avoid submission errors and compliance issues.
Original PR description
…earance or reporting api When sending an invoice to ZATCA, if the contact is an individual, the invoice is sent through the reporting API, and if the contact is a company, the invoice is sent through the clearance API. As of now, if the contact has a parent company, the invoice is sent through the report api. However, we need to make sure that in this case, the invoice goes through the clearance api. The fix introduced simply checks the partner_id.commercial_partner_id to decide whether the invoice is a simplified invoice (i.e. through the reporting api) or not. Task-5085142 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#234691
This change corrects how barcode scans are processed in batch picking so the system properly waits for each step to finish. It helps prevent occasional scan failures and makes batch operations more reliable for warehouse users.
Original PR description
Commit bc9247d46225c696842bc7b0e3c883320231ab1b has introduced an override of the `processBarcode` method. However, it does not return nor await the super call. In particular, in the case where the super call should be done the overrides returns "undefine" rather than a promess to await and hence that call is not awaited anymore. Note: This error has been noticed from the fact that the test `test_barcode_batch_scan_lots` sometimes fails on step 29/31. runbot-233631 Forward-Port-Of: odoo/enterprise#99303
This fix adds explicit cache rules so the browser does not reuse an outdated spreadsheet view when a tab is duplicated. As a result, duplicated tabs will open with the most recent spreadsheet content instead of sometimes showing stale data.
Original PR description
It happens that browser may use a cache if there's no explicit cache control/expiration time: https://httpwg.org/specs/rfc9111.html#heuristic.freshness Steps to reproduce (non-deterministic): - create a new spreadsheet - do some changes, edit a few cells - right click on the tab and hit "Duplicate" => the spreadsheet is not up-to-date on the duplicated tab. The browser loaded the response from "disk cache" instead of fetching the latest data from the server. I'm using Chrom Version 142.0.7444.162 (Official Build) (64-bit) We add an explicit cache control. Forward-Port-Of: odoo/enterprise#99426
The top-bar messaging menu now includes inbox messages that were previously hidden when they were not linked to a specific record. This makes notifications like signature requests easier to find and read directly from the menu, reducing confusion for users.
Original PR description
**Steps to reproduce:** - Set handle notifications in Odoo for one user - Go to `Sign` app with another user - Create a signature request for the first user - The first user is properly notified of…
**Steps to reproduce:** - Set handle notifications in Odoo for one user - Go to `Sign` app with another user - Create a signature request for the first user - The first user is properly notified of the signature request, as the counter badge is updated. - When clicking on the badge, no new message is shown. **Issue:** Inbox messages are not considered in the `MessagingMenu` when they are not linked to any record. It's the case when a signature request is sent and while the notification counter is updated, the message can't be seen in the top bar menu, it's only visible in the `Discuss` app > Inbox which is quite confusing for the users. In previous versions the behavior was different as the signature request was either considered as an activity or no notification was sent. Also if the inbox message is linked to a record, it only appears in the `all` filter of the menu. **Fix:** Added the inbox explicitly to the top `MessagingMenu` to be able to read the corresponding messages. We could also link the signature to its record when sending the message instead of `self.env['sign.request']._message_send_mail()` but it might cause access rights issues. Also ensured that a category `others` was used for such messages, and prevented an error caused by clicking on the conversation when the `Discuss` app was opened. Unfortunatly doing this will show duplicates in the notifications of the menu for messages which are in the inbox but which have a record set. (e.g. when such message appears, it will have one line in the inbox and one for the record itself) So we need to filter out the messages which have a thread from their record in the views to avoid it. related: https://github.com/odoo/enterprise/commit/463d6a2aae536356e6dee6b902f2e881dbc4fbda opw-4969005 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235052 Forward-Port-Of: odoo/odoo#228740
This change prevents users from cancelling purchase orders that have been locked. If someone needs to cancel one, they must first unlock it, which better protects confirmed orders from accidental changes.
Original PR description
Issue before this commit: ========================== Locked purchase orders could still be cancelled, which defeats the purpose of locking them. Steps to reproduce: ========================== 1. Install the `purchase` module. 2. Enable "Lock Confirmed Orders" in the configuration. 3. Create and confirm a purchase order. 4. Lock the purchase order. 5. Try to cancel it → the PO still gets cancelled despite being locked. After this commit: =========================== Cancelling a locked purchase order is no longer allowed. If a user tries to cancel a locked PO, a UserError will be raised instructing them to unlock it first. Locking a purchase order is intended to prevent accidental changes, including edits and cancellations, once the order is confirmed. With this change, users must explicitly unlock a purchase order before cancelling it, ensuring better control and data integrity. TaskId: 4760864 Forward-Port-Of: odoo/odoo#208716
This change fixes an issue that could block users from adding attachments after saving an invoice email as a template. It keeps the email wizard linked to the correct document, preventing an error and making the sending flow work as expected.
Original PR description
Currently, an error occurs when trying to add an attachment after saving an invoice email as a template in the `Send wizard`. **Steps to produce:** - Install the `account` module. - Create a new…
Currently, an error occurs when trying to add an attachment after saving an invoice email as a template in the `Send wizard`. **Steps to produce:** - Install the `account` module. - Create a new invoice, fill in all required details, then `confirm` and click `Send`. - Click the `three-dot (⋮)` menu and select `Save as Template`, enter a name, and save the template. - Try to add an attachment. **Error:** `AttributeError: 'account.move.send.wizard' object has no attribute '_mail_post_access'` `AttributeError: 'account.move.send.wizard' object has no attribute '_get_thread_with_access'` Root **cause:** At [1], the code sets a new `template_id` when the template is saved. This triggers `_compute_model()` at [2], which updates the model field to `account.move.send.wizard` instead of `account.move`, using the `active_model` context, causing the `error`. **Fix:** This commit ensures that after saving a mail template, the wizard retains the correct model, same as [3], and prevents the attachment upload error. [1]: https://github.com/odoo/odoo/blob/5c6afcbffb49803a03e3a384ed60de68093dca04/addons/account/wizard/account_move_send_wizard.py#L296 [2]: https://github.com/odoo/odoo/blob/5c6afcbffb49803a03e3a384ed60de68093dca04/addons/account/wizard/account_move_send_wizard.py#L244-L248 [3]: https://github.com/odoo/odoo/blob/5c6afcbffb49803a03e3a384ed60de68093dca04/addons/mail/wizard/mail_compose_message.py#L380-L389 sentry-6987172677 Forward-Port-Of: odoo/odoo#234268
Follow-up payment reminder emails now send any attachments and dynamic reports that were configured on the email template. This ensures customers receive the full intended reminder message instead of only the basic email content.
Original PR description
### Issue: We can add attachments and dynamic report to the email templates, but they are not sent with follow-ups. ### Steps to reproduce: - Go to the "Payment reminder" email template - Under the…
### Issue: We can add attachments and dynamic report to the email templates, but they are not sent with follow-ups. ### Steps to reproduce: - Go to the "Payment reminder" email template - Under the page "Content", add an attachment by clicking the "Attachments" button - Under the page "Settings", add a dynamic report - Create an overdue invoice for a partner - Go on the form view of the partner, "Accounting" page - Click "Send", make sure the template used is the one with the attachments - Send - The attachments on the template and the dynamic report are not sent ### Cause: The mail template to send the follow-ups is only used to prefill the wizard. ### Solution: Add the template in `_get_wizard_options()` to add the template in the option and later use it to add/generate its attachments. This commit also refactors how the attachments are computed: The previous code was adding the invoices PDFs then removing them. The whole process was confusing. Now `options['attachment_ids']` is appended in `_get_followup_attachments()` with the desired attachments depending on the options. opw-5147736 Forward-Port-Of: odoo/enterprise#99458 Forward-Port-Of: odoo/enterprise#98454
3 changes
Resolved issues and error corrections
This update fixes a timing issue in batch barcode processing so the system correctly waits for an underlying operation to finish before moving on. It reduces occasional scan failures during batch picking and makes barcode workflow behavior more reliable for users.
Original PR description
Commit bc9247d46225c696842bc7b0e3c883320231ab1b has introduced an override of the `processBarcode` method. However, it does not return nor await the super call. In particular, in the case where the super call should be done the overrides returns "undefine" rather than a promess to await and hence that call is not awaited anymore. Note: This error has been noticed from the fact that the test `test_barcode_batch_scan_lots` sometimes fails on step 29/31. runbot-233631 Forward-Port-Of: odoo/enterprise#99303
When users reconcile an invoice from the invoice screen, Odoo will no longer automatically treat a short payment as fully settled. The invoice now remains partially paid unless the user explicitly chooses a write-off, which helps avoid misleading payment status and accounting errors.
Original PR description
When reconciling an invoice from the invoice form view, Odoo currently applies the payment tolerance logic and marks the invoice as fully paid even when the payment amount does not actually cover the full residual. Reconciliation from the invoice should never auto-close the invoice. It must remain partially paid unless the user explicitly triggers a write-off. This PR disables tolerance-based full reconciliation when the matching is initiated from the invoice. task-5246513 --- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)
When returning to a Kanban view after removing a grouping, the system now correctly restores the record limit. This prevents the view from trying to load an excessive number of records, which could slow down the page or cause a crash.
Original PR description
Steps to reproduce ================== - Add a group by in the kanban product view - Switch to the list view - Remove the group by - Switch back to the kanban view -> No limit is applied, and the webclient can crash if too many records are returned. Cause of the issue ================== The groupsLimit is set as MAX_SAFE_INTEGER in the kanban view https://github.com/odoo/odoo/blob/df959e05ac9cf3136d1724bc80b7597a70932225/addons/web/static/src/views/kanban/kanban_controller.js#L168 Which is then reused as the limit https://github.com/odoo/odoo/blob/df959e05ac9cf3136d1724bc80b7597a70932225/addons/web/static/src/model/relational_model/relational_model.js#L368 Solution ======== There is already a code path to reset the limit when switching from grouped to ungrouped, but is wasn't called on the first load (when this.root isn't set yet) opw-5167769 Forward-Port-Of: odoo/odoo#235598 Forward-Port-Of: odoo/odoo#235232
1 change
Resolved issues and error corrections
Users without full administration rights can now revoke SEPA direct debit mandates even when those mandates were used for customer portal payments. This prevents an access error and ensures the related saved payment methods are archived automatically.
Original PR description
**Issue:** As a user without "Administration / Settings" access, it is not possible to revoke SEPA Mandates that have been used to pay invoices through the customer portal. **Steps to Reproduce:** -…
**Issue:** As a user without "Administration / Settings" access, it is not possible to revoke SEPA Mandates that have been used to pay invoices through the customer portal. **Steps to Reproduce:** - Enable SEPA Direct Debit payment provider in Test Mode - Create a mandate for a customer w/ valid IBAN - Create an invoice for that customer and post it - Action > Generate a Payment Link, open this in an incognito window - Pay using SEPA Direct Debit - Call `_set_done()` on the payment.transaction - Try to revoke the mandate as a non-admin with "Accounting / Billing" -> Access Error, can't modify payment.token **Cause:** - When SEPA Mandate is revoked, we check for all associated payment tokens (saved payment methods from SEPA Direct Debit payment provider) and deactivate them. - The check in code isn't called with sudo, so it uses the current user access rights, but only admins can modify the payment tokens in any way. **Solution:** - Write to the `linked_tokens` with sudo so we can archive the tokens regardless of user access opw-5136221 Forward-Port-Of: odoo/enterprise#99447 Forward-Port-Of: odoo/enterprise#99232
32 changes
Resolved issues and error corrections
This update fixes an issue where pending bank transactions could stop displaying correctly in the reconciliation view. It also ensures account totals are loaded properly, preventing incomplete or incorrect amounts from appearing to users.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/1691a9d6ec426566b81537544cafe09d9c62ad78 We added a template to inherit BankRecKanbanRenderer, but we forgot to add the extension. By doing that it broke the pending transaction template override. Also this: https://github.com/odoo/enterprise/commit/5d5a7aca4f0abb4492314324631e8b5463a35332 change the getJournalTotalAmount to use a super instead, but it was missing an await otherwise we just have a promise no task id Forward-Port-Of: odoo/enterprise#99066
This fix ensures that customer invoices reflect the real purchase cost when a kit is drop-shipped, even if the purchase order price was manually changed. It prevents understated cost entries in accounting, so profit and inventory reporting stay accurate.
Original PR description
**Problem:** When confirming the invoice of an order delivered via dropship for some kit bom product with fifo/avco comp, if the price was manually set on the purchase order, the invoice lines…
**Problem:** When confirming the invoice of an order delivered via dropship for some kit bom product with fifo/avco comp, if the price was manually set on the purchase order, the invoice lines generated for the cogs are inaccurate **Steps to reproduce:** - In settings enable dropshipping - Create a kit product with one component (both storable). - Set the route as Dropship for the component. - add a vendor in the purchase tab of the component. - set the cost of the component at 2 - and set an on hand quanity - Set the product category to AVCO and perpetual for the component and the product. - Set the cost to 5 on the product. - Create and confirm a sales order with a quantity of 2 for the product. - On the purchase order set the unit price at 20 for the component. - Confirm the purchase order, then validate the delivery and create the customer invoice. - Confirm the invoice **Current behavior:** In the journal items tab of the invoice the lines for the cogs (expenses and stock interim) have a value of 10 **Expected behavior:** The value should be 40, in accordance with the purchase order **Cause of the issue:** In this forward port, the fix is different. - Prior to this commit https://github.com/odoo/odoo/pull/222169/commits, the cogs of a dropship kit were handled in this way: When _stock_account_prepare_anglo_saxon_out_lines_vals() computes the price_unit, it calls _stock_account_get_anglo_saxon_price_unit(). https://github.com/odoo/odoo/blob/88043b84f7a017dfff790deeb64510fc62698c96/addons/stock_account/models/account_move.py#L131 For regular kits, the sale_mrp override of this method computes the correct price. But for dropshipped kits, because the moves are generated from the purchase order, they do not have a bom linked, so the variable 'boms' is empty and the override do not modify price_unit. https://github.com/odoo/odoo/blob/88043b84f7a017dfff790deeb64510fc62698c96/addons/sale_mrp/models/account_move.py#L17-L18 However, the sale_stock override of this method calls _compute_average_price() https://github.com/odoo/odoo/blob/88043b84f7a017dfff790deeb64510fc62698c96/addons/sale_stock/models/account_move.py#L212 The computation is handled in the mrp_account override, because the product of the moves is different than self (because it's a kit). There, for each component there is a call to _compute_average_price(). https://github.com/odoo/odoo/blob/88043b84f7a017dfff790deeb64510fc62698c96/addons/mrp_account/models/product.py#L73 This time the computation is done in the super method where the value is computed based on the stock.valuation.layer created by the purchase order. So the price taken into account is, rightly so, the one of the purchase order. - But since the commit, there is no more stock.valuation.layers and no more _compute_average_price(). _stock_account_prepare_realtime_out_lines_vals() now calls _get_cogs_value(). In the sale_mrp override of this method ( because the moves are still created from the purchase order), the variable boms is empty and the computation does not happen here. https://github.com/odoo-dev/odoo/blob/2a46a4e2c5a1f0a7848b50f3bf3ac6887a78b2df/addons/sale_mrp/models/account_move.py#L17 The computation happens in the super method where the standard price of the product is returned. https://github.com/odoo-dev/odoo/blob/2a46a4e2c5a1f0a7848b50f3bf3ac6887a78b2df/addons/stock_account/models/account_move_line.py#L65 So now to fix the issue, we can not rely on compute_average_price but we need to modify the sale_mrp override of _get_cogs_values. opw-4985440 Forward-Port-Of: odoo/odoo#229956
We fixed an issue where using Ask AI could crash if more than one AI chat was open for the same user. The update also ensures Ask AI opens a fresh chat and removes a duplicate button from search to avoid confusion.
Original PR description
When multiple AI chat channels existed for the same agent/user, `_get_or_create_ai_chat` could return several records. This caused a singleton error when calling `action_ask_ai` because the code expected a single channel record. This commit filters a single record so that only one channel is returned, preventing the crash. And also 'action_ask_ai' will now always opens a new ai chat. Additionally, the redundant 'Ask AI' button in the search view has been hid, as the same functionality is already available from the systray. task-5107276
When a mail template is duplicated, its attachments are now copied too instead of being shared between templates. This avoids unexpected cross-template changes and helps prevent access and permission issues in future setups with custom rules.
Original PR description
Copying tmeplates should copy their attachments. Otherwise they are
shared, which means
* wrong res_id: ACL check on attachments relies on a specific
template, as res_model / res_id is used in access check;
* propagated changes: changing one attachment changes it on all
duplicated templates;
If custom rules on templates are implemented, this means notably
ACL issues when accessing attachments. It is not the case in standard
Odoo 17 as everyone can read templates but this notably changes in
future versions of Odoo.
While being there, also fix 'default' usage in copy override. User
given values should not be erased by default computation of name.
Task-5128863
Forward-Port-Of: odoo/odoo#234565
Forward-Port-Of: odoo/odoo#232877The manufacturing order overview now values consumed components using the correct unit conversion when the component’s purchase/unit of measure differs from the one used in the bill of materials. This ensures the displayed production cost matches the real quantity used, avoiding inflated cost figures in reports.
Original PR description
…er uom **Problem:** The overview of a produced MO does not take into account the uom of the component for the valuation **Steps to reproduce:** - Create a storable product (the comp) - set the uom…
…er uom **Problem:** The overview of a produced MO does not take into account the uom of the component for the valuation **Steps to reproduce:** - Create a storable product (the comp) - set the uom as L and the cost as 40$ per L - set an on hand quantity - Create a storable product (the final product) - Create a bom for this final product using 100 ml of the comp - Create, confirm and produce a MO for the final product - click on the overview smart button **Current behavior:** the real cost is 4000$ (100*40) **Expected behavior:** it should be 4 (0.1 * 40) **fix** A fix was first introduced in this PR https://github.com/odoo/odoo/pull/230585. But it was closed because this PR had already fixed https://github.com/odoo/odoo/pull/232364. However since this PR the issue is back https://github.com/odoo/odoo/pull/232872. Here is the explanation of the new fix : Inside _get_component_real_cost _get_unit_cost returns the unit cost of the move expressed for 1 unit of the uom of the product (which is correct). But quantity is expressed in the uom of the move so we need to convert it in the uom of the product. https://github.com/odoo/odoo/blob/2ba4998b470236feee3a1636bf6d1807c74eac3a/addons/mrp/report/mrp_report_mo_overview.py#L583-L586
This update prevents a crash in the Live Chat info panel when a customer conversation is still ongoing. It also improves the ordering so the most recently active conversations appear first, making the list more useful for support teams.
Original PR description
Live chat shows recent conversations with a customer in the info panel. Chats are sorted by end date. However, some conversations could still be ongoing. This is not taken into account in the sort function and can lead to a crash. This commit fixes the issue. opw-5263335 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 change fixes an error that could appear when adding a user to a database project if no database was already selected. The user management screen now handles this case correctly, preventing the process from crashing.
Original PR description
Versions -------- - 19.0+ Steps ----- 1. Go to Databases; 2. open a new project; 3. enter any name, hosting provider & URL; 4. under User Management, click on "Add a user". Issue ----- Traceback: > `ValueError: Compute method failed to assign databases.manage_users.wizard(<NewId 0x71e8c0d8fd80>,).everywhere_user_ids` Cause ----- The `_compute_everywhere_user_ids` method computes the value of a non-stored field. Consequently, every record in `self` needs have some value assigned to `everywhere_user_ids` during the compute, but currently, if the `database_ids` field is empty, `continue` is used without assigning a value. Solution -------- If the record doesn't have any known `database_ids`, set `everywhere_user_ids` to `None`. opw-5170587
This update fixes a crash that could happen in special folder selection screens, including Studio, when action icons were shown where they should not have been. It now makes sure those icons only appear in the main Documents list, so secondary views work normally without errors.
Original PR description
This commit adjusts a previous fix that was causing a new crash in certain contexts, like studio. The original fix relied on view-specific information to be available, but this information was…
This commit adjusts a previous fix that was causing a new crash in certain contexts, like studio. The original fix relied on view-specific information to be available, but this information was undefined in those edge cases. This new fix adds a safeguard to check that this information exists before trying to access it, preventing the crash. Original fix: Action icons (like 'Open Folder', 'Rename', etc.) were incorrectly appearing in list views outside of the main Documents app, for example, when selecting a folder in a settings menu or a popup dialog. This was confusing and caused a crash when an icon was clicked, as the required functionality was not loaded in those contexts. This fix removes the action icons from these secondary views. To keep the fix stable-proof, the template of the widget was modified, in 19.1 we will fix this in cleaner way. The icons are now correctly restricted to the main Documents list view, where they function as intended. Other views (like folder pickers) now behave as standard selection lists without errors. Task-5258848 Original Task-5166843
This update adjusts who can access several Online Sync actions so they are mainly available to Invoicing & Banks users. A few sensitive actions remain under stricter access rules to reduce the risk of unintended changes to bank transactions and dates.
Original PR description
Most access right for Online Sync related actions should be Invoicing & Banks. Only Duplicate Wizard (because you can delete transactions easily) and Online Account Fields (because can change date without explicit showing) will be with other group. task-5149304
This change prevents Odoo from checking the payment amount and currency during Adyen’s 3D Secure challenge step. It matters because Adyen does not provide those details at that stage, so the payment flow can continue without unnecessary validation errors.
Original PR description
When Adyen request a 3DS challenge for the payment, we should not enforce amount and currency validation at that time (no amount are provided in the Adyen response). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures warehouse putaway rules are applied correctly when products are moved using a different unit of measure than the product’s default. As a result, items packed for receipt are routed to the right storage location, respecting package capacity limits and avoiding incorrect placement of later transfers.
Original PR description
**Problem:** the stock putaway rules do not apply when the uom on the move is different than the base uom of the product **Steps to reproduce:** - set the warehouse incoming shipment as 'two steps' -…
**Problem:**
the stock putaway rules do not apply
when the uom on the move is different
than the base uom of the product
**Steps to reproduce:**
- set the warehouse incoming shipment as 'two steps'
- enable the 'packages' setting
- navigate to 'Operation Types' and select Receipts
- check the 'set package type' box
- create a storable product
- in the sales tab add 'pack of 6' to the packagings
- navigate to 'package types' and create a new one
- navigate to 'storage categories' and create a new one
- In the 'capacity by pacakge' tab set a limit by package to 1 quantity of your new pacakge type
- open 'warhouse management/locations' and create a new one
- set the parent location to stock and the storage category to your new storage category
- open 'putaway rules' and create a new one
- set the 'store to' field as your new loc
- set the 'when product arrives in' field to stock
- set the 'product' field to your product
- create a new receipt for your product
- set the demand as 4 and the unit as 'pack of 6'
- mark as to do
- change the quantity to 2 and click on put in pack
- in the 'package type' field of the widget enter your new package type
- set the quantity to 4 and click on put in pack
- in the 'package type' field of the widget enter your new package type
- validate the picking
- click on next transfer
- validate the picking
- click on the moves smart button
**Current behavior:**
- both moves are going to your new location
**Expected behavior:**
- as there is a one package limit for this package type only the first move should be going
there
**Cause of the issue:**
The problem comes from the fact that there is no
destination package (result_package_id) on the
move lines of the second pick.
As a consequence the limits regarding packages
can not apply.
Here is why there is no result_package_id on those move lines :
when assigning the new move, action_assign
calls check_entire_pack().
https://github.com/odoo/odoo/blob/96264f88e6ea2dc61ba6c546f9f1a03d49df55ea/addons/stock/models/stock_move.py#L2013 There, before writing the 'result_package_id'
field of the move lines, the method calls
check_move_lines_map_quant_package inside the
if statement.
https://github.com/odoo/odoo/blob/96264f88e6ea2dc61ba6c546f9f1a03d49df55ea/addons/stock/models/stock_picking.py#L1301-L1305 This results in a call to _check_move_lines_map_quant.
Inside _check_move_lines_map_quant, when building
the grouped_ops dictionnary, the quantity of the
move line is expressed in the uom of the line
(here pack of 6) so it will be 2.
Whereas in grouped_quants the quantity used is expressed
in the uom of the quant (here unit) so it will be 12. https://github.com/odoo/odoo/blob/96264f88e6ea2dc61ba6c546f9f1a03d49df55ea/addons/stock/models/stock_package.py#L403
As a consequence the diff in the float_is_zero
will not be null and the return value will be False.
https://github.com/odoo/odoo/blob/96264f88e6ea2dc61ba6c546f9f1a03d49df55ea/addons/stock/models/stock_package.py#L405-L406
opw-5154168When the Journal Items list has no matching records, Odoo will now stay empty instead of showing example data. This makes accounting screens and reports less confusing, especially when users click into a value that has no underlying journal entries.
Original PR description
Currently, when going into the "Journal Items" menu, if there's no data to display, some sample data are shown. To reproduce: set a filter that won't match any journal item, set it as default filter and refresh the page. It doesn't make sense to have sample data, as you cannot create journal items on the fly. It is particularly confusing going to an accounting report like "Profit & Loss" and clicking on a "0.00" value. As no journal item is present, the sample data are shown. The fix is to remove the attribute `sample="1"` on the list. no-task
The message text in Discuss’s white theme has been adjusted to a softer color. This lowers the visual contrast on message lists, helping reduce eye strain for users while keeping the same content and layout.
Original PR description
Main text color in white theme was increased from gray-700 to gray-900, increasing the overall contrast of the web client [1]. This change, in addition to reducing the color of message bubble, has the effect to increase contrast of message list by a lot in white theme, which leads to complain of eyes being hurt. This commit reduces the black level of message text content color in white theme, to match text color as it was before [1]. [1]: https://github.com/odoo/odoo/pull/209125 Part of Task-5265246 Before <img width="958" height="678" alt="before" src="https://github.com/user-attachments/assets/eee192fd-b24f-450e-85cc-2b97cae28b22" /> After <img width="959" height="680" alt="after" src="https://github.com/user-attachments/assets/1955e515-9f43-4394-b32a-63fbfe213f6f" />
This fix makes sure sales orders are no longer shown as fully invoiced when their linked invoice has been canceled. It keeps the invoice status accurate, which helps teams trust the order and billing information they see.
Original PR description
Since 81f25bc, _compute_qty_invoiced would not reset the field to zero when the linked invoice was canceled, meaning that sale orders would be still be flagged as 'Fully Invoiced'. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a helpdesk refund is created from a sales order, the credit note now keeps only the product that was actually selected for refund. This also narrows the product suggestions in the refund wizard to the products linked to the original sales order, avoiding confusion and incorrect refunds.
Original PR description
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we…
_ ## Short functional explanation of the error Let's say a customer buys 2 products. An SO is created. This customer wants to refund only one of the 2 products. He sends a ticket to helpdesk and we click on refund. Even if we specify the product to refund, this action creates a credit note containing both products (previously present on the SO) instead of only the one to refund. Additionally, when selecting the product, we could see in the dropdown of suggestions all the existing products, instead of only the ones related to the SO. ## Reproduction Steps 1. Create a SO containing 2 different products and confirm it. 2. Create a regular invoice and confirm. 3. Go to Helpdesk. Click on the configuration tab, and helpdesk teams. 4. Click on your helpdesk team, scroll down. In After-Sales, check "Refunds". 5. Create a ticket and specify the customer who wants to refund. Make sure the correct helpdesk team is assigned. 6. Click on refund. It opens the wizard. Specify the product to refund and the Invoices to Refund. 7. Click on reverse. ### Expected behavior A credit note containing only the specified product to refund should be created. ### Unexpected behavior The created credit note contains both products originally present on the SO. ## Origin of the issue When issuing a refund from helpdesk_stock_account, this piece of code is called: https://github.com/odoo/enterprise/blob/2051e84c55618c64179c4b9f3e99f4e795bacd32/helpdesk_stock_account/wizard/account_move_reversal.py#L16-L17 which calls the ```reverse_moves``` method in the helpdesk_account.py file, which itself calls the ```reverse_moves``` method in the account_move_reversal.py file, in the account module, and so on. Finally, we arrive in the account_move.py file. In the ```_reverse_moves``` of this file, we can see the code: https://github.com/odoo/odoo/blob/bee7fc1f955c52a88b527ad9a2ddf0021529bbc7/addons/account/models/account_move.py#L4937-L4947 where we simply copy all the lines of the move in the SO without filtering them. As a result, we get the lines of the product we don't want to refund __ opw-5148789 Forward-Port-Of: odoo/enterprise#98771
This change fixes a barcode scanning issue in batch picking so the system correctly waits for the previous processing step to finish. It helps prevent intermittent scan errors and makes the picking workflow more reliable.
Original PR description
Commit bc9247d46225c696842bc7b0e3c883320231ab1b has introduced an override of the `processBarcode` method. However, it does not return nor await the super call. In particular, in the case where the super call should be done the overrides returns "undefine" rather than a promess to await and hence that call is not awaited anymore. Note: This error has been noticed from the fact that the test `test_barcode_batch_scan_lots` sometimes fails on step 29/31. runbot-233631 Forward-Port-Of: odoo/enterprise#99303
This fix ensures purchase orders no longer stay marked as invoiced when the related vendor bill is canceled. The invoice quantity is now recalculated properly, so the order status reflects the real billing situation.
Original PR description
Since 81f25bc57b8433a65bf33950c64dc7582240a229, `_compute_qty_invoiced` was not resetting the field to zero when the linked invoice was canceled, resulting in purchase orders remaining in status `invoiced` even if there was no invoice any more. With this commit, we always write the qty_invoiced on the purchase order line, and the status is recomputed accordingly. Source: post odoo.com migration feedback
Opening the chat icon from an employee’s profile now works correctly instead of showing an error. This fixes a broken user action and ensures employees with linked user accounts can be contacted directly from their form view.
Original PR description
Before this commit, when opening a chat with an employee from the form view it would result in a traceback. Steps to reproduce: 1. Open the form view of an employee that has a user associated 2. Click the "chat" icon next to their name -> traceback This happens because the `getChat` method would insert a Persona record in the Store with a displayName field which has been changed to a setter in [1]. This commit fixes the issue by setting the `name` field instead. [1] https://github.com/odoo/odoo/pull/234702 Forward-Port-Of: odoo/odoo#235279
This fix lets vendor bills and invoices with deferred amounts be reset to draft multiple times, even when audit trail controls are enabled. It removes a restriction that could block users from correcting or reprocessing these documents after an initial reset.
Original PR description
Resetting a vendor bill or invoice with deferred amounts will unlink or reset all existing deferred entries. If the audit trail is enabled, some of these entries must be cancelled instead. [AccountMove.button_draft()](https://github.com/odoo/enterprise/blob/a3f461040cb3443fbcb190c28fddae7044bbd1e7/account_accountant/models/account_move.py#L80-L88) If a protected entry is already cancelled, `AccountMove._unlink_or_reverse()` will still attempt to cancel it. This prevents entries from being Reset to Draft more than once. The current commit removes this restriction. opw-5187737 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235223
This change prevents an access error that could appear when opening the Documents app after a company was archived. It ensures folders are only fetched for companies the user can still access, so the app opens reliably without unexpected permission issues.
Original PR description
**Steps to reproduce:** - Add some folders - Create a new company - Assign some folders to the new company - Archive the company - Click on Documents app - AccessError is raised when opening it…
**Steps to reproduce:** - Add some folders - Create a new company - Assign some folders to the new company - Archive the company - Click on Documents app - AccessError is raised when opening it **Issue:** The issue seems to be related to caching issue on the field `type` when fetching the documents with `search_panel_select_range` and going through `_compute_display_name`: `folders = accessible_records.filtered(lambda d: d.type == 'folder')` This error was quite inconsistent and might be related to the cache missing some prefetched data on a record it shouldn't have been able to read. There is a need to ensure only the folders available to the user are able to be fetched. **Fix:** Added the `type` field in the `search_panel_fields` but this might not be needed if the issue comes from elsewhere. For now the issue was mitigated by explicitly checking for the user companies in the domain of the searchs, but it needs to be checked as this behavior might break other flows. opw-4931278 Forward-Port-Of: odoo/enterprise#99043 Forward-Port-Of: odoo/enterprise#96817
The Website SEO dialog no longer opens too early while the page preview is still loading. This prevents a crash on slow connections and makes the editing experience more reliable for users.
Original PR description
Steps to reproduce: - Open Website app and enter edit mode on any page. - Reload the page with a slow connection. - Immediately open "Optimize SEO" from the navbar menu. Before this commit, the dialog accessed the preview document while the iframe was reloading, so reading location.origin raised a TypeError. After this commit, the dialog waits for the iframe to finish loading or returns immediately when it is already complete, preventing crashes. task-5104033 Forward-Port-Of: odoo/odoo#235231 Forward-Port-Of: odoo/odoo#230820
This change restores employee lookup results in forms for users who do not have access to the Employees app, including on mobile. It ensures employee records can still be selected when they are used as a related field, so users no longer see an empty result list.
Original PR description
**Steps to reproduce** - With Studio, create a many2one field in relation to the Employee model. - Have a user with no "Employees" rights. - With this user and in mobile view, click on the field to…
**Steps to reproduce** - With Studio, create a many2one field in relation to the Employee model. - Have a user with no "Employees" rights. - With this user and in mobile view, click on the field to select an employee. -> No records found. Note: the many2one_avatar_employee widget used in HR apps avoid this problem. **Cause** Issue since https://github.com/odoo/odoo/commit/e962860c6f0d8ec9e50bb376e1faab5c7bc69374 The `web_search_read` on the private employee model returns no records when an `image_*` or `avatar_*` field is part of the requested fields. This is because we try to fetch these fields https://github.com/odoo/odoo/blob/188a3fe45fb41463ff86d1fa5e930ab43fb70d0e/addons/hr/models/hr_employee.py#L240 but they are not stored on the public employee model, and will not be put in cache. When performing a read after that, these fields are missing from cache. We try to fetch them from the db https://github.com/odoo/odoo/blob/e962860c6f0d8ec9e50bb376e1faab5c7bc69374/odoo/models.py#L3185 but this fetch is again done using the public employee. This results in missing values and is interpreted as an access error, no data is returned in `web_search_read`. **Solution** Read the problematic fields to make them present in cache when the cache of the public employee is copied to the one of the private employee. opw-4297115 Forward-Port-Of: odoo/odoo#234806 Forward-Port-Of: odoo/odoo#197575
This update prevents an error that could appear when users clicked the Edit Configuration button on a quotation line after the product name had been removed. It makes the button only available when a configurable product is actually selected, avoiding a broken user experience.
Original PR description
Currently, when a user adds a configurable product to an order line, and remove the name of product and click on `Edit Configuration` (pencil icon) error is encountered. **Steps to Reproduce:** -…
Currently, when a user adds a configurable product to an order line, and remove the name of product and click on `Edit Configuration` (pencil icon) error is encountered. **Steps to Reproduce:** - Install Sales module - Create a Quotation - Add a product(e.g Acoustic Bloc Screen), then only remove the name from the orderline and click on **edit button(pencil Icon)**. **Error:** `TypeError: SaleProductConfiguratorController.sale_product_configurator_get_values()` `missing 1 required positional argument: 'product_template_id'` **Root Cause:** When a user clicks on Edit configuration, the client-side JavaScript makes an RPC call to the server, targeting the `sale_product_configurator_get_values`. which expects product_template_id at [1] and since it is removed from order line the error is encountered. [1]- https://github.com/odoo/odoo/blob/1b657cf1e1ce43874a3ede307b2f8ad68216aa56/addons/sale/controllers/product_configurator.py#L11-L13 **Solution:** This commit prevents the error by correcting `depends` on the field `is_configurable_product`, which will ensure that edit button will be only present if the configurable product is selected. Sentry-5741581459, 6925770690 Forward-Port-Of: odoo/odoo#217464
This change makes interval processing more reliable by ensuring interval data is normalized before it is merged. It prevents inconsistencies and occasional errors that could appear when different interval types were combined, especially in planning-related operations.
Original PR description
## The issue Prior to this commit, the `other` parameter in the `_merge` method could belong to a different class, not necessarily an instance of `Intervals`.…
## The issue Prior to this commit, the `other` parameter in the `_merge` method could belong to a different class, not necessarily an instance of `Intervals`. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L158-L165 The comment indicates that normalization should be enforced; however, there is no corresponding reference to it within the `_boundaries` method. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L48-L53 That normalization just happens in the `__init__`. https://github.com/odoo/odoo/blob/8c737601327acec1d83e1e5e3c6e66c9fd226339/addons/resource/models/utils.py#L117-L132 ## Example For example, in Planning module, we perform operations between `Intervals` and `WorkIntervals`. The `WorkIntervals` class behaves differently from `Intervals`: while `Intervals` uses disjoint closed intervals, `WorkIntervals` uses disjoint semi-closed intervals. ## Side effects During these operations, the `_merge` method was not normalizing the `_items`, which caused inconsistencies and errors (when we are merging two unormalized intervals `([0, 10], [10, 20])` with an empty `others`). ## The fix This commit ensures that the `other` parameter is normalized before processing the `_merge` operation. The fix ensures that normalized intervals are always produced after `_merge`, even when unnormalized intervals are provided as input. ## Real case That issue has been found in that ticket: 5184291 Forward-Port-Of: odoo/odoo#235233 Forward-Port-Of: odoo/odoo#234352
This update ensures duplicated spreadsheets always load the latest version instead of sometimes reusing an outdated browser cache. It helps users avoid seeing missing or stale changes after copying a spreadsheet tab.
Original PR description
It happens that browser may use a cache if there's no explicit cache control/expiration time: https://httpwg.org/specs/rfc9111.html#heuristic.freshness Steps to reproduce (non-deterministic): - create a new spreadsheet - do some changes, edit a few cells - right click on the tab and hit "Duplicate" => the spreadsheet is not up-to-date on the duplicated tab. The browser loaded the response from "disk cache" instead of fetching the latest data from the server. I'm using Chrom Version 142.0.7444.162 (Official Build) (64-bit) We add an explicit cache control. Forward-Port-Of: odoo/enterprise#99426
The website now correctly updates the displayed price without national taxes when a quantity-based fixed price starts to apply. This ensures shoppers in Argentina see the right tax-free price as they change quantities, avoiding confusing mismatches on product pages.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Have a company with Argentinian localization; 2. in Website settings, enable "Display Price without National Taxes"; 3. add a quantity-based fixed price on the website's pricelist; 4. go to a product page where the fixed price can be applied; 5. increase quantity so the fixed price should apply. Issue ----- The price without national taxes isn't getting updated. Cause ----- In the `_get_additional_combination_info` override, the given `quantity` gets ignored, as well as the pricelist price for product variants, instead defaulting to their `lst_price`. Solution -------- Pass the quantity to `_compute_price_rule`, and use the result for both templates & variants. opw-5040056 Forward-Port-Of: odoo/odoo#232480
Follow-up reminder emails now correctly send any files attached to the email template, including dynamic reports. This ensures customers receive all intended documents with their payment reminders, instead of only seeing them prefilled in the sending wizard.
Original PR description
### Issue: We can add attachments and dynamic report to the email templates, but they are not sent with follow-ups. ### Steps to reproduce: - Go to the "Payment reminder" email template - Under the…
### Issue: We can add attachments and dynamic report to the email templates, but they are not sent with follow-ups. ### Steps to reproduce: - Go to the "Payment reminder" email template - Under the page "Content", add an attachment by clicking the "Attachments" button - Under the page "Settings", add a dynamic report - Create an overdue invoice for a partner - Go on the form view of the partner, "Accounting" page - Click "Send", make sure the template used is the one with the attachments - Send - The attachments on the template and the dynamic report are not sent ### Cause: The mail template to send the follow-ups is only used to prefill the wizard. ### Solution: Add the template in `_get_wizard_options()` to add the template in the option and later use it to add/generate its attachments. This commit also refactors how the attachments are computed: The previous code was adding the invoices PDFs then removing them. The whole process was confusing. Now `options['attachment_ids']` is appended in `_get_followup_attachments()` with the desired attachments depending on the options. opw-5147736 Forward-Port-Of: odoo/enterprise#99458 Forward-Port-Of: odoo/enterprise#98454
This change ensures invoices sent to ZATCA use the right submission path when the customer belongs to a parent company. Instead of treating these cases as simplified invoices, Odoo now checks the customer’s main commercial entity so company-related invoices are sent through the clearance process as expected.
Original PR description
…earance or reporting api When sending an invoice to ZATCA, if the contact is an individual, the invoice is sent through the reporting API, and if the contact is a company, the invoice is sent through the clearance API. As of now, if the contact has a parent company, the invoice is sent through the report api. However, we need to make sure that in this case, the invoice goes through the clearance api. The fix introduced simply checks the partner_id.commercial_partner_id to decide whether the invoice is a simplified invoice (i.e. through the reporting api) or not. Task-5085142 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#234691
The OEE smart button on workcenter screens now shows the same value as the detailed OEE report. This fixes a rounding mismatch so users see a more accurate and consistent efficiency measure.
Original PR description
**Current behavior:** The form view for a workcenter has an OEE smart button which can display a different value from the real OEE displayed by the `mrp_workcenter_productivity_report_oee` displayed…
**Current behavior:** The form view for a workcenter has an OEE smart button which can display a different value from the real OEE displayed by the `mrp_workcenter_productivity_report_oee` displayed when actually clicking the button and looking at the report. **Expected behavior:** Same values **Steps to reproduce:** 1. Make a workcenter and a BoM with an operation performed at the workcenter 2. Use the BoM in an MO such that there is some un-productive time (e.g., recorded production duration takes longer than expected duration) * example: 0:20 expected, 1:01 actual 3. Go to the workcenter list view -> click on the created workcenter -> look at OEE smart button display value -> click on it to see report -> report values are different **Cause of the issue:** the `oee` field on the workcenter is computed with rounded intermediary `blocked_time` and `productive_time` values, the actual report uses the raw values. **Fix:** Don't use the rounded intermediary values in computing `oee`. Post-this-diff, we actually do one less `_read_group` (along with computing a more accurate field value). opw-4795463 Forward-Port-Of: odoo/odoo#232730 Forward-Port-Of: odoo/odoo#218310
This change prevents users from cancelling purchase orders that have been locked. If someone needs to cancel a locked order, they must unlock it first, which helps protect confirmed orders from accidental changes and keeps records consistent.
Original PR description
Issue before this commit: ========================== Locked purchase orders could still be cancelled, which defeats the purpose of locking them. Steps to reproduce: ========================== 1. Install the `purchase` module. 2. Enable "Lock Confirmed Orders" in the configuration. 3. Create and confirm a purchase order. 4. Lock the purchase order. 5. Try to cancel it → the PO still gets cancelled despite being locked. After this commit: =========================== Cancelling a locked purchase order is no longer allowed. If a user tries to cancel a locked PO, a UserError will be raised instructing them to unlock it first. Locking a purchase order is intended to prevent accidental changes, including edits and cancellations, once the order is confirmed. With this change, users must explicitly unlock a purchase order before cancelling it, ensuring better control and data integrity. TaskId: 4760864 Forward-Port-Of: odoo/odoo#208716
This change fixes an error that could happen when users saved an invoice email as a template and then tried to add an attachment. The send wizard now keeps the correct document context, so attachment uploads continue to work normally.
Original PR description
Currently, an error occurs when trying to add an attachment after saving an invoice email as a template in the `Send wizard`. **Steps to produce:** - Install the `account` module. - Create a new…
Currently, an error occurs when trying to add an attachment after saving an invoice email as a template in the `Send wizard`. **Steps to produce:** - Install the `account` module. - Create a new invoice, fill in all required details, then `confirm` and click `Send`. - Click the `three-dot (⋮)` menu and select `Save as Template`, enter a name, and save the template. - Try to add an attachment. **Error:** `AttributeError: 'account.move.send.wizard' object has no attribute '_mail_post_access'` `AttributeError: 'account.move.send.wizard' object has no attribute '_get_thread_with_access'` Root **cause:** At [1], the code sets a new `template_id` when the template is saved. This triggers `_compute_model()` at [2], which updates the model field to `account.move.send.wizard` instead of `account.move`, using the `active_model` context, causing the `error`. **Fix:** This commit ensures that after saving a mail template, the wizard retains the correct model, same as [3], and prevents the attachment upload error. [1]: https://github.com/odoo/odoo/blob/5c6afcbffb49803a03e3a384ed60de68093dca04/addons/account/wizard/account_move_send_wizard.py#L296 [2]: https://github.com/odoo/odoo/blob/5c6afcbffb49803a03e3a384ed60de68093dca04/addons/account/wizard/account_move_send_wizard.py#L244-L248 [3]: https://github.com/odoo/odoo/blob/5c6afcbffb49803a03e3a384ed60de68093dca04/addons/mail/wizard/mail_compose_message.py#L380-L389 sentry-6987172677 Forward-Port-Of: odoo/odoo#234268
This change corrects where rounding is applied in accounting tests and related logic, so amounts are handled more consistently. It also updates outdated test comments and adjusts sample values to better verify the behavior, reducing the risk of small calculation errors.
Original PR description
Also fixes the comments that were wrong. Change some values to better test things 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#235557 Forward-Port-Of: odoo/odoo#234213
7 changes
Resolved issues and error corrections
This update corrects how invoices are sent to Saudi Arabia’s ZATCA service when the customer contact belongs to a parent company. Instead of using the individual contact type, Odoo now looks at the main commercial entity so invoices are sent through the correct approval process.
Original PR description
…earance or reporting api When sending an invoice to ZATCA, if the contact is an individual, the invoice is sent through the reporting API, and if the contact is a company, the invoice is sent through the clearance API. As of now, if the contact has a parent company, the invoice is sent through the report api. However, we need to make sure that in this case, the invoice goes through the clearance api. The fix introduced simply checks the partner_id.commercial_partner_id to decide whether the invoice is a simplified invoice (i.e. through the reporting api) or not. Task-5085142 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#234691
When a salesperson updates prices on a sales order, optional products will now correctly recalculate their price if the pricelist has changed. This prevents optional items from keeping an outdated price and ensures the order reflects the selected pricing rules.
Original PR description
### Steps to reproduce: - Create a sale order with a SOL and an optional product - Preview the sale order and add the optional product to the order - Go back to edit mode and change the pricelist -…
### Steps to reproduce: - Create a sale order with a SOL and an optional product - Preview the sale order and add the optional product to the order - Go back to edit mode and change the pricelist - Click on 'Update Prices' - Notice the optional product price won't change ### Cause: When updating the prices of the SOLs we filter some lines that we won't recompute. Upon this commit https://github.com/odoo-dev/odoo/commit/2d919694d5c9588e0644d5ba82b15b9d3f762373 we remove the optional products from the recordset that will get price recomputation. If sale_subscription is installed we will set the product's prices to 0 https://github.com/odoo/enterprise/blob/85e0689ba12442e22e83f3337749c7ad2eb9d7d8/sale_subscription/models/sale_order.py#L674 so the price of the 'Optional product' SOL will change but will be equal to 0 ### Fix: An exception for the filtering has been introduced as we will recompute the price of the optional products only if the pricelist is getting changed opw-5058609 Forward-Port-Of: odoo/odoo#230053
This update fixes a display issue in the portal on mobile devices where product review cards could appear through the chat area while scrolling. It restores the proper background so the page content stays readable and visually clean.
Original PR description
To reproduce: ============= 1- Enable product reviews on the website 2- Add a few reviews 3- Switch to mobile view -> Scroll to see the behavior Why: ==== This commit did the problem https://github.com/odoo/odoo/commit/f13ee41a4a62f7fedbddc4245e52ee8e9dce9e0e Specifically this change: https://github.com/odoo/odoo/commit/f13ee41a4a62f7fedbddc4245e52ee8e9dce9e0e#diff-6e5197b652583a0032baba5d873fb639b7567600f54b58acce137945ca072b03L23-R24 So the value of the background-color for the portal Chatter is no longer getting background-color of the body. Solution: ========= Apply the body background-color to the sticky part. opw-5098372 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users with billing access can now revoke a SEPA mandate even if it has been used through the customer portal. This fixes an access issue that previously blocked the revocation process because linked payment methods could only be archived by administrators.
Original PR description
**Issue:** As a user without "Administration / Settings" access, it is not possible to revoke SEPA Mandates that have been used to pay invoices through the customer portal. **Steps to Reproduce:** -…
**Issue:** As a user without "Administration / Settings" access, it is not possible to revoke SEPA Mandates that have been used to pay invoices through the customer portal. **Steps to Reproduce:** - Enable SEPA Direct Debit payment provider in Test Mode - Create a mandate for a customer w/ valid IBAN - Create an invoice for that customer and post it - Action > Generate a Payment Link, open this in an incognito window - Pay using SEPA Direct Debit - Call `_set_done()` on the payment.transaction - Try to revoke the mandate as a non-admin with "Accounting / Billing" -> Access Error, can't modify payment.token **Cause:** - When SEPA Mandate is revoked, we check for all associated payment tokens (saved payment methods from SEPA Direct Debit payment provider) and deactivate them. - The check in code isn't called with sudo, so it uses the current user access rights, but only admins can modify the payment tokens in any way. **Solution:** - Write to the `linked_tokens` with sudo so we can archive the tokens regardless of user access opw-5136221 Forward-Port-Of: odoo/enterprise#99232
This change makes websocket reconnections more reliable when a connection is interrupted while closing. It clears the old socket state so the system can reconnect properly and keep online events consistent.
Original PR description
In [1], the websoket worker was updated to properly trigger disconnect/reconnecting/reconnect event when calling `_start` with a socket stuck in the closing state. Calling close will trigger a call to `_retryConnectionWithDelay` thus calling `_start` again. However, we need to clear the websocket as well otherwise it will still be in the closing state, preventing reconnect. [1]: https://github.com/odoo/odoo/pull/235623 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 fix prevents an error that could appear when paying a Point of Sale order with change using a black box setup. It allows the system to complete the necessary internal updates without blocking the payment flow, improving reliability at checkout.
Original PR description
When paying an order with change with blackbox, the backend would raise an error telling "Modifying a registered order is not allowed". This is due because of some backend recomputation. To avoid this, we add a context key to bypass blackbox checks during backend recomputation. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo’s email processing has been updated to recognize the CP-850 character encoding alias. This prevents certain incoming emails from failing to be read and helps ensure messages from external systems are processed without errors.
Original PR description
While investigating a few support tickets related to how the l10n_cl override the fetch mail methods, we noticed a more general issue: As of now, the payload parsing business logic of Odoo can't…
While investigating a few support tickets related to how the l10n_cl override the fetch mail methods, we noticed a more general issue:
As of now, the payload parsing business logic of Odoo can't handle emails encoding parts with `charset=cp-850`.
This is due to the fact that `cp-850` is not a accepted/standard encoding alias for cp850 charsets in python's `encoding` library.
Whether or not a mail stack should generate mail using `charset=cp-850` or not, we this fix aims at pro-actively declaring `cp-850` as a valid alias for cp850, so that implicitly the email CPython library can correctly decode the payloads in emails.
### Before this bug:
Sending a mail using `charset=cp-850` would generate a traceback.
Example:
```
From: Sender Name <sender@example.com>
To: Recipient Name <odooalias@example.com>
Subject: Test Email with CP-850 Encoding
Date: Thu, 13 Nov 2025 12:00:00 +0100
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----------=_4987654321-00000000"
This is a multi-part message in MIME format.
------------=_4987654321-00000000
Content-Type: text/plain; charset=cp-850
Content-Transfer-Encoding: quoted-printable
Hallo, dit is een test met een =82 speciale letter.
=
------------=_4987654321-00000000--
```
Would generate:
```
File "/home/odoo/src/odoo/addons/mail/models/mail_thread.py", line 1398, in message_process
msg_dict = self.message_parse(message, save_original=save_original)
File "/home/odoo/src/odoo/addons/mail/models/mail_thread.py", line 1792, in message_parse
msg_dict.update(self._message_parse_extract_payload(message, msg_dict, save_original=save_original))
File "/home/odoo/src/odoo/addons/mail/models/mail_thread.py", line 1592, in _message_parse_extract_payload
content = part.get_content()
File "/home/odoo/miniconda3/lib/python3.10/email/message.py", line 1096, in get_content
return content_manager.get_content(self, *args, **kw)
File "/home/odoo/miniconda3/lib/python3.10/email/contentmanager.py", line 22, in get_content
return self.get_handlers[maintype](msg, *args, **kw)
File "/home/odoo/miniconda3/lib/python3.10/email/contentmanager.py", line 67, in get_text_content
return content.decode(charset, errors=errors)
LookupError: unknown encoding: cp-850
```
### After fix:
`content = part.get_content()` correctly handles the `cp-850` alias
OPW-5171501
OPW-5247486
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#2355294 changes
Resolved issues and error corrections
This update makes WebSocket connections close more reliably by correctly tracking multiple pending timeouts and waiting properly for the other side to respond. It also ensures stalled connections are forcefully ended if the shutdown handshake never completes, reducing the risk of lingering connections and missed disconnects.
Original PR description
This PR fixes several issues with WebSocket timeouts: - Waiting for more than one response was not handled properly, resulting in missed timeouts. - The closing handshake did not strictly follow the RFC when initiated on the server side (it closed without waiting for the other peer). - Close timeouts were not enforced (the connection was not terminated when the other peer did not respond to the close frame).
This change prevents regular users from hitting an access error when creating a Global Invoice in the Mexican electronic invoicing flow. It ensures the needed attachment updates can be completed smoothly, so invoice processing works for demo and other non-admin users.
Original PR description
## Issue: When creating a Global Invoice with a non-admin user (e.g., demo), an Access Error was raised: `Sorry, you are not allowed to access this document` ## Cause: This commit change the attachment creation to use the SUPERUSER: https://github.com/odoo/enterprise/pull/95197 However, updating `attachment.res_id` then required `base.group_system` access rights, preventing regular users from modifying the attachment As a result, non-admin users (like demo) triggered an access error during Global Invoice creation ## Steps to reproduce: - Switch to the MX company - Create a product with an UNSPSC Category (Accounting Tab) - Create and Confirm an Invoice for the product (enable CFDI to public) - Connect as Demo - Go in Accounting > Customers > Invoices - Toggle the last created invoice checkbox - Actions > Create Global Invoice - Before the fix, the Access Error is displayed - Check in the invoice Chatter for the Global CFDI document creation success opw-5181925
Sales orders in Portugal now automatically use the correct tax position based on the warehouse location, instead of relying on manual selection. This reduces the risk of invoicing errors and helps ensure VAT is applied according to place-of-supply rules.
Original PR description
Implements automation to correctly set the sales order fiscal position based on the warehouse, ensuring compliance with "place of supply" VAT rules. Problem: - The VAT rate must be determined by the supply location (warehouse), not the customer's delivery address. - Manually selecting the fiscal position on every sales order is slow and highly prone to user error, leading to incorrect invoicing. task-5088046 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 fix removes hidden newline characters from fields used in Swiss QR codes. It helps ensure the codes are formatted correctly and accepted by banks or payment systems without rejection.
Original PR description
Swiss QR codes have required information for each line of the QR code. Newline characters present in a field's content shift the content to a different line than intended, causing the QR code to be rejected. This commit removes newline characters from the field elements and alters a unit test to check if this issue occurs again. opw-5095997 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr