Thursday, August 7, 2025
20 changes · saas-18.4
Resolved issues and error corrections
This fixes an issue in Point of Sale where staff could not add multiple existing serial-numbered items to the same order when creating new serial numbers was disabled. The checkout flow now correctly accepts serial numbers that were already selected, helping avoid blocked sales for tracked products.
Original PR description
**Steps to reproduce:** - Install `point_of_sale`. - Go to POS -> configuration -> settings - Search 'Operation type' -> open picking type -> Disable `Create new` - Create a storable product 'test'…
**Steps to reproduce:** - Install `point_of_sale`. - Go to POS -> configuration -> settings - Search 'Operation type' -> open picking type -> Disable `Create new` - Create a storable product 'test' with serial tracking. - Add on-hand quantity with serial numbers. - In POS, select the product and choose one SN, - Select it again and choose another SN. **Observation:** - The order line should have 2 quantities with a list of Serial numbers chosen by the user. For one quantity, it's working fine, but for multiple quantities, an issue occurs. **Issue:** - While confirming edit serial numbers popup for multiple quantities, it checks whether each selected SN is valid or not. - The condition is that the entered SN is in the existing available SNs option. But the already chosen SN is not in the existing SN option, - Also, creating a new SN is disabled, so it's considered an invalid input. https://github.com/odoo/odoo/blob/876b7337eb689e0682ab48e9e833f9f0dc6bb8d2/addons/point_of_sale/static/src/app/store/select_lot_popup/select_lot_popup.js#L190-L193 **Solution:** - Added a condition to allow SNs that are already selected (matched by name and ID) to be considered valid inputs. opw-4865902 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221058 Forward-Port-Of: odoo/odoo#219205
Videos embedded in sanitized website content now remain visible when users reopen the editor. This makes it easier to review, change, or remove videos without confusion, while preserving the existing saved-page behavior.
Original PR description
Scenario: - Insert a video in a sanitized html field (for example event.event().description) - Save - Edit Result: the video disappear when editing, so it's hard to remove it or modify it, but reappear when leaving edition. Cause: sanitized field remove iframe, so we need to re-add the iframe when editing the page. Fix: run the code that re-adds the iframe when editing the page. opw-4919773 Forward-Port-Of: odoo/odoo#219397
Customers no longer receive automatic emails asking them to pay when a payment is already being processed through the payment register with a saved payment method. This avoids confusing payment reminders and improves the customer experience around invoice payments.
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. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4850293) opw-4850293 Forward-Port-Of: odoo/odoo#221997 Forward-Port-Of: odoo/odoo#221587
Archived time off types are now hidden from employee profiles in the Employee app. This prevents outdated or inactive leave balances from confusing employees and HR teams.
Original PR description
In this bug, if a time off type is archived, it is still displayed in employee app. Steps to reproduce the bug: 1- Create a database with employee and time off modules installed 2- Allocate a time off to an employee 3- Archive the time off type 4- Open Employee app and go to the employee profile 5- The archived days are still displayed opw-4900060 Forward-Port-Of: odoo/odoo#221449 Forward-Port-Of: odoo/odoo#217517
Vendor bills now select the correct product unit of measure when the same vendor supplies a shared product in multiple companies. This prevents bill creation errors in multi-company purchasing setups and keeps company-specific vendor settings respected.
Original PR description
**Step to reproduce:** 1. Install purchase and account module. 2. Enable the uom option (Purchase > Configuration > Settings). 3. Create a vendor (partner). 4. Set up companies (have at least two…
**Step to reproduce:**
1. Install purchase and account module.
2. Enable the uom option (Purchase > Configuration > Settings).
3. Create a vendor (partner).
4. Set up companies (have at least two companies).
5. Create a product (Vendors bills > Product) that is shared across two companies.
6. Go to Vendors > Product : in the product’s Purchase tab:
- Add the same vendor twice - one line for each company.
- Assign different UoMs (e.g., “Unit(s)” for US company and “Kilogram(s)” for AT company).
7. Switch to one company.
8. Create a vendor bill in one of the companies using that product and vendor.
**Issue:**
A ValueError is raised when creating the vendor bill:
`ValueError: Wrong value for account.move.line.product_uom_id: uom.uom(1, 2)`
https://github.com/odoo/odoo/blob/0e23327c322acbdf6acfecd52385ffee0266220c/addons/account/models/account_move_line.py#L806-L807
**Cause:**
During the computation of product_uom_id where retrieves all seller records
matching the partner_id but fails to limit the result.
**Solution:**
To fix this, retrieve sellers by both partner_id and company_id and first matching
seller is used. This ensures the UoM is correctly set according to the company also.
opw-4877577
Co-authored-by: PIYUSH <pish@odoo.com>
Forward-Port-Of: odoo/odoo#217137This fix prevents preview actions in the website/editor tools from incorrectly flagging content as modified. Business users can preview pages or blocks without triggering unnecessary unsaved-change warnings or save prompts.
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
The Stripe documentation link in the Point of Sale payment provider settings has been fixed. This helps users reach the correct setup instructions without confusion or dead-end navigation.
Original PR description
Before this commit: ---------------- - The Stripe documentation link in the POS payment provider configuration was broken, leading to a poor user experience. After this commit: ------------------------------- - The Stripe documentation link has been corrected to ensure proper access to setup instructions. Task - 4797691 Forward-Port-Of: odoo/odoo#210515
Printing delivery operation reports now works even when an item has no reserved quantity. The report also hides zero-quantity lines, making delivery documents cleaner and easier to read.
Original PR description
**Steps to reproduce:** 1. Install Inventory > Go to Inventory > Configuration > Tick Storage Locations. 2. Go to Operations > Deliveries > create a new delivery. 3. Add two products: one with…
**Steps to reproduce:** 1. Install Inventory > Go to Inventory > Configuration > Tick Storage Locations. 2. Go to Operations > Deliveries > create a new delivery. 3. Add two products: one with on-hand quantity, one without. 4. Set demand quantities > mark as To Do, check availability, and try to print. **Issue:** - A traceback (IndexError: tuple index out of range) occurs when printing picking report if a product has no reserved quantity, due to missing move lines. **Cause:** - The template attempts to access `move.move_line_ids[0]` without checking if `move_line_ids` is non-empty. This raises an IndexError if there's no move lines. https://github.com/odoo/odoo/blob/f539705023993e284dce5dc1027c3c3af9c42d75/addons/stock/report/report_stockpicking_operations.xml#L143-L146 - Also, move lines with zero quantity are displayed in the picking operation report. <img width="529" height="94" alt="image" src="https://github.com/user-attachments/assets/61c439a2-16c4-44aa-a664-fbec672f6226" /> **Solution:** - Add a check to ensure `move.move_line_ids` is non-empty before accessing the first element. - Add filter to avoid rendering move lines with zero `quantity` in the delivery. **opw-4961985** Forward-Port-Of: odoo/odoo#220317
Users without Time Off access can now change the type of a leave request without hitting an access error. This prevents interruptions when employees request or adjust time off, such as switching from paid time off to sick leave.
Original PR description
Steps: ([demo](https://drive.google.com/file/d/1nphgXlAc_w3z0oE7ickuTaGhl5khLhxo/view?usp=drive_link)) - Remove Time Off access to "Demo" user - Login as demo - Request a "Paid Time Off" - Change the Request time off type to "Sick" Actual result: - overtime_id field access error Expected result: - no error Caused by: https://github.com/odoo/odoo/pull/207780 opw-4929659 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218095
Portal users can now access marketing cards in the same way public users already could. This avoids access issues for recipients who are often partner contacts, making shared marketing cards easier to view.
Original PR description
The access right that allows public users to read cards should obviously apply equaly to portal users. Recipients will very often be partners so them not being allowed is very annoying. task-5000332 Forward-Port-Of: odoo/odoo#222037
This fix ensures that when users create a sales order item from a project task, the company is filled in automatically and product taxes appear as expected. This avoids missing tax information during billable project and timesheet workflows, especially in multi-company environments.
Original PR description
## Short functional explanation of the error When clicking on "create and edit" on a Sales Order Item field in a task, the company field is left blank. As a result, the taxes linked to the product…
## Short functional explanation of the error When clicking on "create and edit" on a Sales Order Item field in a task, the company field is left blank. As a result, the taxes linked to the product don't appear. ## Reproduction Steps 1. Install the modules sales, timesheet and project. 2. Make sure that you have at least 2 different companies in the settings. 2. Click on the project app and create a new project. Check the Billable and Timesheets boxes. 3. Create a task and click on it. Set a customer: the field "Sales Order Item" should appear. 4. Click on the "Sales Order Item" field. Type random letters and click on "create and edit". 5. Select a product that has at least one tax. ### Expected behavior The company field should be filled as soon as we click on the create and edit button, and the taxes field should be filled with the taxes of the product as soon as we select said product. ### Unexpected behavior The company and taxes field remain empty. ## Origin of the issue Some fields were set at "default_." __ opw-4904861 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221342
Purchase order PDFs now handle very long product purchase descriptions without the text overlapping the table header when the document spans multiple pages. This makes printed purchase orders clearer and more reliable for users and suppliers.
Original PR description
**Steps to reproduce**: 1. Install the `purchase` module. 2. Go to a product's `Purchase` tab and add a long purchase description (approx. 40–45 lines). 3. Create a Purchase Order using this product.…
**Steps to reproduce**: 1. Install the `purchase` module. 2. Go to a product's `Purchase` tab and add a long purchase description (approx. 40–45 lines). 3. Create a Purchase Order using this product. 4. Print the PDF of the Purchase Order (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 sale order. ref(https://github.com/odoo/odoo/pull/53909) Before: <img width="1003" height="426" alt="image" src="https://github.com/user-attachments/assets/38b7b4de-ea81-445f-8cd2-ae164fcb7531" /> After: <img width="1000" height="414" alt="image" src="https://github.com/user-attachments/assets/ef09ef94-2a26-468a-b6e7-03d93b4515b8" /> opw-4908457 Forward-Port-Of: odoo/odoo#219830
This fix prevents original list prices from being exposed in hidden page elements for rental products that should not show a sale price. It helps keep website pricing consistent with configured pricelists and avoids search engines or visitors discovering prices meant to remain unavailable.
Original PR description
Versions
--------
- 17.0+
Steps
-----
1. Create a pricelist setting product prices to zero;
2. configure website to make zero-priced products unavailable for sale;
3. go to /shop as a public user;
4. open the product page of a zero-priced product;
5. open the browser console;
6. use `document.querySelector('.css_non_editable_mode_hidden .oe_currency_value')`
Issue
-----
The query returns an element with the product's original list price.
Cause
-----
In `website_sale`, this element is part of a `t-if` that only gets rendered when `editable` is `True`. A `website_sale_renting` override changes the conditional to `not combination_info.get('is_rental')`.
Solution
--------
Instead of replacing the `t-if` attribute in the override, add `and not combination_info.get('is_rental')` to it, ensuring it remains hidden outside of editable mode.
opw-4865141
Forward-Port-Of: odoo/enterprise#91728
Forward-Port-Of: odoo/enterprise#91112The VoIP call timer now uses the user's device time consistently instead of mixing it with server time. This prevents calls from showing a negative starting time when clocks differ slightly, improving call display reliability.
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#91738
Customers no longer receive automatic emails asking them to pay when a payment has already been started through the manual payment registration flow. This avoids confusion and reduces the risk of duplicate payment attempts or unnecessary customer support follow-up.
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
Fixed an issue where editing depreciation for assets with a negative value could swap debit and credit amounts in journal entries. This helps keep accounting entries accurate after depreciation adjustments.
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#91340 Forward-Port-Of: odoo/enterprise#88907
This fix ensures that time off overlapping with a public holiday is not incorrectly carried over to a future payslip. It helps keep payroll calculations accurate when employees request sick leave or other absences during periods that include public holidays.
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 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#89264
The journal report now keeps draft invoice lines grouped consistently when several draft invoices share the same date. This prevents errors when users include draft entries and use the Load More option, improving reliability for finance reporting.
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 Spanish Amazon sales invoices from locking their invoice reference too early during processing. It helps ensure invoice names are assigned correctly and reduces the risk of errors in invoice creation or posting.
Original PR description
Accessing `invoice_line_ids` was flushing and protecting `move_name` too early. runbot-162079 Forward-Port-Of: odoo/enterprise#91703
This fix ensures multi-select product options sent through UrbanPiper appear as checkboxes in DoorDash instead of radio buttons. It improves menu accuracy for restaurants using DoorDash integrations and prevents customers from seeing the wrong option selection behavior.
Original PR description
Steps: - Configure urban piper in pos.config - Select products that has attribute and its type is multi-checkbox - Sync menu. Issue: - For Doordash multi-checkbox appears as radio instead of checkbox. Cause: - max_selectable is -1 which is not supported by Doordash. Fix: - Send static value as 30 instead of -1. task- 4971545 Forward-Port-Of: odoo/enterprise#91499