Daily updates from Odoo
Wednesday, August 6, 2025
13 changes · 18.0
Resolved issues and error corrections
Payment receipt PDFs now show the actual payment amount in the foreign currency instead of the company-currency equivalent. This prevents confusion for customers and accounting teams when invoices are paid and reconciled in another currency.
Original PR description
**Steps to reproduce**: 1. Install the `accounting` module. 2. Activate a foreign currency form `Accounting -> Configuration -> Currencies` and fetch its exchange rate. <img width="599" height="267"…
**Steps to reproduce**: 1. Install the `accounting` module. 2. Activate a foreign currency form `Accounting -> Configuration -> Currencies` and fetch its exchange rate. <img width="599" height="267" alt="image" src="https://github.com/user-attachments/assets/34e7c719-20f7-4cd0-a1d6-0e94764461ba" /> 3. Create an invoice using the company’s default currency (e.g., USD). 4. Register a payment using the foreign currency (e.g., VES). 5. Reconcile the payment with the invoice. 6. Print the payment receipt PDF. **Observations**: In the printed PDF, under the `Amount In Currency` column, the amount is incorrectly displayed. For example, suppose `1 USD` = `100 VES`. - An invoice of `100 USD` is created. - A payment of `10,000 Bs` is registered (equivalent to 100 USD). - When the payment receipt is printed, the output appears as: ``` | Invoice Number | Reference | Amount In Currency | Amount | |--------------------|-------------------|--------------------|-------------| | INV/2025/00001 | | | 100.00 USD | | PBNK1/2025/00001 | INV/2025/00001 | -100.00 Bs | -100.00 USD | ``` Here, the `Amount In Currency` for the payment line shows **100 Bs** instead of the correct **10,000 Bs**. **Issue**: The payment receipt uses the `_get_reconciled_invoices_partials()` method to fetch details about reconciled invoices. However, the report incorrectly uses the `amount` field (in company currency) for the `Amount In Currency` column, leading to this mismatch. **Solution**: The report now uses `(debit/credit)_amount_currency` instead of `amount` to correctly reflect the foreign currency values in the `Amount In Currency` column. opw-4898706 Forward-Port-Of: odoo/odoo#219439
Purchase orders now use the supplier’s configured currency even when they are created automatically, such as from an approval request. This prevents orders from defaulting to the company currency and helps keep supplier pricing and purchasing records accurate.
Original PR description
Steps to reproduce: - Go to Invoicing > Configuration > Accounting > Currencies: - Enable the Euro currency - Set company currency to USD - Go to any partner form (e.g. Azure Interior): - In Sales &…
Steps to reproduce:
- Go to Invoicing > Configuration > Accounting > Currencies:
- Enable the Euro currency
- Set company currency to USD
- Go to any partner form (e.g. Azure Interior):
- In Sales & Purchase tab: - Set Supplier Currency to Euro
- Create a purchase order from the UI:
- Select Azure Interior → Currency is correctly updated to Euro (via onchange)
- Install the Approvals module
- Create a storable product "P1":
- Under Purchase tab: - Vendor: Azure Interior - Price unit: 5 EUR
- Create an approval request:
- Request Owner: Marc Demo
- Product: P1
- Approver: Mitchel Admin
- Submit and approve the request
- Click on "Create Purchase Order"
Issue:
The purchase order is created with the correct partner and product. But the currency is incorrectly set to the company currency (USD), instead of the supplier's currency (Euro).
Cause:
The currency was updated via an `@onchange`, which is only triggered in the UI.
When creating a PO programmatically (e.g. via approvals or in a test), the onchange is not executed and the currency falls back to the company default.
Solution:
Replace the `@onchange` logic for `currency_id` with a stored compute field.
This ensures that the correct currency is always computed, regardless of how the purchase order is created.
opw-4938390Fixes an error that could occur when users tried to add tags to a contact in the Contacts app. This keeps contact editing smooth and prevents users from being blocked by an unexpected crash.
Original PR description
**Steps to reproduce:** 1. Install the "Contacts" app. 2. Go to Contacts > Open any contact. 3. Click on the "Tags" (Partner Category) field to add a tag. **Issue:** A traceback is raised: `TypeError: can only concatenate list (not "_ProtectedDomain") to list` **Cause:** - Due to recent changes in https://github.com/odoo/odoo/commit/cd5f29b8b50ef4228be8f58a02bb328548208f77, default domains like `TRUE_DOMAIN` are now defined using a `_ProtectedDomain` class (a tuple subclass) instead of regular lists, to make them immutable. - This breaks code that tries to modify or concatenate domains assuming they are lists. - In this case, `res.partner.category._search_display_name` returned a `_ProtectedDomain` which was passed to `_search()`, leading to the error when Odoo tried to prepend additional filters. Solution: - Before using the domain in _search(), convert it to a regular list using list(domain). opw-4991994
This fix updates Canadian fiscal position mappings so products using Nova Scotia's new 14% HST are handled correctly outside Nova Scotia as well. It helps ensure the correct taxes are applied during transactions and avoids incorrect tax mapping in Canadian localizations.
Original PR description
In odoo/odoo#219117 we added the new 14% tax required for Nova Scotia's tax mandate changes, while the fiscal position was properly update for NS, the rest of the FP were ommited so as of now if any product has a HST 14% tax on it it won't be properly mapped to the correct tax. This was noticed in the saas-18.3 forward port this PR will fix the CSV in older versions and update the migration script for all FP in all versions. task-4937159 Forward-Port-Of: odoo/odoo#220280
Point of Sale loyalty rewards now correctly add the free product when the eligible item has multiple variants. This helps ensure customers receive promised rewards consistently at checkout and reduces manual corrections for cashiers.
Original PR description
Before this commit, when using a free product reward on multi products that have several variants, adding the desired product to the order would not always trigger the automatic addition of the free product as expected. opw-4841759 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Customers no longer receive automatic emails asking them to pay an invoice when a saved payment method is already being processed through the payment registration flow. This avoids confusing customer communication and better reflects the actual payment status.
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#221587
Fixes a website editor issue where pages could crash when reopening content that had a carousel inside a table of contents block with its navigation hidden. This makes editing those pages reliable again and prevents disruption for website managers.
Original PR description
Problem: When `s_carousel` is placed inside an `s_table_of_content` and the navbar of the TOC is hidden (visibility set to "Hide" on desktop), saving and reopening the editor results in a traceback.…
Problem: When `s_carousel` is placed inside an `s_table_of_content` and the navbar of the TOC is hidden (visibility set to "Hide" on desktop), saving and reopening the editor results in a traceback. Cause: The traceback occurs due to the following sequence: In `WysiwygAdapterComponent.startEdition`, calling `await super.startEdition()` will invoke `createInvisibleElement()` if the navbar is hidden. This, in turn, activates the scroll spy by calling `_activateScrollSpy()` while starting the TOC snippet. That triggers `widgets_start_request`, which starts the `s_carousel` snippet. However, at this point the `wysiwyg` instance has not yet been attached to the `wrapwrap` element. That happens later, at: https://github.com/odoo/odoo/blob/f12050f75ae9ae1125c0c01ec504a24bd401b1ea/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L318 and only after the `await super.startEdition()` call at: https://github.com/odoo/odoo/blob/f12050f75ae9ae1125c0c01ec504a24bd401b1ea/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L232 This delay causes a race condition when starting widgets like `s_carousel` that rely on the presence of the `wysiwyg` instance. Solution: Attach the `wysiwyg` instance to the DOM before `await super.startEdition()` in `WysiwygAdapterComponent.startEdition`. Steps to reproduce: - Add a Table of Content block - Insert a Carousel inside the content - Set the TOC navbar visibility to "Hide" on desktop - Save the page - Reopen the editor - A traceback occurs opw-4971409 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221200
Payroll now correctly avoids carrying over sick leave or other time off when it overlaps with a public holiday. This prevents employees from receiving an incorrect deferred leave adjustment on a later payslip.
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 in a stable order when several draft invoices share the same date. This prevents errors when users click "Load More" while including draft entries, 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#90360
This update addresses several user-facing issues across Odoo Enterprise, including payroll offer handling, subscription discounts, accounting exports, bank synchronization, data merging, and localized financial reporting. It improves accuracy, prevents duplicate actions, and helps businesses comply with reporting requirements in Türkiye and Germany.
This fix restores the previous behavior for imported assets so Odoo no longer shifts depreciation differences from prior software into the next period. It helps keep asset reports and depreciation schedules accurate for customers migrating accounting data, while preserving improved remaining and depreciated value calculations.
Original PR description
This reverts commit 79aa48867de14a6d2315ec95b271004084d74b14. A lot of customers reported that the data was wrong in a lot of cases. For instance, when the previous software computed a lower depreciation than Odoo, Odoo was then moving the difference into the next period. The change for the computation of `asset_remaining_value` and `asset_depreciated_value` has been kept. opw-4968367 opw-4977970 opw-4961381 opw-4991216 opw-4965451 Forward-Port-Of: odoo/enterprise#91751 Forward-Port-Of: odoo/enterprise#91723
Customers no longer receive automatic emails asking them to pay when a payment has already been started through the payment registration process. This prevents confusing payment reminders and improves the customer experience for invoices paid with saved payment details.
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#91570
This fix prevents Romanian SAF-T exports from being blocked when optional product group information is missing or when VAT checks incorrectly flag partners. Businesses can complete required tax reporting more smoothly with fewer false validation errors.
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.