Friday, July 4, 2025
14 changes · saas-18.1
Resolved issues and error corrections
The live chat widget page now adapts correctly to small screens on mobile devices. This prevents oversized text and overflowing content, making it easier for visitors to use chat from their phones.
Original PR description
**Before this PR:** the livechat widget page was not responsive on mobile devices. This PR fixes the issue by adding the missing meta tag and adjusting font sizing and word wrapping to prevent content overflow on small screens. task-3499603 Forward-Port-Of: odoo/odoo#217127
Fixes an issue where opening a website page in editor mode could fail if duplicated page views shared the same identifier. This improves reliability for website administrators and prevents disruption when editing affected pages.
Original PR description
When multiple `ir.ui.view` records exist with the same key (e.g., due to duplication), it can lead to a singleton error. **Steps to reproduce:** 1. Install the website module 2. Go to `Settings >…
When multiple `ir.ui.view` records exist with the same key (e.g., due to duplication), it can lead to a singleton error. **Steps to reproduce:** 1. Install the website module 2. Go to `Settings > Technical > User Interface > Views`. 3. Find and duplicate the **Home** view for **My Website** (same key). 4. Open the website home page in Editor mode. **Error:** `ValueError - Expected singleton: ir.ui.view(2776, 2774)` **Cause:** In `viewref()`, it uses `filter_duplicate()` to filter for the most suitable view, but it may return multiple views if more than one match the criteria. - [1] **Ref:** At [2], system uses `limit=1` in `_view_obj()` to ensure only one view is returned, even if duplicates exist for the same key. [1]: https://github.com/odoo/odoo/blob/edfa37271a0015a0d4acb17e6985a87e707e5f33/addons/website/models/website.py#L1228-L1230 [2]: https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/web_editor/models/ir_ui_view.py#L326 **Fix:** This commit ensures that the result is a record set with at most one view and preventing singleton-related errors. sentry-6223988092 Forward-Port-Of: odoo/odoo#213113
This fix keeps column and table content areas stable when users press Backspace in the HTML editor. It prevents misplaced editing hints and preserves the expected editable structure, reducing formatting glitches while editing pages or rich text content.
Original PR description
**Current behavior before PR:** - Pressing backspace while a column is selected could cause the column hint to be incorrectly positioned. This happened because the base container inside the column was removed during the backspace action. - When a table row or column was not fully selected, pressing Backspace would replace the contents of the selected `td` elements with a `br` tag. **Desired behavior after PR is merged:** - If the base container is removed during backspace, it is now reinserted to ensure the column hint remains correctly positioned. - Pressing Backspace in a partially selected row or column now replaces the content of the selected `td` elements with a base container instead of a `br` tag. task:4783325 Forward-Port-Of: odoo/odoo#209226
Payments using an existing third-party check now default to the currency of that check, avoiding incorrect exchange-rate calculations. The change also blocks combining checks in different currencies, reducing accounting errors for businesses handling multi-currency payments.
Original PR description
**Steps to reproduce:** - Install accountant, l10n_ar and l10n_latam_check - Switch to an Argentinian company (e.g. (AR) Responsable Inscripto) - Make sure that USD currency has a rate different than…
**Steps to reproduce:**
- Install accountant, l10n_ar and l10n_latam_check
- Switch to an Argentinian company (e.g. (AR) Responsable Inscripto)
- Make sure that USD currency has a rate different than 1
- Create a journal:
* Journal Name: Checks journal
* Type: Cash
- Save the journal
=> a Cash Account should be automatically created
- In "Incoming Payments" tab of the journal, set:
* "New Third Party Checks" with the Cash Account
* "Existing Third Party Checks" with the Cash Account
- In "Outgoing Payments" tab of the journal, set:
* "Existing Third Party Checks" with the Cash Account
- Create an invoice:
* Customer: [an Argentinian customer] (e.g. ADHOC SA)
* Currency: ARS
* Invoice Lines:
- Quantity: 1
- Price: 150000.00
- Taxes: VAT 21%
- Confirm the invoice
- Pay the invoice:
* Journal: [the created Checks journal]
* Currency: ARS
* Checks: [add a line with the amount of the invoice]
- Create a bill:
* Vendor: [an Argentinian customer] (e.g. ADHOC SA)
* Currency: USD
* Invoice Lines:
- Quantity: 1
- Price: 500.00
- Taxes: VAT 21%
- Pay the bill:
* Journal: [the created Checks journal]
* Payment Method: Existing Third Party Checks
* Checks: [add a line and select the check used to pay the invoice]
**Issue:**
When the check (from the invoice) is selected to pay the bill, the original amount (in ARS) is used but the currency stays in USD, which is not correct.
If the currency is changed to ARS, the currency rate is applied on the amount that is already the amount in ARS, which generates a higher incorrect amount.
**Solution:**
Use the currency set on the existing check by default.
Also prevent adding several checks with different currencies.
opw-4741607
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#215435This fix prevents manually adjusted extra hours from being overwritten when a new attendance is created for the same employee. It helps payroll and HR teams keep intentional corrections intact while still allowing normal automatic approval behavior where values have not been changed.
Original PR description
**Steps to reproduce** - Set "Extra Hours Validation" to "Automatically approved" - Create an attendance for an employee - Change the "Extra Hours" to a different value - Create another attendance…
**Steps to reproduce** - Set "Extra Hours Validation" to "Automatically approved" - Create an attendance for an employee - Change the "Extra Hours" to a different value - Create another attendance for this employee (not necessarily on the same day) - See that the "Extra hours" of the previous attendance has been recomputed, resetting the value entered by the user. **Cause** When creating an attendance for an employee, we recompute the `validated_overtime_hours` for the other attendances of this employee https://github.com/odoo/odoo/blob/cac96f5d3c391ea0d52da2e3433e7eabe07e8fb0/addons/hr_attendance/models/hr_attendance.py#L426 In case of attendances with no validation, this field is synced with the `overtime_hours` https://github.com/odoo/odoo/blob/cac96f5d3c391ea0d52da2e3433e7eabe07e8fb0/addons/hr_attendance/models/hr_attendance.py#L156 **Solution** We may still want to recompute the `validated_overtime_hours` of automatically approved attendances, since it is their default state, unlike manually approved attendances. If the `validated_overtime_hours` field is different from `overtime_hours`, it means it has been modified. In that case, we avoid recomputing it. This doesn't guarantee a manually set value will never be overriden by a change in its dependencies, but it reduces the likelihood. opw-4639230 Forward-Port-Of: odoo/odoo#207806
This fixes an issue where refund workflows could skip the required refund reason popup when Spanish TicketBAI POS and Peruvian POS e-invoicing were installed together. Businesses using these localizations can now process refunds with the expected compliance prompt shown reliably.
Original PR description
When both l10n_es_pos_tbai and l10n_pe_edi_pos are installed, the refund reason popup was not showing up because we were not awaiting the super method call in the l10n_pe_edi_pos override. runbot-227630 Forward-Port-Of: odoo/odoo#217358 Forward-Port-Of: odoo/odoo#216379
Payments will now only try to match against invoices that are officially posted, avoiding errors when an invoice has already been cancelled. This helps keep automated payment follow-up jobs running smoothly and reduces manual intervention for accounting teams.
Original PR description
Steps to reproduce: 1. Create an invoice. 2. Register a payment in the 'pending' state. 3. Cancel the invoice. 4. Confirm the payment (set payment state to 'done'). 5. Run the 'post-process transactions' cron job and check the logs. → Error occurs during reconciliation due to the cancelled invoice. Issue: cancelled invoices were being considered during the reconciliation process, leading to errors. Solution: This fix ensures that only posted invoices are considered during the reconciliation process. Forward-Port-Of: odoo/odoo#217212 Forward-Port-Of: odoo/odoo#213365
Invoice emails sent in batches now use the correct translated button text for each customer's language. This prevents customers from receiving emails with mixed or incorrect language labels when invoices are sent and printed together.
Original PR description
**Issue**: When multiple invoices with different customer languages are sent and printed together, the invoice email button may appear with an incorrect translation for some of them. **Steps to…
**Issue**: When multiple invoices with different customer languages are sent and printed together, the invoice email button may appear with an incorrect translation for some of them. **Steps to reproduce**: - Open the Accounting app - Go to Customers > invoices - Create a new invoice with a customer with its language set to German - Create a new invoice with a customer with its language set to English - Go back to Customers > invoices - Select the two invoices just created and click on action > Sent & Print and then click on the Sent & Print button - Go to Settings > Technical > Email > Emails and check the two last emails. One of them should have the invoice email button wrongly translated **Cause**: Before sending an email, it retrieve the `type_name` using the lang of the customer https://github.com/odoo/odoo/blob/28c3b9cf10488536dce5a4927fdbe8fcd6e5a839/addons/account/wizard/account_move_send.py#L596C1-L605C14 This will trigger that compute method https://github.com/odoo/odoo/blob/a6368e8a5787f3067d09d79516a2924b3f1207f0/addons/account/models/account_move.py#L841C1-L850C67 which set the `type_name` of all the records. Since the compute method only depends on move_type, it does not recompute type_name per record. As a result, all records may share the same type_name, regardless of language context. Please notice that `type_name` is used to display the invoice email button in the right language. **Solution**: Make the compute method `_compute_type_name` depending to the lang parameter, thus it will use the right `type_name` for each email to send. opw-4748741 Forward-Port-Of: odoo/odoo#216811
Online bank connections will now only show payments as active when they are actually eligible. The update also cleans up connections that were incorrectly marked, helping avoid confusion and preventing users from attempting unsupported payment actions.
Original PR description
Due to an overly restrictive condition, all online account connections were being marked as payment enabled/activated, even when they shouldn't be. This commit removes the faulty condition and introduces a small test to validate the correct behavior. Additionally, a fallback mechanism has been added to clean up improperly configured connections by removing the incorrect payment_activated flag where needed. no task id Forward-Port-Of: odoo/enterprise#89268
Fixed an issue where importing Winbooks files could skip some journals when their identifiers shared the same first five characters. The import now assigns clear temporary codes to conflicting journals so all records are brought into Odoo and can be reviewed or renamed afterward.
Original PR description
**Steps to reproduce:** - Install accountant, l10n_be and account_winbooks_import - Switch to a Belgian company (e.g. BE Company CoA) - Go to "Accounting / Configuration / Settings" - Click on…
**Steps to reproduce:** - Install accountant, l10n_be and account_winbooks_import - Switch to a Belgian company (e.g. BE Company CoA) - Go to "Accounting / Configuration / Settings" - Click on "Import (for full history)" in "Accounting Import" section - Click on "Import WBK" in "Winbooks" section - Upload a Winbooks file containing several journals having their "DBKID" value longer than 5 characters with the 5 first characters being identical (e.g. "SALES001", "SALES002",...) - Import **Issue:** Some journals are not imported. **Cause:** The code of a journal is limited to 5 characters and is unique per company. When a code is longer than 5 characters, only the 5 first characters are kept. In this case, several journals to create have the same 5 first characters. Therefore, only one of them is created. **Solution:** If the code of a journal to create has the same first 5 characters of a journal that has already been created (and the same last 5 characters), we use a generic code formatted with a starting "*" char followed by a number that is incremented. This format allows to quickly find it if we want to change its value once imported. This solution is limited to 9999 journals that have a code that can starts with the same 5 characters than another journal, but it should be more than enough. opw-4812655 Forward-Port-Of: odoo/enterprise#86068
Marketing automation campaign tests can once again include tracked link clicks, making test results closer to real customer journeys. The update also prevents overlapping tests for the same campaign and contact details, reducing confusing or incorrect test outcomes while still allowing separate tests to run in parallel.
Original PR description
Previously, marketing campaign testing (through debug) could cause an issue where tracked links could cause a traceback if a marketing activity was edited after a test was attempted. To work around…
Previously, marketing campaign testing (through debug) could cause an issue where tracked links could cause a traceback if a marketing activity was edited after a test was attempted. To work around this, #13665 deactivated link tracking in marketing campaign tests. However, this meant that flows including click actions could no longer be tested. As this issue has been resolved in odoo/odoo#48845, this commit reverts https://github.com/odoo/enterprise/pull/13665 to once again permit marketing automation testing. -- Additional changes are needed to fix other issues: Tests using one's own coordinates are prone to breaking due to newer mailing traces attaching themselves to the oldest marketing trace. This commit makes it so that marketing campaign tests for the same marketing campaign and coordinates cannot run concurrently, by cancelling older test campaigns upon starting a new one. Different tests can still run concurrently on distinct partners/leads/ etc. Additionally: - Running tests are now visible on campaigns in the "New" state; - Activities don't mark themselves as needing sync unless their campaign is in the "Running" state. task-4557855 Forward-Port-Of: odoo/enterprise#89364 Forward-Port-Of: odoo/enterprise#78793
Appointment bookings now avoid matching a website visitor to a customer record from a company the appointment staff cannot access. This prevents multi-company validation errors when creating opportunities from appointment requests, making online booking more reliable for businesses using multiple companies.
Original PR description
**Steps to reproduce:** - Set up CRM / Appointment / Website apps - Create new company (2) - Create partner contact with specific email and the new company - Create appointment type linked to a staff…
**Steps to reproduce:**
- Set up CRM / Appointment / Website apps
- Create new company (2)
- Create partner contact with specific email and the new company
- Create appointment type linked to a staff user of another company (1) who has no access to the new one
- Enable `Create Opportunities` on the new appointment type
- Go to the website as an anonymous user
- Submit an appointment request using the partner's email
- `Incompatible companies on records:` error
**Issue:**
Previous solution (17.0) was trying to use existing partner if the email was provided and existed in the database
`customer = request.env['res.partner'].sudo().search([('email_normalized', '=', email_normalized)], limit=1`
This means that, in a multi-company environment, the lead created by the new appointment for the appointment user of company 1 can be linked to the partner contact of company 2 and throw an error on validation.
**Fix:**
Restricted partner search domain using current allowed companies using the `staff_user` or the user which created the `appointement_type`.
opw-4713060
Forward-Port-Of: odoo/enterprise#87620
Forward-Port-Of: odoo/enterprise#84006This fixes an issue where the refund reason popup did not appear in Point of Sale when both the Spanish TicketBAI and Peruvian electronic invoicing localizations were installed. Refund workflows now behave correctly for affected businesses using these localization modules together.
Original PR description
When both l10n_es_pos_tbai and l10n_pe_edi_pos are installed, the refund reason popup was not showing up because we were not awaiting the super method call in the l10n_pe_edi_pos override. runbot-227630 Forward-Port-Of: odoo/enterprise#89423 Forward-Port-Of: odoo/enterprise#88813
Odoo now saves the Mexican e-invoice sending timestamp before contacting the certification provider. This helps prevent duplicate CFDIs with slightly different issue times when a connection drops during sending and the invoice is retried.
Original PR description
### Background In https://github.com/odoo/enterprise/pull/85026 we changed the behaviour of `l10n_mx_edi_post_time` so that it gets set during the CFDI sending process, rather than when the invoice…
### Background In https://github.com/odoo/enterprise/pull/85026 we changed the behaviour of `l10n_mx_edi_post_time` so that it gets set during the CFDI sending process, rather than when the invoice is posted. This was needed to ensure that the post time both reflects the sending time and is re-used if the invoice needs to be re-sent. ### Bug description Since then, several Mexican customers have reported that some CFDIs are sent duplicated, with a difference of a few seconds in the CFDI's Fecha. ### Analysis A disconnection might occur during sending of the CFDI. In that case, the PAC will process the CFDI, but in Odoo the transaction will be rolled back, and the `l10n_mx_edi_post_time` will be lost. When Odoo re-sends the CFDI, it will take a new `l10n_mx_edi_post_time`. ### Solution Commit before performing the API call so that the `l10n_mx_edi_post_time` gets committed to DB. opw-4780096 Forward-Port-Of: odoo/enterprise#89263 Forward-Port-Of: odoo/enterprise#89117