Friday, August 8, 2025
46 changes · saas-18.4
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
Users can now move content snippets between empty drop zones on shop pages without the action being cancelled. This makes page editing more reliable when arranging eCommerce content around product sections.
Original PR description
Steps to reproduce: - With eCommerce installed, go to the /shop page and go in edit mode. - Drop a "Text - Image" snippet on the dropzone above the products. - Drag this snippet and drop it on the dropzone under the products. => Nothing happens, the drag and drop was cancelled. This happens because the code checking if a change happened (in order to cancel the drag and drop if there is none) was only checking if the new siblings are the same as the old ones. This check is wrong when the dragged snippet had no siblings and is then dropped in an element where it ends up with no siblings too, as both the old and the new ones are `null`, making the condition `true` and cancelling the move. This commit fixes that by also checking if the parent is the same as the old one, making all possible situations covered. task-4367641
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 makes an automated website test more stable by allowing extra time for a popup to appear before checking that it closes correctly. It helps reduce random test failures in the validation pipeline, giving teams more confidence in release checks without changing customer-facing behavior.
Original PR description
Before to this commit, the ‘closing s_popup with the X button updates the invisible elements panel’ test failed from sometimes on runbot. We think boostrap.js takes longer than normal to display the popup. Solution: We're going to increase the waiting timeout so that the crash doesn't recur. We've taken this decision because the problem is very specific and probably link to bootstrap.js. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This 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
Saving website pages now resets carousels to their first slide in a way that avoids errors in Product snippets. This helps prevent editor save failures and keeps carousel content consistent after editing.
Original PR description
When saving the editor, the carousels are restored so they all have their first slide as the active one. Before the refactoring, it was done manually (so the attributes and classes were adapted explicitely). But with the refactoring, it is now done automatically by sliding the carousels to the first slide. This causes a traceback when saving the "Products" snippets, because it has no control indicators. Note that the traceback does not appear since commit [1], but it was only fixed by chance. [1]: 80b5db99a3c26c3dd4fb5c55e04b8813dddb5b8d 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#168801Closing the website theme picker no longer triggers an error after starting a theme switch. This prevents an unnecessary interruption for website editors and lets them exit the theme selection flow normally.
Original PR description
How to reproduce:
================
- Switch to debug mode
- Edit a website page
- Switch to the theme tab
- Click on switch theme
- Click on ok (dialog)
- Close the Pick a Theme action (close button).
Before this commit:
We have an error validating the props. websiteId is equal to null which
is not an accepted value.
After this commit:
The action closes correctly.
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fixes an issue where meetings created from a contact could lose the intended contact link because an empty identifier was saved instead of the expected default. Users should now see newly created meetings correctly associated with the selected contact, improving reliability in calendar scheduling workflows.
Original PR description
To reproduce:
=============
- Pick any contact
- Click on meeting
- Select the time for the meeting with that contact
- Click on more options
- Add a meeting and save
- Click on meeting & contact
Problem:
========
- When creating calendar events, res_id=0 is passed in vals_list
- Events are created with res_id=0 instead of using default value
Solution:
=========
- Add separate handling for res_id in vals_list processing
- Apply defaults.get('res_id') when vals.get('res_id') is falsy
opw-4892445
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#221993
Forward-Port-Of: odoo/odoo#216042This 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
Previewing and then leaving a website builder option no longer marks unchanged pages as modified. This prevents unaffected website or report views from being saved unnecessarily, reducing accidental updates and improving editing reliability.
Original PR description
Before this commit, in the website builder, previewing an option could
ley the o_dirty class, which caused an unaffected view to be saved.
Why:
===
When the preview is removed, normalise is called, which can add
mutations to the DOM, and handleNewRecords was called afterwards,
which caused the addition of o_dirty.
Solution:
========
We believe that o_dirty should only be added to views that have been
modified by the user and not by normalise. handleNewRecords should ignore
mutations created by normalise.
How to reproduce:
================
- Go to the website builder.
- Preview an action.
- When you unpreview, normalise should modify the DOM.
Before this commit:
The o_dirty class is present.
After this commit:
The o_dirty class is not present because no user modifications have taken place.
This commit will fix the same type of problem in the report editor.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
Notification messages for invitation emails and password reset instructions now use corrected grammar. This improves the clarity and professionalism of user-facing communication without changing any functionality.
Original PR description
**Before this commit:** - The notifications for `Send an Invitation Email` and `Send Password Reset Instructions` contained grammatical mistakes. **After this commit:** - The grammatical mistakes have been corrected. task-4975439 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220840
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
This fix makes internal links from website navigation popovers behave like regular website links while editing. It keeps users in the expected website editing context, avoiding pages opening outside the backend editing experience.
Original PR description
Reproduction: 1. click a nav bar menu link, wait for the popover 2. click the link in the popover, the page is opened in another tab out of the backend. For a link having an internal link in the normal editing zone, the opened page is in backend, e.g. the `Edit` button is shown. After this commit: we set the website link_popover template inherit mode as `extension` to alter the template directly instead of creating a new one. All the inheritance of the link_popover will be properly have website feature when website is installed --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
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
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log int
Original PR description
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct…
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log into to one of the demo Argentinean Companies: (AR) Responsable Inscripto 4. Create a customer invoices of type "B" 5. Go to the partner and change the Language to Spanish 6. Return to the invoice and print the PDF 7. Check that the VAT Content section is not translated. ### **Current behavior before PR:** <img width="572" height="407" alt="image" src="https://github.com/user-attachments/assets/e28e609e-2cd2-4ace-9509-f969692ec893" /> ### **Desired behavior after PR is merged:** The "VAT Content section should appear as "IVA Contenido" when printing the report in Spanish. opw-4938520 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221832 Forward-Port-Of: odoo/odoo#219912
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
This fix prevents module installation from failing when an index definition is empty or missing. Odoo now skips those invalid index requests instead of sending them to the database, making installations more reliable without changing user-facing behavior.
Original PR description
Currently when trying to create an index with a falsy definition, either a string or a callable, psql raises a SyntaxError preventing the installation of the module. This commit fixes that by skipping the index creation in case of a falsy definition. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222188 Forward-Port-Of: odoo/odoo#222080
This fix prevents an error when a company installs its chart of accounts after initial setup and then validates the Tax Returns onboarding flow. It ensures the required accounting onboarding is available, helping users complete fiscal year setup without interruption.
Original PR description
For companies that didn't have COA installed, they didn't have onboarding created leading to traceback when setting up fiscal year onboarding for Tax Returns. Steps to reproduce: * A company installed but don't have COA. * Install COA from settings. * In Accounting Dashboard -> Tax Returns * Traceback when validating the return wizard. task-4981853 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222181
Drilling into Task Analysis report counts now shows only the relevant Field Service tasks instead of all tasks. This keeps report details aligned with the selected Field Service data and reduces confusion for users reviewing workload or assignments.
Original PR description
Issue: - When the user drills down in the pivot view, all tasks are displayed. Cause: - The action was not passing the FSM project domain. Fix: - In this commit, we have passed the FSM project domain, so that only the relevant FSM tasks will be displayed during drill down. Steps to reproduce: - Install the industry_fsm module. - Go to Industry > Reporting > Task Analysis. - Group by Assignees. - Check any count column number and drill down. task-4688139 Forward-Port-Of: odoo/enterprise#83295
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
Demo employee contracts for Egypt, Saudi Arabia, and Turkey now use their correct local payroll structures. This prevents demo data from accidentally using Belgian payroll settings when the Belgian localization is also installed, making payroll demonstrations and testing more reliable.
Original PR description
*: eg, sa, tr - Assign the correct payroll structure to employee contracts in demo data to prevents incorrect assignment of the Belgian payroll structure when l10n_be is installed. Task: 4862722 Forward-Port-Of: odoo/enterprise#87409
The VoIP softphone now checks whether the user is typing in another field before taking focus back after a call. This prevents interruptions and helps users continue their work without losing their place.
Original PR description
Before switching the focus back to the softphone after a call, make sure the user isn't typing somewhere else. Only autofocus if the focus is not on an editable element. Task-4997513. Forward-Port-Of: odoo/enterprise#89562
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 salary configuration now leaves the employee state field truly blank when no state is chosen. This prevents new employee records from being assigned the first available state by mistake, improving data accuracy during salary setup.
Original PR description
When using the salary config, the state (private_state_id) shows that no state is set, but the selector actually thinks the first element is selected. So when the employee is created, the state is set anyway. This forces the selector to not have anything selected by default. Task: 4904118 Forward-Port-Of: odoo/enterprise#89958
EC sales list reports now correctly populate values in additional columns beyond goods, services, and triangular transactions. This ensures country-specific reports, such as Slovenia's five-column format, show complete information for compliance review.
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
This fixes the expiration panel so upsell-related expirations keep the standard expiration message instead of being treated like renewal expirations. Business users will see more accurate messaging, reducing confusion around subscription status and next steps.
Original PR description
Upsell expiration are not handled the same way as renewal expiration, so we can keep the default expiration message for any expiration reasons other than a renewal Forward-Port-Of: odoo/enterprise#91839 Forward-Port-Of: odoo/enterprise#91730
Hong Kong payroll now uses the employee’s general name when surname and first name are not filled in. This prevents payslips from showing an empty or incorrect legal name, improving clarity for payroll documents.
Original PR description
Explanation: In hong kong payroll, the legal name is joined by surname and first name. However both fields are not madatory therefore it will display False on Payslip. After this commit, it will display the name field when both surname and first name are not used. opw-4944968 Forward-Port-Of: odoo/enterprise#90250
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 prevents a payroll test from failing when the Belgian payroll module is installed without the accounting module. It keeps test setup compatible with the module's actual dependencies, reducing false failures during quality checks.
Original PR description
Reproduce: Run `TestPayrollSocialBalanceSheet` with only `l10n_be_hr_payroll` installed. Issue: The test setup uses `'account.journal'` to set a default account for cp200_salary_structure. Since `l10n_be_hr_payroll` does not depend on `account`, this raises an error when the account module is not installed. Fix: Add a check to ensure 'account.journal' exists in the environment before using it. Task: 5002551
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