Daily updates from Odoo
Friday, August 8, 2025
126 changes
46 changes
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
25 changes
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
Invoice PDFs now handle very long product descriptions more reliably when line-item tables continue onto additional pages. This prevents text from overlapping the table header, making printed invoices clearer and more professional for customers.
Original PR description
**Steps to reproduce**: 1. Install the `account` module. 2. Create a Invoice using this any product. 3. add long descripition (approx. 40-45 lines). 4. Print the PDF of Invoice (via gear icon).…
**Steps to reproduce**: 1. Install the `account` module. 2. Create a Invoice using this any product. 3. add long descripition (approx. 40-45 lines). 4. Print the PDF of Invoice (via gear icon). **Observation**: The long product description overlaps with the table header when the table spans multiple pages in the generated PDF. **Issue**: wkhtmltopdf does not handle multi-page table headers properly by default. causing header/content overlap when the table breaks across pages. **Solution**: Apply a known wkhtmltopdf workaround by explicitly setting: `<thead style='display: table-row-group;'>` This ensures headers will not repeat same as this. [#53909](https://github.com/odoo/odoo/pull/53909) before: <img width="818" height="231" alt="image" src="https://github.com/user-attachments/assets/8bcc6ced-5911-4abd-b91e-97ffa8fb735e" /> after: <img width="821" height="253" alt="image" src="https://github.com/user-attachments/assets/2ccc6995-c239-4beb-8f68-53d548b7f2f2" /> opw-4982735 Forward-Port-Of: odoo/odoo#222286 Forward-Port-Of: odoo/odoo#221681
Survey invitation emails now respect the subject line configured on the email template instead of replacing it with the default survey subject. This ensures customized survey invitations keep the intended wording when users share surveys by email.
Original PR description
Description of the issue/feature this PR addresses: When a user updates the subject on a template used for a survey, it does not pull the subject from the template. It uses the default subject that…
Description of the issue/feature this PR addresses:
When a user updates the subject on a template used for a survey, it does not pull the subject from the template. It uses the default subject that is used when computing the subject for a survey email that is sent out. This bug came as a part of [this commit](https://github.com/odoo/odoo/commit/220e0271bf43e914950b8ae0d4a1cca5f3ea6d9c).
I've used an elif condition over here as opposed to calling super which was being done before so that the default of Participate to X survey still becomes the default subject.
opw-4654411
Steps to reproduce on runbot:
1. Go to mail templates and search for Survey
2. Open the Survey: Invite template
3. Update the subject on this template
4. Open the Surveys app and select any survey
5. Click on Share and then enable send by email
6. The subject here will default to "Participate to {Survey Name}"
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#219122
Forward-Port-Of: odoo/odoo#211153Manufacturing 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
This update rolls back a previous web interface change that caused an unwanted horizontal scroll bar on form pages. The revert restores the prior behavior while the team prepares a better fix for editor avatars overlapping the status bar during scrolling.
Original PR description
This reverts commit 72acbe0 because of unexpected horizontal inner scroll on `o_form_sheet_bg` element. A better fix will be found in the futur.
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#168801Accounting administrators without expense permissions can now create their own expense reports without triggering a confusing validation error. To prevent mistakes, those users are no longer allowed to create expenses on behalf of other employees unless they have the proper expense access rights.
Original PR description
- Create a user and its related employee without any expense access rights but with accounting admin rights. - With that user create a new expense. - On the employee field select a different employee…
- Create a user and its related employee without any expense access rights but with accounting admin rights. - With that user create a new expense. - On the employee field select a different employee and save. - The following error appears: Validation Error The operation cannot be completed: Missing required value for the field 'Description' (name). Model: 'Expense' (hr.expense) - create/update: a mandatory field is not set - delete: another model requires the record being deleted, you can archive it instead Since b1ac6f52d37cd59fdb973ce87f93d1d0a69dd204, the field employee_id is no longer invisible for users without hr_expense rights. However, in the method _search_filter_for_expense, users without hr_expense rights but with account rights are able to select every employee (commit 87cca4a9ee64c890ccbd24e2d6766f9f8799a0c0). But in hr_expense, the method _compute_is_editable only considered hr_expense rights, which meant that users trying to create a new expense with only accounting rights would get an error if they were not the approver of the employee they tried to create the expense for. After this commit: If the user has no hr_expense rights but has account rights, they will only be able to create expenses for themselves. opw-4780218 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215452
Changing 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 Task Analysis report in Field Service now keeps the correct Field Service filter when users drill into pivot report numbers. This prevents unrelated tasks from appearing and helps teams review accurate operational details.
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 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
This fix keeps the standard expiration message when an expiration is related to upsells rather than renewals. This avoids showing renewal-specific messaging in cases where it does not apply, making the customer-facing notice clearer and more accurate.
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
EC Sales List reports now correctly populate values when a country-specific report has more than the standard three columns. This prevents extra required columns, such as those used in Slovenia, from appearing empty and supports more accurate tax reporting.
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
Demo employee contracts for Egypt, Saudi Arabia, and Turkey now use the appropriate local payroll structures. This prevents Belgian payroll settings from being applied accidentally when the Belgian payroll module is also installed, making demo data more reliable for evaluations and testing.
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 avoids taking focus back after a call when the user is typing in another field. This prevents interruptions and accidental input issues during everyday call handling.
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.
Hong Kong payslips now show the employee's regular name when surname and first name fields are not filled in. This prevents payslips from displaying 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
3 changes
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
This fix prevents an occasional error when users quickly leave an account return view while background checks are still running. It improves reliability by ensuring the page does not try to update a view that has already been closed.
Original PR description
Fix the following issue that could be triggered quite randomly. To reproduce it, the easiest way is to set a timeout between the 2 await functions in the function runCurrentReturnChecks() and…
Fix the following issue that could be triggered quite randomly.
To reproduce it, the easiest way is to set a timeout between
the 2 await functions in the function runCurrentReturnChecks()
and switching quickly from the audit kanban view to a return view
a few times.
The issue occurs because the refresh_check function might take
a few seconds to compute, and if the user leaves the view before
it finishes, the second await function was triggered on a
destroyed component.
UncaughtPromiseError
Uncaught Promise > Component is destroyed
Error: Component is destroyed
at Object.original (http://localhost:8069/web/assets/debug/web.assets_web.js:47514:31) (/web/static/src/core/utils/hooks.js:109)
at Object.fn (http://localhost:8069/web/assets/debug/web.assets_web.js:47507:21) (/web/static/src/core/utils/hooks.js:102)
at ORM.call (http://localhost:8069/web/assets/debug/web.assets_web.js:47524:52) (/web/static/src/core/utils/hooks.js:119)
at ORM.webRead (http://localhost:8069/web/assets/debug/web.assets_web.js:33931:21) (/web/static/src/core/orm_service.js:307)
at props.list.model.load (http://localhost:8069/web/assets/debug/web.assets_web.js:227868:55) (/account_reports/static/src/components/account_return/views/account_return_check_kanban_renderer.js:87)
at async props.list.model.load (http://localhost:8069/web/assets/debug/web.assets_web.js:227866:36) (/account_reports/static/src/components/account_return/views/account_return_check_kanban_renderer.js:85)
at async Object.onClose (http://localhost:8069/web/assets/debug/web.assets_web.js:102138:29) (/web/static/src/views/view_button/view_button_hook.js:95)
at async Object.doActionButton (http://localhost:8069/web/assets/debug/web.assets_web.js:106405:9) (/web/static/src/webclient/actions/action_service.js:1579)
at async execute (http://localhost:8069/web/assets/debug/web.assets_web.js:102144:21) (/web/static/src/views/view_button/view_button_hook.js:101)
at async executeButtonCallback (http://localhost:8069/web/assets/debug/web.assets_web.js:102072:15) (/web/static/src/views/view_button/view_button_hook.js:29)
task-499155826 changes
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
General notes added to a Point of Sale order are now included on the related accounting invoice. This keeps customer-facing documents consistent and prevents important checkout notes from being lost after invoicing.
Original PR description
**Issue** When a POS order is completed with a general note, the note appears on the POS receipt but is missing from the generated accounting invoice. **Steps to Reproduce:** 1. Install Accounting and Point of Sale apps. 2. Start a POS session. 3. Add a product and a general note via Actions → General Note. 4. Add a customer and enable invoicing. 5. Complete the order. **Expected Behavior:** The general note appears in both the POS receipt and the accounting invoice. **Actual Behavior:** The note only appears in the POS receipt. **Root Cause** The _prepare_invoice_lines method only handles customer notes. General notes are not processed and thus excluded from the invoice report.https://github.com/odoo/odoo/blob/ba779f01975c4665eb84086d86b167a2c0f9625e/addons/point_of_sale/models/pos_order.py#L251-L255 opw-4747903 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents the Spanish Veri*Factu e-invoicing module from failing during installation when certain optional tax records have been removed. Businesses can install or enable the module more reliably without being blocked by missing tax setup data.
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#222225
The website builder now correctly restarts the loading progress bar each time a user switches themes. This avoids a confusing stuck loader during repeated theme changes and makes the theme switching process feel reliable.
Original PR description
__Current behavior before commit:__ When switching a theme, the website loader is displayed with a progress bar. When the operation is finished, the loader is hidden and the progress bar interval is cleared. However, the variable holding the interval ID is not being reset. If the user switch theme a second time, the `initProgressBar` method doesn't start a new interval because its initial guard finds the old interval ID and exit prematurely. This resulted in the progress bar appearing to be stuck. __Description of the fix:__ This commit fixes the issue by removing the initial guard of the `initProgressBar` method. __Steps to reproduce:__ 1. Open the Website builder 2. Click on the "Theme" tab 3. Click on "Switch Theme" 4. Choose a Theme 5. The loader is progressing 6. Do every steps again 7. The loader is stuck at the beginning
Invoice PDFs sent by email now use the same customized file name as invoices printed manually. This keeps customer communications consistent and avoids confusion when businesses rename their invoice reports.
Original PR description
**Steps to reproduce**: - install the `accounting` module. - Go to `Settings -> Technical -> Actions -> Reports -> Invoice or Invoice without payment` - Change the printed report name - Try to print…
**Steps to reproduce**:
- install the `accounting` module.
- Go to `Settings -> Technical -> Actions -> Reports -> Invoice or Invoice without payment`
- Change the printed report name
- Try to print the report via the print menu (gear icon -> print) -> The report is shown with the new updated name.
- Try sending the invoice the regular way -> the attached invoice has the default name, Odoo ignores the changes.
**Observation**:
When printing the invoice manually, the file name correctly reflects the custom name configured in the report action. However, when sending the invoice by email, the attachment file name does not match the updated name and remains hardcoded.
**Issue**:
The email attachment file name is hardcoded in the mail sending logic. in the method:
```python
def _get_invoice_report_filename(self, extension='pdf'):
self.ensure_one()
return f'{self.name.replace('/', '_')}.{extension}'
```
It does not dynamically fetch the updated report name from the configured report action.
**Solution**:
When a custom report template is configured on the customer on field `(invoice_template_pdf_report_id)`, the system now dynamically uses the corresponding name from the report action for the email attachment.
opw-4923035This fix updates internal file type tests so they pass consistently whether an optional detection library is installed or not. It helps keep the testing process stable across different Odoo environments without changing end-user behavior.
Original PR description
Those tests are failing when python-magic is installed. Since 26f9c82b99 Odoo > saas-18.4 has this lib as a requirement and comes with appropriate fixes. This commit adapts some test for versions prior to saas-18.4 to also work when the python-magic lib is installed. Forward-Port-Of: odoo/odoo#221269 Forward-Port-Of: odoo/odoo#221045
This fixes an issue where choosing a font size could leave the editor visibly selected but unable to accept typing. Users can now continue editing normally after selecting a font size, reducing confusion and interrupted writing workflows.
Original PR description
### Steps to reproduce: - Go to the To-Do app and type something in the editor. - Select the typed text. - Click on the Font Size Input and choose a value from the dropdown (e.g.,80). - Try typing…
### Steps to reproduce: - Go to the To-Do app and type something in the editor. - Select the typed text. - Click on the Font Size Input and choose a value from the dropdown (e.g.,80). - Try typing again in the editable area. - Selection is still visible, the focus is no longer in the editable area. ### Description of the issue/feature this PR addresses: - `focusEditable()` skipped restoring focus if the selection was inside the editor, even when the editor itself wasn’t focused. - When the font size input (inside an iframe) is focused, editable loses focus. - Selecting a value from the dropdown blurs the iframe input, but focus is not returned to the editable area. - As a result, the selection is still visible but the user cannot type. ### Desired behavior after PR is merged: - Does nothing if the editor or its descendants have focus. - Focuses the editor if needed. - Restores selection only when it's outside the editor. - When the iframe input is blurred, focus is returned to the editable area. task-4932364 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Invoice PDFs now handle very long product descriptions more reliably when line-item tables continue onto another page. This prevents text from overlapping the table header, making printed invoices clearer and more professional for customers.
Original PR description
**Steps to reproduce**: 1. Install the `account` module. 2. Create a Invoice using this any product. 3. add long descripition (approx. 40-45 lines). 4. Print the PDF of Invoice (via gear icon).…
**Steps to reproduce**: 1. Install the `account` module. 2. Create a Invoice using this any product. 3. add long descripition (approx. 40-45 lines). 4. Print the PDF of Invoice (via gear icon). **Observation**: The long product description overlaps with the table header when the table spans multiple pages in the generated PDF. **Issue**: wkhtmltopdf does not handle multi-page table headers properly by default. causing header/content overlap when the table breaks across pages. **Solution**: Apply a known wkhtmltopdf workaround by explicitly setting: `<thead style='display: table-row-group;'>` This ensures headers will not repeat same as this. [#53909](https://github.com/odoo/odoo/pull/53909) before: <img width="818" height="231" alt="image" src="https://github.com/user-attachments/assets/8bcc6ced-5911-4abd-b91e-97ffa8fb735e" /> after: <img width="821" height="253" alt="image" src="https://github.com/user-attachments/assets/2ccc6995-c239-4beb-8f68-53d548b7f2f2" /> opw-4982735 Forward-Port-Of: odoo/odoo#221681
This fix ensures that when users turn formatted text into a button in the HTML editor, the selected font size remains visible. It prevents button styling from unintentionally overriding text formatting, making edited content appear as expected.
Original PR description
### Steps to reproduce: - Type some text and apply a large font-size. - Select the text and apply the button style. - Notice that the font-size is not reflected on the button. ### Description of the…
### Steps to reproduce: - Type some text and apply a large font-size. - Select the text and apply the button style. - Notice that the font-size is not reflected on the button. ### Description of the issue/feature this PR addresses: - The `<a class=btn>` element was placed inside a font-size `<span>`. - However, the `.btn` class defined its own font-size, causing the original styling to be overridden. ### Desired behavior after PR is merged: - Improved the splitAroundUntil utility to correctly handle cases where the target node has no previous or next sibling. In such edge cases, the function now recursively splits up the inline ancestry until the specified limitAncestor, ensuring that the target node is fully isolated. - The font-size `<span>` is moved inside `<a>` tag when applying a button style. - This ensures the original font-size is preserved and correctly displayed. task-4731416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates an accounting payment test so it no longer depends on the hardcoded year 2025. It prevents the automated test from failing when the calendar moves to 2026, helping keep future maintenance and release checks stable.
Original PR description
The test test_resequence_change_payment_name had hardcoded 2025 in the sequence name, meaning that the test will fail in 2026. opw-4437481 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
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
Updates the Spanish descriptions for IIBB sales perceptions in Argentina so San Juan, San Luis, and Santa Fe show their full jurisdiction names. This helps accounting users identify the correct taxes more clearly and consistently when configuring or reviewing sales taxes.
Original PR description
**Description of the issue/feature this PR addresses**: It is needed to ensure that the descriptions for the IIBB perceptions are consistent and correctly reflect the complete name of the…
**Description of the issue/feature this PR addresses**: It is needed to ensure that the descriptions for the IIBB perceptions are consistent and correctly reflect the complete name of the jurisdictions they apply to. **Steps to reproduce**: 1) Go to runbot odoo 18 instance, install l10n_ar module, take position on Argentinean company and activate "Spanish (Latin America)" language. 2) Go to "Accounting / Configuration / Accounting / Taxes", filter by "Sales" Tax Type (type_tax_use) and see that Perc IIBB San Juan, Perc IIBB San Luis and Perc IIBB Santa Fe don`t have the complete description. It is needed to show the complete description. <img width="1825" height="307" alt="image" src="https://github.com/user-attachments/assets/f664e5ec-a4b5-4a8f-bbab-9ba3d824bd2b" /> **Current behavior before PR**: Perc IIBB San Juan, Perc IIBB San Luis and Perc IIBB Santa Fe taxes don`t have the complete description. **Desired behavior after PR is merged**: Perc IIBB San Juan, Perc IIBB San Luis and Perc IIBB Santa Fe taxes have the complete description. <img width="1828" height="425" alt="image" src="https://github.com/user-attachments/assets/dc8ee6dd-23c3-40c1-a973-943971e3cb78" /> **Task Adhoc side**: 53028 **Task latam side**: 1356 --- 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#168801To reproduce: ============= 1- Enable the Dutch/Nederlands language, 2- Preview the Dutch version of the Event: Registration Confirmation email template. Problem: ======== The phrase "te bevestigen" was placed between <t t-if> and <t t-else> blocks, which caused the error. Solution: ========== Moved "te bevestigen" inside both branches to keep the same sentence structure. opw-4936790 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Original PR description
To reproduce: ============= 1- Enable the Dutch/Nederlands language, 2- Preview the Dutch version of the Event: Registration Confirmation email template. Problem: ======== The phrase "te bevestigen" was placed between <t t-if> and <t t-else> blocks, which caused the error. Solution: ========== Moved "te bevestigen" inside both branches to keep the same sentence structure. opw-4936790 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The 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
A test for importing accounting journals now uses the correct spreadsheet file type. This prevents environment-specific failures when file detection tools are installed, improving reliability of the accounting import test suite.
Original PR description
[FIX] account_base_import: fix mime type The `test_duplicate_journals_import` test fails when the magic lib is present. While the `xlsx` detection is supported, the test calls the import wizard with `xlsx` files but `application/vnd.ms-excel` as the file type which is for `xls` files. With this commit, the appropriate file type is given and the test works in all cases. (tested with Docker16, PureNoble and PureBookworm docker files) Forward-Port-Of: odoo/enterprise#91375 Forward-Port-Of: odoo/enterprise#91267
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#91155This fixes an intermittent automated test failure in the barcode inventory flow by making the test wait for the destination change to appear before continuing. It helps keep validation checks stable and reduces false failures in quality assurance runs.
Original PR description
A non-deterministic error has been occurring across all versions starting from 18.0 when running the `test_split_line_on_destination_scan`. problem: The issue lies in one of the steps of the tour,…
A non-deterministic error has been occurring across all versions starting from 18.0 when running the
`test_split_line_on_destination_scan`.
problem:
The issue lies in one of the steps of the tour, where the destination location of the remaining quantity is changed from WH/Stock to shelf1 (LOC-01-01-00). Right after this change, the test proceeds to assertLineDestinationLocation. However, the test step was previously waiting for the presence of the .o_validate_page.btn-primary element — an element that is already visible before the destination location update is actually applied. As a result, the tour sometimes skips to the next step prematurely, without ensuring the location change has occurred, leading to test failure.
Fix:
We replaced the trigger .o_validate_page.btn-primary with a more reliable condition: waiting for an element containing the destination text .../Section 1 (.o_line_destination_location:contains(".../Section 1")). This ensures that the step only proceeds once the destination update has been reflected in the UI.
Runbot-145458The 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