Daily updates from Odoo
Friday, August 8, 2025
94 changes
31 changes
Enhancements to existing features
The website builder now restores live previews for shop page display options, so users can see many visual changes immediately before applying them. This makes configuring eCommerce pages faster and reduces trial-and-error page reloads.
Original PR description
This PR restores the preview system for `/shop` that was introduced by [1] and then lost during the transition to the new website builder. task-4367641 [1]: https://github.com/odoo/odoo/pull/197320
Belgian payroll now excludes PFI contracts when calculating an employee’s seniority for departure notice periods. This helps ensure notice periods are calculated according to Belgian rules and avoids overstating seniority for affected employees.
Original PR description
When you generate the notice period for leaving employees, you must compute their seniority. In Belgium, PFI contracts should not be taken into account. This commit filters the contracts to ignore PFI ones. task-4788455 Forward-Port-Of: odoo/enterprise#90902
First-time bank synchronization now creates a proper opening bank statement instead of a placeholder transaction. This helps ensure starting balances are accurate from the beginning and avoids confusing fake bank entries in accounting records.
Original PR description
Before: - When syncing a bank account for the first time, the system created a dummy bank statement line to fill missing statement data. - This was not linked to a real transaction and could confuse users or lead to inaccurate reporting. After: - Replaced the dummy statement line logic with the creation of a proper opening bank statement. - The system now accurately sets the starting balance and the current balance based on the imported transactions. - This logic only applies when no previous bank statement lines exist for the journal and the current balance differs from the sum of imported transactions. Impact: - Prevents creation of fake bank transactions and journal entries during initial sync, ensuring accurate accounting from the start. - Improves performance and reliability by calculating the correct opening balance using real transaction data and provided bank balance. TaskID-4815622 Forward-Port-Of: odoo/enterprise#90070
Payroll pay run cards are now handled separately in the standard kanban view and the payslip list filtered by pay run. This lets each view be adjusted independently, improving maintainability while keeping payroll actions responsive across screen sizes.
Original PR description
Problem ---------- Change the pay run in the kanban view to stay standard Use a custom component for the pay run card displayed in the filtered list view of payslips. Objective ---------- Unlink the card in the kanban and the card in the payslip list filtered So each one can be modified separately. Solution ---------- A template is defined in the kanban view of payrun. The menu template uses a new compiler to display buttons depending on the screen size in the payrun card. For the list view of payslip filtered by pay run. The card is a custom component call in a Record component to fetch the payslip_run record. Kanban arch is used to fetch fields. The card and menu template can be used too. But as we choose to unlink the 2 payrun card, custom component is used with the same PayrunButtonBox Component to display buttons, with all buttons duplicated task-4873744
Resolved issues and error corrections
This fix prevents Point of Sale orders linked to sales orders from doubling quantities when a lot-tracked product is split across multiple lots. It ensures each lot is handled on its own POS line, so stock transfers show the correct quantities and inventory remains accurate.
Original PR description
When creating a sale order for a product, confirming it, and then modifying the stock move to use 2 different lots. Then paying the order in the POS, the picking created for the pos order will have double qty Steps to reproduce: ------------------- * Create a product tracked by lot * Create 2 lots for that product * Create a sale order for that 3 quantity of that product * Confirm the sale order * Modify the stock move to use 2 different lots, for example: - Lot 1001: 2 units - Lot 1002: 1 unit * Pay the order in the POS * Check the picking created for the pos order > Observation: The picking created for the pos order has double the quantity for the lots. Why the fix: ------------ A PoS line can only hold one lot, so when we import a sale order with multiple lots, we need to split the line into multiple lines, each with a single lot opw-4804704 Forward-Port-Of: odoo/odoo#221760 Forward-Port-Of: odoo/odoo#217537
This fix restores reliable redo behavior in the HTML editor after repeated undo/redo actions or temporary preview changes. It also prevents website builder previews from incorrectly marking unchanged pages as needing to be saved, reducing accidental updates.
Original PR description
[FIX] html_editor: redo after multiple undo/redos or save point restore [FIX] html_builder, website: preview let o_dirty task-4806192
This update fixes several self-ordering problems in Point of Sale, especially for restaurants using QR code ordering and pay-after-each-order flows. Tables and devices are no longer blocked by unpaid or direct-sale orders, cancelled orders are cleared properly for customers, and tickets print in a more reliable sequence.
Original PR description
*: pos_restaurant, pos_online_payment_self_order, pos_self_order When self-ordering is enabled and in pay after each mode, the table selection was handled via table_id fields, which caused issues…
*: pos_restaurant, pos_online_payment_self_order, pos_self_order When self-ordering is enabled and in pay after each mode, the table selection was handled via table_id fields, which caused issues when a customer had an issue with its payment and wanted to pay later. It was blocking the table with its order, so if another customer wanted to scan the same QR code, it would not be able to add anything to the cart. Now in pay after each mode, the table selection is handled via floating_order_name, which allows the order to be processed without blocking the table. This way, the table can be reused for another customer, and the order can be paid later. --- Regarding direct sale in `point_of_sale`, when a customer wanted to pay by card the order was synced with the server when the waiter clicked on the payment method, if the direct sale had no table and no floating order name, when synching on other devices the order was blocking them. Now if no table and no floating order name is set, when synching the order, the pos_reference is set to the floating_order_name, which prevents the order from blocking other devices. --- Regarding self order cancellation from a PoS, when the waiter was cancelling an order it was not synced with the self-order app, which caused the self-order app to keep the order in the cart, preventing the customer from starting a new order. --- Regarding self order ticket printing, when an order arrives on the PoS to be printed, we were trying to print the preparation ticket and the customer ticket at the same time, which caused issues with the printing. Now we printing them one after the other. Forward-Port-Of: odoo/odoo#222180
This fix prevents the website editor from incorrectly marking pages as changed during normal editing actions like media handling or drag and drop previews. This reduces unnecessary saved records and helps ensure only real user edits are stored.
Original PR description
[FIX] html_editor: prevent `o_editable_media` class to add `o_dirty` Before this commit, when the `o_editable_media` class was added on an element, its closest view was marked as dirty, because of…
[FIX] html_editor: prevent `o_editable_media` class to add `o_dirty` Before this commit, when the `o_editable_media` class was added on an element, its closest view was marked as dirty, because of the mutation it was adding. This commit fixes that by making this class a system class, so its mutations are always filtered out. Steps to reproduce: - Go in edit mode with eCommerce installed. - In the header, inspect the shopping cart button and see that its view does not have the `o_editable_media` and `o_dirty` classes. - Change a header option and inspect the button again. => the `o_editable_media` class was added, as well as `o_dirty`, because of that class addition. task-4367641 --- [FIX] html_builder: prevent drag and drop to add unwanted `o_dirty` Before this commit, drag and dropping elements from the sidebar or from the page would add the `o_dirty` class on every views in which dropzones appeared, creating many views in DB for no valid reason when saving. This commit fixes this issue by: - not observing the dropzones addition/removal anymore, - preventing the drag mutations to mark elements as dirty until we finally drop the dragged element. task-4367641
Manufacturing orders created manually in a three-step warehouse route now correctly increase the forecasted stock quantity. This helps replenishment planners see expected finished goods earlier and avoid unnecessary purchase or production actions.
Original PR description
### Steps to reproduce: - In the settings enable Multi-Steps Routes - Put your warehouse in manufacture in 3 steps - Create a storable product P - Create and confirm an MO for 1 unit of P - Go to…
### Steps to reproduce: - In the settings enable Multi-Steps Routes - Put your warehouse in manufacture in 3 steps - Create a storable product P - Create and confirm an MO for 1 unit of P - Go to Inventory > Operations > Procurement > Replenishment - Create a new one for P in WH/stock #### > The forecasted quantity in stock is still 0 but should be at 1, just as if the the MO had been generated using the replenishment for 1 unit ### Cause of the issue: When an MO is created using a procurement, a `location_final_id` is set to WH/Stock on the MO and propagated on the move for the finished product: https://github.com/odoo/odoo/blob/8d4e6df0c0ac5ebc6362f3578ae8cc8edf4a76f7/addons/mrp/models/stock_rule.py#L165 https://github.com/odoo/odoo/blob/8d4e6df0c0ac5ebc6362f3578ae8cc8edf4a76f7/addons/mrp/models/mrp_production.py#L1169-L1175 As such, even if the manufacturing is now handled in push, this move will contribute positively to the forecast in the `virtual_available` quantity of the product in WH/Stock bevause of the `location_final_id`. By contrast, if hte MO is created by hand, it does not bear a `location_final_id` so that the MO can only contribute to the stock forecast has been processed and the related internal transfer `WH/post-prod -> WH/Stock` is created. opw-4882390 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221462 Forward-Port-Of: odoo/odoo#221003
Fixes Argentina delivery guide PDFs so the company and customer address details appear in the correct places. This prevents confusing or incomplete shipping documentation and also improves Spanish translation coverage for related text.
Original PR description
**Steps to reproduce:**
1. Install the l10n_ar_stock
2. Configure the Warehouse > Operation Types > Delivery Orders
- Sequence Prefix?
- Document Type = (91) MAILING R
- CAI = 75178231471048
- CAI Expiration Date = 11/11/2025
- Delivery Guide Prefix = 00001
- Next Delivery Guide Number = 5
- Sequence From = 00000001
- Sequence To = 00000999
3. Create a Sale Order with customer AdHoc and a product that can be delivered with a Delivery Order
4. Create the Delivery Guide
5. Send the Delivery Guide and check the PDF
**Missing details:**
- The customer's address mistakenly came to the place of the company address. The company address is missing, and other details related to the customer address are also missing.
**Fix:**
Added a block of the customer address and fixed the company address details. Also found some text that didn't translate, fixed them also.
**opw**-4980471This fixes withholding tax calculations when registering refund payments, ensuring tax amounts are reported on the correct side. It also prevents an accounting setup that could make payments difficult to edit after creation.
Original PR description
Currently, there is an issue with how the repartition line is selected when registering payment for a refund for withholding taxes. It would select the invoice repartition line, causing the tax amounts to affect the tax report in the wrong way. - It is not setting the is_refund param on the base line, leading to incorrect lines on the payment's entry. - Detecting if we are a refund is tricky with the current system, which is based on the wizard payment_type. It requires some changes in order to be able to have withholding lines with a type_tax_use which doesn't match the payment wizard. Also fixes an issue where a payment could not be edited after creation if the withholding tax line is using the company's default transfer account. In this case, the lines would be counted as counterparts and cause issues. As the account on the base line does not matter that much, we decided to use the simple solution of blocking its usage. Forward-Port-Of: odoo/odoo#220509
Archiving or restoring a company now updates the available company list correctly. This prevents errors in related apps such as Timesheets and Italian Point of Sale when companies are reactivated.
Original PR description
Currently below error occurs while archive/unarchive company: - Company list is not being updated. - In `hr_timesheet` KeyError will be encountered on unarchiving a company. - In `l10n_it_pos` module…
Currently below error occurs while archive/unarchive company: - Company list is not being updated. - In `hr_timesheet` KeyError will be encountered on unarchiving a company. - In `l10n_it_pos` module an AccessError will be encountered on unarchiving a company. **Root Cause:** Since https://github.com/odoo/odoo/commit/22e9d822e8cab08114c006eb8c4054c4de0c40f2, the `session_info` method relies on `user_companies` at [1], which fetches only active company IDs via `_get_company_ids()`. However, `_get_company_ids` uses caching as shown at [2]. When a company is archived or unarchived, 'write' method is called. Now, here the cache is invalidated before writing to the company as shown at [3]. Due to which '_get_company_ids' method doesn't receive the updated list of companies, causing this issue. **Solution:** This commit prevents error by ensuring companies are stored before invalidating the cache. [1]- https://github.com/odoo/odoo/blob/d3482e32f7dbe273125de84f1bbc434ac3c9ffc3/addons/web/models/ir_http.py#L146 [2]- https://github.com/odoo/odoo/blob/7db62d6d65bd57f6ed43ce52a820cf03df19efdd/odoo/addons/base/models/res_users.py#L927-L931 [3]- https://github.com/odoo/odoo/blob/3173a5f993a3ffa3d3a14d29713142e5b6b314d9/odoo/addons/base/models/res_company.py#L343-L367 Sentry-6251348500 Forward-Port-Of: odoo/odoo#222251 Forward-Port-Of: odoo/odoo#219044
Website administrators can no longer create menu structures that go deeper than the supported two levels or combine mega menus with parent or child menus. This prevents hidden or confusing navigation items and keeps website menus predictable for visitors.
Original PR description
Steps to Reproduce: 1. Go to the website. 2. Create a new menu (e.g., 'Test 1') using the 'Edit Menu' option and add it under another menu (e.g., 'Contact Us'), creating a sub-menu. 3. Turn on the…
Steps to Reproduce:
1. Go to the website.
2. Create a new menu (e.g., 'Test 1') using the 'Edit Menu' option and add it under another menu (e.g., 'Contact Us'), creating a sub-menu.
3. Turn on the developer mode.
4. Go to Configuration -> Menus and add two menus (e.g., 'menu 1' and 'menu 2') under the new sub-menu (e.g., 'Test 1').
5. Notice that the two menus ('menu 1' and 'menu 2') are not visible on the website.
Description:
As per functional specifications, creation of multi-level sub-menus should not be allowed.
Key Changes:
raises a `UserError` if a menu exceeds the two-level hierarchy by checking the parent and grandparent levels.
- Implements mega menu restrictions:
- A mega menu cannot have a parent menu.
- A mega menu cannot have child menus.
- Any menu cannot be a child of a mega menu.
- Prevents menus with child menus from being added as submenus to existing menus.
This ensures that the website menu structure adheres to the defined functional specifications, providing a consistent and predictable user experience.
task-3901371
Forward-Port-Of: odoo/odoo#222254
Forward-Port-Of: odoo/odoo#168801This fix prevents the same point-of-sale order, line item, or payment from being created more than once when requests happen at the same time. It helps keep sales records, payments, and reporting accurate by rejecting duplicate entries automatically.
Original PR description
Before this commit, it was possible for concurrent requests to create duplicate PoS orders, order lines, and payments. This was due to the absence of unique identifiers at the database level for these records during their creation. This commit addresses the issue by adding SQL unique constraints on the UUID fields for the `pos.order`, `pos.order.line`, and `pos.payment`. These database-level constraints ensure that any attempt to insert a duplicate record (based on its unique UUID) will be rejected, thereby preventing data duplication and maintaining transactional integrity. opw-4899804 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221975 Forward-Port-Of: odoo/odoo#216862
This fix ensures Malaysian e-Invoicing uses the right region value for foreign customers and consolidated invoices. It helps prevent validation errors by following the required Malaysian e-Invoicing rules while keeping normal Malaysian customer handling unchanged.
Original PR description
## Before this commit: The `CountrySubentityCode` was computed by simply using the `state code` of the partner, without handling the following cases: - Non-Malaysian Partners: For partners located outside Malaysia, the format requires the `state name` to be passed instead of the `state code`. - Consolidation Entries: For consolidation invoices, a fixed value `17` should be passed as the `CountrySubentityCode`, regardless of the partner’s state. ## After this commit: The computation of `CountrySubentityCode` has been updated to handle both cases correctly: - For non-Malaysian partners, the `state name` is used. - For consolidation entries, the fixed value `17` is used. - For regular Malaysian partners, the `state code` continues to be used as before. This ensures compliance with Malaysian e-Invoicing specifications and prevents errors. > Task-4938198 Forward-Port-Of: odoo/odoo#222153 Forward-Port-Of: odoo/odoo#219201
Fixed an issue that prevented Cloth Shop point of sale sample data from loading in databases created without demo data. This ensures users can quickly set up and explore the Cloth Shop POS demo without errors.
Original PR description
Steps: ------------------------------------------------- - Set up a database without demo data. - Open Cloth Shop POS. - Click on load sample data. Issue:…
Steps: ------------------------------------------------- - Set up a database without demo data. - Open Cloth Shop POS. - Click on load sample data. Issue: ------------------------------------------------- Data doesn't load. (Traceback in terminal for not found external ID) Cause: ------------------------------------------------- Commit https://github.com/odoo/odoo/commit/ffb976c3ed5fbcff2e5d06a3183bab2fbe0307ff moved demo data from point_of_sale to product. The issue is that point_of_sale uses a custom 'scenario' flow where demo data gets loaded for a specific scenario. As a consequence, any reference to demo data from the product will cause an error. Solution: ------------------------------------------------- - Move the shoe size attribute back to the pos cloth scenario from product. - Load attribute from the product when we click on Load Sample Data in the cloth shop. task - 5002430 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a website editor issue where changing a blog post category and then undoing could leave duplicated category text. The update ensures only the correct page element is updated, making editor undo behavior more reliable.
Original PR description
If the editing element has no `oeContactOptions`, the selector would compare against the string `"undefined"`. That selector is supposed to select the ones with a different option, but in that case,…
If the editing element has no `oeContactOptions`, the selector would compare against the string `"undefined"`. That selector is supposed to select the ones with a different option, but in that case, other fields without contact options would get selected. The selector was ported from the previous builder during the intial [website builder refactor] This caused the editing element to be present twice in the loop if it had no contact options (in addition to contain extra elements). And setting twice the same text content triggers a bug in the history, which behaves incorrectly when it is undone. (the bug is known and described in the code by a comment `@todo: this removes mutation records that change the node reference. Fix this`) Steps to reproduce: - On `/blog`, open website builder - Change a post's category (name next to the folder icon under summary) - Undo - Bug: the text content is the concatenation of both category [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Italian electronic tax integrations for reversed vendor bills now keep the user-selected document type so credit notes are reported with negative amounts. This prevents refunds from being interpreted as new vendor bills and improves accuracy in Italian EDI reporting.
Original PR description
When tax integrations are sent from a credit note (of a vendor bill) they should have a negative value, as it is the reversal operation. However, currently the amounts are positive, so it appears to…
When tax integrations are sent from a credit note (of a vendor bill) they should have a negative value, as it is the reversal operation. However, currently the amounts are positive, so it appears to be a second Bill rather than its reverse. **Steps to reproduce (with an IT Company)** - Create a non-eu [PARTNER] with complete address and VAT - Create a Vendor Bill with: - Partner: [PARTNER] - Electronic Invoicing > Document Type set to TD18 - A line having Reverse charge tax (ie. 22% G RC) - Confirm and send tax integration - Reverse move - Ensure the document type is set to TD18 as well - Confirm and send tax integration - Check the generated xml **Issue** Credit note tax integration will have a positive amounts, while being a credit note it should have negative amounts This occurs because when generating the xml, the document type is recomputed from the invoice features, even if the user set it manually Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4788529) opw-4788529 Forward-Port-Of: odoo/odoo#221672 Forward-Port-Of: odoo/odoo#220878
Fixed an issue where opening an invoice could fail when the same customer also had a credit note and bank statement line. The payment widget now ignores bank statement lines in this case, keeping invoice payment information available without errors.
Original PR description
Removed the bank statement lines from the payment widget Enterprise: https://github.com/odoo/enterprise/pull/91222 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220981
The GSTR-1 document summary now excludes cancelled invoices that were never officially posted, so reports better reflect valid business documents. Serial number checks are also scoped to the relevant company or return period, and the document summary remains visible in the GSTR-1 section for easier access.
Original PR description
Before: The document summary included all cancelled invoices, even those that were never posted. After: Only invoices that were posted and subsequently cancelled are now considered in the summary. Additional Changes: - Updated check_serials to validate serial continuity within current company. - Made the document summary view always visible in the GSTR-1 section. opw-4940053 Forward-Port-Of: odoo/enterprise#91971 Forward-Port-Of: odoo/enterprise#90160
Winbooks imports now continue when the imported chart of accounts differs from Odoo's default account validation rules. This prevents blocking users during migration and lets them review and adjust the imported draft data inside Odoo afterward.
Original PR description
When importing Winbooks data, if the CoA configuration in Winbooks is different from Odoo's default, users will experience a failure with a message similar to ``` Validation Error Tax Receivable Account (411000 VAT Recoverable) should be an account of type "Receivable" or "Payable" with both options "Allow Reconciliation" and "Non Trade" enabled. ``` This occurs because the account 411000, meant to store the tax provisions, in Winbooks was used as tax receivable. In similar cases we should not raise any error and should let the import go through: the data is imported in draft and the user has the possibility to bring the modifications in Odoo opw-4850314 Forward-Port-Of: odoo/enterprise#91828
This fix ensures batch transfer map views use the correct delivery route map, so users can rearrange pickings as intended. It restores expected route planning behavior after a prior change caused the wrong map view to be opened.
Original PR description
Commit ade5e5085df2 move the `default_order` value as it was defined in the wrong module. Consequence is the map view defined in `stock_enterprise` cannot be reordered anymore. This is an issue as the one in `stock_fleet_enterprise` is never used. The action window is patched to take a picking map view but without specifying witch one. This commit force the map view defined in `stock_fleet_enterprise` to be used in the action of `stock_fleet_enterprise`. Consequence is that the picking can be rearranged again in the map view coming from a batch transfer and not coming from the picking list.
Fixed an issue where invoices or bills included in a batch payment could remain marked as in payment after matching the batch to a bank statement line. This helps accounting teams keep payment statuses accurate when bank journals do not use outstanding payment accounts.
Original PR description
Setting a batch payment having payments without journal entry with a statement line does not reconcile the invoices/bills linked to the payments. Steps: - Make sure to not have outstanding receipts/payments accounts set on bank journal - Create two invoices, confirm and register payment for both - Create a batch payment with tho payments, validate - Create a statement line with amount = sum of the 2 invoices - Add the batch to the statement line - Go back to invoice tree view -> Both invoices are still 'in_payment' instead of 'paid' opw-4980004 Forward-Port-Of: odoo/enterprise#91919
Odoo WhatsApp no longer crashes or misses incoming messages when users send large attachments. The fix prevents oversized file responses from being fully loaded into memory, improving reliability for teams receiving documents through WhatsApp.
Original PR description
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB). Stack Trace: ``` MemoryError: null File "odoo/http.py", line 2383, in…
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB).
Stack Trace:
```
MemoryError: null
File "odoo/http.py", line 2383, in __call__
response = request._serve_db()
File "odoo/http.py", line 1913, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1976, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1943, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2187, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 227, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 757, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/controller/main.py", line 42, in webhookpost
wa_account_id._process_messages(value)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/models/whatsapp_account.py", line 206, in _process_messages
datas = wa_api._get_whatsapp_document(messages[message_type]['id'])
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 236, in _get_whatsapp_document
file_response = self.__api_requests("GET", file_url, auth_type="bearer", endpoint_include=True)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 46, in __api_requests
if 'error' in res.json():
File "requests/models.py", line 971, in json
return complexjson.loads(self.text, **kwargs)
File "requests/models.py", line 928, in text
encoding = self.apparent_encoding
File "requests/models.py", line 793, in apparent_encoding
return chardet.detect(self.content)["encoding"]
File "__init__.py", line 49, in detect
detector.feed(byte_str)
File "chardet/universaldetector.py", line 274, in feed
if prober.feed(byte_str) == ProbingState.FOUND_IT:
File "chardet/charsetgroupprober.py", line 70, in feed
state = prober.feed(byte_str)
File "chardet/hebrewprober.py", line 240, in feed
byte_str = self.filter_high_byte_only(byte_str)
File "chardet/charsetprober.py", line 73, in filter_high_byte_only
buf = re.sub(b"([\x00-\x7F])+", b" ", buf)
File "__init__.py", line 186, in sub
return _compile(pattern, flags).sub(repl, string, count)
```
At line [1], the code `'error' in res.json()` is used, which reads all the json content of `res`, but at times users upload large files, it will cause the above error because the `json()` tries to read all bytes from res, which is a very large amount to handle in memory.
This commit will fix the above issue by returning a response if the response
contains content_length more than 10 MB.
[1] - https://github.com/odoo/enterprise/blob/aca7ae2a7cf4aad5427a60d5cad60d08774357d0/whatsapp/tools/whatsapp_api.py#L46
sentry-5810101850
Forward-Port-Of: odoo/enterprise#70001Australian payroll accounting now includes salary withholding tax amounts in tax return closing entries when they come from payslips and use the relevant tax grids. The payroll accounting module also installs more reliably when Australian localization is installed, avoiding a setup issue before an Australian company exists.
Original PR description
This PR is divided in 2 commits: A first commit is an implementation AU specific and will create the lines related to tax on salary in the tax return closing entry. Before this commit, these lines…
This PR is divided in 2 commits: A first commit is an implementation AU specific and will create the lines related to tax on salary in the tax return closing entry. Before this commit, these lines weren't taken into account in the closing entry. The condition to select the account.move.line are the following: - The journal item has a "W2", "W3" or "W4" (Withholding Tax) tax grid whose journal entry is linked to an hr.payslip. - The journal item does not have an originating tax record (i.e., tax_line_id is empty). - The journal item is posted to a tax provision account (i.e., a balance sheet one) as defined on the salary rule. A second commit fixes a bug: the manifest of the l10n_au_hr_payroll_account module was having a 'countries': ['au'] dependency, that was adding a condition to the dependencies to auto install the module: we expect an existing AU company in DB. But for example if the user installs l10n_au, the condition is evaluated at the moment he clicks on install, and no AU company exists at that time. Task-4921992 Forward-Port-Of: odoo/enterprise#90422
This fix prevents Romanian SAF-T exports from failing when optional product group information is missing. It also corrects VAT validation so valid partner VAT numbers are not incorrectly flagged, helping businesses complete tax reporting more reliably.
Original PR description
- Added fallback for missing to prevent crash during export. - Replaced incorrect usage of with to align with actual partner VAT validation logic and avoid false errors. These changes ensure smoother SAF-T export by handling optional fields and validation more robustly. Forward-Port-Of: odoo/enterprise#91770 Forward-Port-Of: odoo/enterprise#91737
The payment form's Transaction button now opens the correct bank statement information in multi-company setups. This prevents users from seeing access errors caused by the system accidentally selecting a journal from another company.
Original PR description
This fixes the access error when using the 'Transaction' smart button from a reconciled payment present since Steps to reproduce: - Multi-company environment with account_accountant installed - Only select one company - Create a payment with a journal entry (by adding an account on the payment method) - Create a corresponding bank statement and reconcile them both together - Go to the payment form view - Click on the Transaction button `button_open_statement_lines` - Access error is raised due to a "random" assignation of journal which is likely to be one from the other company This make sure we select the default statement line journal by default, ensuring we don't search for a journal in every company Forward-Port-Of: odoo/enterprise#91904
Luxembourg tax report XML exports now include certain special-scheme fields only when the reporting period reaches 2025 or later. Annual VAT reports also fill required fields when related mandatory values are present, helping businesses submit compliant tax files and avoid validation issues.
Original PR description
As per legal requirements, the 491, 492 and 493 fields of the xml export of the tax return only need to be included if at least one day of the period includes dates in 2025 or later. As per legal requirements too, the 192 and 193 fields are mandatory in the annual report if some other fields are present. Among those are 361 and 362 which are mandatory even if null so if 192 and 193 are not there yet, we set them to 362 and 363 values (0.0 in most cases). --- from feedback on task-4587067 opw-4757770 Forward-Port-Of: odoo/enterprise#91859 Forward-Port-Of: odoo/enterprise#89437
The payment widget now correctly includes matching bank statement lines in the Accounting app for invoices and bills. This helps users reconcile payments more easily by showing bank transactions from the same partner where they are most useful.
Original PR description
Removed the bank statement lines in the payment widget from communiy 'account' and added it to 'account_accountant' Community: https://github.com/odoo/odoo/pull/220981 Forward-Port-Of: odoo/enterprise#91222
When products are added to Field Service tasks, the related sales order will no longer be locked too early when automatic sales locking is enabled. This allows the delivery order to be created correctly, preventing blocked or inconsistent orders that users could not adjust.
Original PR description
Issue: When the "Lock Confirmed Sales" setting is enabled, adding a product to a Field Service task would lock the associated sales order before its picking could be created. The confirmation process…
Issue: When the "Lock Confirmed Sales" setting is enabled, adding a product to a Field Service task would lock the associated sales order before its picking could be created. The confirmation process locks the order first , and the subsequent step to create stock moves (`_action_launch_stock_rule`) explicitly skips locked orders. Reproducible on 17.0~master [Task](https://www.odoo.com/odoo/action-4043/4633977) Odoo 17: https://drive.google.com/file/d/1qmAYhSu6gU91efuJEDF-Irn2cLGUQP0A/view?usp=drivesdk Odoo 18: https://drive.google.com/file/d/1x8IeXwT7ZFM7Av9Vp6GSvGIbOaEGfmVx/view?usp=drivesdk Steps to reproduce: 1. In Sales > Configuration > Settings, enable "Lock Confirmed Sales". 2. Go to a Field Service task. 3. In the kanban view via the "Products" smart button, add a product. 4. Come back to the task, refresh the browser, open the linked Sales Order from the smart button. 5. **Before this fix:** The SO is locked, no picking is created, and SO lines will have delivered_qty set even though we haven't delivered anything. 6. **After this fix:** The SO is not locked, and a Delivery smart button is correctly displayed, linking to the generated picking. This behavior left the sales order in an inconsistent state: it was locked, but had no corresponding delivery order. As a result, users were blocked from removing or modifying the products added to the task, as the system prevented edits on a locked order with no picking to cancel. Let's step through what's going on here; 0. We enable "Lock Confirmed Sales" option. 1. Add a product to the Field Service(FS) task https://github.com/odoo/enterprise/blob/4256ea170c31209b83ff808e51145757571f8556/industry_fsm_sale/controllers/catalog.py#L19-L42 https://github.com/odoo/enterprise/blob/4256ea170c31209b83ff808e51145757571f8556/industry_fsm_sale/controllers/catalog.py#L38 2. set_fsm_quantity() is invoked, which will create a SO for the FS task https://github.com/odoo/enterprise/blob/35e1f47160d5840e8701fc0ad43ec42bbfaf9e36/industry_fsm_sale/models/product_product.py#L144 3. `_fsm_create_sale_order()` will immediately `action_confirm()` the new SO, because of the reasons in the function description. ( Since we are immediately confirming newly created SO, I think we should consider not applying the "Lock Confirmed Orders" option to FSM SOs.) https://github.com/odoo/enterprise/blob/2347dac2568dbcf83578f044f8fe41ab70a20f47/industry_fsm_stock/models/project_task.py#L124-L134 https://github.com/odoo/enterprise/blob/2347dac2568dbcf83578f044f8fe41ab70a20f47/industry_fsm_stock/models/project_task.py#L134 4. `odoo/addons/sale/models/sale_order.py/action_confirm()` will lock SO because we enabled 'Lock Confirmed Sales' https://github.com/odoo/odoo/blob/863c064fd911cb4eeedad0abec82adb4690128f6/addons/sale/models/sale_order.py#L964 6. `_action_launch_stock_rule()` is invoked, is in charge of creating Pickings for SOs https://github.com/odoo/odoo/blob/3be83d363786526fe470e41122169e594b5467fb/addons/sale_stock/models/sale_order_line.py#L303 https://github.com/odoo/odoo/blob/3be83d363786526fe470e41122169e594b5467fb/addons/sale_stock/models/sale_order_line.py#L343-L344 7. But, since `line.order_id.locked` , the system do not create Pickings for the SOs. https://github.com/odoo/odoo/blob/3be83d363786526fe470e41122169e594b5467fb/addons/sale_stock/models/sale_order_line.py#L315-L316 The line was introduced by https://github.com/odoo/odoo/commit/17bece3e797913bcba8dd7e07fc8541c0a45e3f7 This commit resolves the issue by passing a context key `fsm_create_sale_order=True` when confirming a sales order that is being created from a Field Service task. The `_should_be_locked` method on the sale order is overridden to check for this context key. If the key is present, it prevents the order from being locked within that specific transaction, allowing the stock rules to execute correctly and create the necessary picking. The order will be locked for any subsequent operations as intended. Tradeoff here; We are sacrificing the universal application of one feature (automatic lock on confirmed sales order) to fix a critical bug that makes the entire FSM delivery process unusable. --- EDIT: Without this change, all of [test_fsm_stock](https://github.com/odoo/enterprise/blob/17.0/industry_fsm_stock/tests/test_fsm_stock.py)'s test cases that use `_fsm_ensure_sale_order()` will fail if the setting is on. (around ~20 test cases). [In the past, similar issue occurred for Subscription Orders, and the PO confirmed that the "Lock Confirmed Order" setting should never affect the subscriptions. ](https://github.com/odoo/enterprise/commit/e4f9d76c0a58f3cc226a2372f3936cea4547312e). This commit takes the same approach to ignore the setting upon SO confirmation. opw-4633977 opw-4749653 opw-4880664 Forward-Port-Of: odoo/enterprise#91799 Forward-Port-Of: odoo/enterprise#88855
This fix restores safeguards in the website builder so users cannot accidentally type into images, category labels, currency symbols, or other fields that should not be directly edited. It also keeps editable areas properly limited, preventing changes that would appear possible but be lost after saving.
Original PR description
The selectors added come from `addons/web_editor/static/src/js/wysiwyg/wysiwyg.js` lines 581 to 597
18 changes
Enhancements to existing features
Event staff can now better manage attendance across multi-day events. Ticket scans and manual attendance updates are logged, and repeat scans on a different day show when the ticket was previously scanned.
Original PR description
**Purpose:** If there is a multi-day event, there's no way manage attendance for each day. **Specifications:** - When ticket is scanned show log in chatter. - In the Registration Desk, when scanning or manually selecting an attendee, if the attendee is already marked as `done` but today's date is different from the current `date_closed`, update the warning message to 'Ticket was last scanned on `<DATE>`' Task-4864066
Product attribute loading in the online shop has been optimized so search and filtering pages respond much faster, especially on stores with large catalogs. This improves customer browsing speed and reduces delays when many products are involved.
Original PR description
### Description: The default query to fetch attributes for searched products needs to join on the `product_tmpl_ids` Many2Many field. This can be slow, as it requires a join on an intermediate table. This change avoids that by directly querying the attribute lines and grouping by `attribute_id` to remove duplicates. ### Benchmark (in 18.0): | N° of products | Before | After | |----------------|--------|-------| | 3708 | 400ms | 200ms | | 128539 | 4 min | 800ms | | 484798 | 6 min | 3s | ### Reference: opw-4937361 Forward-Port-Of: odoo/odoo#222064
Belgian payroll departure notices now exclude PFI contracts when calculating an employee’s seniority. This helps ensure notice periods for leaving employees are calculated according to Belgian rules and avoids overstating seniority.
Original PR description
When you generate the notice period for leaving employees, you must compute their seniority. In Belgium, PFI contracts should not be taken into account. This commit filters the contracts to ignore PFI ones. task-4788455 Forward-Port-Of: odoo/enterprise#90902
Resolved issues and error corrections
Refund payments with withholding taxes now use the correct refund tax allocation, so tax reports reflect amounts in the right direction. The change also prevents payment editing problems when withholding tax lines use the company's default transfer account.
Original PR description
Currently, there is an issue with how the repartition line is selected when registering payment for a refund for withholding taxes. It would select the invoice repartition line, causing the tax amounts to affect the tax report in the wrong way. - It is not setting the is_refund param on the base line, leading to incorrect lines on the payment's entry. - Detecting if we are a refund is tricky with the current system, which is based on the wizard payment_type. It requires some changes in order to be able to have withholding lines with a type_tax_use which doesn't match the payment wizard. Also fixes an issue where a payment could not be edited after creation if the withholding tax line is using the company's default transfer account. In this case, the lines would be counted as counterparts and cause issues. As the account on the base line does not matter that much, we decided to use the simple solution of blocking its usage. Forward-Port-Of: odoo/odoo#220509
The Spanish VeriFactu electronic invoicing module can now be installed even if certain optional tax records have been removed. This prevents installation failures for affected Spanish accounting setups and helps businesses continue enabling compliance features without manual data repair.
Original PR description
In case some taxes for which we specify Applicability info (field `l10n_es_applicability`) do not exist the module can not be installed. I.e. the `_l10n_es_edi_verifactu_post_init_hook` raises. Reproduce 1. Install `l10n_es` without installing `l10n_es_edi_verifactu` 2. Delete tax with xmlid `account_tax_template_s_iva_e` (sales tax with description "VAT 0% export (services)") 3. Install `l10n_es_edi_verifactu` 4. A "Validation Error" appears ``` The operation cannot be completed: - Create/update: a mandatory field is not set. - Delete: another model requires the record being deleted. If possible, archive it instead. Model: Tax (account.tax) Field: Tax Name (name) ``` opw-5003231 opw-4996685 opw-4999922 Forward-Port-Of: odoo/odoo#222313 Forward-Port-Of: odoo/odoo#222225
Manufacturing orders created manually in a 3-step warehouse setup now correctly increase the stock forecast for the final warehouse location. This helps planners see expected inventory accurately and avoid unnecessary replenishment orders.
Original PR description
### Steps to reproduce: - In the settings enable Multi-Steps Routes - Put your warehouse in manufacture in 3 steps - Create a storable product P - Create and confirm an MO for 1 unit of P - Go to…
### Steps to reproduce: - In the settings enable Multi-Steps Routes - Put your warehouse in manufacture in 3 steps - Create a storable product P - Create and confirm an MO for 1 unit of P - Go to Inventory > Operations > Procurement > Replenishment - Create a new one for P in WH/stock #### > The forecasted quantity in stock is still 0 but should be at 1, just as if the the MO had been generated using the replenishment for 1 unit ### Cause of the issue: When an MO is created using a procurement, a `location_final_id` is set to WH/Stock on the MO and propagated on the move for the finished product: https://github.com/odoo/odoo/blob/8d4e6df0c0ac5ebc6362f3578ae8cc8edf4a76f7/addons/mrp/models/stock_rule.py#L165 https://github.com/odoo/odoo/blob/8d4e6df0c0ac5ebc6362f3578ae8cc8edf4a76f7/addons/mrp/models/mrp_production.py#L1169-L1175 As such, even if the manufacturing is now handled in push, this move will contribute positively to the forecast in the `virtual_available` quantity of the product in WH/Stock bevause of the `location_final_id`. By contrast, if hte MO is created by hand, it does not bear a `location_final_id` so that the MO can only contribute to the stock forecast has been processed and the related internal transfer `WH/post-prod -> WH/Stock` is created. opw-4882390 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221462 Forward-Port-Of: odoo/odoo#221003
Fixed an issue where products tracked by lot could be counted twice when a sales order with multiple lots was paid through Point of Sale. The order is now split correctly by lot, keeping delivered quantities accurate and preventing inventory discrepancies.
Original PR description
When creating a sale order for a product, confirming it, and then modifying the stock move to use 2 different lots. Then paying the order in the POS, the picking created for the pos order will have double qty Steps to reproduce: ------------------- * Create a product tracked by lot * Create 2 lots for that product * Create a sale order for that 3 quantity of that product * Confirm the sale order * Modify the stock move to use 2 different lots, for example: - Lot 1001: 2 units - Lot 1002: 1 unit * Pay the order in the POS * Check the picking created for the pos order > Observation: The picking created for the pos order has double the quantity for the lots. Why the fix: ------------ A PoS line can only hold one lot, so when we import a sale order with multiple lots, we need to split the line into multiple lines, each with a single lot opw-4804704 Forward-Port-Of: odoo/odoo#221625 Forward-Port-Of: odoo/odoo#217537
Fixes several self-ordering issues that could block tables or devices when payments failed, direct sales were synced, or orders were cancelled. It also makes ticket printing more reliable by printing preparation and customer tickets one after another.
Original PR description
*: pos_restaurant, pos_online_payment_self_order, pos_self_order When self-ordering is enabled and in pay after each mode, the table selection was handled via table_id fields, which caused issues…
*: pos_restaurant, pos_online_payment_self_order, pos_self_order When self-ordering is enabled and in pay after each mode, the table selection was handled via table_id fields, which caused issues when a customer had an issue with its payment and wanted to pay later. It was blocking the table with its order, so if another customer wanted to scan the same QR code, it would not be able to add anything to the cart. Now in pay after each mode, the table selection is handled via floating_order_name, which allows the order to be processed without blocking the table. This way, the table can be reused for another customer, and the order can be paid later. --- Regarding direct sale in `point_of_sale`, when a customer wanted to pay by card the order was synced with the server when the waiter clicked on the payment method, if the direct sale had no table and no floating order name, when synching on other devices the order was blocking them. Now if no table and no floating order name is set, when synching the order, the pos_reference is set to the floating_order_name, which prevents the order from blocking other devices. --- Regarding self order cancellation from a PoS, when the waiter was cancelling an order it was not synced with the self-order app, which caused the self-order app to keep the order in the cart, preventing the customer from starting a new order. --- Regarding self order ticket printing, when an order arrives on the PoS to be printed, we were trying to print the preparation ticket and the customer ticket at the same time, which caused issues with the printing. Now we printing them one after the other.
This update corrects how Malaysian e-Invoicing data is filled for foreign customers and consolidated invoices. It helps ensure invoices meet Malaysian reporting requirements and reduces the risk of submission errors.
Original PR description
## Before this commit: The `CountrySubentityCode` was computed by simply using the `state code` of the partner, without handling the following cases: - Non-Malaysian Partners: For partners located outside Malaysia, the format requires the `state name` to be passed instead of the `state code`. - Consolidation Entries: For consolidation invoices, a fixed value `17` should be passed as the `CountrySubentityCode`, regardless of the partner’s state. ## After this commit: The computation of `CountrySubentityCode` has been updated to handle both cases correctly: - For non-Malaysian partners, the `state name` is used. - For consolidation entries, the fixed value `17` is used. - For regular Malaysian partners, the `state code` continues to be used as before. This ensures compliance with Malaysian e-Invoicing specifications and prevents errors. > Task-4938198 Forward-Port-Of: odoo/odoo#222153 Forward-Port-Of: odoo/odoo#219201
This fix stops users from creating website menu structures that go deeper than the supported two levels, which previously caused some menu items to disappear from the site. It also enforces clearer rules around mega menus so website navigation remains predictable and easier to manage.
Original PR description
Steps to Reproduce: 1. Go to the website. 2. Create a new menu (e.g., 'Test 1') using the 'Edit Menu' option and add it under another menu (e.g., 'Contact Us'), creating a sub-menu. 3. Turn on the…
Steps to Reproduce:
1. Go to the website.
2. Create a new menu (e.g., 'Test 1') using the 'Edit Menu' option and add it under another menu (e.g., 'Contact Us'), creating a sub-menu.
3. Turn on the developer mode.
4. Go to Configuration -> Menus and add two menus (e.g., 'menu 1' and 'menu 2') under the new sub-menu (e.g., 'Test 1').
5. Notice that the two menus ('menu 1' and 'menu 2') are not visible on the website.
Description:
As per functional specifications, creation of multi-level sub-menus should not be allowed.
Key Changes:
raises a `UserError` if a menu exceeds the two-level hierarchy by checking the parent and grandparent levels.
- Implements mega menu restrictions:
- A mega menu cannot have a parent menu.
- A mega menu cannot have child menus.
- Any menu cannot be a child of a mega menu.
- Prevents menus with child menus from being added as submenus to existing menus.
This ensures that the website menu structure adheres to the defined functional specifications, providing a consistent and predictable user experience.
task-3901371
Forward-Port-Of: odoo/odoo#222254
Forward-Port-Of: odoo/odoo#168801Changing an item quantity with the Point of Sale numpad is now saved immediately in the local browser database. This prevents checkout carts from reverting to the original quantity if the page is refreshed, reducing order mistakes and cashier frustration.
Original PR description
If you modified the quantity of a pos order line with the numpad, then refreshed the page the new quantity would be lost. Steps to reproduce: ------------------- * Open PoS * Add any product to the cart * Modify the quantity using the numpad * Direclty refresh the page > Observation: The quantity of the product is back to 1 Why the fix: ------------ When modifying a pos order line it was not synched with the indexed local database. We now make sure that when a pos order line is modified it is synched correctly. opw-4801613
Archiving or restoring a company now refreshes the company information shown to users correctly. This prevents outdated company lists and avoids errors in related apps such as Timesheets and Italian point of sale when a company is restored.
Original PR description
Currently below error occurs while archive/unarchive company: - Company list is not being updated. - In `hr_timesheet` KeyError will be encountered on unarchiving a company. - In `l10n_it_pos` module…
Currently below error occurs while archive/unarchive company: - Company list is not being updated. - In `hr_timesheet` KeyError will be encountered on unarchiving a company. - In `l10n_it_pos` module an AccessError will be encountered on unarchiving a company. **Root Cause:** Since https://github.com/odoo/odoo/commit/22e9d822e8cab08114c006eb8c4054c4de0c40f2, the `session_info` method relies on `user_companies` at [1], which fetches only active company IDs via `_get_company_ids()`. However, `_get_company_ids` uses caching as shown at [2]. When a company is archived or unarchived, 'write' method is called. Now, here the cache is invalidated before writing to the company as shown at [3]. Due to which '_get_company_ids' method doesn't receive the updated list of companies, causing this issue. **Solution:** This commit prevents error by ensuring companies are stored before invalidating the cache. [1]- https://github.com/odoo/odoo/blob/d3482e32f7dbe273125de84f1bbc434ac3c9ffc3/addons/web/models/ir_http.py#L146 [2]- https://github.com/odoo/odoo/blob/7db62d6d65bd57f6ed43ce52a820cf03df19efdd/odoo/addons/base/models/res_users.py#L927-L931 [3]- https://github.com/odoo/odoo/blob/3173a5f993a3ffa3d3a14d29713142e5b6b314d9/odoo/addons/base/models/res_company.py#L343-L367 Sentry-6251348500 Forward-Port-Of: odoo/odoo#219044
Winbooks data imports now continue even when the source chart of accounts differs from Odoo's default setup. This prevents import failures for draft accounting data, allowing users to review and adjust records inside Odoo afterward.
Original PR description
When importing Winbooks data, if the CoA configuration in Winbooks is different from Odoo's default, users will experience a failure with a message similar to ``` Validation Error Tax Receivable Account (411000 VAT Recoverable) should be an account of type "Receivable" or "Payable" with both options "Allow Reconciliation" and "Non Trade" enabled. ``` This occurs because the account 411000, meant to store the tax provisions, in Winbooks was used as tax receivable. In similar cases we should not raise any error and should let the import go through: the data is imported in draft and the user has the possibility to bring the modifications in Odoo opw-4850314 Forward-Port-Of: odoo/enterprise#91828
The Indian GSTR document summary now excludes cancelled invoices that were never officially posted, preventing inaccurate tax reporting totals. It also improves serial continuity checks by return period and keeps the document summary view consistently visible in the GSTR-1 section.
Original PR description
Before: The document summary included all cancelled invoices, even those that were never posted. After: Only invoices that were posted and subsequently cancelled are now considered in the summary. Additional Changes: - Updated check_serials to validate serial continuity within current company. - Made the document summary view always visible in the GSTR-1 section. opw-4940053 Forward-Port-Of: odoo/enterprise#91971 Forward-Port-Of: odoo/enterprise#90160
Scheduled bank statement reconciliation now uses the correct company context, preventing incorrect currency rates from being applied. The related code was also cleaned up to avoid duplicated logic, making future maintenance safer.
Original PR description
In this commit: https://github.com/odoo/enterprise/pull/89244/commits/788d79cea3c2d45582e16b25847c7821a6521da1 we fixed a bug where the cron would be trigger with the wrong company which impacted the currency rate. We decided to put the change in the try_auto_reconcile, but it was a bit of code duplication so this commit will refactor that. Task-4933083
Odoo can now handle large files sent through WhatsApp without running into memory errors. This helps ensure customer messages with bigger attachments are received reliably instead of failing silently or causing errors.
Original PR description
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB). Stack Trace: ``` MemoryError: null File "odoo/http.py", line 2383, in…
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB).
Stack Trace:
```
MemoryError: null
File "odoo/http.py", line 2383, in __call__
response = request._serve_db()
File "odoo/http.py", line 1913, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1976, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1943, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2187, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 227, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 757, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/controller/main.py", line 42, in webhookpost
wa_account_id._process_messages(value)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/models/whatsapp_account.py", line 206, in _process_messages
datas = wa_api._get_whatsapp_document(messages[message_type]['id'])
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 236, in _get_whatsapp_document
file_response = self.__api_requests("GET", file_url, auth_type="bearer", endpoint_include=True)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 46, in __api_requests
if 'error' in res.json():
File "requests/models.py", line 971, in json
return complexjson.loads(self.text, **kwargs)
File "requests/models.py", line 928, in text
encoding = self.apparent_encoding
File "requests/models.py", line 793, in apparent_encoding
return chardet.detect(self.content)["encoding"]
File "__init__.py", line 49, in detect
detector.feed(byte_str)
File "chardet/universaldetector.py", line 274, in feed
if prober.feed(byte_str) == ProbingState.FOUND_IT:
File "chardet/charsetgroupprober.py", line 70, in feed
state = prober.feed(byte_str)
File "chardet/hebrewprober.py", line 240, in feed
byte_str = self.filter_high_byte_only(byte_str)
File "chardet/charsetprober.py", line 73, in filter_high_byte_only
buf = re.sub(b"([\x00-\x7F])+", b" ", buf)
File "__init__.py", line 186, in sub
return _compile(pattern, flags).sub(repl, string, count)
```
At line [1], the code `'error' in res.json()` is used, which reads all the json content of `res`, but at times users upload large files, it will cause the above error because the `json()` tries to read all bytes from res, which is a very large amount to handle in memory.
This commit will fix the above issue by returning a response if the response
contains content_length more than 10 MB.
[1] - https://github.com/odoo/enterprise/blob/aca7ae2a7cf4aad5427a60d5cad60d08774357d0/whatsapp/tools/whatsapp_api.py#L46
sentry-5810101850
Forward-Port-Of: odoo/enterprise#70001Luxembourg VAT report XML exports now include certain special-scheme fields only when the reporting period includes dates in 2025 or later. The annual VAT report also fills required fields when related mandatory fields are present, helping businesses submit legally compliant tax files.
Original PR description
As per legal requirements, the 491, 492 and 493 fields of the xml export of the tax return only need to be included if at least one day of the period includes dates in 2025 or later. As per legal requirements too, the 192 and 193 fields are mandatory in the annual report if some other fields are present. Among those are 361 and 362 which are mandatory even if null so if 192 and 193 are not there yet, we set them to 362 and 363 values (0.0 in most cases). --- from feedback on task-4587067 opw-4757770 Forward-Port-Of: odoo/enterprise#91859 Forward-Port-Of: odoo/enterprise#89437
Fixed an issue where invoices or bills linked to payments in a validated batch could remain marked as in payment after matching the batch with a bank statement line. This ensures payment statuses update correctly when bank journals do not use outstanding payment or receipt accounts.
Original PR description
Setting a batch payment having payments without journal entry with a statement line does not reconcile the invoices/bills linked to the payments. Steps: - Make sure to not have outstanding receipts/payments accounts set on bank journal - Create two invoices, confirm and register payment for both - Create a batch payment with tho payments, validate - Create a statement line with amount = sum of the 2 invoices - Add the batch to the statement line - Go back to invoice tree view -> Both invoices are still 'in_payment' instead of 'paid' opw-4980004
29 changes
Enhancements to existing features
This update adds detailed logging for AI agent activity, helping teams understand how AI requests use tokens, tools, and time. It improves visibility for troubleshooting and cost/performance monitoring without changing the normal user experience.
Original PR description
This commit introduces comprehensive logging for AI agent API interactions, providing visibility into token usage, API calls, and tool execution patterns. The logging system tracks: - API calls with…
This commit introduces comprehensive logging for AI agent API interactions,
providing visibility into token usage, API calls, and tool execution patterns.
The logging system tracks:
- API calls with estimated token counts (input/output)
- Tool execution (sequential vs batch)
- Timing information for API calls and tool execution
- Summary statistics including total estimated tokens, API calls, tools, and batches
Append `--log-handler odoo.addons.ai:DEBUG` when starting the server to see the
detailed logs.
Example output:
```
DEBUG [AI Prompt] <context>
<session-info>
<user id="2" name="Mitchell Admin" model="res.users"/>
<partner id="3" name="Mitchell Admin" model="res.partner"/>
<company id="1" name="My US Company" model="res.company"/>
</session-info>
</context>
<query>
pos orders from restaurant configs containing products from the food categ
</query>
DEBUG [AI Response] Starting generation for model 'gemini-2.5-flash'
DEBUG [AI API Call #1] Sending request with 44360 tokens
DEBUG [AI API Call #1 - →] Received single tool call (3.99s, 16 tokens)
DEBUG [AI Tool →] 'AI: Get Menu Details' with args (menu_ids=[613])
DEBUG [AI Tool - 0.02s] Completed 'AI: Get Menu Details'
DEBUG [AI API Call #2] Sending request with 45432 tokens
DEBUG [AI API Call #2 - ⚡] Received Batch #1, 4 tool calls (2.90s, 77 tokens)
DEBUG [AI Tool - Batch #1 ⚡] 'AI: Get Fields' with args (model_name='pos.order')
DEBUG [AI Tool - Batch #1 - 0.02s] Completed 'AI: Get Fields'
DEBUG [AI Tool - Batch #1 ⚡] 'AI: Get Fields' with args (model_name='pos.order.line')
DEBUG [AI Tool - Batch #1 - 0.01s] Completed 'AI: Get Fields'
DEBUG [AI Tool - Batch #1 ⚡] 'AI: Get Fields' with args (model_name='product.product')
DEBUG [AI Tool - Batch #1 - 0.06s] Completed 'AI: Get Fields'
DEBUG [AI Tool - Batch #1 ⚡] 'AI: Get Fields' with args (model_name='pos.category')
DEBUG [AI Tool - Batch #1 - 0.01s] Completed 'AI: Get Fields'
DEBUG [AI Tool Summary] Batch #1 completed, 4 tool calls
DEBUG [AI API Call #3] Sending request with 50602 tokens
DEBUG [AI API Call #3 - →] Received single tool call (2.98s, 86 tokens)
DEBUG [AI Tool →] 'AI: Open Menu List' with args (menu_id=613, model_name='pos.order', selected_filters=[], selected_groupbys=[], search=['config_id=restaurant'], custom_domain='[["lines.product_id.po
DEBUG [AI Tool - 0.02s] Completed 'AI: Open Menu List'
DEBUG [AI Summary] Total: 10.01s | API calls: 3 (9.87s) | Tools: 6 (0.13s) | Tokens: 140573 (in: 140394, out: 179) | Batches: 1
```Website editors can now configure dynamic appointment snippets to show a single selected record as well as filtered record lists. This makes it easier to build focused website sections, while a loading effect improves the editing experience when snippet content is refreshed.
Original PR description
Currently, dynamic snippets only support filters to display records. This commit improves the current implementation, and allows users to select a single record directly in the snippet (which should automatically switch to the "single record" mode, when the number of records to fetch is set to "one"). - Generic snippets can switch between models, while specific ones will limit selection to their related model. - A loading effect was added while fetching snippet content. Remark: The current diff uses default placeholder templates, which designers will update (see TODO comments). This enhances snippet flexibility, enabling "mono-record" snippets similar to existing dynamic ones. Community PR: https://github.com/odoo/odoo/pull/190514 task-4280375 Co-authored-by: Antoine (anso) <anso@odoo.com>
Duplicating a project now also duplicates the files in its document folder, including projects created from sales order templates. Demo data was added so users can see the project top bar preferences carried over when a templated project is created.
Users can now use "Sign Now" when eMSigner is only required for the final signer, while unsupported multi-document actions are hidden to avoid confusion. The update also prevents an error when SMS authentication is used, making the signing process smoother and more reliable.
Original PR description
Before: - If any signer used the eMSigner authentication method, the "Sign Now" option was disabled. - eMSigner does not support signing multiple documents in a bundle, so a warning was shown when…
Before: - If any signer used the eMSigner authentication method, the "Sign Now" option was disabled. - eMSigner does not support signing multiple documents in a bundle, so a warning was shown when users tried to add more documents. - After merging `sign_emsigner`, a traceback occurred when signing with the 'sms' method because `_validate_auth_method` was called with an unexpected `frame` parameter. After: - The "Sign Now" option is now allowed when eMSigner is used only by the last signer. - It remains blocked if eMSigner is used by any signer other than the last one. - Instead of showing a warning, the "Add Document" button is now hidden when eMSigner is selected. - Add `*(kwargs` while calling `_validate_auth_method` auth method when auth method is 'sms' which prevent the issue of parameter. Impact: - Users can complete signing even when the last signer uses eMSigner, improving workflow efficiency. - The interface is cleaner and prevents confusion by hiding options that are not supported. - The fix for the 'sms' method prevents errors and ensures smoother signing for all supported authentication methods. - Overall, this change improves usability, reduces errors, and provides a better user experience. task-4815486
First-time bank account synchronization now creates a proper opening bank statement instead of a dummy transaction. This prevents misleading entries and helps ensure accounting balances start accurately from the bank's real transaction and balance data.
Original PR description
Before: - When syncing a bank account for the first time, the system created a dummy bank statement line to fill missing statement data. - This was not linked to a real transaction and could confuse users or lead to inaccurate reporting. After: - Replaced the dummy statement line logic with the creation of a proper opening bank statement. - The system now accurately sets the starting balance and the current balance based on the imported transactions. - This logic only applies when no previous bank statement lines exist for the journal and the current balance differs from the sum of imported transactions. Impact: - Prevents creation of fake bank transactions and journal entries during initial sync, ensuring accurate accounting from the start. - Improves performance and reliability by calculating the correct opening balance using real transaction data and provided bank balance. TaskID-4815622 Forward-Port-Of: odoo/enterprise#90070
Sales achievement report lines now show the related customer directly, so users can identify who each line is for without opening the source document. This makes the report easier to review and saves time when checking commissions from invoices, sales orders, or subscriptions.
Original PR description
Before: * The Sales Achievement Report didn’t show which customer each line referred to. * To find out, users had to open the linked invoice, sale order, or subscription. After: * The report now displays the customer name (`partner_id`) directly on each achievement line. * The customer information is pulled from: * Invoices (`account.move`) * Sale orders (`sale.order`) * Subscriptions (via `sale_order_log` linked to `sale.order`) Impact: * Makes the report easier to read and understand at a glance. * Saves time by letting users identify the customer without needing to click into each document. task-4501131
VAT return attachments such as PDFs and XML files are now visible again from the related closing entry, making it easier for users to find supporting documents. Draft entry reviews now show the accounting date for better context, and the Accounting Periods setup wizard no longer marks the Opening Date as invalid before the user submits it.
Original PR description
There are 3 improvements here: - Attaching PDF and other documents in closing entry moves (like previously) - Showing the Accounting date by default on draft entries check - Preventing the Opening…
There are 3 improvements here: - Attaching PDF and other documents in closing entry moves (like previously) - Showing the Accounting date by default on draft entries check - Preventing the Opening Date field to be red when creating a Accounting Periods wizard In version 18.2, when a closing entry move was generated, the PDF (and other files such as XML) would be send in the chatter. In version 18.3, the Tax returns were changed to have the attachment generated when marking the Tax return as submitted and would be available on the Tax return line. You would still be able to see the closing entry move by using the thre dots next to the Tax return line and selection "View entry" but the attachment wouldn't be included in the chatter anymore. Now, the same attachments from the Tax report line are included in the closing entry move and we made sure to not generate invoices lines from those attachments as they have been generated from the lines we had. The second improvements was to display the Accounting Date on the Draft entries that needs to be reviewed in a Tax return line to give the user more context on why they need to review those specific Draft entries. Lastly, when accessing Tax Returns it would ask for us to set the Accouting Periods through a wizard which prefilled informations such as the VAT Periodicity but the Opening Date needs to be filled by this user but this field would show as red when opening the wizard as it is required and no information was prevent. To allow the field to be red only if we try to submit the informations we are passing the informations to the wizard as default value which wouldn't trigger the wizard to try to save values when being created. task-4784283
The mobile Discuss experience is being improved with easier search and a new button to start or access meetings. This should help users find conversations faster and move into meetings more smoothly while working from mobile devices.
Original PR description
Part of task-4967066
Staff can now increase or decrease the preparation time while accepting UrbanPiper online orders. The updated time is shared with UrbanPiper and shown on the kitchen display, helping keep customers, delivery channels, and kitchen teams aligned.
Original PR description
Following this commit: - The user can now increase or decrease the preparation time while accepting online orders. - The same updated time will be sent to Urbanpiper, also maintaining consistency. - Updated preparation time will also be reflected in the kitchen display task-4904077 <img width="449" height="921" alt="image" src="https://github.com/user-attachments/assets/4d7f1023-0fdd-4c4f-956b-3042d58ddb7d" />
Spreadsheet dashboards now support a carousel-style chart figure, letting users view several charts in one compact area and switch between them with tabs. The CRM pipeline dashboard is updated to use the latest spreadsheet capabilities, improving dashboard readability and presentation.
Original PR description
Adapt enterprise codebase to o-spreadsheet update (https://github.com/odoo/odoo/pull/222308)
Contract template screens now restore and reorganize important payroll, salary, work entry, and localization fields that were lost after HR and contract features were merged. This makes contract templates easier to review and configure across multiple country payroll setups, reducing missing information and improving day-to-day HR setup accuracy.
Original PR description
* = hr_contract_salary, hr_payroll{,_account}, hr_work_entry_{attendance,planning}, l10n_{ae,au,be,ch,eg,hk,id,in,jo,ke,lt,lu,mx,nl,ro,sa,sk,us}_hr_payroll, l10n_au_hr_payroll_account,
Since the merge of hr and contract, we only have a form view for contracts for templates. Thus, during the merge, a lot of info has been lost on contract template form view.
This commit, reintroduce fields that were present in saas-18.3 and re-organize them.
task-4904024
Forward-Port-Of: odoo/enterprise#89832Accounts that were already reviewed or supervised in an audit are now automatically moved back to To Review when a relevant accounting entry is posted or reverted within the audit period. This helps ensure auditors re-check accounts affected by new or changed financial activity, reducing the risk of relying on outdated audit conclusions.
Original PR description
When a move is posted that affects an account marked as reviewed or supervised in an audit, and the move falls within the audit period, the account's status is reset to To Review. task-4991558
Audit report templates are now clearer, easier to navigate, and better organized for users preparing audit documentation. The update improves report structure, removes rarely used content, cleans up generated output, and places audit reports in a more logical menu location.
Original PR description
This PR introduces several enhancements aimed at improving the default template of the audit reports: - Headings have been added to articles to establish a clearer content hierarchy and to…
This PR introduces several enhancements aimed at improving the default template of the audit reports: - Headings have been added to articles to establish a clearer content hierarchy and to automatically populate the table of contents. - The "General Ledger" article has been removed, as it is rarely used in practice and typically not relevant to most audit reports. - Some sections are now folded by default to avoid displaying contradictory content (for the attestations). - Labels for foldable sections are no longer shown in the generated resulting in a cleaner and more professional appearance. - The configuration of the "Balance Sheet" and "Profit and Loss" reports has been updated to provide more meaningful and contextual insights. - The index of the root article now lists all articles in the report hierarchy. Additionally, the root article of the audit report will now be named after the audit report itself. This change makes it easier for users to locate the article within the workspace. Lastly, the "Audit Reports" menu item has been moved under the "Working Files" section of the "Audit" menu to better reflect its purpose and improve navigation. Task-4999770
Resolved issues and error corrections
Customers will no longer receive automatic emails asking them to pay when their payment is already being processed through the payment register. This avoids confusion and reduces unnecessary follow-up for invoices paid with a saved payment method.
Original PR description
**Before this commit:** When creating an invoice payment with the "automatic invoice" option enabled in Sales settings and using a saved payment token, an email is sent to the customer before the…
**Before this commit:** When creating an invoice payment with the "automatic invoice" option enabled in Sales settings and using a saved payment token, an email is sent to the customer before the transaction move is posted and the invoice payment status is updated to "In Payment." This results in the email incorrectly asking the customer to remit payment, even though the payment is already being processed. **Steps to Reproduce:** 1. Enable "Automatic Invoicing" from Sales settings. 2. Enable and publish any payment provider (e.g., Demo) in test mode. 3. Create an invoice and generate a payment link. Open the link in a new incognito tab and pay using any dummy card number (ensure the "Save my payment details" checkbox is checked). This saves the payment token for the partner. 4. Create a new invoice with the same partner, then register payment. Select the payment method and the previously saved token, then confirm. 5. Observe that the payment status is "In Payment," but the email sent to the customer incorrectly asks them to remit payment. **Fix:** This change prevents payment notification emails from being sent automatically when the payment is manually created from the payment register wizard. opw-4850293 Forward-Port-Of: odoo/enterprise#91761 Forward-Port-Of: odoo/enterprise#91570
The journal report now keeps draft invoice lines grouped in a stable order when multiple draft entries share the same date. This prevents errors when users include draft entries and use the Load More option, improving reliability for reviewing accounting reports.
Original PR description
**Issue description:** When fetching AMLs for the journal report with _query_aml(), it sorts the AMLs based on (am.date, am.name), which are not unique in case we have multiple (draft) moves with the same date. The lines will end up mixed and ordered with respect to the account, which causes errors with the "Load More" functionality, as it assumes that the lines are ordered based on their move. For posted entries, it's not an issue as the am.name is unique. **Steps to reproduce:** -Create 3 or more invoices (with 3+ AMLs each) in draft and on the same invoicing date. -Open journal report settings and set the Load More Limit to 5. -Open the journal report and set the date to this day and check the "Include Draft Entries" option. -Press "Load More", you will get an error. opw-4929907 Forward-Port-Of: odoo/enterprise#91746 Forward-Port-Of: odoo/enterprise#90360
The payment form’s Transaction button now chooses the correct default journal in multi-company setups. This prevents users from being blocked by access errors when opening reconciled payment transactions while working in a single selected company.
Original PR description
This fixes the access error when using the 'Transaction' smart button from a reconciled payment present since Steps to reproduce: - Multi-company environment with account_accountant installed - Only select one company - Create a payment with a journal entry (by adding an account on the payment method) - Create a corresponding bank statement and reconcile them both together - Go to the payment form view - Click on the Transaction button `button_open_statement_lines` - Access error is raised due to a "random" assignation of journal which is likely to be one from the other company This make sure we select the default statement line journal by default, ensuring we don't search for a journal in every company Forward-Port-Of: odoo/enterprise#91904
EC Sales List reports with country-specific extra columns now populate those columns correctly instead of leaving them blank. This helps businesses in countries such as Slovenia get complete and reliable VAT reporting information.
Original PR description
Before this commit, when an ec sales list report had more than the 3 bases columns (goods, service, triangular) the value was not filled. For example in slovinia, the ec sales list has 5 columns, the two extras columns where always empty. task-4963633 Forward-Port-Of: odoo/enterprise#90669
Users with the right permissions in the Sign app can now cancel sign requests even if they do not have access to salary package offer records. This prevents an access error from blocking normal document cancellation workflows for HR and signing users.
Original PR description
After this commit https://github.com/odoo/enterprise/commit/40d3314d1b06c8110b476690d2264e86b3492b3e we are not able to cancel a sign request, if user do not have read/write access on…
After this commit https://github.com/odoo/enterprise/commit/40d3314d1b06c8110b476690d2264e86b3492b3e we are not able to cancel a sign request, if user do not have read/write access on `hr.contract.salary.offer` model **step to reproduce:** - install `hr_contract_salary` - create a new user with following right: `Sign -> Administrator` `Contracts -> Employee Manager` `Recruitment -> Interviewer` - login with test user - open sign -> All Documents (with demo data 2, there should be 2 documents) - try to cancel one of them <img width="1572" height="689" alt="config for user" src="https://github.com/user-attachments/assets/72e89ac7-fed3-4a38-918f-5dbb198bd1e3" /> **Observation:** - even with Admin rights of Sign, we are not able to cancel a sign request and we receive a Access Error `You are not allowed to access 'Salary Package Offer' (hr.contract.salary.offer) records` **Fix:** we use `sudo()` to allow everyone to cancel their sign request opw-4859774 Forward-Port-Of: odoo/enterprise#91688 Forward-Port-Of: odoo/enterprise#89865
This fixes Luxembourg VAT XML exports so special scheme fields are included only when legally required for periods touching 2025 or later. It also ensures mandatory annual report fields are filled when related fields are present, reducing rejection risk for Luxembourg tax filings.
Original PR description
As per legal requirements, the 491, 492 and 493 fields of the xml export of the tax return only need to be included if at least one day of the period includes dates in 2025 or later. As per legal requirements too, the 192 and 193 fields are mandatory in the annual report if some other fields are present. Among those are 361 and 362 which are mandatory even if null so if 192 and 193 are not there yet, we set them to 362 and 363 values (0.0 in most cases). --- from feedback on task-4587067 opw-4757770 Forward-Port-Of: odoo/enterprise#91859 Forward-Port-Of: odoo/enterprise#89437
This fix stops sick leave or other time off that overlaps with a public holiday from being incorrectly carried over to the next payslip. It helps ensure payroll calculations reflect public holidays accurately and prevents employees from receiving an unnecessary deferred leave adjustment.
Original PR description
The aim of this commit is to prevent a sick day or any other type of time off taken on a public holiday to be deferred. To reproduce: - Create a public Holiday for previous month - Regenerate the…
The aim of this commit is to prevent a sick day or any other type of time off taken on a public holiday to be deferred. To reproduce: - Create a public Holiday for previous month - Regenerate the work entries for that month - Compute a batch of payslip for last month, validate and mark it as paid --> The public holiday should be on the payslip - OPTIONAL: run the cron `Payroll: Generate pdfs` to make create the payslip in document and make it available to the concerned employee. - With the concerned employee, put a time off on the whole week of the last month. It should overlap with the public holiday. - Validate the time off and defer it for next payslip - Compute a batch of payslip for following month, validate and mark it as paid Before this commit: The overlapping sick day gets deferred completely ignoring the fact it was a public holiday. After this commit: The overlapping sick day doesn't get deferred. opw-4903546 Forward-Port-Of: odoo/enterprise#91872 Forward-Port-Of: odoo/enterprise#89264
This fix prevents Romanian SAF-T exports from failing when optional product group information is missing. It also corrects VAT validation so valid partners are not incorrectly blocked, helping businesses complete compliance exports more reliably.
Original PR description
- Added fallback for missing to prevent crash during export. - Replaced incorrect usage of with to align with actual partner VAT validation logic and avoid false errors. These changes ensure smoother SAF-T export by handling optional fields and validation more robustly. Forward-Port-Of: odoo/enterprise#91770 Forward-Port-Of: odoo/enterprise#91737
Audit reports can now be exported successfully when their article includes an embedded PDF file. This prevents an internal error during export and helps users include supporting PDF documents in audit reports without disruption.
Original PR description
Currently, the method responsible for loading PDF files embedded in an article crashes because it receives an `ir.attachment` object instead of a bytes-like object (-> TypeError: a bytes-like object is required, not 'ir.attachment'). Because of this error, it is currently not possible to export an audit report containing an embedded PDF file. Steps to reproduce: 1. Create an audit report 2. Open the article associated with the audit report 3. Insert a PDF file in it using the `/file` command 4. Export the article to PDF => The page loading the PDF shows an internal error. To revolve this issue, we will provide the raw attachment to the method responsible for loading the PDF file. With this fix, people should be able to export an audit report containing PDF files without errors. Task-4989809
Negative-value assets now keep depreciation journal entries on the correct debit and credit sides after edits. This prevents accounting inconsistencies when users adjust depreciation schedules for assets with negative original values.
Original PR description
Before this commit, creating an asset with a negative value then editing the depreciation caused a inversion between credit and debit in the Journal entries The account_depreciation_id and account_depreciation_expense_id were not inverse for negative depreciation, in the function `_inverse_depreciation_value()` We add that missing account inversion for negative assets Steps to reproduce: - Create an asset with negative Original Value - You can choose any Depreciation Account and Expense Account - Click on Compute Depreciation - Check the Posted Entries and note the values position (credit/debit) - Go back to the Asset > Depreciation Board - Add 10 to the first line Depreciation - Remove 10 to the second line Depreciation - Save the Asset - Check the Posted Entries again - The changes ones should have credit/debit inversion before the fix opw-4759988 Forward-Port-Of: odoo/enterprise#91468 Forward-Port-Of: odoo/enterprise#88907
Odoo now avoids trying to fully load very large WhatsApp file responses into memory when checking for errors. This prevents message processing failures when customers send large attachments, improving reliability for WhatsApp communications.
Original PR description
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB). Stack Trace: ``` MemoryError: null File "odoo/http.py", line 2383, in…
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB).
Stack Trace:
```
MemoryError: null
File "odoo/http.py", line 2383, in __call__
response = request._serve_db()
File "odoo/http.py", line 1913, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1976, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1943, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2187, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 227, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 757, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/controller/main.py", line 42, in webhookpost
wa_account_id._process_messages(value)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/models/whatsapp_account.py", line 206, in _process_messages
datas = wa_api._get_whatsapp_document(messages[message_type]['id'])
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 236, in _get_whatsapp_document
file_response = self.__api_requests("GET", file_url, auth_type="bearer", endpoint_include=True)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 46, in __api_requests
if 'error' in res.json():
File "requests/models.py", line 971, in json
return complexjson.loads(self.text, **kwargs)
File "requests/models.py", line 928, in text
encoding = self.apparent_encoding
File "requests/models.py", line 793, in apparent_encoding
return chardet.detect(self.content)["encoding"]
File "__init__.py", line 49, in detect
detector.feed(byte_str)
File "chardet/universaldetector.py", line 274, in feed
if prober.feed(byte_str) == ProbingState.FOUND_IT:
File "chardet/charsetgroupprober.py", line 70, in feed
state = prober.feed(byte_str)
File "chardet/hebrewprober.py", line 240, in feed
byte_str = self.filter_high_byte_only(byte_str)
File "chardet/charsetprober.py", line 73, in filter_high_byte_only
buf = re.sub(b"([\x00-\x7F])+", b" ", buf)
File "__init__.py", line 186, in sub
return _compile(pattern, flags).sub(repl, string, count)
```
At line [1], the code `'error' in res.json()` is used, which reads all the json content of `res`, but at times users upload large files, it will cause the above error because the `json()` tries to read all bytes from res, which is a very large amount to handle in memory.
This commit will fix the above issue by returning a response if the response
contains content_length more than 10 MB.
[1] - https://github.com/odoo/enterprise/blob/aca7ae2a7cf4aad5427a60d5cad60d08774357d0/whatsapp/tools/whatsapp_api.py#L46
sentry-5810101850
Forward-Port-Of: odoo/enterprise#70001Quality checks that send items to a failure location now correctly keep stock movements consistent, avoiding mismatches between item movements and their locations. This reduces the risk of downstream inventory issues such as incorrect automated routes or valuation problems, while preventing unsupported quantity checks in manufacturing flows.
Original PR description
In case of 'quantity' control per quality point. If a complete stock move line is sent to a failure location. The stock move was not split. We could have a stock move line going to a location that is not child of the location of the corresponding move. This can lead issues in case of push_rules or stock valuation. Task: 4575193 Forward-Port-Of: odoo/enterprise#89313 Forward-Port-Of: odoo/enterprise#81275
The GSTR-1 document summary now counts only invoices that were posted before being cancelled, excluding cancelled drafts that should not affect reporting. This improves the accuracy of Indian GST reporting and keeps the document summary visible for easier access.
Original PR description
Before: The document summary included all cancelled invoices, even those that were never posted. After: Only invoices that were posted and subsequently cancelled are now considered in the summary. Additional Changes: - Updated check_serials to validate serial continuity within current company. - Made the document summary view always visible in the GSTR-1 section. opw-4940053 Forward-Port-Of: odoo/enterprise#91971 Forward-Port-Of: odoo/enterprise#90160
When users edit a folder from the Documents details panel, the folder list now refreshes at the right time and shows the latest names. This prevents outdated folder information from appearing after changes are saved, making document organization more reliable.
Original PR description
Something changed in 18.4 (fw or documents) such that we * sometimes we didn't trigger a reload of the search panel after modifying a folder * sometimes the reload of the searchpanel was triggered *before* the initiation (and return) of the write call, so the search panel was updated with the old values Note that this asynchronous misbehavior was not easily visible in hoot tests, but the call count enables to highlight the problem (and drive a suitable solution). The fix is actually an opportunity to keep reloading the search panel on update inside `update` (i.e., saving) flows. Also last style cleanups in documents_details_panel.js. Task-4992298 Forward-Port-Of: odoo/enterprise#91476
Point of Sale orders are now checked and synchronized before being sent for preparation, preventing the same order from being printed by multiple devices. This helps restaurants and stores avoid duplicate preparation work and confusion when several POS devices are active.
Original PR description
*: pos_urban_piper_enhancements Before this change, when a device sent an order in preparation via the ticket printer, this could result in the same order being printed by multiple devices, as the order was not synchronized after it was sent. The error is a bit tricky, because if the user had installed a preparation screen, the order was sent to the preparation screen via syncAllOrders. In this case, the order was correctly synchronized and the other devices were informed of the changes. This commit adds two things. - We check the server before sending the order to preparation to make sure it has not already been sent. - Even when the user does not have a preparation display, the order will be synchronized after being sent to a printer. Forward-Port-Of: odoo/enterprise#91094 Forward-Port-Of: odoo/enterprise#91006
Users can now open sent signature documents in My Documents even when the recipient is not a logged-in Odoo user. This prevents an error that blocked access to documents involving an Emsigner signer and supports sending documents to external partners reliably.
Original PR description
**Version:** - Master **Steps to reproduce :** - Upload a PDF - Add two signers (one is Emsigner) - Send the document to a random partner (not a logged-in user) - Try opening the document from "My Documents" **Issue:** - A traceback error occurs when opening the sent document. **Before:** - tried to check for a logged-in user (e.g., Mitchell Admin), but the document was sent to someone who wasn't logged in, causing the error because it will filter out the curren logged user. **After:** - The error is fixed, and the document can now be opened without any traceback. **Impact:** - Now, we can send documents to anyone, and they will show correctly in "My Documents" without errors.
16 changes
New functionality added to Odoo
Point of Sale restaurants using UrbanPiper can now connect with Wolt as an additional delivery provider. This expands delivery channel options and may help businesses reach more customers through Wolt orders.
Original PR description
Following this commit: - Integrated Wolt as delivery provider in pos_urban_piper. task-4882282
Enhancements to existing features
Invoice document layout settings now show the same options whether users send, print, or configure layouts from settings. Tax ID, bank account number, and QR code previews are kept consistent, helping businesses avoid surprises in customer-facing invoice documents.
Original PR description
Previously, the document layout wizard used when sending invoices included fields for Tax ID, Bank Account Number, and QR Code. However, these fields were missing from the wizard accessed via the…
Previously, the document layout wizard used when sending invoices included fields for Tax ID, Bank Account Number, and QR Code. However, these fields were missing from the wizard accessed via the `Print` button and from the layout configurator under `General Settings > Configure Document Layout`. This was because only the send flow was using the inherited report layout from the `account` module, while the print and settings flows were using the base layout from `web` directly. Additionally, the preview template in web did not include the bank account number or QR code With this **PR**: 1. The `Print` button now uses the inherited layout from `account`. 2. The settings configurator button also uses the correct layout from `account`. 3. The bank account number and QR code fields are now dependencies of the _compute_preview method, making the preview responsive to their changes. 4. Both fields are now shown in the preview when configuring the layout in settings. This ensures the document layout behaves consistently across send, print, and settings configurator flows. **task**-4954030
The online shop now retrieves product attribute filters more efficiently during searches. This can dramatically reduce loading times on large product catalogs, improving the shopping experience and reducing server strain.
Original PR description
### Description: The default query to fetch attributes for searched products needs to join on the `product_tmpl_ids` Many2Many field. This can be slow, as it requires a join on an intermediate table. This change avoids that by directly querying the attribute lines and grouping by `attribute_id` to remove duplicates. ### Benchmark (in 18.0): | N° of products | Before | After | |----------------|--------|-------| | 3708 | 400ms | 200ms | | 128539 | 4 min | 800ms | | 484798 | 6 min | 3s | ### Reference: opw-4937361 Forward-Port-Of: odoo/odoo#222064
Resolved issues and error corrections
Sales orders linked to a project will now keep that project connection when they create purchase orders through make-to-order buying or drop-shipping. This helps businesses track purchasing costs and delivery activity against the correct customer project without manual correction.
Original PR description
This commit fixes two issues related to project propagation from Sale Order to Purchase Order: **1. Project not propagated when using MTO+Buy route** **Steps to reproduce:** - Install only…
This commit fixes two issues related to project propagation from Sale Order to Purchase Order: **1. Project not propagated when using MTO+Buy route** **Steps to reproduce:** - Install only `sale_project_stock` and `purchase` - Enable multi-step routes and unarchive the "MTO" route - Create a storable product "P1" with: - Routes: MTO + Buy - Vendor: any - Create a Sale Order with: - 1 unit of P1 - Any project set in "Other Info" - Confirm the SO **Issue:** A Purchase Order is created but the project is not propagated to it. This propagation was previously ensured by `project_mrp_sale`, via: https://github.com/odoo/odoo/blob/238a41e35280256382f6509182b9e900fb4f7aba/addons/project_mrp_sale/models/stock_move.py#L9 --- **2. Project not propagated when using drop-shipping** **Steps to reproduce:** - Enable drop-shipping - Create a product "P2" with: - Route: Drop-Ship - Create a Sale Order with: - 1 unit of P2 - Any project set - Confirm the SO **Issue:** A Purchase Order is created, but the project is again missing. --- **Fix:** - Move the `_prepare_procurement_values` override from `project_mrp_sale` to `sale_project_stock` to ensure project propagation regardless of the presence of `project_mrp_sale` - Also adapt `sale_project` to ensure project is retrieved from the Sale Order if not set on the Sale Order Line. opw-4976606
Outgoing emails now include links for attachments that are stored in cloud storage, not only for files that exceed the email size limit. This prevents recipients from missing purchase order or other email attachments that were uploaded to cloud storage.
Original PR description
Before this commit, when sending emails with attachments stored in the cloud, the attachments's links were not included in the email body, as we only included the links for attachments exceeding the max email size. With this commit, we ensure that all attachments stored in the cloud are converted to links in the email body and included in the the email. opw-4717083
Marketing card previews and test mailings now use the right preview card, avoid recording preview clicks as real engagement, and show translated default email content. Campaigns tied to removed models are also cleaned up, with small usability improvements to related field selectors.
Original PR description
- Avoid counting "clicks" on archived (implicitly preview) cards - Pick the preview card when building the default mailing body - Translate the default mailing body - If a card targets a model that has been uninstalled, remove the campaign as is done for mailings task-4247003
Product forecasts now correctly account for outgoing stock moves created by multi-step delivery routes. This prevents sales orders from showing an incorrect available forecast when stock is already committed for delivery.
Original PR description
### Steps to reproduce: - In the settings enable Multi-Steps routes - Put your warehouse in delivery in 2 steps - Create and confirm a sale order for 1 units of a storable product #### > While the…
### Steps to reproduce: - In the settings enable Multi-Steps routes - Put your warehouse in delivery in 2 steps - Create and confirm a sale order for 1 units of a storable product #### > While the pick move was created and confirmed the forecast is still at 0 even tho it should be at -1 and the outgoing pick move should be matched with the SO line in the forecast report. ### Cause of the issue: The issue has been introduced by commit 5b40fb086a0e5677678c312b42dc1f2c8991dc9e The issue being that since the `location_final_id` should not have been considered for the past forecast based on done move chains (because each done move of the chain will refer to the same external `final_dest_id`). The proposed fix was therefore to change the dest_loc_domain as such: https://github.com/odoo/odoo/commit/5b40fb086a0e5677678c312b42dc1f2c8991dc9e#diff-1f24ce9f94c5795040749acca5924384d7d17c0ac39b1993cef3b484e4bd30afR324-R326 However, the new domain: https://github.com/odoo/odoo/blob/995a7072cb3315fc03544b281b1ed5ca4e81e901/addons/stock/models/product.py#L322-L326 ignores completely the part of the condition refering to `final_dest_id` for outgoing moves since the condition is negated here: https://github.com/odoo/odoo/blob/995a7072cb3315fc03544b281b1ed5ca4e81e901/addons/stock/models/product.py#L328-L333 The logical `OR` (`|`) becoming an `AND` (`&`) for the `domain_move_out_loc`. opw-4997982 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale now ignores canceled payment attempts when matching responses from payment terminals such as Adyen. This prevents a previously canceled payment from blocking a later order, so staff can complete the new sale normally.
Original PR description
If you made an order and tried to pay with a payment terminal (like Adyen) then canceled the payment on the terminal. Then leave the order and create a new order, add different products, and try to…
If you made an order and tried to pay with a payment terminal (like Adyen) then canceled the payment on the terminal. Then leave the order and create a new order, add different products, and try to pay again, pay on the terminal, the payment will not be transmitted to the PoS and the order would still be waiting for payment. Steps to reproduce: ------------------ * Create a pos payment method using adyen * Open a PoS session * Create an order with a product * Pay with the adyen payment method * Cancel the payment on the terminal * Leave the order * Create a new order with different products * Try to pay with the adyen payment method * Validate the payment on the terminal > Observation: The payment will not be transmitted to the PoS and the order will still be waiting for payment. Why the fix: ---------------- The issue occurs because the canceled payment line is still considered as a pending payment line. And when the payment will be receiven on the pos it would take the canceled payment line as the pending one. opw-4805704
Fixed an issue that prevented users from creating down payment invoices on Indian sales quotations when a reseller was selected. This keeps invoicing workflows from being blocked in reseller sales scenarios.
Original PR description
**Issue** When creating a down payment invoice for a quotation that includes a reseller, an error is raised and the operation is aborted. **Steps to Reproduce** 1. Install Accounting, Studio, and…
**Issue** When creating a down payment invoice for a quotation that includes a reseller, an error is raised and the operation is aborted. **Steps to Reproduce** 1. Install Accounting, Studio, and l10n_in_sale 2. Open the Quotation view in Studio 3. Set the "Referrer" field (i.e., l10n_in_reseller_partner_id) to be always visible and remove group restrictions 4. Create a new quotation and set a reseller in the Referrer field 5. Confirm the quotation 6. Click "Create Invoice" 7. Choose "Down Payment (percentage)" with 10% 8. Click "Create Draft" **Root Cause** The `_prepare_invoice_values()` method was assigning the full `res.partner` record to the `l10n_in_reseller_partner_id` field instead of its ID. Since the `account.move` model expects an integer ID for many2one fields, this caused a `psycopg2.ProgrammingError` due to the database adapter not being able to serialize a recordset. **Fix** Ensure the value passed to l10n_in_reseller_partner_id is the .id of the partner record, not the recordset itself. Opw-4899919 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes website menu setup so users cannot create menu structures that the website cannot display properly. It also enforces clearer rules for mega menus, helping keep navigation consistent and predictable for visitors.
Original PR description
Steps to Reproduce: 1. Go to the website. 2. Create a new menu (e.g., 'Test 1') using the 'Edit Menu' option and add it under another menu (e.g., 'Contact Us'), creating a sub-menu. 3. Turn on the…
Steps to Reproduce:
1. Go to the website.
2. Create a new menu (e.g., 'Test 1') using the 'Edit Menu' option and add it under another menu (e.g., 'Contact Us'), creating a sub-menu.
3. Turn on the developer mode.
4. Go to Configuration -> Menus and add two menus (e.g., 'menu 1' and 'menu 2') under the new sub-menu (e.g., 'Test 1').
5. Notice that the two menus ('menu 1' and 'menu 2') are not visible on the website.
Description:
As per functional specifications, creation of multi-level sub-menus should not be allowed.
Key Changes:
raises a `UserError` if a menu exceeds the two-level hierarchy by checking the parent and grandparent levels.
- Implements mega menu restrictions:
- A mega menu cannot have a parent menu.
- A mega menu cannot have child menus.
- Any menu cannot be a child of a mega menu.
- Prevents menus with child menus from being added as submenus to existing menus.
This ensures that the website menu structure adheres to the defined functional specifications, providing a consistent and predictable user experience.
task-3901371
Forward-Port-Of: odoo/odoo#168801The Spanish VAT books export now handles a missing company tax activity setting gracefully. Instead of showing an error, it directs users to complete the required company configuration so they can export the report successfully.
Original PR description
**Steps to reproduce:** 1. Install the `l10n_es_reports` module. 2. Remove the value from the `IAE Group or Heading` field in company settings. 3. Navigate to `Accounting -> Reporting -> Tax Report -> Generic Tax Report`. 4. Click the down arrow and select `VAT Record Books (XLSX)`. **Observed behavior:** * A traceback error occurs when attempting to export the VAT books. **Root cause:** * The system attempts to traverse the `IAE Group or Heading` field, which is empty, causing the traceback. **ref**: https://github.com/odoo/enterprise/blob/d8539dff5f3dcecfeb99fd7fc22a6915aaa02c4b/l10n_es_reports/models/libros_export.py#L126-L138 **Solution:** * If field `IAE Group or Heading` not configured, a RedirectWarning is raised to guide the user to the company form view for proper setup. opw-4981531 Forward-Port-Of: odoo/enterprise#91607
Odoo now avoids running out of memory when WhatsApp users send large files, such as uploads over 35 MB. This helps ensure incoming WhatsApp messages with larger attachments are received reliably instead of failing or missing content.
Original PR description
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB). Stack Trace: ``` MemoryError: null File "odoo/http.py", line 2383, in…
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB).
Stack Trace:
```
MemoryError: null
File "odoo/http.py", line 2383, in __call__
response = request._serve_db()
File "odoo/http.py", line 1913, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1976, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1943, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2187, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 227, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 757, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/controller/main.py", line 42, in webhookpost
wa_account_id._process_messages(value)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/models/whatsapp_account.py", line 206, in _process_messages
datas = wa_api._get_whatsapp_document(messages[message_type]['id'])
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 236, in _get_whatsapp_document
file_response = self.__api_requests("GET", file_url, auth_type="bearer", endpoint_include=True)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 46, in __api_requests
if 'error' in res.json():
File "requests/models.py", line 971, in json
return complexjson.loads(self.text, **kwargs)
File "requests/models.py", line 928, in text
encoding = self.apparent_encoding
File "requests/models.py", line 793, in apparent_encoding
return chardet.detect(self.content)["encoding"]
File "__init__.py", line 49, in detect
detector.feed(byte_str)
File "chardet/universaldetector.py", line 274, in feed
if prober.feed(byte_str) == ProbingState.FOUND_IT:
File "chardet/charsetgroupprober.py", line 70, in feed
state = prober.feed(byte_str)
File "chardet/hebrewprober.py", line 240, in feed
byte_str = self.filter_high_byte_only(byte_str)
File "chardet/charsetprober.py", line 73, in filter_high_byte_only
buf = re.sub(b"([\x00-\x7F])+", b" ", buf)
File "__init__.py", line 186, in sub
return _compile(pattern, flags).sub(repl, string, count)
```
At line [1], the code `'error' in res.json()` is used, which reads all the json content of `res`, but at times users upload large files, it will cause the above error because the `json()` tries to read all bytes from res, which is a very large amount to handle in memory.
This commit will fix the above issue by returning a response if the response
contains content_length more than 10 MB.
[1] - https://github.com/odoo/enterprise/blob/aca7ae2a7cf4aad5427a60d5cad60d08774357d0/whatsapp/tools/whatsapp_api.py#L46
sentry-5810101850
Forward-Port-Of: odoo/enterprise#70001Project profitability reports now keep previously invoiced amounts from subscriptions that were renewed. This prevents revenue from disappearing after renewal, giving businesses a more accurate view of project performance.
Original PR description
To reproduce: ============= - create a subscription with a service and link it to a project - confirm the subscription and invoice it - check the profitability of the project, everything is fine - renew the subscription and invoice it - check the profitability of the project, the invoiced amount is not taking into account the previous invoiced amount Problem: ======== renewed subscriptions are excluded from the profitability computation because they are closed by the renewal and not bringing any profitability, but with that we loose the profitability of the previous invoiced amount. Solution: ========= keep renewed subscriptions in computing `Invoiced` amount. opw-4755016 Forward-Port-Of: odoo/enterprise#91437
Fixes an issue where rental orders could incorrectly show products as unavailable after another order was picked up, even though stock was still available. Businesses using rentals without transfer documents now see accurate availability, reducing false warnings and order confusion.
Original PR description
Steps to reproduce:
- Do not enable “Rental Transfer” in settings
- Create a storable product “P1”:
- Enable “Can be rented”
- update available quantity to 10 units
- Create a first rental order for 24h:
- 9 units of P1
- Confirm the order
- Create a second rental order for the same 24h period:
- 1 unit of P1
-> Expected: The availability widget is green and indicates 1 unit available (correct).
Problem:
After picking up the first order, the widget on the second order turns red and incorrectly shows no availability.
The current logic checks virtual_available (1 unit) and subtracts rented_qty_during_period (9 units), resulting in -8. It then takes max(0, -8) → 0. However, the actual picked quantity should be taken into account, regardless of whether “Rental Transfer” is enabled, since disabling it merely omits the creation of a picking—not the move itself.
opw-4901017
opw-4906162
Forward-Port-Of: odoo/enterprise#91155The GSTR-1 document summary now excludes cancelled invoices that were never officially posted, improving the accuracy of Indian GST reporting. It also keeps the document summary visible and checks serial continuity within the relevant return period/company context.
Original PR description
Before: The document summary included all cancelled invoices, even those that were never posted. After: Only invoices that were posted and subsequently cancelled are now considered in the summary. Additional Changes: - Updated check_serials to validate serial continuity within current company. - Made the document summary view always visible in the GSTR-1 section. opw-4940053 Forward-Port-Of: odoo/enterprise#91965 Forward-Port-Of: odoo/enterprise#90160
EC sales list reports now correctly populate additional columns beyond the standard goods, services, and triangular columns. This prevents country-specific reports, such as Slovenia's five-column report, from showing empty values where data should appear.
Original PR description
Before this commit, when an ec sales list report had more than the 3 bases columns (goods, service, triangular) the value was not filled. For example in slovinia, the ec sales list has 5 columns, the two extras columns where always empty. task-4963633 Forward-Port-Of: odoo/enterprise#90669