Thursday, October 9, 2025
39 changes · 19.0
Enhancements to existing features
When a user opens a project without their own top bar setup, Odoo now uses the project manager's configuration as a fallback. This helps keep project actions visible and consistent without requiring every user to configure the top bar manually.
Original PR description
If the current user doesn't have a top bar configuration yet for a given project, we fallback on the top bar configuration of the project manager to show the actions. task-5072899 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Documents folder action menu now opens immediately instead of waiting for all actions to load, with a spinner shown during loading. Selecting embedded folder actions also feels faster because changes appear right away, while server updates are batched to reduce delays and unnecessary calls.
Original PR description
The cogwheel which holds the folder actions was slow to open because it loads the actions at startup. To speedup it up, we backport the fix odoo/enterprise#90124 that allows the cogwheel to be open while loading the actions (instead of waiting that the actions are loaded). We also add a spinner while it is being loaded. When selecting action to embed for the folder, it was slow as well. To solve the problem, we toggle the action immediately (not waiting the answer of the server) and roll it back in case of failure. Finally, to limit the number of calls to the server, we only reload the search model if there are no pending toggle of action. So if you activate for example 5 actions in a row and the connection is slow enough, the search model will only be reloaded once instead of 5 times (when the 5 actions are toggled). Task-4828503 Forward-Port-Of: odoo/enterprise#94141
The HTML editor now supports simple Markdown-style shortcuts to create blockquotes and separators while typing. Separator placement has also been improved so inserted lines appear in the expected position based on where the cursor is, making content editing faster and more predictable.
Original PR description
### Desired behavior after PR is merged: - Adjust separator insertion logic based on cursor position: ```html <div>/separator[]</div> → before <div>/separator[]abc</div> → before <div>ab/separator[]c</div> → after <div>abc/separator[]</div> → after ``` - Refactor markdown shortcuts implementation by introducing `shorthands` resource containing objects with pattern and commandId keys. - In the shortcut_plugin, bind an onInput handler to process input events and match precedingText against the defined patterns, triggering the corresponding commands when matched. - Add support for > (blockquote) and --- (separator) markdown shortcuts. - Separator insertion behavior: ```html <div>--- []</div> → before <div>--- []abc</div> → before ``` task-4908567 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A new test action on the IoT Box record helps users quickly check whether required communication methods are working. It also triggers a network quality check, making it easier to diagnose client-site connectivity issues before they disrupt device operations.
Original PR description
In order to ease debugging at client's, we introduce a test button on the IoT Box record that will first test communication protocols and display a notification for each non-working protocol, then request a network quality check on the IoT Box (ping to odoo.com + ping to gateway). Community PR: odoo/odoo#229655 Task: 5130809
The IoT system can now quickly check connection quality and show whether network performance is fast, normal, slow, or unreachable. This helps consultants diagnose connectivity issues more easily when working with IoT Boxes and receipt printing.
Original PR description
In order to ease network checks for consultants, we added a quick latency and packet loss check, formatting the output as "slow"/"normal"/ "fast" or "unreachable". We also add a way to test each protocol (webrtc, longpolling, websocket) and to check latency/packet lost, in order to add a `Test` button on the IoT Box record. Enterprise PR: odoo/enterprise#96298 Task: 5130809
Employee records now reliably show selected company cars in the activity history when contracts are signed, even when the contract version was already prepared. Offer summaries also include the selected car and bike names, making compensation details clearer for employees and HR teams.
Original PR description
As when signing the employee contract, the version related to that contract is already created and we just set the version active, the value of the car does not change, so the tracking is not triggered and it's not added into the chatter. This PR force the car_id and ordered_car_id to be tracked by adding the initial value the employee precommit tracking values, before the version is activated (so before the employee get the new values from the newly active version). Also, this PR adds the selected car and bike names to the offer summary. Task-4962922 Forward-Port-Of: odoo/enterprise#90915
Resolved issues and error corrections
Fixes an issue where Time Off list view header buttons, such as New Group, did not respond properly unless they were approve or refuse actions. This helps managers complete Time Off and allocation workflows from list, calendar, and Gantt views without blocked or ignored actions.
Original PR description
**Issue** When clicking header buttons other than approve/refuse in Time Off list view, the actions are not processed correctly. **Steps to Reproduce** 1. Navigate to Time Off > Management > Time Off or Allocations 2. Switch to List view 3. Click on New Group button 4. Action is not executed properly **Root Cause** Previously, handleViewButtonClick only processed approve/refuse actions and ignored other header button actions. Now, non-leave actions are correctly forwarded to the default handler. Task ID: 5062846 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes Nuvei payment handling so customers who return from the payment page without completing payment are not blocked by missing notification data. It also validates amounts correctly for Nuvei methods such as Webpay that require whole-number amounts, improving successful payment processing.
Original PR description
Since https://github.com/odoo/odoo/pull/163860, all notifications from providers are checked to see that they have the correct currency and amount in their flow before processing the notification. However, this has two issues with Nuvei: 1. The process when a customer hits "Go back" on the payment page instead of paying does not send any notification data. As such trying to compare these values will not work. 2. Certain payment methods within Nuvei use different decimal precision than the currencies on odoo. Webpay must always be in whole values even for USD, as such, we need to pass the correct number of precision digits to the validation method otherwise Webpay will never be able to go through. opw-5108631 Forward-Port-Of: odoo/odoo#230159
This fixes Brazilian Avalara tax calculations for service invoices so discounts are not subtracted twice. Businesses using this localization should see more accurate tax amounts on discounted service lines, reducing billing and compliance discrepancies.
Original PR description
Confusingly, Avalara's service API already accounts for the discount in lineNetFigure, whereas their goods API does not. In <saas-18.4 this was handled by _l10n_br_get_line_total(), but it got lost in the big refactor in saas-18.4 [1]. [1] https://github.com/odoo/enterprise/pull/82623 opw-5147143 Forward-Port-Of: odoo/enterprise#96585
Fixed an issue where computing taxes on an invoice could fail when no external tax was found for a customer's ZIP code. The system now safely continues with empty manual tax data, helping users complete invoice tax calculations without interruption.
Original PR description
Currently, an error occurs when computing taxes for an invoice. **Error:** `KeyError: 'manual_tax_amounts'` **Cause:** When a user clicks the `Compute Tax` button, the system calculates the tax for…
Currently, an error occurs when computing taxes for an invoice.
**Error:**
`KeyError: 'manual_tax_amounts'`
**Cause:**
When a user clicks the `Compute Tax` button, the system calculates the tax for that invoice, including the `manual_tax_amount` [1]. However, if no tax is found for a given customer ZIP code, the `tax_values_list` becomes empty [2]. As a result, `manual_tax_amounts` in the base line also becomes empty.
Later, when the system tries to fetch the `manual_tax_amounts` key from extra_tax_data, it raises a KeyError [2], because the key no longer exists.
Additionally, the condition in [3] indicates that there is no guarantee that the `manual_tax_amounts` key will always be present in the base_line.
**FIX:**
This commit ensures that if the manual_tax_amounts key does not exist, an empty dictionary {} is used instead. This prevents the KeyError from occurring during tax computation.
[1]- https://github.com/odoo/enterprise/blob/b17b6b4e5ca3085d831fc763457496b5c5b639c5/account_external_tax/models/account_external_tax_mixin.py#L155-L163
[2]- https://github.com/odoo/enterprise/blob/a51aee8f6e8bce2aa699d3199d6723495464a762/account_external_tax/models/account_external_tax_mixin.py#L88
[3]- https://github.com/odoo/odoo/blob/241c170dbece8c1652db9ca1aa935b2106ede532/addons/account/models/account_tax.py#L1330
sentry-6919182805
Forward-Port-Of: odoo/enterprise#96401The Time Off screens now correctly process the New Group action from list, calendar, and Gantt views. This lets managers create grouped time off requests without the button failing or being ignored.
Original PR description
See https://github.com/odoo/odoo/pull/226574 **Issue** - When clicking header buttons other than approve/refuse in Time Off list view, the actions are not processed correctly. - Added New Group Time Off to calendar and gantt view **Steps to Reproduce** 1. Navigate to Time Off > Management > Time Off or Allocations 2. Switch to List view 3. Click on New Group button 4. Action is not executed properly **Root Cause** Previously, handleViewButtonClick only processed approve/refuse actions and ignored other header button actions. Now, non-leave actions are correctly forwarded to the default handler. Task ID: 5062846
The purchase reporting view now correctly includes purchase order lines for products that do not have a category. This restores the vendor On-time Rate graph so purchasing teams can assess vendor delivery performance even when product category data is missing.
Original PR description
**Steps to reproduce:** 1-Install the purchase_stock module. 2-Create a Purchase Order with a new vendor. 3-In the Purchase Order line, add a product without a category. 4-Confirm the order and…
**Steps to reproduce:** 1-Install the purchase_stock module. 2-Create a Purchase Order with a new vendor. 3-In the Purchase Order line, add a product without a category. 4-Confirm the order and validate the generated receipt. 5-In the vendor form view, click the On-time Rate smart button → no graph is visible. **Issue:** https://github.com/odoo/odoo/blob/77b3956ed5635d79ae8dc19423140dc6a10098f1/addons/purchase_stock/report/vendor_delay_report.py#L46-L50 ``` The On-time Rate graph is not displayed in the Vendor Delay report. ``` **Cause:** - From version 18.2, `categ_id` was removed as a required field. The report query still uses an inner join on `categ_id`, which excludes products without a category and prevents data from being generated. - Commit which make `categ_id` non require - https://github.com/odoo/odoo/pull/166323/commits/b039caecbeb04057fbccb1cc88d03a4946f88e8e **Solution:** - Replace the inner join with a left join so that products without a `categ_id` are also included in the report (with null values when the category is not set). **opw** - 4991367 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230388 Forward-Port-Of: odoo/odoo#225557
Vendor credit notes matched to purchase orders now show the correct positive quantity when reversing over-billed purchase lines. This helps avoid confusing refund quantities and supports more accurate purchase billing records.
Original PR description
Steps to reproduce:- - Create a Purchase Order with Product A(invoicing policy: received quantities) and Quantity 3. - Create Vendor Bill with Product A and Quantity 3 and match it with the PO. - Receive only 2 on PO. - Now on PO, Quantity: 3, Received:2, Billed:3 - Create a Vendor Credit Note for that partner, add an empty line and save. - Click on PO Matching at the top. - Select line from Vendor Credit Note and line from PO, click match. Problem: In Vendor Credit Note Quantity: -1 (which should be 1) Before this commit: When credit note values are prepared from purchase order, quantity to invoice on purchase order is set as quantity on credit note. After this commit: When credit note values are prepared from purchase order, inverse(-ve) of quantity to invoice on purchase order is set as quantity on credit note. task-4975200 Forward-Port-Of: odoo/odoo#230487 Forward-Port-Of: odoo/odoo#221203
Customer statement emails sent from child invoice contacts now include the correct PDF details instead of an empty attachment. The Customer Statement button is also hidden when there are no transactions or no amount due, reducing confusion for accounting users.
Original PR description
**Steps to reproduce:** 1. Go to Accounting > Customers > create a company with child contact (invoice) (both having name and email). 2. Create an invoice with the child contact as customer and…
**Steps to reproduce:** 1. Go to Accounting > Customers > create a company with child contact (invoice) (both having name and email). 2. Create an invoice with the child contact as customer and confirm it. 3. Go to the child contact and open the Customer Statement smart button. 4. Download the PDF → data is shown correctly. 5. Send the statement → the attachment in the sent mail is empty. **Issue:** - When sending customer statements via email from a child contact, the generated PDF attachment contains no data, showing empty amounts and transactions. - Additionally, the "Customer Statement" button was still visible even when the total due was zero. **Cause:** - The button visibility condition checks for `total_due == 0.0 and not has_moves`, which didn’t properly cover all use cases. **Solution:** - Update button visibility condition to: `invisible="not has_moves or total_due == 0"` ensuring it is hidden when there are no moves or the total due is zero. **opw-5009182** Forward-Port-Of: odoo/enterprise#95356 Forward-Port-Of: odoo/enterprise#93162
The AI assistant now handles incomplete grouped search requests more safely when the language model leaves out required grouping or summary fields. This prevents terminal errors and keeps the chat experience stable for users making business data queries.
Original PR description
Currently, an error occurs when no groupby property is found in LLM response while trying to search records through the AI agent in the chat. Steps to replicate: - Install ai_app and sale_management.…
Currently, an error occurs when no groupby property is found in LLM response
while trying to search records through the AI agent in the chat.
Steps to replicate:
- Install ai_app and sale_management.
- Setup gemini key.
- In the systray click on AI icon.
- Type in:
`read group in res partner`
or
`read group in partners groupby None`
- Error will occur in terminal.
(If the error doesnt occur the first time, spam the above given prompt.)
Error:
`ValueError: TypeError("'NoneType' object is not iterable") while evaluating
"ai['result'] = record._ai_tool_read_group(model_name, domain, groupby, aggregates, having, offset, limit, order)"`
Cause:
- As the LLM response didnt incude groupby it was passed on as None to the orm,
which caused the `'NoneType' object is not iterable` at the line [1].
- The groupby was set `None` through line [2], the loop sets every param that
is not in the instance as None i.e. Every value that is in `ai_tool_schema`
but not received in LLM response is set as `None`.
Solution:
- The method `_ai_tool_read_group` now safely handles cases where `groupby` or
`aggregates` (similar error occurs when aggregates is none at [3]) are None.
- Fields are assigned default values before calling the method `_read_group`.
[1]: https://github.com/odoo/odoo/blob/c034fed2eeb194961af7e1b3c60203141784acf2/odoo/orm/models.py#L1919
[2]: https://github.com/odoo/enterprise/blob/7e6fe07512b7d897cf6315d45e6a1004e48ef45e/ai/utils/tools_schema/validators.py#L51
[3]: https://github.com/odoo/odoo/blob/c034fed2eeb194961af7e1b3c60203141784acf2/odoo/orm/models.py#L1923
sentry-6912361256This fix ensures the correct domestic fiscal position is selected for several country localizations, which helps apply the right local taxes. It adjusts fiscal position ordering for the UAE, Mexico, and Cambodia, and removes a duplicate Italian domestic fiscal position that could cause incorrect selection.
Original PR description
Since the fiscal position sequence is used to determin the domestic fiscal position, and hence, the domestic taxes - it is important to properly sequence the fiscal positions. This commit fixes the…
Since the fiscal position sequence is used to determin the domestic fiscal position, and hence, the domestic taxes - it is important to properly sequence the fiscal positions. This commit fixes the following localizations: **AE** Sequences are added making Dubai the domestic fiscal position. However this needs to be improved to automatically prioritize the fiscal position based on the company's state. **IT** (l10n_it_edi_doi) An additional domestic fiscal position was mistakenly added. The correct domestic FP is defined in it's dependency module l10n_it. The duplicate FP is removed. **MX** Sequences are added **KH** Sequences are added No Task - l10n's identified by the fiscal position checks in `test_all_l10n` Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230654
This fix ensures outgoing stock movements are properly included when Odoo calculates product quantities in strict mode. Businesses should see more accurate inventory availability figures in affected stock workflows.
Original PR description
### Issue: Commit ba54310a11d2b702753d4b9b028a62dd00a91467 has altered the location domain for quantities computations. However, the `dest_loc_domain_out` has not been correctly replaced: https://github.com/odoo/odoo/blob/f173c738b1adcf85a80eb641ad307b7cccf17294/addons/stock/models/product.py#L319 Since the returned value used to be negated and is not anymore. This results in out moves being ignored by the `_compute_quantities` in `strict` mode. opw-4997982 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229734 Forward-Port-Of: odoo/odoo#229304
The Point of Sale customer details screen now shows only the information needed for checkout and related POS work. This reduces clutter for staff and helps avoid errors caused by back-office-only fields appearing in the POS interface.
Original PR description
Before this commit: ==================== The POS frontend used the main backend form view of res.partner, which displayed all partner details. Many of these fields and buttons were irrelevant for the POS and occasionally caused errors or tracebacks due to backend-specific features being exposed. After this commit: =================== The POS frontend now displays a simplified partner form with only the essential fields required for POS operations. Unnecessary backend details are hidden to improve usability and prevent potential errors. Task-5103953
Gantt group headers now keep the right size so they remain visible and aligned while users scroll. This prevents oversized headers from breaking the sticky behavior, especially on smaller mobile screens.
Original PR description
Gantt group headers could stop being sticky because their width was fixed based on the number and size of columns. Even though they were set to position: sticky, oversized headers could no longer remain aligned when scrolling, as they extended beyond the viewport and were constrained by the document width. This was especially noticeable on mobile, where group headers are often wider than the screen. The fix applies a max-width style to these headers, capping their size to the available space so they remain sticky without overflowing the document. task-4970992 Forward-Port-Of: odoo/enterprise#96612 Forward-Port-Of: odoo/enterprise#96015
This fix improves how Swiss payroll recalculates payslip issues, helping ensure payroll warnings and related checks stay accurate after changes. It reduces the risk of outdated or incorrect payslip information affecting payroll review and accounting workflows.
Original PR description
task-5150492
Adding a combo product to the online shop cart no longer fails when its related combo choice was deleted. This prevents shoppers from encountering an error at checkout and keeps the cart flow working for affected products.
Original PR description
Currently, an error occurs when a user adds a combo product to the cart. Steps to Reproduce [video](https://drive.google.com/file/d/1m-zxaIsrIzogeLun_Dj92Hb37-S9g9dO/view?usp=sharing): - Install the…
Currently, an error occurs when a user adds a combo product to the cart. Steps to Reproduce [video](https://drive.google.com/file/d/1m-zxaIsrIzogeLun_Dj92Hb37-S9g9dO/view?usp=sharing): - Install the `website_sale` module. - Create a product of type `combo` and add a `combo choice`. - Go to the `combo choices` and delete `that combo choice`. - Go to the `website` > `Shop` and add that product to the `cart`. `ValueError: min() arg is an empty sequence` This error occurs after this [commit](https://github.com/odoo/odoo/pull/198070/files), When user creates a combo product, adds its related combo choice, and then deletes that combo choice, adding the product to the cart causes the system to check the quantities of the order line [1]. Since there is no sale combo choice for that product, the combo line becomes empty and raises an error[2]. This commit ensures combo choice quantities are checked only if they exist. [1]- https://github.com/odoo/odoo/blob/df05ae6d9af6abdfd67c49ac7a4d01762472bfc3/addons/website_sale/controllers/cart.py#L189 [2]- https://github.com/odoo/odoo/blob/df05ae6d9af6abdfd67c49ac7a4d01762472bfc3/addons/website_sale/models/sale_order.py#L621 sentry-6924112987 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Shared employee profile links that include private information now show a clearer access message instead of causing an error. Users are redirected to the public employee list, and extra checks help prevent similar permission issues from returning.
Original PR description
Sharing a link of an employee profile containing private info generated a traceback. Permissions had to be applied to the private field. I've also put a more explicit error message that allows the user to get redirected to the public employee list. I couldn't find a way to get the employee id from the url before the generic permission warning comes in. Thus I had to resort to redirecting to the general public employees list. Other tracebacks may happen each time a private field without the corresponding groups is put in the xml. Thus I added a test to prevent us from doing that again. Forward-Port-Of: odoo/odoo#230390 Forward-Port-Of: odoo/odoo#228623
Quality checks for serial-number tracked products now correctly stay failed when an item fails inspection during receipt processing. This prevents defective tracked items from being incorrectly marked as passed, improving inventory quality control accuracy.
Original PR description
Serial number tracked product are marked as pass even when they fail a move_line type of check. ### Steps to reproduce: * Create a product tracked by serial number * For this product create a control…
Serial number tracked product are marked as pass even when they fail a move_line type of check. ### Steps to reproduce: * Create a product tracked by serial number * For this product create a control point: - Control per quantity - Operations : Receipts * Create a receipt for this product * Mark the receipt as Todo * Start the Quality check from the receipt, without using the smart button. * Fail the Quality check * The Quality check still passes ### Issue: When validating a quality check and it fails: https://github.com/odoo/enterprise/blob/d48228127c239e45938551d9bbac734afab8b31a/quality_control/wizard/quality_check_wizard.py#L84-L92 I will not go through the standard process with show_faillure_message where the user can select failed_qty, it directly goes to confirme_fail>_move_to_failure_location: https://github.com/odoo/enterprise/commit/49149580d34ec5583559fa0288356fec6cb2c514#diff-2ffdc2ffc25417076b580b772447514c7e9d8b3e2d2fff2d3100721eb5ccbaf4L455-R457 In our case since failed_qty is still at 0 this new condition transfer the quality check to pass. In the case of serial numbers, the quality check is done one by one, the failed_qty can be retrived from check.move_line_id.quantity opw-5015266 Forward-Port-Of: odoo/enterprise#92966
Fixed a survey issue where people who answered certain multiple-choice questions with a comment could still be told the question was unanswered. This improves survey completion reliability and adds safeguards to prevent invalid multiple answers on single-choice questions.
Original PR description
Issue: When answering a question with a comment in multiple choice with roaming activated for the survey, the UI will display a warning message that says the question requires an answer. Cause: The backend creates a skipped record if none of the pre-created answers is chosen. Solution: Don't create a skipped record if a comment counts as an answer and a comment is provided. Added validation of input and unittests Task-5062984 Forward-Port-Of: odoo/odoo#226022
Fast checkout could leave printed receipts empty, and in restaurant workflows it could cause an error when printing. This fix ensures the receipt screen uses the correct current order so customers receive complete receipts reliably.
Original PR description
pos*: pos_event_iot, l10n_it_pos Steps to reproduce: - Enable a one-click payment method. - Create and validate an order using fast validation. - On the receipt screen, print the order receipt. Issue: - The printed receipt is empty (no order details). - In restaurant mode, a traceback occurs when printing the receipt. Fix: - Use the receipt screen’s `currentOrder` reference instead of fetching the order directly from the POS instance. Task-5093060 Related: https://github.com/odoo/odoo/pull/227621