Daily updates from Odoo
Wednesday, October 29, 2025
29 changes · 19.0
Enhancements to existing features
The Italian localization now prevents use of old tax exemption reason codes that the Italian Tax Agency no longer accepts. This helps businesses avoid invalid electronic invoices by relying on the newer, more detailed Natura codes already available in Odoo.
Original PR description
There are old Natura (l10n_it_tax_exemption_reason) that are deprecated in favour of more detailed ones. We already have the detailed ones, but we allow the old values, but the Tax Agency considers them invalid already. ref: https://fex-app.com/FatturaElettronica/FatturaElettronicaBody/DatiBeniServizi/DatiRiepilogo/Natura Forward-Port-Of: odoo/odoo#233440 Forward-Port-Of: odoo/odoo#226939
This update adds a printable PDF version of Mexican payroll CFDI documents, making it easier for companies and employees to access compliant payslip documentation. It improves payroll reporting and presentation for Mexican electronic payroll processes.
Bank statement lines that use separate credit and debit columns can now be corrected directly from the attached statement. This makes manual corrections easier and more accurate for statements using that layout.
Original PR description
Previously, there was no way to use the manual correction tool on a bank statement that displayed the lines using credit/debit columns. Now, the debit/credit amounts can be selected on the attachment to fill in the amount of each line. task-[5126902](https://www.odoo.com/odoo/project/2068/tasks/5126902)
VoIP searches now find phone numbers even when they include spaces, hyphens, parentheses, or other formatting symbols. This makes it easier for users to locate contacts and call history entries regardless of how numbers are displayed or entered.
Original PR description
Introduces the `matchPhoneNumber` function, a new utility designed to match search terms against fully formatted phone numbers. The function converts a digit string like "123" into a flexible regex (e.g., /1\D*2\D*3/i) that matches digits regardless of any non-digit characters (spaces, hyphens, parentheses) between them. **Example:** * **SearchTerms**: "123" * **Target**: "+1 (2)-345" * **Match**: "1 (2)-3" Task-5160296 Forward-Port-Of: odoo/enterprise#98294 Forward-Port-Of: odoo/enterprise#97711
Resolved issues and error corrections
This update improves how Odoo recalculates and carries tax details when preparing sales-related helper data, especially for discounts, down payments, and future combo product handling. It reduces the risk of unexpected tax results by recalculating from clean data and preserving manual tax information more accurately.
Original PR description
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#233226 Forward-Port-Of: odoo/odoo#232284
Fixes an issue where changing a website form to send outgoing emails could cause submissions to fail and log an error. The form editor now refreshes the form setup when the model changes, ensuring required hidden fields are included so visitors can submit forms successfully.
Original PR description
Currently, an error occurs when submitting the 'Send Email' form. Steps to Reproduce: - Install the `website` and `web_studio` modules. - Go to `website` > `Click on Edit` > `Drag and drop form`. -…
Currently, an error occurs when submitting the 'Send Email' form. Steps to Reproduce: - Install the `website` and `web_studio` modules. - Go to `website` > `Click on Edit` > `Drag and drop form`. - click the form and in actions select the `more models`, and select `outgoing mails(mail.mail)` model and `save`. - `Submit` the form, and the error appears in the `logs`. **Error:** `KeyError: 'website_form_signature'` **Cause:** This error occurs when submitting the "Send Email" form from the website. By default, the form action is `"Send an E-mail"`, and when the user `changes` the form’s model to outgoing mails (mail.mail), which also has the action "Send an E-mail," the system checks the existing model [1] and retrieves it. Since `shouldRerender` is set to false, [2] is not executed, and as a result, the `email_to(hidden field)` is not present in the form. And the website_form_signature is added from [3], but due to the condition at [4], the code at [3] is not executed. When it is accessed at [5], KeyError is raised. **Fix:** This commit ensures that when the user changes the model, `rerenderXml` is executed so that the `hidden field` is also added. [1]: https://github.com/odoo/enterprise/blob/359a1c546fc9e4bc113517bf6ea912a70a9ea123/website_studio/static/src/website_form_editor.js#L155-L156 [2]: https://github.com/odoo/enterprise/blob/359a1c546fc9e4bc113517bf6ea912a70a9ea123/website_studio/static/src/website_form_editor.js#L174-L178 [3]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L252 [4]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L236 [5]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/controllers/form.py#L88 sentry-6746753251 Forward-Port-Of: odoo/enterprise#93287
Refreshing a signature document no longer hides the Sign Now and Cancel buttons or replaces the document name with “unnamed.” This keeps the signing flow clear and reliable for users who reload the page while reviewing or signing documents.
Original PR description
Version: - 18.0 Steps to reproduce: - Open document which is send for signature. - Refresh the browser. Before: - Refreshing the page was hiding the `sign now` and `cancel` button from control panel…
Version: - 18.0 Steps to reproduce: - Open document which is send for signature. - Refresh the browser. Before: - Refreshing the page was hiding the `sign now` and `cancel` button from control panel and also the name of document get replaced by 'unnamed' in breadcrumbs - The `needToSign` value was loaded from the context and used later to show those button, which is only available when navigating from `go_to_document`. On refresh, the context was lost, leading to the error. - Breadcrumbs were not getting set properly on reload. After: - Added `needToSign` to the URL query string.On page refresh, the data is retrieved from the URL as a fallback instead of relying on the context. - Add name of document to URL query string and on page refresh use that name to get correct name of document and update name to breadcrumbs using `setDisplayName`. Impact: - Buttons remain visible after refresh. - Correct document name is shown in breadcrumbs. - Ensures a smoother and more stable user experience when viewing documents. task-4805166 Forward-Port-Of: odoo/enterprise#97837 Forward-Port-Of: odoo/enterprise#93589
Fixes an issue that could cause website 'Send Email' forms to fail after being configured in the page editor. The form now includes required hidden information by default, helping visitors submit messages without triggering server errors.
Original PR description
Currently, an error occurs when submitting the 'Send Email' form. **Steps to Reproduce:** - Install the `website` module. - Go to `website` > `Click on Edit` > `Drag and drop form.` - Click the form…
Currently, an error occurs when submitting the 'Send Email' form. **Steps to Reproduce:** - Install the `website` module. - Go to `website` > `Click on Edit` > `Drag and drop form.` - Click the form and in actions select again `Send an E-mail` action and `save`. - `Submit the form`, and the error appears in the logs. **Error**: KeyError: 'website_form_signature' **Cause:** This error occurs when submitting the "Send Email" form from the website. When the user chooses the model Outgoing Mails (mail.mail), the email_to hidden field is not added. This is because email_to is only added when the recipient email value is changed from the sidebar via apply [1]. As a result, the email_to hidden field is missing from the form. And the website_form_signature is added from [2], but due to the condition at [3], the code at [2] is not executed. When it is accessed at [4], KeyError is raised. **FIX:** This commit ensures that when the user selects the action model, if there are hidden field , it is added to the form with its default value. [1]: https://github.com/odoo/odoo/blob/3b16debc6d6557334082fdf841b20ef0e31fc9d2/addons/website/static/src/builder/plugins/form/form_option_plugin.js#L863 [2]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L252 [3]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L236 [4]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/controllers/form.py#L88 sentry-6746753251 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226598
This fixes an issue where third-party checks could still appear as available after they had both incoming and outgoing payment activity. Businesses using Latin American check workflows will see more accurate check lists and avoid selecting checks that are no longer on hand.
Original PR description
**Steps to reproduce:** 1. Install the modules: `accounting`, `l10n_ar`, and `l10n_latam_check`. 2. Create a third-party check journal: * Add payment methods: *New Third Party Checks* (inbound) and…
**Steps to reproduce:** 1. Install the modules: `accounting`, `l10n_ar`, and `l10n_latam_check`. 2. Create a third-party check journal: * Add payment methods: *New Third Party Checks* (inbound) and *Existing Third Party Checks* (outbound). * Configure outstanding accounts for both methods. 3. Create a vendor payment: * Use the third-party check journal. * Select the *Existing Third Party Checks* method. * Leave the check list empty. * Keep the payment in *Draft*. 4. Create a customer payment: * Use the same journal and select the *New Third Party Checks* method. * Add a new check under the *Checks* tab. * Post the payment. 5. Return to the draft vendor payment created in step 3: * Add the newly created check to it (via *Add a line*). * Post the payment. 6. Go to **Customers → Third Party Checks**. **Observed behavior:** - The check still shows a `current_journal_id` even though it has both inbound and outbound operations. - As a result, the check incorrectly appears in the 'On Hand' filter. **Root cause:** - `_get_last_operation` was sorting operations by `date`. - In some scenarios or flows where multiple operations share the same `date`, the wrong operation could be selected as the "last one", leading `_compute_current_journal` to assign a journal incorrectly. **Solution:** - Sort operations by `write_date` to always pick the true last operation. - This ensures `_compute_current_journal` correctly clears `current_journal_id` whenever both inbound and outbound operations exist. opw-5012903 Forward-Port-Of: odoo/odoo#225556
Bank synchronization now avoids creating transactions or opening balances on accounting lock dates. This helps keep financial records compliant with closed periods and prevents entries from being shifted to incorrect dates.
Original PR description
If you have a company with a lock date set, and you connect a bank that has transactions dated to the day of the lock date, these transactions will be fetched, which do not make sense because nothing…
If you have a company with a lock date set, and you connect a bank that has transactions dated to the day of the lock date, these transactions will be fetched, which do not make sense because nothing should be created in a period covered by a lock date. As a result, these transactions would be created at a wrong date (if the current month is the first after the lock date or if the sequence has a monthly reset, then they would be appended to the current month, else if the sequence reset annually, then they would be created at the current date). Additionally, the potential opening balance would be created at a wrong date too, since it would try to create it one day prior to the oldest transaction. The date which the opening balance is created would not be the same as the transactions above, which adds a layer to the mess created. To prevent this, at initialization, we set the last sync date one day after the lock date, not the same day. As for the opening balance, we do not try to set it one day prior to the oldest transaction, but the same day. The `internal_index` computed will ensure it is displayed as the first transaction of that journal. Finally, the test related to statement creation were adapted to this new behavior. Some ordering based on `date` in other tests were changed to `internal_index` to unify the test file with these changes. opw-4890538 Forward-Port-Of: odoo/enterprise#95138 Forward-Port-Of: odoo/enterprise#93543
Fixes an accounting error when a dropshipped product is returned to an internal subcontracting location. The return now increases stock valuation correctly, helping inventory value and accounting reports stay accurate.
Original PR description
…ml internal dropship return **Problem:** when the subcontracting setting is active, the return of a dropshipped product (not necessarily subcontracted) to the internal subcontracting location will…
…ml internal dropship return **Problem:** when the subcontracting setting is active, the return of a dropshipped product (not necessarily subcontracted) to the internal subcontracting location will create an account move that credits "stock valuation" instead of debitting it **Steps to reproduce:** - enable the "Anglo-Saxon Accounting","Multi-steps routes" and "Subcontracting" settings - create a storable product with dropshipping route and a vendor - in 'general information' write a non null cost - make sure the product category's inventory valuation' is 'automated' - create a new quotation for this product, confirm it and confirm the linked purchase order - click on the dropship smart button and validate the picking - click on return and select 'Physical Locations/Subcontracting Location' as the return location - validate and click on the valuation smart button - on the only stock valuation layer for this move, click on the book shaped widget **Current behavior:** the account move credits Stock Valuation and debits stock interim (received) **Expected behavior:** As we are returning the product to stock it should increase the value of the stock valuation account. Therefore, it should debit stock valuation and credit stock interim (received) **Cause of the issue:** If the mrp_subcontracting_dropshipping module is active, and if we call _is_dropshipped_return on a stock move which is the return (to the subcontracting location) of a dropshipped move : the method will return true. https://github.com/odoo/odoo/blob/b34cebcf0c142d92affdb642525f066d431b7ca3/addons/mrp_subcontracting_dropshipping/models/stock_move.py#L29-L35 Therefore, inside _account_entry_move, _is_in will be false (contrary to if mrp_subcontracting_dropshipping is not installed or if the destination is another internal location) https://github.com/odoo/odoo/blob/b34cebcf0c142d92affdb642525f066d431b7ca3/addons/stock_account/models/stock_move.py#L580 The aml vals will be computed inside _prepare_anglosaxon_account_move_vals https://github.com/odoo/odoo/blob/b34cebcf0c142d92affdb642525f066d431b7ca3/addons/stock_account/models/stock_move.py#L596 Here the fact the destination location is internal does not change the fact that it should debit the stock valuation account (meaning it should used acc_valuation as the second parameter of _prepare_account_move_vals) if the cost is positive. https://github.com/odoo/odoo/blob/b34cebcf0c142d92affdb642525f066d431b7ca3/addons/stock_account/models/stock_move.py#L610-L614 opw-4894755 Forward-Port-Of: odoo/odoo#224871 Forward-Port-Of: odoo/odoo#221009
Fixes an issue where CRM stages disappeared after assigning them to a sales team during editing. Sales teams can now keep their team-specific stages visible in list and kanban views, reducing confusion and setup rework.
Original PR description
**Steps to reproduce:** 1. Install the CRM module. 2. Go to CRM → Sales → Teams(Team should more than one). 3. Open any Sales Team and create a new Stage. 4. Go to Settings of the created Stage →…
**Steps to reproduce:** 1. Install the CRM module. 2. Go to CRM → Sales → Teams(Team should more than one). 3. Open any Sales Team and create a new Stage. 4. Go to Settings of the created Stage → Edit. 5. Set the 'Sales Teams' same as the selected Team and save. 6. The newly created stage disappears from the list. **Issue:** - When editing a stage and assigning a 'Sales Teams', the stage no longer appears in the kanban or list view. **Cause:** Issue Occur from this [commit](https://github.com/odoo/odoo/commit/7345cbbff6ecb1dcbc508c320e807849167a4f1a) - The `_read_group_stage_ids` method overwrite the `search_domain` in the final `else` block, even when a valid `team_id` was present in the context. As a result, the search domain ignored the selected team and only fetched global stages (with no team assigned). **Solution:** Refactored `_read_group_stage_ids` to correctly handle conditional domain building: - Respect `team_id` when present in the context. - Include user team stages when `show_user_team_stages` is enabled. - Avoid overwriting `search_domain` when a specific team context is active. **opw - 5147315**
Inventory valuation journal entries now use the accounting date chosen on the inventory adjustment when one is provided. This prevents entries from being posted with today's date by mistake, improving accuracy for backdated stock and accounting records.
Original PR description
Prerequisites: --------------- * Install the stock and accounting * Configure Product Category: * Go to Inventory >Configuration > Categories * Create a new category (e.g.,Test) * Set Inventory…
Prerequisites: --------------- * Install the stock and accounting * Configure Product Category: * Go to Inventory >Configuration > Categories * Create a new category (e.g.,Test) * Set Inventory Valuation to "Perpetual (at invoicing)" * Create a new storable product and assign it to the new category * Go to Inventory > Configuration > Warehouse Management > Locations * Remove the `internal location` filter and select `Inventory adjustment` * On `Inventory Variation`, select Stock Valuation To reproduce: -------------- 1. Go to Inventory >Operations > Physical Inventory 2. Select Accounting date from the optional view button 3. Create a record with a past accounting date 4. Check the related journal entry date Issue: ------ The journal entry is created with today’s date instead of the specified accounting date. Cause of the issue: -------------------- After this 08b62a4, `accounting_date` is not considered when creating the journal entry, causing this issue. https://github.com/odoo/odoo/blob/db9053adcfb36d9d522079c4b3fd03ae2c7a6504/addons/stock_account/models/stock_move.py#L148-L151 Solution: --------- Use `accounting_date` if available when creating the journal entry. opw-5091817 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Documents app now correctly shows the email alias management section in the document details panel when using list view. This fixes a regression that could hide alias settings from users and makes the panel behave more reliably across document views.
Original PR description
Steps to Reproduce =================== 1. Set an alias in settings. 2. Go to a folder in Documents. 3. Open document right panel in list view. -> The email alias section in the document detail panel is missing in the list view. Issue ======= The commit [1] unintentionally change few lines of code in forward-port conflict. It removes `mail_alias_domain_count` from the view and we get undefined in JS. After this commit ================== Added required fields for the details panel to the controller mixin in JS to make it stable friendly and simplify usage regardless of view arch. Adapt selectors of `documents kanban: select a range with SHIFT key` test as we always pass `type` from js which groups documents into folder and file. [1] https://github.com/odoo/enterprise/commit/d278f9013113c6de4b3425fecad5d54a9d4d22b9 Task-5045288 Forward-Port-Of: odoo/enterprise#98219 Forward-Port-Of: odoo/enterprise#93401
This fix prevents the Point of Sale loyalty system from accidentally adding an extra product when shoppers use quantity shortcuts in promotions such as “Buy X Get Y.” It also restores the intended reward behavior so eligible free items are applied correctly based on the loyalty program rules.
Original PR description
After commit https://github.com/odoo/odoo/commit/b86dd8f0674f02a14f4aaa10db39bd4a1e8270f1, an extra order line could be added unintentionally. For example, in a "Buy X Get Y" loyalty program, if you add the product and press 3x on the numpad, the system would incorrectly add 3x + 1 products to the order. Moreover, the fix introduced in the above commit was not correct according to the program logic. For instance, if the configuration is set to "Grant: 1 credit per order" with a minimum quantity of 2, and the reward is for one point, then when ordering 2 products, one of them should indeed be free. The previous fix changed this intended behavior, resulting in incorrect reward application. opw-5151979 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232192 Forward-Port-Of: odoo/odoo#231704
This update fixes an issue in Web Studio where adding a column in reports with conditional table headers could update only some rows. Business users editing delivery slips and similar reports can now insert columns more reliably without creating inconsistent table layouts.
Original PR description
The TableSizeComputer.compute() method can return cells with incorrect cell indexes. This can result in the _addColumn function only adding a column to some rows in the report editor.…
The TableSizeComputer.compute() method can return cells with incorrect cell indexes. This can result in the _addColumn function only adding a column to some rows in the report editor. TableSizeComputer.compute() does not handle cases where a conditional is used inside of a th element but the corresponding td element does not have a conditional. Steps to reproduce ----- 1. Open the Delivery Slip in the report editor. 2. Click the header to show the dropdown and select elif: o.move_line_ids and o.state=='done'. 3. Hover over the last th element to select the column button. 4. Click Insert right and see that only the header row has an additional column. Cause ----- TableSizeComputer.compute() calculates how many possible cells can be in a row which can be more than the total number of columns you have if you have th or td elements with a conditional inside of them. In the Delivery Slip report, a th element is present when using serial numbers and a different th element is present when not using serial numbers. The corresponding t-body has two different tr elements for these conditions. The compute method will have one less cell in these rows because the corresponding conditional is handled outside of the row. Solution ----- Only count mutually exclusive th or td elements once. This prevents the cellIndex from being larger than the total possible columns. opw-ticket 5173345 Forward-Port-Of: odoo/enterprise#98207
The Swedish point-of-sale receipt reprint limit now works correctly, helping businesses comply with local receipt handling requirements. The update also improves error handling when the blackbox device is disconnected or reports unexpected issues, reducing stalled screens and unclear diagnostics.
Original PR description
Before this commit, the receipt reprint check logic (which only allows a receipt to be reprinted once) was not working. There were two issues preventing it from working: - The name of the function had changed but not been updated in this module, so the override was not applied. - The ID being used to check the order was incorrect. A few smaller issues were also fixed: - A logging issue in the IoT driver, which prevented the error severity from being printed. - An infinite loading UI if the blackbox was disconnected. - The blackbox error handler swallowing up some errors due to only expecting one specific format. Forward-Port-Of: odoo/enterprise#98271 Forward-Port-Of: odoo/enterprise#98076
This fixes an issue where a newly configured CRM sales stage could disappear from the Opportunities view after refreshing. Sales teams can now reliably see and use their configured stages, reducing confusion during pipeline management.
Original PR description
step to reproduce: - install crm with sample data - go to sales -> teams -> "Sales" - Add a stage and configure it for "sales team" from the stage's cog menu - back to **Opportunities** page and refresh Observation: - The stage vanishes from the view Cause: - commit [1] adds a if condition in `_read_group_stage_ids` view such that it overrides previous if condition, hence we lose the intended domain Fix: - fix the method and made it simpler [1] https://github.com/odoo/odoo/commit/7345cbbff6ecb1dcbc508c320e807849167a4f1a opw-5166128 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update keeps Australian payroll services connected to Odoo's external processing service after changes to the connection setup. It adds the new service addresses and improves error handling so connection issues are clearer, without disrupting existing connections.
Original PR description
Adds the new urls configured for the iap proxy. Adapts for the updated connection flow. This does not break any existing connections. Related PR: https://github.com/odoo/iap-apps/pull/1124
Quality checks linked to a camera now correctly trigger the connected IoT Box to take a picture instead of opening a manual file upload. The fix also improves retrieval of measurements from IoT devices, helping operators complete shop-floor quality checks more reliably.
Original PR description
Even after linking a camera to a quality control point, we still ended up in the file uploader instead of calling the *take picture* action on the IoT Box. This commit fixes the issue by restoring the call to the IoT Box, updating it to use the `iot_http` service. It also ensures measurements are correctly fetched from the IoT Box.
DHL pallet package defaults were corrected so they use the measurements DHL expects. This prevents shipment validation errors and allows delivery labels to be generated when users keep the standard pallet settings.
Original PR description
## Short functional explanation of the error When setting the 'DHLxw Package Type' of a DHL delivery method to 'DHL pallets' without changing default values, trying to validate an order delivery…
## Short functional explanation of the error When setting the 'DHLxw Package Type' of a DHL delivery method to 'DHL pallets' without changing default values, trying to validate an order delivery causes an error. ## Reproduction Steps 1. Type 'Delivery method' in the dashboard. Select DHL BE, set the region to Europe and the 'DHLxw Package Type' to 'DHL pallets'. Click on the arrow at the right of 'DHL pallets'. You should see the default values set to 1200, 1600 and 1200. These correspond to millimeters, while DHL expects centimeters. 2. Make sure you're using a company located in Belgium. 3. In the inventory settings, make sure that either 'multi-step route' is unchecked or that for your warehouse, the outgoing shipments are set to '1 step'. 3. Create a new quotation. Select a Customer with a Belgian address. Add a product for which there's at least 1 copy in stock. 4. Click on add shipping and select DHL BE. Then click add and ok. 5. Click on confirm. A smart button at the top of the page called "delivery" should appear. Click on it and set the scheduled date to a future day. Finally, click validate. ### Expected behavior New labels should generate without issue. ### Unexpected behavior An error occurs: ```Bad request Multiple problems found, see Additional Details 1001: The requested product(s) (N) not available based on your search criteria.(687662d08999745d3df3783068fcca24) 410107: The piece height exceeds max, N/- 410304: No products available ``` ## Origin of the issue The default values for DHL are set to 1200, 1600 and 1200, which correspond to millimeters. However, DHL expects centimeters, for which the default value is thus too high. Note: because the issue stems from default values, after implementing the fix, the module should be reinstalled. __ opw-4804639 Forward-Port-Of: odoo/enterprise#90272
This fixes the website editor so header customization options appear in the correct order in the sidebar again. It removes confusing duplicate option behavior and corrects a tooltip, making header setup clearer for website editors.
Original PR description
After PR[1] was merged, the header options were not displayed correctly in the sidebar. In 19.0, there were many changes in the header options files (PR[2]) PR[1] was not adapted properly in the forward port, which led to duplicated classes and sequence issues. This commit restores the options order. It also fixes an incorrect tooltip. ----------------------------------------------------------------------- PR[1]: https://github.com/odoo/odoo/pull/230283 PR[2]: https://github.com/odoo/odoo/pull/221703
Cancelled restaurant point-of-sale orders are now removed from the Ticket Screen instead of showing under paid orders. This keeps order history clearer for staff and helps avoid confusion when reviewing completed sales.
Original PR description
pos*: point_of_sale, pos_restaurant Steps to reproduce: - Open the Restaurant POS and place an order. - Send it to the preparation screen by clicking Order. - Reopen the order and cancel it via the Action button. Issue: - The cancelled order still appears under the Paid section on the Ticket Screen. Fix: - Cancelled orders are now excluded from the Ticket Screen display. - Remove canceled orders from local records. Task: 4936636 Forward-Port-Of: odoo/odoo#232114 Forward-Port-Of: odoo/odoo#219402
This fix ensures repeated server requests fail cleanly when the underlying server call cannot complete, instead of leaving users waiting indefinitely. It improves reliability for offline workflows and updates related email marketing tests to reflect the corrected behavior.
Original PR description
*mass_mailing This commit fixes some issues in the RPC cache, when the fallback (i.e. the call to the server) failed. More specifically, if the same rpc was done multiple times before the first one…
*mass_mailing
This commit fixes some issues in the RPC cache, when the fallback (i.e. the call to the server) failed. More specifically, if the same rpc was done multiple times before the first one returned, the returned promise might be pending forever:
1) if type="disk": only the promise of the first call was rejected,
the promise of the other calls was left pending forever.
2) if type="ram": all calls got the same promise as response, which
was left pending forever.
This commit fixes those issue and introduces new tests for the failing fallback scenario.
These issues have been highlighted when working on the offline UI, as in offline, rpcs always fail.
We also had to properly mock the route `/html_editor/get_image_info` in a mass_mailing test, as the call threw an "unimplemented route error" which was previously hidden by the issue 2) that this commit fixes.
task~5106517
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-prThis fix ensures editable areas inside protected website or HTML editor sections are correctly recognized. It helps users edit intended content blocks more reliably while preserving restrictions on areas that should remain locked.
Original PR description
[FIX] html_builder, *: set contenteditable attribute on correct elements *: html_editor, website The goal of this commit is to fix the behavior of the `extra_contenteditable_handlers` resource; its goal is to mark as editable an element that is inside an `.o_not_editable`. The problem is that this was not working as intended as the elements given as argument to the handler were a list that was filtered of the elements that have an `.o_not_editable` ancestor. Note: even if it is in stable, the `force_editable_selector` resource has been renamed as `content_editable_providers` as a provider is needed in some cases. Because it has become a provider, the `force_not_editable_selector` resource has also been renamed and becomes a provider. This choice has been made to maintain consistency throughout the plugin. Forward-Port-Of: odoo/odoo#230545
Fixed an issue where users with access to multiple companies could not assign themselves to planning tasks if their employee record belonged to a selected company that was not the current active company. This ensures planning assignments work as expected in multi-company setups and avoids silent failures.
Original PR description
_______________________________________ ## Short functional explanation of the error Let's say we have the scenario where a user has access to company_1 and company_2, but only has a corresponding…
_______________________________________ ## Short functional explanation of the error Let's say we have the scenario where a user has access to company_1 and company_2, but only has a corresponding employee in company_2. If the user selects company_1 and company_2 but keeps company_1 as his current company, and tries to assign himself a task that has been created for company_2, nothing happens. ## Reproduction Steps 1. As an admin, create a user with which you'll be able to log. Make sure that you have at least 2 companies created, and that the user has access to both. Create an employee for that user in company_2. 2. Select both companies. In planning, create a slot for company_2 and publish it. 3. Log in as the user you created. Make sure that the current company is company_1. Select company_2. 4. Go to planning and try to assign yourself to the slot you've just created as an admin ### Expected behavior Either an error message shows, or the employee is assigned to the slot for company_2 (as company_2 is selected). ### Unexpected behavior Nothing happens ## Origin of the issue When the current company isn't the one corresponding to the one the employee is in, even if another company is selected and contains the employee, self.env.user.employee_id is set at False _________________________________________ opw-4963674 --- Forward-Port-Of: odoo/enterprise#95785 Forward-Port-Of: odoo/enterprise#91616
This fix ensures Safari users can apply or dismiss links in the HTML editor without the link popover closing too early. It improves reliability when editing links in places such as email templates, including the link type selector.
Original PR description
## Issue: On Safari, the Apply and Dismiss buttons of the LinkPopover did not trigger their actions In some cases, it seemed to work only because a temporary link was not properly cleared The Link…
## Issue: On Safari, the Apply and Dismiss buttons of the LinkPopover did not trigger their actions In some cases, it seemed to work only because a temporary link was not properly cleared The Link Type Selection was also broken by the same bug ## Cause: Safari triggers a `pointerdown` event through the `LinkPopover`, which changes the `selection` and calls the `handleSelectionChange()` method https://github.com/odoo/odoo/blob/e43135e94bf22bc2f7a115c37e8a082f96871ed0/addons/html_editor/static/src/main/link/link_plugin.js#L672-L678 At that point, `documentSelection` is `null`, causing the overlay to close before the `onClickApply()` on the Apply button It's the same issue with the Dismiss button and the Link Type Selection ## Steps to reproduce: - Install mail to get access to an html_editor - Enable debug mode - Go in Email Templates and open one of them - Select a text and open link tools - Add Odoo.com and click on Apply - The link may seems to be created (if it's the case, there is no preview) - You can confirm that with the link type selector that closed the popover before the fix opw-5115887 Forward-Port-Of: odoo/odoo#233513 Forward-Port-Of: odoo/odoo#233241
This fix ensures French POS certification logic ignores orders that do not yet have a secure sequence number when finding the previous order. It prevents false duplicate-history errors that could block module loading or database upgrades for businesses with many older POS orders.
Original PR description
## Description of the issue/feature this PR addresses: When obtaining the previous order for pos.order records, all orders with l10n_fr_secure_sequence_number == NULL will be recognised as the…
## Description of the issue/feature this PR addresses:
When obtaining the previous order for pos.order records, all orders with l10n_fr_secure_sequence_number == NULL will be recognised as the previous order for those where l10n_fr_secure_sequence_number == 1, as if their sequence value was zero.
## Current behavior before PR:
Since there can be more than one orders without sequence number, this behaviour will trigger an UserError exception, as the ORM will mistakenly deduce that there are multiple previous orders for a single one, which is not necessarily correct.
### Examples:
upg-3170341
```sql
lare_3170341=> SELECT count(id) FROM pos_order WHERE l10n_fr_secure_sequence_number IS NULL;
count
-------
67281
(1 row)
```
```python
# Debugging standard codebase with a Python debugger
...
match = prev_map.get(order.l10n_fr_secure_sequence_number - 1, []) # len(match) == 67281
if len(match) > 1:
raise UserError(_('An error occurred when computing the inalterability...'))
...
```
upg-3170341
```sql
lare_3167621=> SELECT count(id) FROM pos_order WHERE l10n_fr_secure_sequence_number IS NULL;
count
-------
294
(1 row)
```
```python
# Debugging standard codebase with a Python debugger
...
match = prev_map.get(order.l10n_fr_secure_sequence_number - 1, []) # len(match) == 294
if len(match) > 1:
raise UserError(_('An error occurred when computing the inalterability...'))
...
```
---
Traceback group: https://upgrade.odoo.com/odoo/tbg/1869
```
2025-09-30 07:48:30,945 329 INFO db_3167621 odoo.modules.loading: Loading module l10n_fr_pos_cert (110/131)
2025-09-30 07:48:31,375 329 INFO db_3167621 odoo.modules.registry: module l10n_fr_pos_cert: creating or updating database tables
2025-09-30 07:48:31,432 329 INFO db_3167621 odoo.models: Prepare computation of pos.order.previous_order_id
2025-09-30 07:48:31,597 329 WARNING db_3167621 odoo.modules.loading: Transient module states were reset
2025-09-30 07:48:31,597 329 ERROR db_3167621 odoo.modules.registry: Failed to load registry
2025-09-30 07:48:31,597 329 CRITICAL db_3167621 odoo.service.server: Failed to initialize database `db_3167621`.
Traceback (most recent call last):
File "/home/odoo/src/odoo/18.0/odoo/service/server.py", line 1361, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-13>", line 2, in new
File "/home/odoo/src/odoo/18.0/odoo/tools/func.py", line 97, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/18.0/odoo/modules/registry.py", line 129, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 485, in load_modules
processed_modules += load_marked_modules(env, graph,
File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 365, in load_marked_modules
loaded, processed = load_module_graph(
File "/home/odoo/src/odoo/18.0/odoo/modules/loading.py", line 206, in load_module_graph
registry.init_models(env.cr, model_names, {'module': package.name}, new_install)
File "/home/odoo/src/odoo/18.0/odoo/modules/registry.py", line 618, in init_models
func()
File "/home/odoo/src/odoo/18.0/odoo/addons/base/models/ir_model.py", line 2007, in _reflect_relation
self.env.invalidate_all()
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 839, in invalidate_all
self.flush_all()
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 857, in flush_all
self._recompute_all()
File "/home/odoo/src/odoo/18.0/odoo/api.py", line 850, in _recompute_all
self[field.model_name]._recompute_field(field)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 7359, in _recompute_field
field.recompute(records)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1463, in recompute
apply_except_missing(self.compute_value, recs)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1436, in apply_except_missing
func(records)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1485, in compute_value
records._compute_field_value(self)
File "/home/odoo/src/odoo/18.0/addons/mail/models/mail_thread.py", line 427, in _compute_field_value
return super()._compute_field_value(field)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5296, in _compute_field_value
fields.determine(field.compute, self)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 110, in determine
return needle(*args)
File "/home/odoo/src/odoo/18.0/addons/l10n_fr_pos_cert/models/pos.py", line 79, in _compute_previous_order
raise UserError(_('An error occurred when computing the inalterability. Impossible to get the unique previous posted point of sale order.'))
odoo.exceptions.UserError: Une erreur s'est produite lors de la vérification de l'inaltérabilité. Impossible de récupérer la dernière commande de caisse unique et comptabilisée.
```
## Desired behavior after PR is merged:
The method `pos.order._compute_previous_order` already only checks orders with a sequence number != NULL, so to address this issue, we will use the same condition to retrieve only orders with a valid sequence. This will result in no more exceptions created by incorrect data.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#229585This fix prevents spreadsheet dashboards from crashing when a list uses expanding formulas that repeat or generate list fields. Users can now open affected dashboards normally, improving reliability for dashboard views that include spreadsheet-based lists.
Original PR description
How to reproduce: - Add a list to a dashboard - edit the dashboard such that a spill formula involving the list appears `=ODOO.LIST(1, SEQUENCE(500), "name")` or `=odoo.list.header(1, C1:C2)` and C1: "name", C2:"name" Save those changes and open the corresponding dashboad view -> traceback Task-5220385 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