Daily updates from Odoo
Navigate
Branch
Friday, August 8, 2025
87 changes
1 change
Resolved issues and error corrections
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
55 changes
New functionality added to Odoo
Spreadsheets can now show several charts inside one carousel figure, letting users switch between charts with tabs instead of placing each chart separately. The CRM pipeline dashboard was updated to use the latest spreadsheet capabilities, improving dashboard presentation and navigation.
Original PR description
A new type of figure, the carousel, was added. This figure allows to display multiple charts in a single figure, with a tabbed interface to switch between them. To implement this, we had to de-correlate the figureId and the chartId, as a figure can now contain multiple charts. This required a bunch of changes through the codebase. Task: [4981828](https://www.odoo.com/odoo/2328/tasks/4981828)
Enhancements to existing features
This update adds detailed logging for AI agent activity, helping teams understand how AI requests use tokens, tools, and time. It improves visibility for troubleshooting and cost/performance monitoring without changing the normal user experience.
Original PR description
This commit introduces comprehensive logging for AI agent API interactions, providing visibility into token usage, API calls, and tool execution patterns. The logging system tracks: - API calls with…
This commit introduces comprehensive logging for AI agent API interactions,
providing visibility into token usage, API calls, and tool execution patterns.
The logging system tracks:
- API calls with estimated token counts (input/output)
- Tool execution (sequential vs batch)
- Timing information for API calls and tool execution
- Summary statistics including total estimated tokens, API calls, tools, and batches
Append `--log-handler odoo.addons.ai:DEBUG` when starting the server to see the
detailed logs.
Example output:
```
DEBUG [AI Prompt] <context>
<session-info>
<user id="2" name="Mitchell Admin" model="res.users"/>
<partner id="3" name="Mitchell Admin" model="res.partner"/>
<company id="1" name="My US Company" model="res.company"/>
</session-info>
</context>
<query>
pos orders from restaurant configs containing products from the food categ
</query>
DEBUG [AI Response] Starting generation for model 'gemini-2.5-flash'
DEBUG [AI API Call #1] Sending request with 44360 tokens
DEBUG [AI API Call #1 - →] Received single tool call (3.99s, 16 tokens)
DEBUG [AI Tool →] 'AI: Get Menu Details' with args (menu_ids=[613])
DEBUG [AI Tool - 0.02s] Completed 'AI: Get Menu Details'
DEBUG [AI API Call #2] Sending request with 45432 tokens
DEBUG [AI API Call #2 - ⚡] Received Batch #1, 4 tool calls (2.90s, 77 tokens)
DEBUG [AI Tool - Batch #1 ⚡] 'AI: Get Fields' with args (model_name='pos.order')
DEBUG [AI Tool - Batch #1 - 0.02s] Completed 'AI: Get Fields'
DEBUG [AI Tool - Batch #1 ⚡] 'AI: Get Fields' with args (model_name='pos.order.line')
DEBUG [AI Tool - Batch #1 - 0.01s] Completed 'AI: Get Fields'
DEBUG [AI Tool - Batch #1 ⚡] 'AI: Get Fields' with args (model_name='product.product')
DEBUG [AI Tool - Batch #1 - 0.06s] Completed 'AI: Get Fields'
DEBUG [AI Tool - Batch #1 ⚡] 'AI: Get Fields' with args (model_name='pos.category')
DEBUG [AI Tool - Batch #1 - 0.01s] Completed 'AI: Get Fields'
DEBUG [AI Tool Summary] Batch #1 completed, 4 tool calls
DEBUG [AI API Call #3] Sending request with 50602 tokens
DEBUG [AI API Call #3 - →] Received single tool call (2.98s, 86 tokens)
DEBUG [AI Tool →] 'AI: Open Menu List' with args (menu_id=613, model_name='pos.order', selected_filters=[], selected_groupbys=[], search=['config_id=restaurant'], custom_domain='[["lines.product_id.po
DEBUG [AI Tool - 0.02s] Completed 'AI: Open Menu List'
DEBUG [AI Summary] Total: 10.01s | API calls: 3 (9.87s) | Tools: 6 (0.13s) | Tokens: 140573 (in: 140394, out: 179) | Batches: 1
```This update reorganizes shared discussion action settings used by live chat and related messaging features. It should make the messaging experience easier to maintain and more consistent across support conversations, with no major user-facing change expected.
Website editors can now configure dynamic appointment snippets to show a single selected record as well as filtered record lists. This makes it easier to build focused website sections, while a loading effect improves the editing experience when snippet content is refreshed.
Original PR description
Currently, dynamic snippets only support filters to display records. This commit improves the current implementation, and allows users to select a single record directly in the snippet (which should automatically switch to the "single record" mode, when the number of records to fetch is set to "one"). - Generic snippets can switch between models, while specific ones will limit selection to their related model. - A loading effect was added while fetching snippet content. Remark: The current diff uses default placeholder templates, which designers will update (see TODO comments). This enhances snippet flexibility, enabling "mono-record" snippets similar to existing dynamic ones. Community PR: https://github.com/odoo/odoo/pull/190514 task-4280375 Co-authored-by: Antoine (anso) <anso@odoo.com>
This update organizes web client translation text more clearly across areas such as Documents Spreadsheet, Sign, and IAP Extract. It helps keep labels and messages easier to manage for multilingual users, with no expected change to everyday workflows.
The Indian GSTR-3B report has been updated to correct calculation issues and better match the government filing format. New and expanded sections make the report more complete, helping businesses review GST information more accurately before filing.
Original PR description
These improvements resolve all calculation errors, add new sections 3.1.1, 5.1, and introduces subsections C and D to section 4(A). The report format has also been updated to align with the government site layout. **task**-4034448
Duplicating a project now also duplicates the files in its document folder, including projects created from sales order templates. Demo data was added so users can see the project top bar preferences carried over when a templated project is created.
Users can now use "Sign Now" when eMSigner is only required for the final signer, while unsupported multi-document actions are hidden to avoid confusion. The update also prevents an error when SMS authentication is used, making the signing process smoother and more reliable.
Original PR description
Before: - If any signer used the eMSigner authentication method, the "Sign Now" option was disabled. - eMSigner does not support signing multiple documents in a bundle, so a warning was shown when…
Before: - If any signer used the eMSigner authentication method, the "Sign Now" option was disabled. - eMSigner does not support signing multiple documents in a bundle, so a warning was shown when users tried to add more documents. - After merging `sign_emsigner`, a traceback occurred when signing with the 'sms' method because `_validate_auth_method` was called with an unexpected `frame` parameter. After: - The "Sign Now" option is now allowed when eMSigner is used only by the last signer. - It remains blocked if eMSigner is used by any signer other than the last one. - Instead of showing a warning, the "Add Document" button is now hidden when eMSigner is selected. - Add `*(kwargs` while calling `_validate_auth_method` auth method when auth method is 'sms' which prevent the issue of parameter. Impact: - Users can complete signing even when the last signer uses eMSigner, improving workflow efficiency. - The interface is cleaner and prevents confusion by hiding options that are not supported. - The fix for the 'sms' method prevents errors and ensures smoother signing for all supported authentication methods. - Overall, this change improves usability, reduces errors, and provides a better user experience. task-4815486
First-time bank account synchronization now creates a proper opening bank statement instead of a dummy transaction. This prevents misleading entries and helps ensure accounting balances start accurately from the bank's real transaction and balance data.
Original PR description
Before: - When syncing a bank account for the first time, the system created a dummy bank statement line to fill missing statement data. - This was not linked to a real transaction and could confuse users or lead to inaccurate reporting. After: - Replaced the dummy statement line logic with the creation of a proper opening bank statement. - The system now accurately sets the starting balance and the current balance based on the imported transactions. - This logic only applies when no previous bank statement lines exist for the journal and the current balance differs from the sum of imported transactions. Impact: - Prevents creation of fake bank transactions and journal entries during initial sync, ensuring accurate accounting from the start. - Improves performance and reliability by calculating the correct opening balance using real transaction data and provided bank balance. TaskID-4815622 Forward-Port-Of: odoo/enterprise#90070
Sales achievement report lines now show the related customer directly, so users can identify who each line is for without opening the source document. This makes the report easier to review and saves time when checking commissions from invoices, sales orders, or subscriptions.
Original PR description
Before: * The Sales Achievement Report didn’t show which customer each line referred to. * To find out, users had to open the linked invoice, sale order, or subscription. After: * The report now displays the customer name (`partner_id`) directly on each achievement line. * The customer information is pulled from: * Invoices (`account.move`) * Sale orders (`sale.order`) * Subscriptions (via `sale_order_log` linked to `sale.order`) Impact: * Makes the report easier to read and understand at a glance. * Saves time by letting users identify the customer without needing to click into each document. task-4501131
VAT return attachments such as PDFs and XML files are now visible again from the related closing entry, making it easier for users to find supporting documents. Draft entry reviews now show the accounting date for better context, and the Accounting Periods setup wizard no longer marks the Opening Date as invalid before the user submits it.
Original PR description
There are 3 improvements here: - Attaching PDF and other documents in closing entry moves (like previously) - Showing the Accounting date by default on draft entries check - Preventing the Opening…
There are 3 improvements here: - Attaching PDF and other documents in closing entry moves (like previously) - Showing the Accounting date by default on draft entries check - Preventing the Opening Date field to be red when creating a Accounting Periods wizard In version 18.2, when a closing entry move was generated, the PDF (and other files such as XML) would be send in the chatter. In version 18.3, the Tax returns were changed to have the attachment generated when marking the Tax return as submitted and would be available on the Tax return line. You would still be able to see the closing entry move by using the thre dots next to the Tax return line and selection "View entry" but the attachment wouldn't be included in the chatter anymore. Now, the same attachments from the Tax report line are included in the closing entry move and we made sure to not generate invoices lines from those attachments as they have been generated from the lines we had. The second improvements was to display the Accounting Date on the Draft entries that needs to be reviewed in a Tax return line to give the user more context on why they need to review those specific Draft entries. Lastly, when accessing Tax Returns it would ask for us to set the Accouting Periods through a wizard which prefilled informations such as the VAT Periodicity but the Opening Date needs to be filled by this user but this field would show as red when opening the wizard as it is required and no information was prevent. To allow the field to be red only if we try to submit the informations we are passing the informations to the wizard as default value which wouldn't trigger the wizard to try to save values when being created. task-4784283
The mobile Discuss experience is being improved with easier search and a new button to start or access meetings. This should help users find conversations faster and move into meetings more smoothly while working from mobile devices.
Original PR description
Part of task-4967066
Staff can now increase or decrease the preparation time while accepting UrbanPiper online orders. The updated time is shared with UrbanPiper and shown on the kitchen display, helping keep customers, delivery channels, and kitchen teams aligned.
Original PR description
Following this commit: - The user can now increase or decrease the preparation time while accepting online orders. - The same updated time will be sent to Urbanpiper, also maintaining consistency. - Updated preparation time will also be reflected in the kitchen display task-4904077 <img width="449" height="921" alt="image" src="https://github.com/user-attachments/assets/4d7f1023-0fdd-4c4f-956b-3042d58ddb7d" />
Spreadsheet dashboards now support a carousel-style chart figure, letting users view several charts in one compact area and switch between them with tabs. The CRM pipeline dashboard is updated to use the latest spreadsheet capabilities, improving dashboard readability and presentation.
Original PR description
Adapt enterprise codebase to o-spreadsheet update (https://github.com/odoo/odoo/pull/222308)
Contract template screens now restore and reorganize important payroll, salary, work entry, and localization fields that were lost after HR and contract features were merged. This makes contract templates easier to review and configure across multiple country payroll setups, reducing missing information and improving day-to-day HR setup accuracy.
Original PR description
* = hr_contract_salary, hr_payroll{,_account}, hr_work_entry_{attendance,planning}, l10n_{ae,au,be,ch,eg,hk,id,in,jo,ke,lt,lu,mx,nl,ro,sa,sk,us}_hr_payroll, l10n_au_hr_payroll_account,
Since the merge of hr and contract, we only have a form view for contracts for templates. Thus, during the merge, a lot of info has been lost on contract template form view.
This commit, reintroduce fields that were present in saas-18.3 and re-organize them.
task-4904024
Forward-Port-Of: odoo/enterprise#89832Accounts that were already reviewed or supervised in an audit are now automatically moved back to To Review when a relevant accounting entry is posted or reverted within the audit period. This helps ensure auditors re-check accounts affected by new or changed financial activity, reducing the risk of relying on outdated audit conclusions.
Original PR description
When a move is posted that affects an account marked as reviewed or supervised in an audit, and the move falls within the audit period, the account's status is reset to To Review. task-4991558
The contact import template has been refreshed to make importing contact data easier for users. It now includes a ready-to-use example with demo data and validation coverage to help keep the template reliable over time.
Original PR description
This commit updates the contact import template following the change in 'base'. task-4875863
Audit report PDFs can now include account reports without showing duplicate page numbers. This improves readability and consistency when multiple documents are combined into one final report.
Original PR description
When generating audit reports, we compile a single, comprehensive PDF that includes all relevant documents and account reports attached to the articles. Each page in the final report is automatically numbered during generation. However, because account reports also include their own page numbers, this can lead to pages displaying two conflicting numbers: one from the account report and another from the audit report. To address this, we're introducing a new context variable in the account reports (named: `exclude_page_footer`). This allows the page footer to be disabled when needed. Disabling the account report's footer ensures that the final audit report is cleaner, more consistent, and easier for users to read. Task-4989809
Audit report templates are now clearer, easier to navigate, and better organized for users preparing audit documentation. The update improves report structure, removes rarely used content, cleans up generated output, and places audit reports in a more logical menu location.
Original PR description
This PR introduces several enhancements aimed at improving the default template of the audit reports: - Headings have been added to articles to establish a clearer content hierarchy and to…
This PR introduces several enhancements aimed at improving the default template of the audit reports: - Headings have been added to articles to establish a clearer content hierarchy and to automatically populate the table of contents. - The "General Ledger" article has been removed, as it is rarely used in practice and typically not relevant to most audit reports. - Some sections are now folded by default to avoid displaying contradictory content (for the attestations). - Labels for foldable sections are no longer shown in the generated resulting in a cleaner and more professional appearance. - The configuration of the "Balance Sheet" and "Profit and Loss" reports has been updated to provide more meaningful and contextual insights. - The index of the root article now lists all articles in the report hierarchy. Additionally, the root article of the audit report will now be named after the audit report itself. This change makes it easier for users to locate the article within the workspace. Lastly, the "Audit Reports" menu item has been moved under the "Working Files" section of the "Audit" menu to better reflect its purpose and improve navigation. Task-4999770
The customer-facing preview buttons in Helpdesk and Field Service now use the shorter label “Preview” instead of “Customer Preview.” This keeps wording consistent across related screens and makes the interface simpler for users.
Original PR description
*: industry_fsm In this commit: - To maintain consistency, the buttons are renamed from "Customer Preview" to "Preview". task - 4567479
The field service task form now places priority and tags in a more convenient location. This helps users review and update key task information more easily during day-to-day field service work.
Original PR description
task-5003822
Odoo now helps Colombian customers complete the DIAN certification setup automatically instead of manually creating journals, products, taxes, and test records. This reduces onboarding effort and errors, while warning users to run the process only on a staging or duplicated database because it makes lasting changes.
Original PR description
New customers starting out with odoo in Colombia have to go through a registration process where they send specific records to the DIAN via a specific endpoint. Currently, the process is: 1) Activate…
New customers starting out with odoo in Colombia have to go through a registration process where they send specific records to the DIAN via a specific endpoint. Currently, the process is: 1) Activate Certification process in settings. 2) Create 3 journals (SETP, NC, ND) for invoice, debit notes, and credit notes. 3) Create a specific product with a tax enabled. 4) Create the specific amount of invoices/debit notes/credit notes as required from within the DIAN portal. This process is slow and for most of the users coming to Odoo, they will not have experience with accounting software or understand where to setup such records. As such, a one click setting has been added for certification where they input the number of records necessary, and it will automatically do everything they need. Notes on implementation: - This will perform changes that could be considered irreversible on customers databases. As such there is a warning that it should only occur on a staging/duplicated database. - The values that are hard coded, Technical Key, Min/Max Range Values, and the Authorization Number all come from DIAN and are shared across all users, as such hard coding them to these values are not releasing any secrets. task-4366022
Users setting up Brazilian AvaTax will now see a non-blocking warning if another AvaTax account already exists in the database. This helps prevent credential synchronization issues while still allowing the user to continue when appropriate.
Original PR description
Before this PR: - No warning is shown if user is creating another avatax account in the DB. After this PR: - A non-blocking warning is shown if user tries to create another avatax account in the DB to prevent issues with credentials. Task: 4842897
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-4991558Adding products to Field Service tasks no longer locks the related sales order too early when automatic sales order locking is enabled. This ensures the required delivery order is created, preventing blocked or inconsistent Field Service sales orders.
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
A test setup for Peru electronic invoicing now includes the required sales permission so it works reliably when demo data is not installed. This reduces false test failures and helps keep releases stable without changing day-to-day user workflows.
Original PR description
The new downpayment test failed in without demo due to missing sales group on the user. This fix adds the missing group. runbot-230456 Forward-Port-Of: odoo/enterprise#91740
Hong Kong payroll now uses the employee's standard name on payslips when surname and first name are not filled in. This prevents payslips from showing an empty or incorrect legal name, improving payroll document accuracy.
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 VoIP call timer now uses the user’s device timing consistently instead of comparing it with server timing. This prevents calls from appearing to start with a negative duration when device and server clocks are slightly out of sync.
Original PR description
It was reported that the timer for the call would sometimes start as a negative number. Examining the code that computes it suggests that the timestamp sent by the server was a few seconds in the future compared to luxon.DateTime.now() (client time). This discrepancy is most likely due to the clock skew between the client and the server. This commit adapts the code so that it only computes time based on client-side values, effectively preventing clock skew issues. Task-4930666 Forward-Port-Of: odoo/enterprise#91863 Forward-Port-Of: odoo/enterprise#91738
The payment form’s Transaction button now chooses the correct default journal in multi-company setups. This prevents users from being blocked by access errors when opening reconciled payment transactions while working in a single selected company.
Original PR description
This fixes the access error when using the 'Transaction' smart button from a reconciled payment present since Steps to reproduce: - Multi-company environment with account_accountant installed - Only select one company - Create a payment with a journal entry (by adding an account on the payment method) - Create a corresponding bank statement and reconcile them both together - Go to the payment form view - Click on the Transaction button `button_open_statement_lines` - Access error is raised due to a "random" assignation of journal which is likely to be one from the other company This make sure we select the default statement line journal by default, ensuring we don't search for a journal in every company Forward-Port-Of: odoo/enterprise#91904
EC Sales List reports with country-specific extra columns now populate those columns correctly instead of leaving them blank. This helps businesses in countries such as Slovenia get complete and reliable VAT reporting information.
Original PR description
Before this commit, when an ec sales list report had more than the 3 bases columns (goods, service, triangular) the value was not filled. For example in slovinia, the ec sales list has 5 columns, the two extras columns where always empty. task-4963633 Forward-Port-Of: odoo/enterprise#90669
This fix prevents a Belgian payroll test from failing when the Accounting app is not installed. It makes the test setup more reliable for environments that only use Belgian payroll, without changing payroll functionality for users.
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 Forward-Port-Of: odoo/enterprise#91881
Users with the right permissions in the Sign app can now cancel sign requests even if they do not have access to salary package offer records. This prevents an access error from blocking normal document cancellation workflows for HR and signing users.
Original PR description
After this commit https://github.com/odoo/enterprise/commit/40d3314d1b06c8110b476690d2264e86b3492b3e we are not able to cancel a sign request, if user do not have read/write access on…
After this commit https://github.com/odoo/enterprise/commit/40d3314d1b06c8110b476690d2264e86b3492b3e we are not able to cancel a sign request, if user do not have read/write access on `hr.contract.salary.offer` model **step to reproduce:** - install `hr_contract_salary` - create a new user with following right: `Sign -> Administrator` `Contracts -> Employee Manager` `Recruitment -> Interviewer` - login with test user - open sign -> All Documents (with demo data 2, there should be 2 documents) - try to cancel one of them <img width="1572" height="689" alt="config for user" src="https://github.com/user-attachments/assets/72e89ac7-fed3-4a38-918f-5dbb198bd1e3" /> **Observation:** - even with Admin rights of Sign, we are not able to cancel a sign request and we receive a Access Error `You are not allowed to access 'Salary Package Offer' (hr.contract.salary.offer) records` **Fix:** we use `sudo()` to allow everyone to cancel their sign request opw-4859774 Forward-Port-Of: odoo/enterprise#91688 Forward-Port-Of: odoo/enterprise#89865
The expiration panel now keeps the standard expiration message for upsell-related cases, while renewal expirations continue to use their separate handling. This avoids showing the wrong renewal-focused wording to customers when the expiration reason is an upsell.
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
This fixes Luxembourg VAT XML exports so special scheme fields are included only when legally required for periods touching 2025 or later. It also ensures mandatory annual report fields are filled when related fields are present, reducing rejection risk for Luxembourg tax filings.
Original PR description
As per legal requirements, the 491, 492 and 493 fields of the xml export of the tax return only need to be included if at least one day of the period includes dates in 2025 or later. As per legal requirements too, the 192 and 193 fields are mandatory in the annual report if some other fields are present. Among those are 361 and 362 which are mandatory even if null so if 192 and 193 are not there yet, we set them to 362 and 363 values (0.0 in most cases). --- from feedback on task-4587067 opw-4757770 Forward-Port-Of: odoo/enterprise#91859 Forward-Port-Of: odoo/enterprise#89437
This fix stops sick leave or other time off that overlaps with a public holiday from being incorrectly carried over to the next payslip. It helps ensure payroll calculations reflect public holidays accurately and prevents employees from receiving an unnecessary deferred leave adjustment.
Original PR description
The aim of this commit is to prevent a sick day or any other type of time off taken on a public holiday to be deferred. To reproduce: - Create a public Holiday for previous month - Regenerate the…
The aim of this commit is to prevent a sick day or any other type of time off taken on a public holiday to be deferred. To reproduce: - Create a public Holiday for previous month - Regenerate the work entries for that month - Compute a batch of payslip for last month, validate and mark it as paid --> The public holiday should be on the payslip - OPTIONAL: run the cron `Payroll: Generate pdfs` to make create the payslip in document and make it available to the concerned employee. - With the concerned employee, put a time off on the whole week of the last month. It should overlap with the public holiday. - Validate the time off and defer it for next payslip - Compute a batch of payslip for following month, validate and mark it as paid Before this commit: The overlapping sick day gets deferred completely ignoring the fact it was a public holiday. After this commit: The overlapping sick day doesn't get deferred. opw-4903546 Forward-Port-Of: odoo/enterprise#91872 Forward-Port-Of: odoo/enterprise#89264
This fix prevents Romanian SAF-T exports from failing when optional product group information is missing. It also corrects VAT validation so valid partners are not incorrectly blocked, helping businesses complete compliance exports more reliably.
Original PR description
- Added fallback for missing to prevent crash during export. - Replaced incorrect usage of with to align with actual partner VAT validation logic and avoid false errors. These changes ensure smoother SAF-T export by handling optional fields and validation more robustly. Forward-Port-Of: odoo/enterprise#91770 Forward-Port-Of: odoo/enterprise#91737
Invoice extraction tests now use a real PDF attachment instead of invalid file data. This prevents misleading error messages during automated test runs and helps keep build results clearer for teams monitoring system quality.
Original PR description
The tests that were using a PDF as attachment were causing this error to be logged on each of them: `Error when reading the pdf file (...)`. This happened because the attachment raw bytes weren't representing a valid PDF file. Related to runbot build error [230282](https://runbot.odoo.com/odoo/runbot.build.error/230282).
Audit reports can now be exported successfully when their article includes an embedded PDF file. This prevents an internal error during export and helps users include supporting PDF documents in audit reports without disruption.
Original PR description
Currently, the method responsible for loading PDF files embedded in an article crashes because it receives an `ir.attachment` object instead of a bytes-like object (-> TypeError: a bytes-like object is required, not 'ir.attachment'). Because of this error, it is currently not possible to export an audit report containing an embedded PDF file. Steps to reproduce: 1. Create an audit report 2. Open the article associated with the audit report 3. Insert a PDF file in it using the `/file` command 4. Export the article to PDF => The page loading the PDF shows an internal error. To revolve this issue, we will provide the raw attachment to the method responsible for loading the PDF file. With this fix, people should be able to export an audit report containing PDF files without errors. Task-4989809
Negative-value assets now keep depreciation journal entries on the correct debit and credit sides after edits. This prevents accounting inconsistencies when users adjust depreciation schedules for assets with negative original values.
Original PR description
Before this commit, creating an asset with a negative value then editing the depreciation caused a inversion between credit and debit in the Journal entries The account_depreciation_id and account_depreciation_expense_id were not inverse for negative depreciation, in the function `_inverse_depreciation_value()` We add that missing account inversion for negative assets Steps to reproduce: - Create an asset with negative Original Value - You can choose any Depreciation Account and Expense Account - Click on Compute Depreciation - Check the Posted Entries and note the values position (credit/debit) - Go back to the Asset > Depreciation Board - Add 10 to the first line Depreciation - Remove 10 to the second line Depreciation - Save the Asset - Check the Posted Entries again - The changes ones should have credit/debit inversion before the fix opw-4759988 Forward-Port-Of: odoo/enterprise#91468 Forward-Port-Of: odoo/enterprise#88907
Odoo now avoids trying to fully load very large WhatsApp file responses into memory when checking for errors. This prevents message processing failures when customers send large attachments, improving reliability for WhatsApp communications.
Original PR description
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB). Stack Trace: ``` MemoryError: null File "odoo/http.py", line 2383, in…
Currently a below occurs or content is not receiving to odoo WhatsApp when the user uploads a large file (tried with > 35 MB).
Stack Trace:
```
MemoryError: null
File "odoo/http.py", line 2383, in __call__
response = request._serve_db()
File "odoo/http.py", line 1913, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1976, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1943, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2187, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 227, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 757, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/controller/main.py", line 42, in webhookpost
wa_account_id._process_messages(value)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/models/whatsapp_account.py", line 206, in _process_messages
datas = wa_api._get_whatsapp_document(messages[message_type]['id'])
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 236, in _get_whatsapp_document
file_response = self.__api_requests("GET", file_url, auth_type="bearer", endpoint_include=True)
File "home/odoo/src/enterprise/saas-17.4/whatsapp/tools/whatsapp_api.py", line 46, in __api_requests
if 'error' in res.json():
File "requests/models.py", line 971, in json
return complexjson.loads(self.text, **kwargs)
File "requests/models.py", line 928, in text
encoding = self.apparent_encoding
File "requests/models.py", line 793, in apparent_encoding
return chardet.detect(self.content)["encoding"]
File "__init__.py", line 49, in detect
detector.feed(byte_str)
File "chardet/universaldetector.py", line 274, in feed
if prober.feed(byte_str) == ProbingState.FOUND_IT:
File "chardet/charsetgroupprober.py", line 70, in feed
state = prober.feed(byte_str)
File "chardet/hebrewprober.py", line 240, in feed
byte_str = self.filter_high_byte_only(byte_str)
File "chardet/charsetprober.py", line 73, in filter_high_byte_only
buf = re.sub(b"([\x00-\x7F])+", b" ", buf)
File "__init__.py", line 186, in sub
return _compile(pattern, flags).sub(repl, string, count)
```
At line [1], the code `'error' in res.json()` is used, which reads all the json content of `res`, but at times users upload large files, it will cause the above error because the `json()` tries to read all bytes from res, which is a very large amount to handle in memory.
This commit will fix the above issue by returning a response if the response
contains content_length more than 10 MB.
[1] - https://github.com/odoo/enterprise/blob/aca7ae2a7cf4aad5427a60d5cad60d08774357d0/whatsapp/tools/whatsapp_api.py#L46
sentry-5810101850
Forward-Port-Of: odoo/enterprise#70001This update fixes an internal automated test for the Sign app that was failing after a recent change. It helps keep the development validation pipeline stable, reducing noise and delays for future updates.
Original PR description
Before this, after merge this PR : https://github.com/odoo/enterprise/pull/88774 the test `test_send_request_with_default_partner_id` failed because product_id was hardcoded. In this PR, fixes the test so it works correctly.
Quality checks that send items to a failure location now correctly keep stock movements consistent, avoiding mismatches between item movements and their locations. This reduces the risk of downstream inventory issues such as incorrect automated routes or valuation problems, while preventing unsupported quantity checks in manufacturing flows.
Original PR description
In case of 'quantity' control per quality point. If a complete stock move line is sent to a failure location. The stock move was not split. We could have a stock move line going to a location that is not child of the location of the corresponding move. This can lead issues in case of push_rules or stock valuation. Task: 4575193 Forward-Port-Of: odoo/enterprise#89313 Forward-Port-Of: odoo/enterprise#81275
Demo employee contracts for Egypt, Saudi Arabia, and Turkey now use the appropriate local payroll structures. This prevents them from being incorrectly linked to Belgian payroll settings when Belgian payroll is also installed, improving reliability of demo and testing data.
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#91958 Forward-Port-Of: odoo/enterprise#87409
The GSTR-1 document summary now counts only invoices that were posted before being cancelled, excluding cancelled drafts that should not affect reporting. This improves the accuracy of Indian GST reporting and keeps the document summary visible for easier access.
Original PR description
Before: The document summary included all cancelled invoices, even those that were never posted. After: Only invoices that were posted and subsequently cancelled are now considered in the summary. Additional Changes: - Updated check_serials to validate serial continuity within current company. - Made the document summary view always visible in the GSTR-1 section. opw-4940053 Forward-Port-Of: odoo/enterprise#91971 Forward-Port-Of: odoo/enterprise#90160
This fixes an issue in Mexican electronic invoicing where invoices containing only a section or note line could not be saved because tax information was incorrectly required. Users can now save these invoice descriptions without encountering invalid field errors.
Original PR description
Issue: When we try to save an invoice with only a line section or line note, an error is thrown indicating invalid fields: invoice lines. This happens because the `l10n_mx_edi_tax_object` is required on account move lines. Purpose of this PR: Allow for line sections and line notes to be saved without tax objects. Steps to reproduce on Runbot: install l10n_mx switch to MX company and create an invoice with just a line section or line note save Invalid Fields error is raised opw-4987040 Forward-Port-Of: odoo/enterprise#91758
When users edit a folder from the Documents details panel, the folder list now refreshes at the right time and shows the latest names. This prevents outdated folder information from appearing after changes are saved, making document organization more reliable.
Original PR description
Something changed in 18.4 (fw or documents) such that we * sometimes we didn't trigger a reload of the search panel after modifying a folder * sometimes the reload of the searchpanel was triggered *before* the initiation (and return) of the write call, so the search panel was updated with the old values Note that this asynchronous misbehavior was not easily visible in hoot tests, but the call count enables to highlight the problem (and drive a suitable solution). The fix is actually an opportunity to keep reloading the search panel on update inside `update` (i.e., saving) flows. Also last style cleanups in documents_details_panel.js. Task-4992298 Forward-Port-Of: odoo/enterprise#91476
Point of Sale orders are now checked and synchronized before being sent for preparation, preventing the same order from being printed by multiple devices. This helps restaurants and stores avoid duplicate preparation work and confusion when several POS devices are active.
Original PR description
*: pos_urban_piper_enhancements Before this change, when a device sent an order in preparation via the ticket printer, this could result in the same order being printed by multiple devices, as the order was not synchronized after it was sent. The error is a bit tricky, because if the user had installed a preparation screen, the order was sent to the preparation screen via syncAllOrders. In this case, the order was correctly synchronized and the other devices were informed of the changes. This commit adds two things. - We check the server before sending the order to preparation to make sure it has not already been sent. - Even when the user does not have a preparation display, the order will be synchronized after being sent to a printer. Forward-Port-Of: odoo/enterprise#91094 Forward-Port-Of: odoo/enterprise#91006
Users can now open sent signature documents in My Documents even when the recipient is not a logged-in Odoo user. This prevents an error that blocked access to documents involving an Emsigner signer and supports sending documents to external partners reliably.
Original PR description
**Version:** - Master **Steps to reproduce :** - Upload a PDF - Add two signers (one is Emsigner) - Send the document to a random partner (not a logged-in user) - Try opening the document from "My Documents" **Issue:** - A traceback error occurs when opening the sent document. **Before:** - tried to check for a logged-in user (e.g., Mitchell Admin), but the document was sent to someone who wasn't logged in, causing the error because it will filter out the curren logged user. **After:** - The error is fixed, and the document can now be opened without any traceback. **Impact:** - Now, we can send documents to anyone, and they will show correctly in "My Documents" without errors.
The Task Analysis report now keeps the field service filter when users drill down from the pivot view. This prevents unrelated tasks from appearing, making reporting counts and follow-up lists more accurate for field service teams.
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
This fix improves the shop floor experience by ensuring the next production step is highlighted after completing an instruction step. It also shows all operators working on the same work order, so teams can clearly see who is active.
Original PR description
Two small fixes for shop floor UX. Please check the commits for details. task-5005167
Features or functions removed from Odoo
Obsolete setup options for creating repair orders from returns were removed from the field service repair configuration view. This keeps the interface aligned with the newer repair process, reducing outdated settings and maintenance overhead.
Original PR description
Removed obsolete XML elements related to the “Repair Order from Return” option from the operation type view. These elements are no longer relevant after the feature was replaced with a transfer-level server action in the repair module. The view definition is aligned with the updated repair flow, ensuring clean and maintainable XML. Task ID: [4778453](https://www.odoo.com/odoo/project/966/tasks/4778453)
Code cleanup and technical improvements
This update removes outdated label and expansion settings from search filter groupings across many Odoo Enterprise modules. It is an internal cleanup that helps keep search views consistent with the latest platform standards, with no expected change to day-to-day workflows.
Original PR description
Remove all the occurrences of string attribute from group in the search view. Also removed expand attribute wherever left from group in the search view. Community PR: https://github.com/odoo/odoo/pull/220023 Related PR: https://github.com/odoo/enterprise/pull/88229 (Remove expand attribute) task-4915069
Several website and eCommerce-related templates were updated to use the current recommended rendering method. This is an internal cleanup that helps keep the platform maintainable and aligned with supported standards, with no expected change for customers or day-to-day users.
Original PR description
\*: l10n_cl_edi_website_sale, l10n_mx_edi_website_sale, website_\* This commit updates all instances of the deprecated t-esc attribute within the web_editor and website modules to use the recommended t-out attribute. See also : - https://github.com/odoo/design-themes/pull/804 - https://github.com/odoo/odoo/pull/168191 task-3573251
31 changes
New functionality added to Odoo
This update lets employees use their own Gmail or Outlook outgoing mail accounts while adding safeguards so private mail servers cannot be used by others. It also adds Spanish Veri*Factu e-invoicing support, improves to-do quick creation, and fixes selected Point of Sale and website editing issues.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale restaurants using UrbanPiper can now connect with Wolt as an additional delivery provider. This expands delivery channel options and may help businesses reach more customers through Wolt orders.
Original PR description
Following this commit: - Integrated Wolt as delivery provider in pos_urban_piper. task-4882282
Enhancements to existing features
Invoice document layout settings now show the same options whether users send, print, or configure layouts from settings. Tax ID, bank account number, and QR code previews are kept consistent, helping businesses avoid surprises in customer-facing invoice documents.
Original PR description
Previously, the document layout wizard used when sending invoices included fields for Tax ID, Bank Account Number, and QR Code. However, these fields were missing from the wizard accessed via the…
Previously, the document layout wizard used when sending invoices included fields for Tax ID, Bank Account Number, and QR Code. However, these fields were missing from the wizard accessed via the `Print` button and from the layout configurator under `General Settings > Configure Document Layout`. This was because only the send flow was using the inherited report layout from the `account` module, while the print and settings flows were using the base layout from `web` directly. Additionally, the preview template in web did not include the bank account number or QR code With this **PR**: 1. The `Print` button now uses the inherited layout from `account`. 2. The settings configurator button also uses the correct layout from `account`. 3. The bank account number and QR code fields are now dependencies of the _compute_preview method, making the preview responsive to their changes. 4. Both fields are now shown in the preview when configuring the layout in settings. This ensures the document layout behaves consistently across send, print, and settings configurator flows. **task**-4954030
The online shop now retrieves product attribute filters more efficiently during searches. This can dramatically reduce loading times on large product catalogs, improving the shopping experience and reducing server strain.
Original PR description
### Description: The default query to fetch attributes for searched products needs to join on the `product_tmpl_ids` Many2Many field. This can be slow, as it requires a join on an intermediate table. This change avoids that by directly querying the attribute lines and grouping by `attribute_id` to remove duplicates. ### Benchmark (in 18.0): | N° of products | Before | After | |----------------|--------|-------| | 3708 | 400ms | 200ms | | 128539 | 4 min | 800ms | | 484798 | 6 min | 3s | ### Reference: opw-4937361 Forward-Port-Of: odoo/odoo#222064
Resolved issues and error corrections
Sales orders linked to a project will now keep that project connection when they create purchase orders through make-to-order buying or drop-shipping. This helps businesses track purchasing costs and delivery activity against the correct customer project without manual correction.
Original PR description
This commit fixes two issues related to project propagation from Sale Order to Purchase Order: **1. Project not propagated when using MTO+Buy route** **Steps to reproduce:** - Install only…
This commit fixes two issues related to project propagation from Sale Order to Purchase Order: **1. Project not propagated when using MTO+Buy route** **Steps to reproduce:** - Install only `sale_project_stock` and `purchase` - Enable multi-step routes and unarchive the "MTO" route - Create a storable product "P1" with: - Routes: MTO + Buy - Vendor: any - Create a Sale Order with: - 1 unit of P1 - Any project set in "Other Info" - Confirm the SO **Issue:** A Purchase Order is created but the project is not propagated to it. This propagation was previously ensured by `project_mrp_sale`, via: https://github.com/odoo/odoo/blob/238a41e35280256382f6509182b9e900fb4f7aba/addons/project_mrp_sale/models/stock_move.py#L9 --- **2. Project not propagated when using drop-shipping** **Steps to reproduce:** - Enable drop-shipping - Create a product "P2" with: - Route: Drop-Ship - Create a Sale Order with: - 1 unit of P2 - Any project set - Confirm the SO **Issue:** A Purchase Order is created, but the project is again missing. --- **Fix:** - Move the `_prepare_procurement_values` override from `project_mrp_sale` to `sale_project_stock` to ensure project propagation regardless of the presence of `project_mrp_sale` - Also adapt `sale_project` to ensure project is retrieved from the Sale Order if not set on the Sale Order Line. opw-4976606
Outgoing emails now include links for attachments that are stored in cloud storage, not only for files that exceed the email size limit. This prevents recipients from missing purchase order or other email attachments that were uploaded to cloud storage.
Original PR description
Before this commit, when sending emails with attachments stored in the cloud, the attachments's links were not included in the email body, as we only included the links for attachments exceeding the max email size. With this commit, we ensure that all attachments stored in the cloud are converted to links in the email body and included in the the email. opw-4717083
Marketing card previews and test mailings now use the right preview card, avoid recording preview clicks as real engagement, and show translated default email content. Campaigns tied to removed models are also cleaned up, with small usability improvements to related field selectors.
Original PR description
- Avoid counting "clicks" on archived (implicitly preview) cards - Pick the preview card when building the default mailing body - Translate the default mailing body - If a card targets a model that has been uninstalled, remove the campaign as is done for mailings task-4247003
Product forecasts now correctly account for outgoing stock moves created by multi-step delivery routes. This prevents sales orders from showing an incorrect available forecast when stock is already committed for delivery.
Original PR description
### Steps to reproduce: - In the settings enable Multi-Steps routes - Put your warehouse in delivery in 2 steps - Create and confirm a sale order for 1 units of a storable product #### > While the…
### Steps to reproduce: - In the settings enable Multi-Steps routes - Put your warehouse in delivery in 2 steps - Create and confirm a sale order for 1 units of a storable product #### > While the pick move was created and confirmed the forecast is still at 0 even tho it should be at -1 and the outgoing pick move should be matched with the SO line in the forecast report. ### Cause of the issue: The issue has been introduced by commit 5b40fb086a0e5677678c312b42dc1f2c8991dc9e The issue being that since the `location_final_id` should not have been considered for the past forecast based on done move chains (because each done move of the chain will refer to the same external `final_dest_id`). The proposed fix was therefore to change the dest_loc_domain as such: https://github.com/odoo/odoo/commit/5b40fb086a0e5677678c312b42dc1f2c8991dc9e#diff-1f24ce9f94c5795040749acca5924384d7d17c0ac39b1993cef3b484e4bd30afR324-R326 However, the new domain: https://github.com/odoo/odoo/blob/995a7072cb3315fc03544b281b1ed5ca4e81e901/addons/stock/models/product.py#L322-L326 ignores completely the part of the condition refering to `final_dest_id` for outgoing moves since the condition is negated here: https://github.com/odoo/odoo/blob/995a7072cb3315fc03544b281b1ed5ca4e81e901/addons/stock/models/product.py#L328-L333 The logical `OR` (`|`) becoming an `AND` (`&`) for the `domain_move_out_loc`. opw-4997982 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
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
Documentation and clarification updates
This pull request records that GABIT Marco Gantenbein has signed Odoo's Contributor License Agreement. It is an administrative legal update that helps ensure contributions can be accepted under Odoo's licensing rules.
Original PR description
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr