Daily updates from Odoo
Navigate
Branch
Friday, September 19, 2025
40 changes
8 changes
Resolved issues and error corrections
This fix changes how default supplier taxes are applied so large product databases can be updated without running out of memory. It helps accounting setup and migrations complete reliably for companies with many products sharing the same supplier tax.
Original PR description
As I mentioned in the query below, multiple grouped product.template records with the same supplier_taxes_id are being modified with the default purchase tax (account_purchase_tax_id),which leads to…
As I mentioned in the query below, multiple grouped product.template records with the same supplier_taxes_id are being modified with the default purchase tax (account_purchase_tax_id),which leads to a memory error. To prevent this, I have used an INSERT query.
```sql
SELECT tax_id, COUNT(*) AS product_count
FROM product_supplier_taxes_rel
GROUP BY tax_id
ORDER BY product_count DESC;
tax_id | product_count
--------+---------------
15 | 1262126
156 | 343332
114 | 36363
47 | 10132
23 | 202
546 | 11
474 | 5
782 | 2
666 | 2
1188 | 2
1318 | 1
3 | 1
(12 rows)
```
- Traceback
```python
Traceback (most recent call last):
File "/home/odoo/src/odoo/17.0/odoo/service/server.py", line 1314, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-16>", line 2, in new
File "/home/odoo/src/odoo/17.0/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/17.0/odoo/modules/registry.py", line 110, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/17.0/odoo/modules/loading.py", line 515, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/src/odoo/17.0/odoo/modules/migration.py", line 240, in migrate_module
migrate(self.cr, installed_version)
File "/home/odoo/src/odoo/17.0/addons/l10n_ch/migrations/11.3/end-migrate.py", line 8, in migrate
env["account.chart.template"].try_loading("ch", company)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 155, in try_loading
return self._load(template_code, company, install_demo)
File "/home/odoo/src/odoo/17.0/addons/point_of_sale/models/chart_template.py", line 22, in _load
result = super()._load(template_code, company, install_demo)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 214, in _load
self._post_load_data(template_code, company, template_data)
File "/home/odoo/src/enterprise/17.0/account_reports/models/chart_template.py", line 10, in _post_load_data
super()._post_load_data(template_code, company, template_data)
File "/home/odoo/src/odoo/17.0/addons/stock_account/models/account_chart_template.py", line 12, in _post_load_data
super()._post_load_data(template_code, company, template_data)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 669, in _post_load_data
sudoed_products_purchase._force_default_purchase_tax(company)
File "/home/odoo/src/odoo/17.0/addons/account/models/product.py", line 130, in _force_default_purchase_tax
product_grouped_by_tax.supplier_taxes_id += default_supplier_taxes
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1322, in __set__
records.write({self.name: write_value})
File "/home/odoo/src/odoo/17.0/addons/website_sale/models/product_template.py", line 176, in write
return super().write(vals)
File "/home/odoo/src/odoo/17.0/addons/rating/models/rating_mixin.py", line 100, in write
result = super(RatingMixin, self).write(values)
File "/home/odoo/src/odoo/17.0/addons/stock_account/models/product.py", line 55, in write
res = super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/mrp/models/product.py", line 74, in write
return super().write(values)
File "/home/odoo/src/odoo/17.0/addons/stock/models/product.py", line 921, in write
return super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/product/models/product_template.py", line 502, in write
res = super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/mail/models/mail_thread.py", line 311, in write
return super(MailThread, self).write(values)
File "/home/odoo/src/odoo/17.0/addons/mail/models/mail_activity_mixin.py", line 250, in write
return super(MailActivityMixin, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/website/models/mixins.py", line 218, in write
return super(WebsitePublishedMixin, self).write(values)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 4444, in write
field.write(self, value)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4337, in write
self.write_batch([(records, value)])
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4358, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4957, in write_real
y_to_xs[y].add(x)
File "/home/odoo/src/odoo/17.0/odoo/tools/misc.py", line 1136, in add
self._map[elem] = None
MemoryError
```
opw - 4544050
upg - 2459515
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#227532
Forward-Port-Of: odoo/odoo#204931The calendar year view now responds properly when the browser window is resized. This prevents display issues and helps users keep a clear yearly schedule view across different screen sizes.
Original PR description
FullCalendar already applies a debounce on the `windowResize` handler. Thus, doing it again in our renderer is a duplicated effort. Also, in the Year calendar renderer, the debounced version of the handler is initialized after the FullCalendar instances (one for each month) are created... which prevents it from being run at all. This commit fixes and cleans this up by directly passing our handler to FullCalendar, letting him do the rest. task-4809668 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#227725 Forward-Port-Of: odoo/odoo#227458
This fix gives the test user the required Sales access so Mexican localization tests can create sales orders successfully. It does not change business behavior, but helps keep automated checks reliable for this localization.
Original PR description
The tests `test_global_discount` and `test_down_payment` in `l10n_mx_edi_sale` were failing with:
AccessError: You are not allowed to create 'Sales Order' (sale.order) records.
This happened because `mx_external_setup` runs with a user that does not belong to any Sales group. Both tests explicitly create Sale Orders and advance payment wizards, which require Sales ACLs.
This change ensures the test user has the `sales_team.group_sale_salesman` group in `setUpClass`, so Sales Orders can be created normally. No business logic is modified, only test stabilization for the MX localization.
[RB-232559](https://runbot.odoo.com/odoo/error/232559)
Forward-Port-Of: odoo/enterprise#94911This update brings the embedded spreadsheet component to its latest version and fixes several issues affecting spreadsheet calculations. Users should see clearer formula error messages and more reliable pivot table calculated measures, especially when working with totals.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c7e71ac07 [REL] 18.4.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/c7e71ac07 [REL] 18.4.11 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/716824c3d [FIX] functions: wrong error message for `SORT` [Task: 5085267](https://www.odoo.com/odoo/2328/tasks/5085267) https://github.com/odoo/o-spreadsheet/commit/7cd1c8af8 [FIX] helpers: preserve sparse(empty) elements in removeIndexesFromArray [Task: 4977932](https://www.odoo.com/odoo/2328/tasks/4977932) https://github.com/odoo/o-spreadsheet/commit/cbf814c77 [FIX] package: add swc binaries to optional dependencies [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/e7ecca4fc [FIX] pivot: calculated measure from totals [Task: 5061631](https://www.odoo.com/odoo/2328/tasks/5061631) https://github.com/odoo/o-spreadsheet/commit/47870c124 [FIX] pivot: add aggregator to calculated measure id [Task: 5061631](https://www.odoo.com/odoo/2328/tasks/5061631) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
The Indian GSTR-3B report now includes purchase credit notes, receipts, and other purchase records correctly. This helps businesses see more accurate tax reporting data and avoids purchase-related amounts being shown through the POS report, where they do not belong.
Original PR description
Currently, purchase entries are not displaying the correct data because the credit notes and receipts were not included. This PR removes purchase-related data from `l10n_in_reports_gstr_pos` (as POS has no relation to purchase records) and ensures that credit note data and other purchase records are properly displayed in the GSTR-3B report. **opw**-5079401 Forward-Port-Of: odoo/enterprise#95079 Forward-Port-Of: odoo/enterprise#94582
Field service tasks created from templates now correctly keep the template's "Under Warranty" setting. This ensures warranty-related service work is identified accurately from the start, reducing manual correction and billing or service handling mistakes.
Original PR description
**Steps to reproduce:**
- Install industry_fsm_sale
- Create a task template with "Under Warranty" enabled
- Create a task from that template
**Issue:**
The created task does not carry over the "Under Warranty" value from the task template.
**Cause:**
The `under_warranty` field has `copy=False`, so the value is not transferred.
**Fix:**
Updated the copy method to check for `copy_from_template` in the context. If the task template has "Under Warranty" enabled, the field is explicitly set on the new task.
task: 5083386
Forward-Port-Of: odoo/enterprise#94924This change rolls back recent manufacturing and inventory accounting updates that attempted to correct valuation during unbuild operations but introduced additional accounting inconsistencies and errors. The revert restores the prior behavior while the team prepares a cleaner solution, reducing the risk of new regressions in stock valuation and purchase/manufacturing accounting.
Original PR description
This commit reverts [1], [2], [3], and [4]. (It actually results in minimal changes since those commits were already removing parts of each other.) Issue before those commits: 1. Setup a auto-fifo…
This commit reverts [1], [2], [3], and [4]. (It actually results in minimal changes since those commits were already removing parts of each other.) Issue before those commits: 1. Setup a auto-fifo category and two storable products (a component and a finished product) 2. Receive one compo at 10, then one at 25 3. Produce two MO with one finished product 4. Unbuild the second one Error: - For the component, we just use the value of the consumed components: IN 1 @ 25 - For the finished product, we process it as a classic out. Reminder, we are in FIFO: OUT 1 @ 10 As a result, thanks to the unbuild, we have created - A over-valuation of the stock (+15) - An outstanding balance of the "Cost of Production" This is why [1] has been merged. However, it brought some other issues, cf [2], [3] and [4]. Unfortunately, it still has some issues - After the above use case, the difference between the debit and the credit of the stock valuation account is no longer the sum of the remaining values of the layers - Adding some landed costs on MOs will lead to a traceback when undbuilding - The over-valuation of the stock (that was already present before [1], cf above) is still present Following some discussions with R&D and the product owners, we have decided to start over from scratch, which means: - Revert all commits - Try another approach (if so, the new PR will be linked to the PR related with this commit) [2], [3], and [4] are partially reverted: the tests can remain, as they were only failing due to a sequence of changes. [1] https://github.com/odoo/odoo/commit/84dda968146d2f3743ab7fc516300e50780725e3 [2] https://github.com/odoo/odoo/commit/49565cdd9007ac66a3b835dc073777e2e6c48f2c [3] https://github.com/odoo/odoo/commit/3a69456a291da593748475c86e7efc6234019e47 [4] https://github.com/odoo/odoo/commit/fb30cde9a320c245cf1321c9dc2ea2e67a53d0a0 OPW-5036574 Forward-Port-Of: odoo/odoo#226380 Forward-Port-Of: odoo/odoo#225728
This fix prevents crashes when the system loads unusual record combinations, such as temporary records mixed with saved records or records with an empty identifier. It improves overall platform stability and keeps behavior consistent across core data operations.
Original PR description
This commit addresses two corner cases that cause `fetch()` to crash: Mixing new and real records: - Issue: If a recordset contains both new and real records, `fetch()` raises an `AccessError`. - Rationale: While we typically assume that new and real records are never mixed, certain recordset operations can inadvertently lead to this state. Handling this case improves the overall robustness of the ORM. Using `False` as a record id: - Issue: Using a record with a `False` id, such as `browse([False])`, causes a SQL error when `fetch()` is called. - Rationale: Other operations, like `browse([False]).name`, work without crashing. To ensure consistency across the ORM, `fetch()` should also handle `False` ids without error. Forward-Port-Of: odoo/odoo#227447
9 changes
Resolved issues and error corrections
Opening Knowledge activities now filters the article list to the articles that actually have matching activities. This prevents users from landing on an unfiltered list of all articles and helps them find the relevant work faster.
Original PR description
Currently, when the user tries to open any activity of the knowledge article, it opens all articles instead of the one which has an activity assigned to them. **Steps to reproduce this issue:** 1) Install the Knowledge module 2) Set up an activity for yourself on a Knowledge article 3) Open the activities from Activities (top left corner) **Issue:** You will end up in the all articles list, with no filters applied. **Cause:** When the user clicks on the activities, a default search filter is added in the context, which is then applied on the view. But in the knowledge article, we don't have any search filters for the activities. Therefore, it renders all knowledge article records. **Solution:** Add search filters for the knowledge articles. opw-4997201 Forward-Port-Of: odoo/enterprise#93609
This fixes an error that appeared when opening the barcode scanner in Attendance kiosk mode while debug mode was enabled. The scanner now uses the standard barcode scanning flow, preventing the crash and improving reliability for users managing attendance check-ins.
Original PR description
**Step to reproduce:** - install Attendances app - turn on debug mode - go to Attendance -> kiosk mode - open the scanner **Observation:** - We get a traceback **Cause:** - we pass a extra prop `token` to BarcodeDialog component, which is not accepted by it https://github.com/odoo/odoo/blob/178dff30131a93680dfd994fd22b29a766ee9354/addons/web/static/src/core/barcode/barcode_dialog.js#L12 - this raises issue from OWL when we have debug-mode on **Fix:** - reuse the actual `scanBarcode` method and remove the faulty one. https://github.com/odoo/odoo/blob/178dff30131a93680dfd994fd22b29a766ee9354/addons/web/static/src/core/barcode/barcode_dialog.js#L47-L60 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227551 Forward-Port-Of: odoo/odoo#225738
This update brings the spreadsheet component to its latest maintenance version. It fixes incorrect error messaging, improves handling of empty spreadsheet data, and corrects pivot table calculated measures so business reports remain accurate.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/b64ee85e0 [REL] 18.3.21 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/b64ee85e0 [REL] 18.3.21 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/a9e5756c6 [FIX] functions: wrong error message for `SORT` [Task: 5085267](https://www.odoo.com/odoo/2328/tasks/5085267) https://github.com/odoo/o-spreadsheet/commit/679819e2f [FIX] helpers: preserve sparse(empty) elements in removeIndexesFromArray [Task: 4977932](https://www.odoo.com/odoo/2328/tasks/4977932) https://github.com/odoo/o-spreadsheet/commit/c405bca1b [FIX] package: add swc binaries to optional dependencies [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/3a578beaa [FIX] pivot: calculated measure from totals [Task: 5061631](https://www.odoo.com/odoo/2328/tasks/5061631) https://github.com/odoo/o-spreadsheet/commit/906bf4c28 [FIX] pivot: add aggregator to calculated measure id [Task: 5061631](https://www.odoo.com/odoo/2328/tasks/5061631) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
Purchase entries in the Indian GSTR-3B report now include credit notes, receipts, and other relevant purchase records. This improves tax report accuracy and removes unrelated purchase data from the POS reporting area.
Original PR description
Currently, purchase entries are not displaying the correct data because the credit notes and receipts were not included. This PR removes purchase-related data from `l10n_in_reports_gstr_pos` (as POS has no relation to purchase records) and ensures that credit note data and other purchase records are properly displayed in the GSTR-3B report. **opw**-5079401 Forward-Port-Of: odoo/enterprise#95079 Forward-Port-Of: odoo/enterprise#94582
Creating a field service task from a template now correctly keeps the template's Under Warranty setting. This helps teams avoid missed warranty coverage details and reduces manual corrections after task creation.
Original PR description
**Steps to reproduce:**
- Install industry_fsm_sale
- Create a task template with "Under Warranty" enabled
- Create a task from that template
**Issue:**
The created task does not carry over the "Under Warranty" value from the task template.
**Cause:**
The `under_warranty` field has `copy=False`, so the value is not transferred.
**Fix:**
Updated the copy method to check for `copy_from_template` in the context. If the task template has "Under Warranty" enabled, the field is explicitly set on the new task.
task: 5083386The Planning and Timesheet Analysis report now calculates planned and remaining hours using each employee's actual working schedule. This prevents incorrect totals for employees who do not work the standard company weekdays, improving reliability of planning reports.
Original PR description
To reproduce: ============= - set the company calendar to 40h/week (Mon to Fri) - create an employee with a 32h/week working schedule (doesn't work on Fri) - on planning app, create a shift for this employee for ex from 01/09 to 15/09 with 2h allocated - go to Planning / Timesheet Analysis report and check report for this employee on september -> planned hours and remaining hours are wrong Problem: ======== when querying the data for the desired period, we divide the allocated hours by the number of weekdays (Mon to Fri) in the period, but we should divide by the number of working days according to the employee's working schedule Solution: ========= we compute the number of working days based on the resource calendar of the employee and use this number to compute the planned hours and remaining hours opw-5008066
This change rolls back earlier updates to manufacturing unbuild valuation because they introduced accounting inconsistencies and errors in some cost scenarios. The team will restart with a different approach to better handle stock valuation without creating incorrect balances.
Original PR description
This commit reverts [1], [2], [3], and [4]. (It actually results in minimal changes since those commits were already removing parts of each other.) Issue before those commits: 1. Setup a auto-fifo…
This commit reverts [1], [2], [3], and [4]. (It actually results in minimal changes since those commits were already removing parts of each other.) Issue before those commits: 1. Setup a auto-fifo category and two storable products (a component and a finished product) 2. Receive one compo at 10, then one at 25 3. Produce two MO with one finished product 4. Unbuild the second one Error: - For the component, we just use the value of the consumed components: IN 1 @ 25 - For the finished product, we process it as a classic out. Reminder, we are in FIFO: OUT 1 @ 10 As a result, thanks to the unbuild, we have created - A over-valuation of the stock (+15) - An outstanding balance of the "Cost of Production" This is why [1] has been merged. However, it brought some other issues, cf [2], [3] and [4]. Unfortunately, it still has some issues - After the above use case, the difference between the debit and the credit of the stock valuation account is no longer the sum of the remaining values of the layers - Adding some landed costs on MOs will lead to a traceback when undbuilding - The over-valuation of the stock (that was already present before [1], cf above) is still present Following some discussions with R&D and the product owners, we have decided to start over from scratch, which means: - Revert all commits - Try another approach (if so, the new PR will be linked to the PR related with this commit) [2], [3], and [4] are partially reverted: the tests can remain, as they were only failing due to a sequence of changes. [1] https://github.com/odoo/odoo/commit/84dda968146d2f3743ab7fc516300e50780725e3 [2] https://github.com/odoo/odoo/commit/49565cdd9007ac66a3b835dc073777e2e6c48f2c [3] https://github.com/odoo/odoo/commit/3a69456a291da593748475c86e7efc6234019e47 [4] https://github.com/odoo/odoo/commit/fb30cde9a320c245cf1321c9dc2ea2e67a53d0a0 OPW-5036574 Forward-Port-Of: odoo/odoo#226380 Forward-Port-Of: odoo/odoo#225728
This update prevents crashes when Odoo loads records in rare invalid or mixed states. It makes the core data layer more consistent and reliable, reducing unexpected errors for users and administrators.
Original PR description
This commit addresses two corner cases that cause `fetch()` to crash: Mixing new and real records: - Issue: If a recordset contains both new and real records, `fetch()` raises an `AccessError`. - Rationale: While we typically assume that new and real records are never mixed, certain recordset operations can inadvertently lead to this state. Handling this case improves the overall robustness of the ORM. Using `False` as a record id: - Issue: Using a record with a `False` id, such as `browse([False])`, causes a SQL error when `fetch()` is called. - Rationale: Other operations, like `browse([False]).name`, work without crashing. To ensure consistency across the ORM, `fetch()` should also handle `False` ids without error. Forward-Port-Of: odoo/odoo#227447
This fix prevents the messaging editor from crashing when a user presses ArrowUp while editing an attachment-only message. It keeps the composer stable in this edge case, improving reliability without changing normal messaging behavior.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ Pressing the ArrowUp key in the editing composer when it is empty while editing a message with only an attachment caused a JavaScript traceback. This happened because the composer was not associated with a thread, and the code tried to access `composer.thread.lastEditableMessageOfSelf`. **Current behavior before PR:** --------------------------------- - Pressing ArrowUp in the empty editing composer triggers a TypeError - The error occurs when editing a message that only has an attachment - The composer does not have a thread reference **Desired behavior after PR is merged:** ----------------------------------------- - Pressing ArrowUp in this scenario safely checks if a thread exists - No TypeError occurs, and the composer remains stable **Task:** 5068553 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
2 changes
Resolved issues and error corrections
Opening a Knowledge activity now shows only the articles linked to that activity instead of the full article list. This helps users get directly to the relevant work item and avoids confusion when managing assigned activities.
Original PR description
Currently, when the user tries to open any activity of the knowledge article, it opens all articles instead of the one which has an activity assigned to them. **Steps to reproduce this issue:** 1) Install the Knowledge module 2) Set up an activity for yourself on a Knowledge article 3) Open the activities from Activities (top left corner) **Issue:** You will end up in the all articles list, with no filters applied. **Cause:** When the user clicks on the activities, a default search filter is added in the context, which is then applied on the view. But in the knowledge article, we don't have any search filters for the activities. Therefore, it renders all knowledge article records. **Solution:** Add search filters for the knowledge articles. opw-4997201 Forward-Port-Of: odoo/enterprise#93609
Purchase-related values in India’s GSTR-3B report now include credit notes, receipts, and other purchase records correctly. This helps businesses review GST return data more accurately and avoids missing purchase adjustments in compliance reports.
Original PR description
Currently, purchase entries are not displaying the correct data because the credit notes and receipts were not included. This PR removes purchase-related data from `l10n_in_reports_gstr_pos` (as POS has no relation to purchase records) and ensures that credit note data and other purchase records are properly displayed in the GSTR-3B report. **opw**-5079401 Forward-Port-Of: odoo/enterprise#95079 Forward-Port-Of: odoo/enterprise#94582
5 changes
Enhancements to existing features
The app switcher scrollbar now uses a transparent background so it fits more naturally with the surrounding design. This is a small visual polish that improves the look and consistency of the navigation experience.
Original PR description
This PR customizes the app switcher scrollbar by using a transparent background for better visual integration. task-5089709 Forward-Port-Of: odoo/enterprise#94799
Resolved issues and error corrections
This update fixes internal test failures in the Mexico electronic invoicing sales module by giving the test user the needed Sales permissions. It helps keep automated checks reliable without changing any customer-facing business behavior.
Original PR description
The tests `test_global_discount` and `test_down_payment` in `l10n_mx_edi_sale` were failing with:
AccessError: You are not allowed to create 'Sales Order' (sale.order) records.
This happened because `mx_external_setup` runs with a user that does not belong to any Sales group. Both tests explicitly create Sale Orders and advance payment wizards, which require Sales ACLs.
This change ensures the test user has the `sales_team.group_sale_salesman` group in `setUpClass`, so Sales Orders can be created normally. No business logic is modified, only test stabilization for the MX localization.
[RB-232559](https://runbot.odoo.com/odoo/error/232559)
Forward-Port-Of: odoo/enterprise#94911The automatic cleanup process now skips documents linked to signed agreements, preventing background errors when trash is cleared. Users will still be informed if they try to manually delete protected signed documents, preserving important records and avoiding system noise.
Original PR description
Currently an error occurs when auto vacuum tries to clear documents linked to `sign_document`. **Steps to replicate:** * Install `documents_sign` with demo data. * Go to documents > Move Employment…
Currently an error occurs when auto vacuum tries to clear documents linked to `sign_document`. **Steps to replicate:** * Install `documents_sign` with demo data. * Go to documents > Move Employment contracts to trash * Trash > Try to to delete employment contract you will see error in terminal. Similarly error will be produced by the Auto-Vacuum process when it attempts to delete it after the configured deletion delay. **Error:** `ForeignKeyViolation: update or delete on table 'ir_attachment' violates foreign key constraint 'sign_document_attachment_id_fkey' on table 'sign_document' DETAIL: Key (id)=(1164) is still referenced from table 'sign_document'.` **Root cause:** * At [1], the `sign.document` model was introduced, which prevents the deletion of sign documents. As a result, attempting to delete them due to [2] will cause an error. **Solution:** * Update the `_get_gc_clear_bin_domain` to ensure that the Auto-Vacuum process skips sign documents. * This will still throw an Validation and ForeignKey error as expected when the user tries to delete it from the GUI letting them know it cannot be deleted. [1]: https://github.com/odoo/enterprise/commit/4254542e8fb4ce3b2b9b46c624d86f7fcac8df7b#diff-deebbcccf829fd1804d145c5c7140b482801644bd948639f77caa310b18b8120 [2]: https://github.com/odoo/enterprise/blob/828d47f9ad1d5e396b074c404287799574a6d692/sign/models/sign_document.py#L44 sentry-6842360375 Forward-Port-Of: odoo/enterprise#95086 Forward-Port-Of: odoo/enterprise#93818
This fixes an issue where already-used serial numbers could reappear when users manually added delivery lines. The change helps prevent selecting unavailable stock, reducing mistakes in warehouse operations and improving inventory accuracy.
Original PR description
Steps to reproduce the bug: Create a storable product “P” tracked by serial number Create a receipt for 100 units with serial numbers sn.001 to sn.100 Create a delivery for 10 units, Odoo assigns serial numbers from sn.001 to sn.010, Validate Create a delivery for 3 units, Odoo assigns serial numbers from sn.011 to sn.013, Delete the 3 move lines, Add a line: you will see again the serial numbers sn.001 to sn.010 in the list Origin: This pr : https://github.com/odoo/odoo/pull/216035 removed the 'on_hand' & 'in_stock' without removing their uses (search_default_*) Fix: Ensure a correct domain when adding a line. opw-5075144 Forward-Port-Of: odoo/enterprise#95032
This update keeps subscription-related website sales pages aligned with recent changes in the main Odoo website sales flow. It helps ensure customers can continue using subscription checkout and related pages without disruption after the platform update.
Original PR description
Forward-Port-Of: odoo/enterprise#95078
14 changes
Enhancements to existing features
The live chat conversation screen has been streamlined to show visitor identity and status more clearly in the header, while moving country and language details into the visitor information panel. This makes support conversations easier to scan and reduces visual clutter for agents.
Original PR description
* = im_livechat, website_livechat Purpose of this commit: - updated discuss header to show profile image and ImStatus for visitor - moved the country flag and the language to the visitor info side panel - removed visitor profile image from visitor banner - removed 'fa-circle-o' from disconnected message task-4607567 **Before**: <img width="1279" height="1039" alt="Screenshot 2025-09-17 at 16 21 03" src="https://github.com/user-attachments/assets/9e931629-0297-4817-9252-40b405da8644" /> **After**: <img width="1284" height="1043" alt="Screenshot 2025-09-17 at 16 21 34" src="https://github.com/user-attachments/assets/52fbdb33-4086-471b-a6b3-60cd40d72644" />
Messages that start or link to a separate thread now show a preview directly underneath, making the connection visible to users. Users can click the preview to open the linked thread, helping them follow related conversations more easily.
Original PR description
Before this commit, when a thread was created from a message, the message lack visual to tell a thread is linked to it. This commit adds a preview of thread at the bottom of message when this is linked to a thread. Click on preview opens the linked thread. Task-4656448 <img width="862" height="366" alt="Screenshot 2025-09-18 at 22 35 34" src="https://github.com/user-attachments/assets/2bcabcea-d7c5-4916-afc7-a2e56ea32a29" />
Resolved issues and error corrections
Fixed an issue that could block users from creating new attendee records from the eLearning reporting views. This prevents an unexpected error and keeps attendee management working reliably.
Original PR description
Currently an error occurs when creating the attendee records. Steps to Reproduce: - Install the `website_slide` module. - Go to `Reporting` > `Attendees`. - Go to either the `Graph or Pivot View` and…
Currently an error occurs when creating the attendee records. Steps to Reproduce: - Install the `website_slide` module. - Go to `Reporting` > `Attendees`. - Go to either the `Graph or Pivot View` and click on any `count` value. - Open any attendee record and click on `New`. `SyntaxError: syntax error at or near ")" LINE 18: WHERE SCP.id IN () ^` This error occurs when creating an Attendee record. The _compute_next_slide_id method runs every time the record is accessed, which causes the error [1]. As clearly mentioned in [this commit](https://github.com/odoo/odoo/commit/fd2fb88bb155b680147313433d22a2b7388c902c#diff-1ee3fce434db0c4e897973eebf5c1be501196cbd413e6c250ecc973238f939b9L292-R326), when a compute method is declared without the @api.depends(...) decorator or with no actual dependencies, the computed field will still be initialized when creating a new record from a form view. This commit ensures that when the compute method runs and the record has not been created yet, the next_slide_id is set to False. [1]:- https://github.com/odoo/odoo/blob/9f18013bc05e6657f5d41c05931fcdafad827d54/addons/website_slides/models/slide_channel.py#L91 sentry-6465821899 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227733 Forward-Port-Of: odoo/odoo#217104
The calendar year view now handles browser resizing reliably by using FullCalendar's built-in resize handling instead of duplicating it. This helps users keep a properly adjusted yearly calendar layout when changing window size or device orientation.
Original PR description
FullCalendar already applies a debounce on the `windowResize` handler. Thus, doing it again in our renderer is a duplicated effort. Also, in the Year calendar renderer, the debounced version of the handler is initialized after the FullCalendar instances (one for each month) are created... which prevents it from being run at all. This commit fixes and cleans this up by directly passing our handler to FullCalendar, letting him do the rest. task-4809668 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#227725 Forward-Port-Of: odoo/odoo#227458
Archived tasks opened through project sharing now match the standard project view by hiding the Recurrent field. This prevents users from seeing an option that should not apply to inactive tasks, making the shared project experience more consistent.
Original PR description
**Steps to Reproduce:** - Share a project. - From the shared project, archive a task. - Open the archived task in the standard project form view → the Recurrent field becomes invisible (as expected).…
**Steps to Reproduce:**
- Share a project.
- From the shared project, archive a task.
- Open the archived task in the standard project form view → the Recurrent field becomes invisible (as expected).
- Open the same archived task from the Project Sharing view by applying the Inactive/Archived filter → the Recurrent field is
still visible.
**Issue:**
The Recurrent field should not be visible for archived tasks. However, in the Project Sharing view, it still appears for inactive tasks.
**Current behaviour:**
The Recurrent field is hidden in the standard form view for archived tasks, but remains visible in the project sharing view.
**Expected behaviour:**
The Recurrent field should remain invisible in both the standard form view and the project sharing view when the task is archived.
**Fix:**
Adjusted the project sharing form view XML to apply the same invisible logic, ensuring the Recurrent field is hidden when the task is archived.
**Task-5040281**
Forward-Port-Of: odoo/odoo#226220This update avoids unnecessary repeated calculations in online shop and wishlist pages, helping pages load more efficiently. It also prevents archived products from appearing in customer wishlists, keeping the shopping experience cleaner and more accurate.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Field Service task forms now show the repeat interval directly under the planned date. This makes recurring task settings easier to find and keeps related scheduling information together.
Original PR description
**Steps to Reproduce:** 1. Open the Field Service app. 2. Create or open an existing task. 3. Check the form view of the task. **Issue:** - The 'Repeat Every' block was displayed at the bottom of the sheet, making it less intuitive. - It should logically appear under the 'Planned Date' block for better visibility. **Current behaviour:** - The 'Repeat Every' block appears in a different section, away from the 'Planned Date' block. **Expected behaviour:** - The 'Repeat Every' block should be displayed directly under the 'Planned Date' block for better usability and logical grouping. **Fix:** - Adjusted the form view XML to move the 'Repeat Every' field below the 'Planned Date' field. **Task-5040281** Forward-Port-Of: odoo/enterprise#93208
This update keeps the online subscription purchase flow aligned with recent changes in the main website sales system. It helps prevent display or checkout issues for customers buying subscriptions online.
The spreadsheet component was updated to its latest version with fixes for formula error messages and handling of empty data positions. This improves reliability for users working with spreadsheet calculations and helps prevent confusing results or messages.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/84f3b74e3 [REL] 19.0.3 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/84f3b74e3 [REL] 19.0.3 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/ea0afdfb5 [FIX] functions: wrong error message for `SORT` [Task: 5085267](https://www.odoo.com/odoo/2328/tasks/5085267) https://github.com/odoo/o-spreadsheet/commit/760bc3786 [FIX] helpers: preserve sparse(empty) elements in removeIndexesFromArray [Task: 4977932](https://www.odoo.com/odoo/2328/tasks/4977932) https://github.com/odoo/o-spreadsheet/commit/a0cab23f5 [FIX] package: add swc binaries to optional dependencies [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
Fixes an issue that prevented point-of-sale orders from being completed when Ecuadorian electronic invoicing was enabled. The payment validation process now uses the correct order reference, restoring normal checkout operations.
Original PR description
After the commit https://github.com/odoo/enterprise/commit/343efe41bc74e612c867d5109c196a11680866db, the `currentOrder` reference in the payment validation flow was replaced with `order`. However, this change was not reflected in `l10n_ec_edi_pos`, which still relied on `currentOrder`. As a result, attempting to validate a POS order raised an error, making it impossible to complete the order. This commit updates the logic to use `order` instead of `currentOrder`, aligning with the upstream changes and restoring proper functionality. opw-5099083
This fix changes how Odoo applies default supplier taxes to large product catalogs, avoiding a memory crash during accounting setup or upgrades. Businesses with many products can complete tax setup more reliably without interruptions.
Original PR description
As I mentioned in the query below, multiple grouped product.template records with the same supplier_taxes_id are being modified with the default purchase tax (account_purchase_tax_id),which leads to…
As I mentioned in the query below, multiple grouped product.template records with the same supplier_taxes_id are being modified with the default purchase tax (account_purchase_tax_id),which leads to a memory error. To prevent this, I have used an INSERT query.
```sql
SELECT tax_id, COUNT(*) AS product_count
FROM product_supplier_taxes_rel
GROUP BY tax_id
ORDER BY product_count DESC;
tax_id | product_count
--------+---------------
15 | 1262126
156 | 343332
114 | 36363
47 | 10132
23 | 202
546 | 11
474 | 5
782 | 2
666 | 2
1188 | 2
1318 | 1
3 | 1
(12 rows)
```
- Traceback
```python
Traceback (most recent call last):
File "/home/odoo/src/odoo/17.0/odoo/service/server.py", line 1314, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-16>", line 2, in new
File "/home/odoo/src/odoo/17.0/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/17.0/odoo/modules/registry.py", line 110, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/17.0/odoo/modules/loading.py", line 515, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/src/odoo/17.0/odoo/modules/migration.py", line 240, in migrate_module
migrate(self.cr, installed_version)
File "/home/odoo/src/odoo/17.0/addons/l10n_ch/migrations/11.3/end-migrate.py", line 8, in migrate
env["account.chart.template"].try_loading("ch", company)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 155, in try_loading
return self._load(template_code, company, install_demo)
File "/home/odoo/src/odoo/17.0/addons/point_of_sale/models/chart_template.py", line 22, in _load
result = super()._load(template_code, company, install_demo)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 214, in _load
self._post_load_data(template_code, company, template_data)
File "/home/odoo/src/enterprise/17.0/account_reports/models/chart_template.py", line 10, in _post_load_data
super()._post_load_data(template_code, company, template_data)
File "/home/odoo/src/odoo/17.0/addons/stock_account/models/account_chart_template.py", line 12, in _post_load_data
super()._post_load_data(template_code, company, template_data)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 669, in _post_load_data
sudoed_products_purchase._force_default_purchase_tax(company)
File "/home/odoo/src/odoo/17.0/addons/account/models/product.py", line 130, in _force_default_purchase_tax
product_grouped_by_tax.supplier_taxes_id += default_supplier_taxes
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 1322, in __set__
records.write({self.name: write_value})
File "/home/odoo/src/odoo/17.0/addons/website_sale/models/product_template.py", line 176, in write
return super().write(vals)
File "/home/odoo/src/odoo/17.0/addons/rating/models/rating_mixin.py", line 100, in write
result = super(RatingMixin, self).write(values)
File "/home/odoo/src/odoo/17.0/addons/stock_account/models/product.py", line 55, in write
res = super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/mrp/models/product.py", line 74, in write
return super().write(values)
File "/home/odoo/src/odoo/17.0/addons/stock/models/product.py", line 921, in write
return super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/product/models/product_template.py", line 502, in write
res = super(ProductTemplate, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/mail/models/mail_thread.py", line 311, in write
return super(MailThread, self).write(values)
File "/home/odoo/src/odoo/17.0/addons/mail/models/mail_activity_mixin.py", line 250, in write
return super(MailActivityMixin, self).write(vals)
File "/home/odoo/src/odoo/17.0/addons/website/models/mixins.py", line 218, in write
return super(WebsitePublishedMixin, self).write(values)
File "/home/odoo/src/odoo/17.0/odoo/models.py", line 4444, in write
field.write(self, value)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4337, in write
self.write_batch([(records, value)])
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4358, in write_batch
self.write_real(records_commands_list, create)
File "/home/odoo/src/odoo/17.0/odoo/fields.py", line 4957, in write_real
y_to_xs[y].add(x)
File "/home/odoo/src/odoo/17.0/odoo/tools/misc.py", line 1136, in add
self._map[elem] = None
MemoryError
```
opw - 4544050
upg - 2459515
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#227532
Forward-Port-Of: odoo/odoo#204931Italian split payment taxes now show the correct label in the Taxes column of PDF documents instead of appearing like standard taxes. This helps customers and businesses read tax information accurately on generated documents.
Original PR description
Split payment taxes were not labelled correctly in the PDF's "Taxes" column, they were labelled as standard taxes. <img width="1214" height="598" alt="image" src="https://github.com/user-attachments/assets/f1ea57bd-9a7f-460f-8c81-6a89585ba6d8" /> Forward-Port-Of: odoo/odoo#227284 Forward-Port-Of: odoo/odoo#226366
This update fixes internal automated tests for the Mail app by making sure they select the correct "Add a reaction" button when two similar options are present. It helps keep message reaction functionality stable without changing the user experience.
Original PR description
Follow-up of https://github.com/odoo/odoo/pull/227728 PR above improved quick add a reaction to use quick reaction menu too, similarly to "Add a reaction" in the message actions. By doing so, the 2 buttons to add a reaction have been adapted to use same label "Add a reaction", one was just "Add reaction". Some HOOT tests were asserting presence of the "Add a reaction" button, but with the change there are sometimes 2 such buttons, one being the message action and the other is the quick add reaction. Tests were adapted but not all of them: when they expect to click on "Add a reaction" on a message with at least one reaction, it should clarify whether the "Add a reaction" is the one in message action or the one in quick add a reaction, otherwise the HOOT test fails due to attempting to click on the 2 buttons at once. This commit fixes with more specific selector, that the "Add a reaction" to click is the one from message actions.
This update prevents crashes when the system loads records in uncommon but possible situations, such as mixed temporary and saved records or records with an empty identifier. It improves reliability in the core data layer and makes behavior more consistent across Odoo.
Original PR description
This commit addresses two corner cases that cause `fetch()` to crash: Mixing new and real records: - Issue: If a recordset contains both new and real records, `fetch()` raises an `AccessError`. - Rationale: While we typically assume that new and real records are never mixed, certain recordset operations can inadvertently lead to this state. Handling this case improves the overall robustness of the ORM. Using `False` as a record id: - Issue: Using a record with a `False` id, such as `browse([False])`, causes a SQL error when `fetch()` is called. - Rationale: Other operations, like `browse([False]).name`, work without crashing. To ensure consistency across the ORM, `fetch()` should also handle `False` ids without error. Forward-Port-Of: odoo/odoo#227447
1 change
Resolved issues and error corrections
Updates Odoo's spreadsheet component to the latest version, addressing several issues in pivot tables, calculated measures, array handling, and formula error messages. This improves reliability and clarity for users working with spreadsheet reports and analytics.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/54e799a08 [REL] 18.0.45 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/54e799a08 [REL] 18.0.45 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/3df32e0d7 [FIX] pivot: add deferred calculated measure [Task: 5096156](https://www.odoo.com/odoo/2328/tasks/5096156) https://github.com/odoo/o-spreadsheet/commit/81a876010 [FIX] helpers: preserve sparse(empty) elements in removeIndexesFromArray [Task: 4977932](https://www.odoo.com/odoo/2328/tasks/4977932) https://github.com/odoo/o-spreadsheet/commit/6cc703fdc [FIX] package: add swc binaries to optional dependencies [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/bc1029b83 [FIX] functions: wrong error message for `SORT` [Task: 5085267](https://www.odoo.com/odoo/2328/tasks/5085267) https://github.com/odoo/o-spreadsheet/commit/7b30152cd [FIX] pivot: calculated measure from totals [Task: 5061631](https://www.odoo.com/odoo/2328/tasks/5061631) https://github.com/odoo/o-spreadsheet/commit/e13196bdb [FIX] pivot: add aggregator to calculated measure id [Task: 5061631](https://www.odoo.com/odoo/2328/tasks/5061631) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
1 change
Resolved issues and error corrections
The spreadsheet component was updated to a newer maintenance version with fixes for formula error messages and handling of empty cells in internal operations. This helps users get clearer feedback and reduces the risk of incorrect spreadsheet behavior in Odoo.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/bf7d9c8ac [REL] 17.0.74 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/bf7d9c8ac [REL] 17.0.74 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/2612a1243 [FIX] package: add swc binaries to optional dependencies [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/ced4ea861 [FIX] functions: wrong error message for `SORT` [Task: 5085267](https://www.odoo.com/odoo/2328/tasks/5085267) https://github.com/odoo/o-spreadsheet/commit/1e01797f0 [FIX] helpers: preserve sparse(empty) elements in removeIndexesFromArray [Task: 4977932](https://www.odoo.com/odoo/2328/tasks/4977932) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>