Daily updates from Odoo
Thursday, April 30, 2026
43 changes · saas-19.2
Resolved issues and error corrections
This update fixes a critical issue where gift cards and e-wallets could be reused after being refunded, leading to potential misuse. It now prevents refunds and ensures order lines are created correctly when products are linked to multiple loyalty programs, improving program accuracy and preventing data inconsistencies.
Original PR description
Previously, it was possible to refund a gift card or e-wallet after creation. However, the associated code remained usable, allowing the gift card or e-wallet to be reused, which is not the expected behavior. To address this, refunds for gift cards and e-wallets are now prevented. Additionally, when a product is part of the trigger products for multiple gift card or e-wallet programs, it was not possible to create separate order lines for the same product with different programs selected. The second line was merged into the first. A condition has been added to prevent merging when different programs are selected. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6052281 Forward-Port-Of: odoo/odoo#261647 Forward-Port-Of: odoo/odoo#256896
This update strengthens the security of Xendit payments by requiring a valid access token linked to the specific transaction. Previously, payments could be processed without this verification, creating a potential risk. Now, payments are restricted to the correct transaction, improving security and preventing unauthorized payments.
Original PR description
**Description of the issue/feature this PR addresses:** The `/payment/xendit/payment` endpoint did not enforce validation of an access token tied to the transaction when processing direct payment requests. **Current behavior before PR:** The endpoint accepted public requests using only the transaction reference, allowing payment execution without verifying that the request was linked to the intended transaction. **Desired behavior after PR is merged:** The endpoint now requires a valid access_token associated with the transaction (reference) before processing. This ensures that payment execution is restricted to the correct transaction. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261912 Forward-Port-Of: odoo/odoo#260258
This update ensures the IRN (Invoice Reference Number) generated during E-Invoicing EDI submission is correctly saved and displayed in both the Invoice PDF and the invoice form within Odoo. Previously, the IRN was only present in the PDF but not on the invoice itself, now it's consistently available.
Original PR description
**Steps to reproduce:** * Install module *Indian - GSTR with E-invoice (l10n_in_edi_gstr)*. * Configure *Indian integration* with required credentials (E-Invoicing, E-Way bill, etc.). * Save the…
**Steps to reproduce:** * Install module *Indian - GSTR with E-invoice (l10n_in_edi_gstr)*. * Configure *Indian integration* with required credentials (E-Invoicing, E-Way bill, etc.). * Save the settings. * Create a *customer invoice*. * Post the invoice. * Send the invoice through *E-Invoicing (EDI)*. * Open the generated *Invoice PDF* and the *form view*. **Observed behavior:** * The *IRN number* is correctly present in the *Invoice PDF*. * However, it is *not saved/displayed* in the invoice form view. **Cause:** * The invoice flow did not store the *IRN number* on the invoice after receiving the EDI response, even though the value was available. **Fix:** * Inherit *_l10n_in_edi_send_invoice*. * Add a condition after the invoice is sent and the JSON response is received. * When the *IRN number* is present in the response, set it on the *l10n_in_irn_number* field of the invoice (in lower case). opw-6097923 Forward-Port-Of: odoo/enterprise#115522 Forward-Port-Of: odoo/enterprise#114350
This update resolves an issue where the 'Remove Format' function would get stuck in an infinite loop when used with icons and background colors in the To-do app. The fix ensures that icons are correctly processed during format removal, preventing the loop and restoring normal functionality.
Original PR description
Steps to reproduce: =================== 1. Open the To-do app and pick any task. 2. In the description add text and an icon with a bg color. `(you can add this: <i class="fa rounded rounded-circle…
Steps to reproduce: =================== 1. Open the To-do app and pick any task. 2. In the description add text and an icon with a bg color. `(you can add this: <i class="fa rounded rounded-circle fa-user bg-o-color-1 fa-4x" contenteditable="false"></i>)` 3. Select all and click "Remove format". Result: -> Traceback due to an infinite loop. Cause: ====== Remove format calls `removeAllColor()`, which loops forever at: https://github.com/odoo/odoo/blob/626bde21a25366d0bb29662bae2057c247a1638e/addons/html_editor/static/src/main/font/color_plugin.js#L194-L194 Why: _applyColor doesn't remove the icon's background class, so hasAnySelectedNodeColor keeps returning true and the removal loop never terminates. This happens because `font` is already the `<i>` element with the `fa` class, using `querySelectorAll` on it won't include the element itself, so the icon is never checked or updated. https://github.com/odoo/odoo/blob/6cdc6f55886ea48e90f9023a6c6142bf072745b9/addons/html_editor/static/src/main/font/color_plugin.js#L290 Solution: ========= Check if the font itself has the fa class before doing the `querySelectorAll`, and include it in the nodes to check for color. Test Impact: ============ Before this fix, a `<span>` containing an icon was wrapped in a `<font>` when applying color, treating the icon as a normal span (without size) instead of applying the color directly. https://github.com/odoo/odoo/blob/8792c2d38eb0aadac8d778d83fd76f270404ecd5/addons/html_editor/static/src/main/font/color_plugin.js#L397 opw-5928627 Forward-Port-Of: odoo/odoo#261405 Forward-Port-Of: odoo/odoo#248449
This update resolves an issue where exporting VSME reports would fail if the base year was not a valid 4-digit number. The fix adds validation to ensure only correct years are used, preventing errors and ensuring report generation continues smoothly. This improves data reliability for VSME reporting.
Original PR description
Currently, an error occurs when exporting VSME reports if the base year is not a valid 4-digit year. **Steps to Reproduce:** 1. Install the `esg_csrd` module with demo data. 2. Create new "**VSME Reports**" with `Base Year = 1`. 3. Now, click on "**Print**". **Error:** `ValueError - Invalid isoformat string: '1-01-01'` **Cause:** The base year is directly used to build a date in [1], resulting in `datetime.date(1, 1, 1)`. In [2], this is formatted to **"1-01-01"** and used in a domain search, which raises a ValueError due to an invalid ISO date format. **Fix:** - Adds a **constraint on base year** to ensure only valid years (1000–9999) are allowed for new VSME Report records. - Adds a **helper validation method** to verify base year before performing computations on existing records. sentry-7419431039 Forward-Port-Of: odoo/enterprise#114453
This update corrects a bug that prevented users from successfully booking appointments with flexible hour slots in the 19.2 release. The issue stemmed from a rounding error in how appointment URLs were generated, leading to a 404 error. The fix ensures accurate slot durations are used, allowing for seamless appointment booking.
Original PR description
Steps to reproduce: 1. Install `appointment` 2. Create an appointment type with the followings 3. Schedule type flexible and a slot of 20 min. 4. Share this appointment and try to book appointment…
Steps to reproduce: 1. Install `appointment` 2. Create an appointment type with the followings 3. Schedule type flexible and a slot of 20 min. 4. Share this appointment and try to book appointment for 20 min. Issue: - 404 Error occurs after selectiong the slot Cause: - In 19.0, commit https://github.com/odoo/enterprise/commit/9bae0e13e7bf5e0db25a60fc2683bc51eccb4447 started using slot.duration when building the booking URL for flexible slots. However, slot.duration is rounded to 2 decimals, so a 20-minute slot is serialized as 0.33 instead of its exact value. During validation, the end datetime is recomputed from this rounded duration, which no longer matches the original slot boundaries. This mismatch causes the slot to be considered invalid and the controller raises NotFound. Solution: - Compute the slot duration directly from slot_start_dt_tz and slot_end_dt_tz when building the URL, preserving the full precision. opw-5924312 Forward-Port-Of: odoo/enterprise#108870
This update restricts the future duration of recurring calendar events to 15 years by default, preventing excessive event creation and ensuring predictable scheduling. Administrators can adjust this limit for specific events needing longer recurrence periods. This improves system stability and resource management.
Original PR description
`forever` recurrent events could currently be created for 720 years into the future, leading to excessive and unnecessary event generation. This change limits the creation of forver recurrent events to a fixed horizon of 15 years (by default) in the future, ensuring predictable behavior and preventing unbounded recurrence. The maximum horizon can be adjusted through the system parameter `calendar.max_recurrence_years` for events that require a longer recurrence window. Task-5714633 Forward-Port-Of: odoo/odoo#261808 Forward-Port-Of: odoo/odoo#247929
This update fixes an issue where the POS system was loading all employees, regardless of their role, leading to performance slowdowns. The change now ensures that only basic employees are loaded, improving the speed and efficiency of the POS experience. This resolves a previous bug related to employee configuration settings.
Original PR description
Before this commit, when some employee was assigned to advanced or minimal employee, all of the employees were loaded in the POS session, because there was no basic employee assigned to the POS config. opw-5898068 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260805 Forward-Port-Of: odoo/odoo#247043
This update resolves an issue where the POS system was loading all employees, regardless of configuration. Previously, the absence of a basic employee assignment caused this. Now, the system only loads employees based on the POS configuration, improving performance and reducing unnecessary data loading.
Original PR description
Before this commit, when some employee was assigned to advanced or minimal employee, all of the employees were loaded in the POS session, because there was no basic employee assigned to the POS config. opw-5898068 Forward-Port-Of: odoo/enterprise#115109
This update clarifies how WHT reporting is handled in the accounting system. Previously, the system incorrectly mixed WHT closing entries with VAT closing entries, leading to potential reporting errors. This fix removes a specific return type, ensuring accurate and separate reporting of WHT transactions.
Original PR description
WHT does not require a closing entry. The current return type is causing VAT closing entry to mix with WHT closing entry or vice versa. task-6157814 Forward-Port-Of: odoo/enterprise#115576
This update resolves an issue where power buttons were incorrectly displayed and overlapping other menu items within the HTML editor, particularly on smaller screens. The fix adjusts the editor's width detection to ensure buttons are hidden when they cause overlap, improving the user experience and visual consistency.
Original PR description
Problem: Power buttons are shown regardless of the editor field's actual rendered width, causing them to overlap other menus when the field is small. Solution: Instead of relying solely on the global…
Problem: Power buttons are shown regardless of the editor field's actual rendered width, causing them to overlap other menus when the field is small. Solution: Instead of relying solely on the global `ui.isSmall` (mobile detection), check the editor field's own width and hide power buttons whenever it falls below the overlap threshold. Before: <img width="576" height="301" alt="image" src="https://github.com/user-attachments/assets/dcebed55-5c80-4fe5-8d33-c320549cf347" /> After: <img width="542" height="336" alt="image" src="https://github.com/user-attachments/assets/34a233bb-9958-43ac-adb9-04702a2e403d" /> Steps to reproduce: - Change languange (French to have a long placeholder). - Settings > Customer Invoices > Default Terms & Conditions. - Check "Add a Note". - Resize the screen to smaller size. - Observe the power buttons overlap with the translate button. task-6117734 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261881 Forward-Port-Of: odoo/odoo#259094
This update resolves an issue where the IoT box pairing dialog could freeze indefinitely. Additionally, it corrects a localization problem where the 'Connecting' placeholder wasn't updating correctly for non-English users. These changes ensure a smoother and more reliable experience when adding IoT boxes to the system.
Original PR description
This commit fixes two small issues with IoT pairing: 1. When pairing an IoT box, even after the DB has discovered the IoT box and added it as a record, the dialog will keep waiting forever. If you close the dialog manually the IoT box appears as expected. 2. If using a language other than English, the placeholder 'Connecting' name will not be replaced when the IoT finishes pairing. The IoT box can still be used as normal however. Forward-Port-Of: odoo/enterprise#115627
This update corrects a reporting issue within the GSTR-3B report for Indian companies using the '18% IGST (IMP-Service)' tax. Previously, the report incorrectly excluded bills with this tax. The fix adjusts the tax distribution to ensure accurate reporting of IGST liabilities, resolving a discrepancy in import of services.
Original PR description
**Steps to reproduce:** - Install l10n_in_reports - Switch to an Indian company (e.g. IN Company) - Create a bill with a Service product and "18% IGST (IMP-Service)" tax - Confirm the bill - Go to "Accounting / Reporting / India / GSTR-3B" **Issue:** In "4. (A) (2) Import of services" section of the report, the bill that has been created is not taken into account. **Cause:** The "18% IGST (IMP-Service)" tax has a distribution of: * 100% of the tax in "100570" account with "IGST" tax tag * -100% of the tax in same account with "IGST" tax tag Therefore, both distribution lines with the tax tag cancel themselves. opw-6116356 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260631
This update resolves an issue where multi-company invoice calculations were failing due to incorrect tax access permissions. The change ensures tax calculations are performed securely, regardless of the company context, preventing errors and improving invoice processing reliability.
Original PR description
Description of the issue this commit addresses: In multi-company setups, invoice line tax recomputation could read product or account taxes in user context and trigger an AccessError on account.tax when products carry taxes from another company. Desired behavior after this commit is merged: This patch hardens account.move.line tax recomputation paths by reading tax M2M values in sudo and returning filtered results in normal env, so compute logic no longer crashes on cross-company tax records. Ticket [link](https://www.odoo.com/odoo/project.task/6036638) opw-6036638 Forward-Port-Of: odoo/odoo#260948
This update corrects a formatting issue in the e-waybill document date field. Previously, both date and time were displayed, which is now standardized to show only the date. This ensures consistent reporting and compliance with required document formats.
Original PR description
The `document_date` field in e-waybill form view previously included both date and time, which is not as per the expected format. This fix ensures that only the date is shown, hiding the time component. Forward-Port-Of: odoo/odoo#261253 Forward-Port-Of: odoo/odoo#259656
This update corrects a bug that prevented customers from being found using their email addresses. The system was incorrectly searching for emails in the phone field instead. This change ensures accurate customer retrieval based on email, improving data accuracy and usability.
Original PR description
The email-based lookup was mistakenly checking the phone field (`phone = email`) instead of the email field. Because of this, customers could not be correctly found using their email address. This change fixes the domain to properly match on the email field. Forward-Port-Of: odoo/odoo#260567
This update fixes an issue where backorders created from returns weren't properly associated with the original return. Previously, the system didn't correctly set a link between the backorder and the return, leading to reporting discrepancies. This change ensures that backorders generated from returns are accurately tracked within the return process.
Original PR description
### Steps to reproduce: - Create, confirm and validate a delivery for 2 units of a product A - Click Return > Return All - Validate the return for 1 unit and backorder #### > The backorder does not belong to the return list of the delivery ### Cause of the issue: Backorder pickings are created by copying the picking to backorder: https://github.com/odoo/odoo/blob/9ad995ff6b59a6a2fdfbbd6cf385fe27568dd3ea/addons/stock/models/stock_picking.py#L1580-L1593 https://github.com/odoo/odoo/blob/9ad995ff6b59a6a2fdfbbd6cf385fe27568dd3ea/addons/stock/models/stock_picking.py#L1571-L1578 However, the `return_id` is a `copy=False` field that is not manully set during this copy process: https://github.com/odoo/odoo/blob/9ad995ff6b59a6a2fdfbbd6cf385fe27568dd3ea/addons/stock/models/stock_picking.py#L558 opw-6111544 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261831 Forward-Port-Of: odoo/odoo#259804
This update resolves an issue preventing the MPESA payment method from correctly processing transactions initiated by Safaricom. It disables CSRF checks on callback endpoints and ensures URLs use HTTPS, addressing a common error related to invalid URLs. Additionally, the code now incorporates a 'till number' for transactions, improving data accuracy.
Original PR description
1. The `MPESA` payment method needs a callback url where it does a `POST` request with the transaction details. Since the call comes from safaricom, CSRF will block those requests. This commit will…
1. The `MPESA` payment method needs a callback url where it does a `POST` request with the transaction details. Since the call comes from safaricom, CSRF will block those requests. This commit will disable CSRF checks on the callback endpoints which are expected to be called from an external service 2. Sometimes the `web.base.url` parameter is automatically set to http. But safaricom expects https for all the urls. So we need to ensure that the urls we send on `lipa_na_mpesa_register_urls` use https, otherwise the registration fails with an `invalid url` error. Additionally, I added the error message in case of error 4. In addition to the business short code we also need a till number for transactions. Since this is stable, I've added the till number as an extension of the business shortcode field and then parse it before usage. On master there is a new PR which will properly separate the fields Task-[6045833](https://www.odoo.com/odoo/project/1737/tasks/6045833) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254993
This update resolves an issue where unreconciling bank statements with batch payments would unexpectedly revert invoices to draft due to approval checks triggered by third-party modules. The fix allows for the necessary repost to occur even when approvals are pending, preventing users from needing to manually re-enter data. This ensures smoother reconciliation processes.
Original PR description
When unreconciling a batch payment from a bank statement line, delete_reconciled_line() resets the linked invoice to draft to recompute its amount_residual, then re-posts it. If a third-party module…
When unreconciling a batch payment from a bank statement line, delete_reconciled_line() resets the linked invoice to draft to recompute its amount_residual, then re-posts it. If a third-party module (e.g. Studio Approvals) silently rejects action_post for the current user, the invoice stays in draft and the user has to redo the work manually. This internal repost is not a business action, the move was already approved when initially posted, so it can run as sudo to bypass approval checks. Steps to reproduce: 1. Add a Studio Approval rule on account.move.action_post with an approver other than the current user 2. As a user without that approval right, post a vendor bill and register a payment 3. Add the payment to a batch payment 4. Reconcile a bank statement line with the batch payment 5. With the user without approval rights, try to unreconcile the bank statement line (delete_reconciled_line) - Expected: the bill stays Posted. - Actual (before fix): the bill silently rolls back to Draft because action_post is rejected by the approval hook. opw-6121448 Forward-Port-Of: odoo/enterprise#115341 Forward-Port-Of: odoo/enterprise#115241
This update resolves a technical issue where an incorrect import statement was present in the core Point of Sale (POS) system. This fix ensures the system functions correctly and prevents potential errors related to data processing within the POS module. The change is a routine maintenance update.
Original PR description
This PR fixes the wrong import in adam_scale_driver.py opw-6173563 Forward-Port-Of: odoo/enterprise#115625
This update resolves an issue where users without HR access rights couldn't apply filters in the Time Off search functionality. The fix prevents a technical error related to a specific field not present in the public employee model, ensuring all users can effectively filter their time off data. This improves usability for a wider range of users.
Original PR description
More general fix for https://github.com/odoo/enterprise/pull/113973 or https://github.com/odoo/enterprise/pull/115478 Steps to reproduce: - Log using a user with no HR access rights (e.g. Marc Demo) - Go to Time Off > Overview - Remove all filters - Add a new custom filter on "Department is equal to ..." or "Job is equal to ..." Instead of the filter being applied, a traceback occurs. This originates from the fact that in _get_gantt_data_groupby_employee, the employee domain is mapped to address the field current_version_id. However, if a user has no HR rights, the search will be redirected to the employee public model, on which that field isn't defined. This commit adapts the domain in search_fetch to avoid current_version_id being present in it. No related task Co-authored by @BeBel42
This update adds a new test case to the HR holiday Gantt chart functionality. It addresses a previous issue related to public employee access, ensuring that authorized users can correctly view and manage holiday schedules. This enhancement improves the reliability and security of the HR module.
Original PR description
Add a test for the issue resolved in https://github.com/odoo/odoo/pull/261937 No related task
A bug was causing timesheets to be incorrectly linked to another employee when created through the timesheet systray. This issue stemmed from a formatting error in how user IDs were passed during the timesheet creation process. This fix ensures timesheets are accurately recorded for the correct employee.
Original PR description
# Steps to reproduce: - Open a billable project and a task - Open the timesheet systray - Create timesheet # Current behaviour The timesheet is recorded for another employee. # Root cause This happens because the `user_id` passed to the record update was lacking the right `[id, name]` format. As a consequence, the timesheet was created without a user (`False`), thereby linking it to another employee than the current user. task-6169253
This update fixes a discrepancy in the sale details report by accurately reflecting cash rounding adjustments. Now, the report displays the total cash rounding applied during a session, aligning the displayed total with actual payment amounts. This ensures greater accuracy and transparency in sales reporting.
Original PR description
The sale details report total_paid was computed from sum(order.amount_total), which does not include the cash rounding adjustment. This caused a discrepancy between the displayed total and the sum of individual payment lines when cash rounding is enabled. Use the sum of actual payment amounts instead, which naturally includes cash rounding since payments are recorded with their rounded values. opw-5253018 Forward-Port-Of: odoo/odoo#261884 Forward-Port-Of: odoo/odoo#254401
This update resolves an issue where 'Other Expense' accounts were incorrectly included in default reporting filters. By adding specific account types (exchange differences, discounts) to the filter, the system now accurately categorizes expenses, leading to more precise financial reporting. This improves the reliability of financial data.
Original PR description
[FIX] account: Default account filter include Other Expense In "Defalut Accounts" setting, adding `expense_other` in the search domain for the following accounts: - Exchange difference entries > Loss - Early payment discounts > Early Discount Gain - Early payment discounts > Early Discount Loss task-6116375 Forward-Port-Of: odoo/odoo#259583
This update resolves a problem where the size of the product search bar was incorrectly set, causing issues with a website tour. The fix ensures the search bar's size is only adjusted when the ‘website_sale_renting’ module is installed, preventing disruptions to other website features.
Original PR description
__Before commit__ odoo/enterprise@1111381c set the size attribute of the product search bar. However, the view inherits from `website.website_search_box`, which means that all search boxes on the website will have the size attribute set if `website_sale_renting` is installed. The tour `dropdowns_and_header_hide_on_scroll` fails in saas-19.3 because odoo/odoo@9394e17a added a step that depends on the size of the main website search bar, which may vary because of this. __After commit__ Only set the size attribute to the product search bar as intended. runbot-242449 Forward-Port-Of: odoo/enterprise#115433
This update fixes a bug where the Odoo app could become unresponsive if a feature was repeatedly accessed. The change prevents the creation of duplicate promises, ensuring that the app remains responsive even with frequent interactions. This improves overall app stability and user experience.
Original PR description
Whenever `isOnMainTab` is called, it creates and returns a new promise that will be resolved once the shared worker sends its response. However, if `isOnMainTab` is called twice in quick succession, before the shared worker answers, only the last promise is resolved, leaving the first one hanging forever. This commit fixes the issue by not recreating a promise if there is already one pending. Forward-Port-Of: odoo/odoo#262021
This update fixes an issue where the Datev export CSV incorrectly reported tax rates when a vendor bill used multiple tax repartition lines. The fix ensures that all tax amounts are accurately included in the CSV, improving the reliability of financial data exports to Datev.
Original PR description
With l10n_de_reports: - Configure a foreign currency with an exchange rate. - Configure a tax with multiple repartition lines. - Create a vendor bill in this foreign currency with this tax. - In the general ledger export the datev csv. In the datev csv the rate is wrong. In the method _l10n_de_datev_get_csv, we build a tax_amount dict. However when one tax has multiple lines, the amount is replaced and not added. opw-6010097 Forward-Port-Of: odoo/enterprise#115535 Forward-Port-Of: odoo/enterprise#110453
This update resolves an issue preventing users from switching between company localization types (Companies vs. Associations & Foundations) for Belgian businesses. The fix clears references to old accounts within cash rounding settings, allowing the localization switch to complete without errors. This ensures accurate reporting and functionality for Belgian clients.
Original PR description
### Issue before this commit: Switching the fiscal localization of a Belgian company from "Companies" to "Associations and Foundations" caused a traceback during the chart reload process. The…
### Issue before this commit:
Switching the fiscal localization of a Belgian company from "Companies" to "Associations and Foundations" caused a traceback during the chart reload process. The operation failed because some accounts from the previous localization could not be deleted.
### Steps to reproduce the issue:
1. Download Accounting
2. Create a new Belgian company
3. Switch to that company
4. Go into Settings -> Fiscal Localization
5. Switch to Associations and Foundations
6. Traceback: The operation cannot be completed: Another model is using the record you are trying to delete. The troublemaker is: 'Account Cash Rounding' (account.cash.rounding). Thanks to the following constraint: 'Profit Account' (profit_account_id). How about archiving the record instead?
### Cause of the issue:
The Belgian localization creates a default cash rounding method ("Round to 0.05") linked to specific profit and loss accounts. When switching localization, it was tried to delete the old chart of accounts, but these accounts are still referenced by account.cash.rounding through profit_account_id and loss_account_id, which use ondelete='restrict'. This prevents account deletion and blocks the localization change. Commit that caused the issue: https://github.com/odoo/odoo/commit/412fc9bed36645dd950c9a60d9b6ffdd9b4bce67
### Reason to introduce the fix:
Before reloading the Belgian chart template, the fix clears the profit_account_id and loss_account_id on the existing cash rounding records. This removes the blocking references, allows the old accounts to be deleted safely, and lets the fiscal localization switch complete successfully without affecting existing cash rounding configurations.
opw-6050537
Forward-Port-Of: odoo/odoo#260145This update fixes an issue preventing users from deleting time off allocations that were created after a payslip had been validated. Previously, the system incorrectly blocked deletion, requiring manual adjustments through HR. This change ensures time off allocations can be deleted regardless of when they were created relative to payslip validation.
Original PR description
## Issue When creating a time off for a date that is already covered by a confirmed payslip, that time off cannot be deleted. ## Steps to reproduce 1. Install *Time Off in Payslips*…
## Issue
When creating a time off for a date that is already covered by a confirmed payslip, that time off
cannot be deleted.
## Steps to reproduce
1. Install *Time Off in Payslips* (`hr_payroll_holidays`)
2. Create or use an employee E with a running contract, e.g.:
- Contract: Jan 1 to Indefinite
- Wage: $1000/month
3. In Payroll > Payslips, create a new Off-Cycle for Employee E:
- Period: March 1 - March 31
- *Compute Sheet*, *Confirm* and *Mark as paid*
4. In Time Off > Management > Time Off, create a new time off allocation for Employee E:
- Date: anywhere during March
- *Save* and *Validate*
5. Try to delete the allocation
6. **An error occurs: _"The pay of the month is already validated with this day included. If you need to adapt, please refer to HR."_**
## Cause
The condition under which this error is raised is defined in `_check_uncovered_by_validated_payslip`:
https://github.com/odoo/enterprise/blob/0226ad15abc8db70f8e379fddec3d83d15749c85/hr_payroll_holidays/models/hr_leave.py#L195-L203
It was originally added by https://github.com/odoo/enterprise/commit/1abb4a815ecb32557fc773cae54baf3e205d9b8c to prevent the deletion of holidays created **before** validating a payslip.
The condition does not take in account the moment when the leave was created. If a leave is created after the computation of the payslip, it did not impact that payslip, and thus can be deleted without risk.
opw-6089990
Forward-Port-Of: odoo/enterprise#115545
Forward-Port-Of: odoo/enterprise#114895This update corrects a formatting issue that prevented receipts printed on specific 180dpi receipt printers (like the TM-T88V) from displaying correctly. The previous setting caused a gap in the printed output, now fixed to align with standard printer specifications. This ensures accurate receipt printing for our retail partners.
Original PR description
Printers with a 180dpi (so 180 dot per 25.4mm) (like the TM-T88V) have a standard print width of 72mm on an 80mm roll. Which gives 72/25.4*180 = 510.23 dots / pixels So, the manufactures usually defines it as 512 dot grid. Right now, the width is set to 576px, causing the last 65 pixels to not be printed. opw-6087544 opw-6125418
This update ensures the session cookie is consistently set when using Odoo.sh, preventing frequent disconnections and improving the reliability of WebSocket connections. This change enhances the overall user experience by maintaining a stable connection, regardless of the database configuration.
Original PR description
Before this commit, the session cookie was only being set when the `db_name` is defined in `odoo.conf`. This was because it was used to identify the correct DB in a multi-DB setup. However, having the session cookie set also prevents frequent disconnects on every message when connected to an odoo.sh DB. After this commit, the session cookie is always set even when no `db_name` is defined. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where test tags containing brackets or backslashes weren't parsed correctly, preventing some tests from running. The changes ensure that nested brackets and escaped characters are handled properly, improving the reliability of test execution. This resolves a technical detail that ensures consistent test results.
Original PR description
When using test tags for js tests, some tests are not parsed correctly when containing brackets `[ ]` This is because the tag selector use them to set parameters bounds as in…
When using test tags for js tests, some tests are not parsed correctly when containing brackets `[ ]` This is because the tag selector use them to set parameters bounds as in `.test_method[test_param]` The previous implementation using a regex could generate invalid test tags when the params contains comma, and brackets This commits fixes this two ways: Nested brackets will work, meaning that something like `.test_method[test, witch brackets[]]` will be correctly parsed as a tag `.test_method` with a parameter `test, witch brackets[]`since the brakets are balanced. Before, it was parsed as twho tags, `.test_method[test` and ` witch brackets[]]` the second one being considered invalid and spamming logs with errors Brackets and backslashes can be escaped with a backslash, meaning that something like `.test_method[test, with brackets], and backslash\]` can be escaped as `.test_method[test, with brackets\], and backslash\\]` Note that the parser will make it's best effort to parse non escaped strings, so a \ not followed by and escaped character will remain there in order to make potential copy paste easier. For the previous example `.test_method[test, with brackets\], and backslash\` will work the same way. So in practice, we only really need to escape \ when followed by another backslash or a bracket, and we need to escape brackets when they are not balanced. Comma in hoot tests are also a problem since they are used to separate parameters, this can easily be tested by only splitting on `,@` since all hoot test should start with a @ and parameters of test_unit_* tests should be a list of hoot tests. A followup pr will introduce the params to the canonical tag, and escape it as needed Forward-Port-Of: odoo/odoo#262101 Forward-Port-Of: odoo/odoo#261516
This update prevents the 'Start a Poll' action from appearing in the composer when users are editing an existing message. Previously, this action was misleading and unnecessary, as polls are intended for new message creation. This change improves the user experience by aligning the action's availability with its intended use.
Original PR description
**Description of the issue/feature this PR addresses:** ---------------------------------------------- When editing a message in a channel or group and opening the 'More Actions' menu in the…
**Description of the issue/feature this PR addresses:** ---------------------------------------------- When editing a message in a channel or group and opening the 'More Actions' menu in the composer, the 'Start a poll' action is displayed among the available options. Starting a poll while editing an existing message makes no sense, as polling is only meaningful when composing a new message. **Current behavior before PR:** ---------------------------------------------- - 'Start a poll' action appears in the composer 'More Actions' menu even when the user is editing an existing message - Clicking it while in edit mode opens the poll creation dialog, which is misleading and unintended behavior **Desired behavior after PR is merged:** ---------------------------------------------- - 'Start a poll' action is hidden from the 'More Actions' menu when the composer is in edit mode - The action continues to appear as expected when composing a new message in a channel or group conversation Task-6171541 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261961
This update resolves a bug where editing previously edited messages caused unexpected behavior like selecting the "(edited)" label and losing content after saving. The fix removes the "(edited)" span from the editor's content, ensuring correct editing functionality and a smoother user experience.
Original PR description
When editing an already-edited message, the `(edited)` span was included in the editor's editable content because `prepareBodyForEditing` (formerly `getNonEditableMentions`) passed the raw body…
When editing an already-edited message, the `(edited)` span was included in the editor's editable content because `prepareBodyForEditing` (formerly `getNonEditableMentions`) passed the raw body directly to the composer. This caused two issues: - CTRL+A would select the `(edited)` label, allowing it to be styled, repositioned, or accidentally deleted. - CTRL+A + Backspace + retype left the body empty after saving, because the self-closing `<span class="o-mail-Message-edited"/>` in the stored HTML was parsed by browsers as an open tag (spans are not void elements), swallowing subsequent content as its children. Fix: strip `.o-mail-Message-edited` from the body before loading it into the editor. The server always re-appends a fresh `(edited)` span at the end when saving, so removing it from the editor content is safe and correct. Also align the mock server with the real server behavior: - Place the span *inside* the last `div`/`p` element instead of after it. Rename `getNonEditableMentions` → `prepareBodyForEditing` to reflect that the function now covers both making mentions non-editable and stripping the edited label. task-6172161 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where combo products weren't consistently ordered according to their choices, leading to incorrect item sequences in sales orders. The fix ensures combo items are always displayed in the intended order defined by the combo selection, improving the accuracy and reliability of the point-of-sale system.
Original PR description
When creating a combo product, its items were not ordered according to the combo choice sequence, and extra items were always appended at the end. As a result, combo items could appear in the wrong order. This fix ensures that, when computing combo prices and merging combo items with extra items before creating the order lines, the correct sequence is derived from the parent product. All items are then sorted based on this sequence so that they consistently follow the order defined by the combo choices. --- Task: https://www.odoo.com/odoo/project/1737/tasks/6064642 Forward-Port-Of: odoo/odoo#261633 Forward-Port-Of: odoo/odoo#255596
This update resolves a performance issue where changing a product's lot/serial in a stock picking could trigger slow requests due to Odoo fetching all stock quantities without respecting a defined limit. The fix ensures that the system respects the limit during these onchange calls, resulting in significantly faster response times.
Original PR description
## Problem: During an `onchange` call, if a field is defined in the `fields_spec` with a `limit` attribute, the `fetch` method doesn't respect it, and will fetch all records satisfying the domain. In…
## Problem: During an `onchange` call, if a field is defined in the `fields_spec` with a `limit` attribute, the `fetch` method doesn't respect it, and will fetch all records satisfying the domain. In certain circumstances, this leads to slow requests. ## Solution: Enforce the `limit` when fetching if it is present. ## Steps to reproduce: - Have a product with many quant records 1. Open a picking for this product in Barcode 2. Change the lot/serial The frontend will send an `onchange` request that includes `product_stock_quant_ids` in the `fields_spec` (with default `limit` 40). Odoo will fetch all quants for this product regardless of the limit, and the request will take a while to resolve. ## Benchmark: <table> <thead> <tr> <th># of quants</th> <th>Before</th> <th>After</th> </tr> </thead> <tbody> <tr> <td>17193</td> <td>~9s</td> <td>~400ms</td> </tr> </tbody> </table> opw-6041705 Forward-Port-Of: odoo/odoo#261904 Forward-Port-Of: odoo/odoo#259983
This update addresses a technical detail by removing the Tailscale IP address from the IoT box status screen. This change improves the clarity and accuracy of the information displayed to users, streamlining the status reporting process. It ensures that only relevant network interfaces are shown.
Original PR description
This PR removes tailscale ip address from iot box status screen. ``` >>> netifaces.interfaces() ['lo', 'eth0', 'wlan0', 'tailscale0'] ``` The 'tailscale0' interface will now be ignored Forward-Port-Of: odoo/odoo#242796
This update resolves an issue in the Gantt planning view where the Plan dialog incorrectly filtered out unscheduled shifts for resources with no scheduled shifts. The fix ensures the dialog displays all relevant unscheduled shifts, improving the accuracy of resource scheduling and planning.
Original PR description
Steps to Reproduce --- 1. Open the Planning Gantt view. 2. Click a cell that belongs to a resource with no scheduled shifts. 3. The Plan dialog opens with an empty list. Issue --- In saas-19.2, the context field for the selected resource was renamed from resource_id to resource_ids. Hence it remained in the dialog context. Current Behaviour --- The Plan dialog is filtered by resource_ids, returning no results for unscheduled resources. Expected Behaviour --- The dialog should list all unscheduled shifts matching the resource's roles, or all unscheduled shifts if no roles are defined, while preserving the scheduling context once a shift is selected. Fix --- Set search_default_resource_ids to false in getSelectCreateDialogProps(). task-4922525
This update resolves an issue where transcription summaries were incorrectly duplicated across multiple chat records. The fix ensures summaries are now only posted to the relevant chatter, and also corrects a previous error that occurred when closing the composer window. This improves the user experience and prevents redundant notifications.
Original PR description
Before this commit, there was an issue where the message of the transcription summary would get posted to the chatters of all records of a given model. With this commit, the message is only posted on the current chatter. This commit also fixes a regression where closing the composer window would cause an exception to occur. task-6147951
This update resolves an issue where printers connected as IoT devices weren't correctly loaded within the Point of Sale system. Previously, these printers were unusable. This change ensures all printers, regardless of their IoT connection, are properly integrated into the PoS workflow.
Original PR description
preparation printers were not loaded in PoS as IoT devices making them unusable. Forward-Port-Of: odoo/enterprise#115768
This update adjusts the checksum calculation for the IoT scale certified module to align with recent changes in the related iot_drivers module. This ensures data integrity and stability for users relying on this certified version of Odoo Enterprise. It's a routine maintenance update.
Original PR description
This PR adapts the expected checksum for the scale certified module corresponding change in iot_drivers module Forward-Port-Of: odoo/enterprise#115771
A bug was causing the appointment builder to crash when editing appointments. This update corrects a misconfiguration that was sending incorrect data, preventing the builder from reloading properly after changes. This ensures a smoother and more reliable experience for users editing appointments.
Original PR description
'Reload' was wrongly passed as a prop to BuilderContext in 'Appointment Type' Option. This ended up in a traceback when user opened the builder on an appointment page. To see the issue: - Create an appointment, and go to its frontend page in debug mode - Start editing - Click anywhere on the page => Traceback We also replace `isReload` with `reload` in order to reload the page when applying the actions. task-6147936 opw-6144915 Forward-Port-Of: odoo/enterprise#115506