Daily updates from Odoo
Wednesday, August 12, 2026
45 changes · saas-19.4
Resolved issues and error corrections
A new test verifies that India's GSTR-1 report selects the correct tax rate group when GST and CESS taxes are used together. This helps prevent reporting errors in tax filings for affected Indian businesses.
Original PR description
This PR adds a test case to ensure that the correct tax rate group is selected in the GSTR-1 report when a combination of GST and CESS taxes is used. Community PR - https://github.com/odoo/odoo/pull/280571 Forward-Port-Of: odoo/enterprise#126770
Products created through the Barcode Lookup service now show the image retrieved from the external database. This prevents missing product pictures in the product form and helps users confirm they selected the right item.
Original PR description
Issue before this commit: ========================= When creating a product by adding a barcode using the Barcode Lookup service, the product image was fetched properly but was not displayed in the…
Issue before this commit: ========================= When creating a product by adding a barcode using the Barcode Lookup service, the product image was fetched properly but was not displayed in the UI. Steps to Reproduce: ========================= - Install the stock module. - Enable the Stock Barcode Database. - Add a valid API key for the Barcode Database. - Create a product by adding a barcode available in the Barcode Lookup API. - Notice that the product image is not displayed. Cause of the issue: ========================= This issue was introduced by this [PR](https://github.com/odoo/odoo/pull/244421), which improved the behaviour of **fields.Binary**. As a result, the image returned by the Barcode Lookup API was not converted to the expected binary format, preventing it from being displayed in the UI. With This Commit: ========================= With this commit, convert the fetched image to the expected binary format before assigning it to the product, ensuring that it is displayed correctly in the UI. opw-6434478 Forward-Port-Of: odoo/enterprise#126314
This fix updates how mandatory SSS and Pag-IBIG payroll contributions are calculated for Philippine payroll. It ensures the contribution bases use the correct salary categories, improving payroll accuracy and compliance reporting.
Original PR description
. SSS Mandatory contribution is categories['TAX_CASH_EARNINGS'] . Pag-IBIG Contribution is categories['PH_BASIC'] + categories['ECOLA'] . Update the corresponding tests task-6431960
Belgian payroll calculations now use greater precision when computing ONSS social security contribution amounts. This reduces rounding discrepancies and helps produce more accurate payslips and payroll reporting.
Original PR description
…unt calculation Task: 6431856
Salary offers now correctly display fields that rely on payroll information, even when accessed by HR users with appropriate permissions. The related salary configurator test flow was also updated to reflect real HR user access rather than administrator access.
Original PR description
A field displayed inside the offer should have been computed with sudo as it accesses some payroll field to compute. Also, the salary configurator tour has been adapted to use a HR user instead of an admin Forward-Port-Of: odoo/enterprise#127510
This fix prevents users in multi-company setups from hitting an unsolvable error when creating operation steps without the Quality Control module installed. It ensures quality team email aliases always have an appropriate company value, so manufacturing quality workflows continue smoothly across companies.
Original PR description
This commit actually reverts [1] and manually forwards [2]. Suppose `mrp_workorder` installed and `quality_control` uninstalled. Because of the default value provided by [1], the only existing quality team is linked to the first company. As a result, when using another company, if the user tries to create an operation step (i.e., a QCP), it will raise an error when the onchange tries to load the default team in charge: https://github.com/odoo/enterprise/blob/f9c99f937bd64e5a0acb4bc88b1fc08249250c4e/quality/models/quality.py#L141-L142 However, the `quality` module doesn't provide any view to create such a team. tldr The module raises an error that is actually impossible to solve... Let's avoid it in the above situation. [1] https://github.com/odoo/enterprise/commit/f9c99f937bd64e5a0acb4bc88b1fc08249250c4e [2] https://github.com/odoo/enterprise/commit/8cd5c9322bef7db49a90d4aef844dd0ba267058e Forward-Port-Of: odoo/enterprise#127438 Forward-Port-Of: odoo/enterprise#126364
This fix makes the payroll payrun automated test wait for the page to fully reload before continuing. It reduces false test failures and helps keep payroll quality checks stable without changing user-facing payroll behavior.
Original PR description
Currently in payroll_payrun_tour in hr_payroll module, if we put step_delay as paramater in tour test. the tour test will get fail, after the validation in payslip step. When return to Payrun View Page, the next step to click New Button and Select the Payrun in the Dropdown option. But New Button with dropdown only available in the Payslip steps. The reason it works in runboot before due to race conditions where the test still click new button in Payslip step, expected there is dropdown in this view. The reason it's not work in with step_delay, because step_delay make we have time to change the payrun view, when we trigger the new button, the button is no longer reflected to Payslip step but in PayRun View. In this PR, expected to wait the tour test to fully reload the Payrun View before click the New button, so it will work with or without step_delay. task-6455499
Sales users in Kenya can now open invoices they are allowed to view without being blocked by missing access to local electronic invoicing codes. The change grants employees read-only access to these non-confidential codes, reducing interruptions in sales and invoicing workflows.
Original PR description
The KE codes are used in invoices and when sales people who do not have accounting access, but still can see their own invoices open an invoice, right now they will have an access error because they do not have read access to the codes. So, we should just apply the same logic as is done in edi.documents and give base.group_user read access to those codes, which are not confidential anyways. Forward-Port-Of: odoo/enterprise#126825
Timesheet suggestions now behave correctly when users hold Ctrl and click them. Instead of opening an unwanted new browser window, the suggestion is added to the timesheet form as intended, reducing user confusion.
Original PR description
Currently, when a user use ctrl + click on a suggestion, instead of adding it to the view form, it opens a new window. This is due to the default behavior when ctrl+click is used on a link. Using a button instead of an a href="#" solves this issue. Forward-Port-Of: odoo/enterprise#126293 Forward-Port-Of: odoo/enterprise#126240
Payroll departure processing now correctly updates payslip history when new payslips are added, ensuring departure-related payroll records are generated in the right order. This helps avoid incorrect payroll results at the end of an employee collaboration.
Original PR description
Departure should be generated after payslips
The Helpdesk ticket quick create form now has clearer spacing between the customer field and action buttons. This small layout fix makes the form easier to read and reduces visual crowding for users creating tickets from the kanban view.
Original PR description
This commit add a space between the partner field and the buttons in ticket kanban quickreate. task-6443626 Forward-Port-Of: odoo/enterprise#126901
Subscription products now show discounted recurring prices correctly on shop product tiles. This prevents customers from seeing a price based on the one-time sale price when a discount is meant to apply to the subscription plan.
Original PR description
Steps to reproduce: =================== 1. Create a subscription product, allow one-time sale, sale price 5 2. Add a recurring price 10/month 3. On the pricelist, add an advanced rule: -10% for the…
Steps to reproduce: =================== 1. Create a subscription product, allow one-time sale, sale price 5 2. Add a recurring price 10/month 3. On the pricelist, add an advanced rule: -10% for the monthly plan 4. Open the shop page and look at the product tile Cause: ======= On the /shop page, the subscription price displayed on a product tile is computed by `_get_sales_prices`. The cart has no plan selected yet at that point, so `request.cart.plan_id.id` is empty and was passed as `plan_id` to `_compute_price`. In `product.pricelist.item._compute_base_price`, the recurring base price is only looked up when a `plan_id` is given: if rule_base == 'list_price' and product.recurring_invoice and plan_id: ... # find the recurring rule -> base = recurring price With `plan_id` empty, that branch is skipped and the percentage rule falls back on the product's one-time `list_price` instead of the recurring price. Example: one-time price 5, recurring price 10/month, pricelist rule -10% on the monthly plan. => Tile showed 4.5/month (5 * 0.9) instead of 9/month (10 * 0.9). Solution: ========= The chosen pricing already targets a plan, so pass `pricing.plan_id.id` to `_compute_price`, matching what the product page does in `_get_additionnal_combination_info`. opw-6307398 Forward-Port-Of: odoo/enterprise#124815 Forward-Port-Of: odoo/enterprise#120872
The point-of-sale self-order test was adjusted to match the current behavior where takeaway is selected automatically when it is the only option. This keeps quality checks aligned with the user experience and helps avoid false test failures.
Original PR description
In this commit: - The takeaway preset is now automatically selected when it is the only available option. Remove the explicit "Takeaway" selection step from the tour to match the updated behavior. Task:6217791 Community PR : https://github.com/odoo/odoo/pull/274301 Forward-Port-Of: odoo/enterprise#126889 Forward-Port-Of: odoo/enterprise#122979
The planning overlap warning no longer appears for private tasks that are not linked to a project. This prevents users from seeing irrelevant warnings while drafting tasks and keeps scheduling alerts focused on project-related work.
Original PR description
Steps to reproduce: - - Create a task without a project (do not save) - Set planned_date_begin and date_deadline so it overlaps with another task for the same assignee Issue: - - The overlap warning is shown even though the task has no project. Cause: - - When creating a new record, the overlap warning was shown before saving as there was no check for private tasks (tasks with no project), so the warning could appear even when the task had no project. Solution: - - Add a project check so private tasks never show the warning, and recompute it whenever the project changes. Related PR https://github.com/odoo/enterprise/pull/109988 task-6140800
Payslip CFDIs in Mexican payroll now have their SAT validation status updated correctly in Odoo. This prevents validated payroll documents from incorrectly showing an undefined status, improving compliance visibility for payroll teams.
Original PR description
l10n_mx_hr_payroll_account_edi introduces new l10n_mx_edi.document states (payslip_sent, payslip_sent_failed, payslip_cancel, payslip_cancel_failed) but never extends the two hooks the base l10n_mx_edi module relies on to keep sat_state in sync: - _get_update_sat_status_domains(), which builds the domain used by the SAT-status cron (and manual refresh) to pick documents to poll. Payslip states were missing from it, so their SAT status was never fetched at all. - _update_document_sat_state(), which routes a fetched SAT status to a per-source-document handler. It has no branch for the payslip states, so even a manual poll would silently do nothing. As a result, payslip CFDIs validated in the SAT always appeared as "not_defined" in Odoo. opw-6192651 Forward-Port-Of: odoo/enterprise#126294 Forward-Port-Of: odoo/enterprise#124006
The selection options for l10n_id_coretax_add_info_07/08 and l10n_id_coretax_facility_info_07 were swapped: the "additional information" fields showed facility stamp text and vice versa. Also add the UoM codes and new kode faktur 07 additional info/facility stamp options published by DJP on 2026-01-26. task-6434742 Forward-Port-Of: odoo/odoo#281096
Original PR description
The selection options for l10n_id_coretax_add_info_07/08 and l10n_id_coretax_facility_info_07 were swapped: the "additional information" fields showed facility stamp text and vice versa. Also add the UoM codes and new kode faktur 07 additional info/facility stamp options published by DJP on 2026-01-26. task-6434742 Forward-Port-Of: odoo/odoo#281096
**Issue:** In the website builder, when entering "Edit" mode through "Edit" button, the main navbar is hidden. An animation is moving the navbar upwards and a "d-none" class is added to it after a delay of 200ms to avoid it disappearing suddenly. It is displayed again after saving the changes by removing the "d-none" class. However, when entering "Edit" mode and leaving it quickly, it is possible that the code hiding the navbar is executed after the code displaying it again because of the 20
Original PR description
**Issue:** In the website builder, when entering "Edit" mode through "Edit" button, the main navbar is hidden. An animation is moving the navbar upwards and a "d-none" class is added to it after a…
**Issue:** In the website builder, when entering "Edit" mode through "Edit" button, the main navbar is hidden. An animation is moving the navbar upwards and a "d-none" class is added to it after a delay of 200ms to avoid it disappearing suddenly. It is displayed again after saving the changes by removing the "d-none" class. However, when entering "Edit" mode and leaving it quickly, it is possible that the code hiding the navbar is executed after the code displaying it again because of the 200ms setTimeout(). The issue is not reproducible in the UI directly, but the `test_32_website_background_colorpicker` tour is often failing with the following error: ``` FAILED: [53/65] Tour website_page_options → Step <b>Click Edit</b> to start designing your homepage. (trigger: body:has(:iframe body[is-ready=true]) .o_menu_systray .o_menu_systray_item.o_edit_website_container button). Element (body:has(:iframe body[is-ready=true]) .o_menu_systray .o_menu_systray_item.o_edit_website_container button) has not been found. TIMEOUT step failed to complete within 10000 ms. ``` During the tour several clicks on "Save" and "Edit" are executed, leading to the navbar being unavailable when trying to click on "Edit". runbot-243712 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278645
**Steps to Reproduce:** 1. Send a message to Marc demo with Mitchell admin or vice-versa, read the message from reciever's side. 2. Click on seen-by indicator from sender's side, make sure the dialog appears and then Press `'ESC'`. 3. Chat window closes whereas the dialog should have closed. Since #169737, pressing 'esc' on the seen-by dialog closes the chat window instead of the dialog. The chat window's root element has a keydown handler that closes the window on `'escape'`, and cat
Original PR description
**Steps to Reproduce:** 1. Send a message to Marc demo with Mitchell admin or vice-versa, read the message from reciever's side. 2. Click on seen-by indicator from sender's side, make sure the dialog…
**Steps to Reproduce:** 1. Send a message to Marc demo with Mitchell admin or vice-versa, read the message from reciever's side. 2. Click on seen-by indicator from sender's side, make sure the dialog appears and then Press `'ESC'`. 3. Chat window closes whereas the dialog should have closed. Since #169737, pressing 'esc' on the seen-by dialog closes the chat window instead of the dialog. The chat window's root element has a keydown handler that closes the window on `'escape'`, and catches focus by default whenever something non-focusable is clicked inside it (e.g. the seen-by indicator). The seen-by dialog's content had no focusable element, so it never grabbed focus for itself, leaving focus on the chat window. Pressing 'escape' therefore closed the chat window instead of the dialog. This commit fixes the issue by adding tabindex on the template, letting the dialog grab focus like other dialogs/popovers already do, so `'escape'` is handled by the dialog first. task-4895004 Forward-Port-Of: odoo/odoo#281656 Forward-Port-Of: odoo/odoo#278847
Steps to Reproduce: ------------------------ - Install the Point of Sale module & create an order with a customer (partner). - Scan the QR code on the receipt to retrieve the invoice. Issue: ------- When clicking `Get My Invoice`, the invoice was not being generated. Cause: --------- - The correct partner was not being set. POS customer scanning the QR code is not logged into Odoo, so no partner is associated with the request. We were incorrectly using the logged-in user’s partner,
Original PR description
Steps to Reproduce: ------------------------ - Install the Point of Sale module & create an order with a customer (partner). - Scan the QR code on the receipt to retrieve the invoice. Issue: -------…
Steps to Reproduce: ------------------------ - Install the Point of Sale module & create an order with a customer (partner). - Scan the QR code on the receipt to retrieve the invoice. Issue: ------- When clicking `Get My Invoice`, the invoice was not being generated. Cause: --------- - The correct partner was not being set. POS customer scanning the QR code is not logged into Odoo, so no partner is associated with the request. We were incorrectly using the logged-in user’s partner, which resulted in an empty partner and therefore an empty VAT value. - The customer's country was also incorrect because the partner’s country was fetched but then overwritten by the order’s country due to improper value assignment. Fix: ---- - In most POS scenarios, the customer associated with the order is the one requesting the invoice. Therefore, if no logged-in user is found, we now correctly use the order’s partner to retrieve VAT and other required information. - The partner's country was corrected by ensuring the values are assigned in the proper order and no longer overridden incorrectly. task: 5406951 Forward-Port-Of: odoo/odoo#281615 Forward-Port-Of: odoo/odoo#239811
Currently, the is_base_affected condition is only checked on the group tax. However, this condition should also be checked on the child taxes to ensure proper matching. Without checking the child taxes, incorrect matches can occur when the parent tax has is_base_affected set to True, while one of its child taxes has it set to False. Since the parent and child tax configurations are not necessarily synchronized, relying only on the parent tax can lead to incorrect matching. This fix ensures
Original PR description
Currently, the is_base_affected condition is only checked on the group tax. However, this condition should also be checked on the child taxes to ensure proper matching. Without checking the child taxes, incorrect matches can occur when the parent tax has is_base_affected set to True, while one of its child taxes has it set to False. Since the parent and child tax configurations are not necessarily synchronized, relying only on the parent tax can lead to incorrect matching. This fix ensures that is_base_affected is validated at both the parent and child tax levels, preventing such incorrect matches. Enterprise PR - https://github.com/odoo/enterprise/pull/126770 Forward-Port-Of: odoo/odoo#280571
`#right-elements` (tax totals block) is floated (`float-end`). Per CSS spec, an `auto` margin on a floated element always resolves to 0, so the `ms-auto` class added by 9767e8f5c1da5a9c9e38472ad576ffa3c4e32075 is a no-op, leaving no gutter before adjacent content such as the legal notes paragraph. Partial revert of 9767e8f5c1da5a9c9e38472ad576ffa3c4e32075 Steps to reproduce: ------------------- * On a tax, set a multi-line paragraph in Legal Notes (Advanced Options tab) * Apply it on an
Original PR description
`#right-elements` (tax totals block) is floated (`float-end`). Per CSS spec, an `auto` margin on a floated element always resolves to 0, so the `ms-auto` class added by…
`#right-elements` (tax totals block) is floated (`float-end`). Per CSS spec, an `auto` margin on a floated element always resolves to 0, so the `ms-auto` class added by 9767e8f5c1da5a9c9e38472ad576ffa3c4e32075 is a no-op, leaving no gutter before adjacent content such as the legal notes paragraph. Partial revert of 9767e8f5c1da5a9c9e38472ad576ffa3c4e32075 Steps to reproduce: ------------------- * On a tax, set a multi-line paragraph in Legal Notes (Advanced Options tab) * Apply it on an invoice line and print/preview the invoice PDF > Observation: the legal notes text touches/overlaps the tax totals table, with no spacing. Why the fix: ------------ `ms-5` gives `#right-elements` a real left margin, restoring the spacing lost when `ms-auto` (a no-op on floats) replaced it. BEFORE: <img width="596" height="753" alt="Screenshot 2026-08-05 at 10 52 00" src="https://github.com/user-attachments/assets/c596d6e9-4b61-434c-9b38-3ff0797e7fa7" /> AFTER: <img width="494" height="596" alt="Screenshot 2026-08-05 at 10 51 44" src="https://github.com/user-attachments/assets/f9a1792d-22c2-4586-9a75-53c4695f17e4" /> opw-6384085 Forward-Port-Of: odoo/odoo#280654
l10n_vn_pos_symbol carries groups='base.group_system,point_of_sale.group_pos_manager', but _prepare_invoice_vals reads it while an ORDINARY salesperson closes an order: _process_saved_order calls _generate_pos_order_invoice as the acting user, with no sudo anywhere on the way. So on a Vietnamese POS with auto-send to SInvoice enabled, a user in point_of_sale.group_pos_user alone hit Access Denied by ACLs for operation: read, model: pos.config, fields: l10n_vn_pos_symbol and the order nev
Original PR description
l10n_vn_pos_symbol carries groups='base.group_system,point_of_sale.group_pos_manager', but _prepare_invoice_vals reads it while an ORDINARY salesperson closes an order: _process_saved_order calls…
l10n_vn_pos_symbol carries groups='base.group_system,point_of_sale.group_pos_manager', but _prepare_invoice_vals reads it while an ORDINARY salesperson closes an order: _process_saved_order calls _generate_pos_order_invoice as the acting user, with no sudo anywhere on the way. So on a Vietnamese POS with auto-send to SInvoice enabled, a user in point_of_sale.group_pos_user alone hit
Access Denied by ACLs for operation: read, model: pos.config, fields: l10n_vn_pos_symbol
and the order never finished syncing - the receipt screen's Done button stayed disabled and the checkout dead-ended.
This is reachable from the module's own test suite, which is what makes it more than theoretical: point_of_sale's start_pos_tour logs in as `pos_user` (group_pos_user, NOT group_pos_manager - that is `pos_admin`), so test_l10n_vn_edi_pos_refund_reason_tour exercises exactly the unprivileged path.
Reading the config as sudo is the right resolution rather than widening the field's groups: the salesperson is never shown the symbol or allowed to change it, it is only stamped onto the invoice their own sale produces, which is what a per-POS configuration field is for. Both symbols are read through the same sudo recordset so the company-level fallback keeps working identically.
Reproduced and verified on v18_full (5-repo addons path):
before - FAILED: [13/36] Tour L10nVnEdiPosRefundReasonTour -> "go to next screen from
receipt"; 1 failed, 0 error(s) of 1 tests
after - tour succeeded for both tours in the class; 0 failed, 0 error(s) of 2 tests,
and no ACL line left in the log
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#281621
Forward-Port-Of: odoo/odoo#281119Following odoo/odoo@b325a1ee7955, on database will a lot of messages (> MAX_SEARCH_LIMIT) in case an AccessError for a mail.message is raised, the computation of the source ir.rule will crash will: `ValueError: Cannot search, too many messages` This commit add the `search_domain` hint when looking for the ir.rule that restrict access to those records, so that the access right check of mail.message (`_search_res_access()`) are limited to those records only. --- I confirm I have signed
Original PR description
Following odoo/odoo@b325a1ee7955, on database will a lot of messages (> MAX_SEARCH_LIMIT) in case an AccessError for a mail.message is raised, the computation of the source ir.rule will crash will: `ValueError: Cannot search, too many messages` This commit add the `search_domain` hint when looking for the ir.rule that restrict access to those records, so that the access right check of mail.message (`_search_res_access()`) are limited to those records only. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281788
**Steps to reproduce:** - Go to Discuss app - Open a discussion - Add a reaction to one of the older messages - Create a new poll - Click on the vote number count - Close the vote dialog - Go back to the message that has the reaction - Open the reaction dialog for that message - Dialog opens, but the focus scroll down to the poll (also possible to reproduce with any visible active element, e.g. links or messages being edited) **Issue:** `Dropdown.closePopover()` re-focus the elemen
Original PR description
**Steps to reproduce:** - Go to Discuss app - Open a discussion - Add a reaction to one of the older messages - Create a new poll - Click on the vote number count - Close the vote dialog - Go back to the message that has the reaction - Open the reaction dialog for that message - Dialog opens, but the focus scroll down to the poll (also possible to reproduce with any visible active element, e.g. links or messages being edited) **Issue:** `Dropdown.closePopover()` re-focus the element that was active when the `MessageReactionList` dropdown was opened and `focus()` call doesn't use `preventScroll` so it moves back to `_focusedElBeforeOpen`. **Fix:** Use `focusToggleOnClosed` to prevent this behavior. opw-6355999 Forward-Port-Of: odoo/odoo#281581 Forward-Port-Of: odoo/odoo#279705
Before this commit it was possible to assign an arbitrary account_move to a pos.order by sending it in the order data. This commit prevents that by removing the account_move from the order data before creating the pos.order. Forward-Port-Of: odoo/odoo#280279
Original PR description
Before this commit it was possible to assign an arbitrary account_move to a pos.order by sending it in the order data. This commit prevents that by removing the account_move from the order data before creating the pos.order. Forward-Port-Of: odoo/odoo#280279
Before this commit, the default einvoice format was changed only when the partner was french and had a vat number, but we want to ease that condition and do it only if the partner is french. task-6303174 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278158 Forward-Port-Of: odoo/odoo#270720
Original PR description
Before this commit, the default einvoice format was changed only when the partner was french and had a vat number, but we want to ease that condition and do it only if the partner is french. task-6303174 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278158 Forward-Port-Of: odoo/odoo#270720
When several xmlids point to the same record, PostgreSQL's UPDATE ... FROM can match multiple source rows to one target and pick an arbitrary value. Aggregate translations per res_id in import order so the later entry wins Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281833 Forward-Port-Of:
Original PR description
When several xmlids point to the same record, PostgreSQL's UPDATE ... FROM can match multiple source rows to one target and pick an arbitrary value. Aggregate translations per res_id in import order so the later entry wins Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281833 Forward-Port-Of: odoo/odoo#277818
We now dpkg configure before every upgrade to ensure the IoT Box is ready to upgrade properly and `apt` commands won't fail. Forward-Port-Of: odoo/odoo#281693
Original PR description
We now dpkg configure before every upgrade to ensure the IoT Box is ready to upgrade properly and `apt` commands won't fail. Forward-Port-Of: odoo/odoo#281693
Steps to Reproduce the Error (Odoo SaaS 19.2): 1. Install l10n_gcc_invoice localization & Accounting 2. Activate Arabic language (ar_001) and add Default Terms and Conditions in Settings > Configuration > Customer Invoices > Default Terms and Conditions 3. Create invoice with ar_001 partner 4. Confirm the invoice 5. Try to create credit note → Error: KeyError: 'en_US' Root Cause: The _load_narration_translation() workaround reads raw invoice_terms from DB and injects the entire JSONB di
Original PR description
Steps to Reproduce the Error (Odoo SaaS 19.2): 1. Install l10n_gcc_invoice localization & Accounting 2. Activate Arabic language (ar_001) and add Default Terms and Conditions in Settings >…
Steps to Reproduce the Error (Odoo SaaS 19.2):
1. Install l10n_gcc_invoice localization & Accounting
2. Activate Arabic language (ar_001) and add Default Terms and Conditions in Settings > Configuration > Customer Invoices > Default Terms and Conditions
3. Create invoice with ar_001 partner
4. Confirm the invoice
5. Try to create credit note → Error: KeyError: 'en_US'
Root Cause:
The _load_narration_translation() workaround reads raw invoice_terms from DB and injects the entire JSONB dict directly into cache, bypassing ORM field conversion. When Odoo 19.2's improved ORM conversion runs, it creates nested JSON in narration instead of a flat structure.
Timeline:
- bedf1cb66fbb: Workaround added to prevent T&C duplication in preview
- 75f050b9650d: Root cause fixed in report template (conditional display) → Made _load_narration_translation() redundant
- 4e4156536bc9: Odoo 19.2 improved ORM conversion → Now conflicts with the redundant workaround, causing nested JSON
How It Breaks:
1. Invoice creation: _load_narration_translation() injects raw dict into cache
2. ORM writes: nested JSON stored: {ar_001: {en_US: ., ar_001: Arabic}}
3. Credit note creation: copy_translations() expects flat structure → Crashes: KeyError: 'en_US'
Why It's Safe to Remove:
Report template already prevents T&C duplication (commit 75f050b9650d). Removing the workaround restores proper credit note creation without breaking T&C display.
Changes:
- Remove moves._load_narration_translation() in create()
- Remove out self.filtered('id')._load_narration_translation() in _compute_narration()
opw : 6284943
Forward-Port-Of: odoo/odoo#271037When IoT Boxes are connected to dbs v18.0, no etag is returned but the iot handlers controller. The IoT Box then logs a traceback as it can't find and store it, to avoid redownloading if handlers didn't change. We now check if the key exist before accessing it. The IoT Box will then download driver every time. sentry-7662835841
Original PR description
When IoT Boxes are connected to dbs v18.0, no etag is returned but the iot handlers controller. The IoT Box then logs a traceback as it can't find and store it, to avoid redownloading if handlers didn't change. We now check if the key exist before accessing it. The IoT Box will then download driver every time. sentry-7662835841
Before this commit, `visitor leaving ends the livechat conversation` failed about once in a hundred runs: Failed to find 1 of "span" with text "This livechat conversation has ended." (Timeout of 10 seconds). Found 0 instead. This happens because the test only waits for the `channels_as_member` request to reach the server, from the `onRpc` callback that runs before the route is served. The answer holds `livechat_end_dt` as `false` and lands right after the `mail.record/insert` of t
Original PR description
Before this commit, `visitor leaving ends the livechat conversation` failed about once in a hundred runs: Failed to find 1 of "span" with text "This livechat conversation has ended." (Timeout of 10…
Before this commit, `visitor leaving ends the livechat conversation` failed about once in a hundred runs:
Failed to find 1 of "span" with text "This livechat conversation
has ended." (Timeout of 10 seconds). Found 0 instead.
This happens because the test only waits for the `channels_as_member` request to reach the server, from the `onRpc` callback that runs before the route is served. The answer holds `livechat_end_dt` as `false` and lands right after the `mail.record/insert` of the visitor leaving, so the date goes back to `false` and the conversation still looks open.
One solution could have been to use `waitStoreFetch`, but its step comes from that same callback, and the helper returns six microtasks before the answer is inserted, on a hundred runs out of a hundred.
This commit fixes the issue by waiting for the messaging menu to list a plain channel, which arrives with the `channels_as_member` answer only.
https://runbot.odoo.com/odoo/error/945672
Forward-Port-Of: odoo/odoo#281582
Forward-Port-Of: odoo/odoo#281489[FIX] hr_attendance: restricting visibility-monthly hours smart button Bug reproduction: 1 - v19 and later on 2 - Even though you don't have a group attendance_user or attendance_manager and you are not the attendance manager of some employee 3 - You can see the smart button "monthly hours" in the employee form view Bug cause: 1 - If the user is attendance officer (which means at least attendance manager of 1 employee) the smart button does always appear. Bug sol
Original PR description
[FIX] hr_attendance: restricting visibility-monthly hours smart button Bug reproduction: 1 - v19 and later on 2 - Even though you don't have a group attendance_user or attendance_manager and you are…
[FIX] hr_attendance: restricting visibility-monthly hours smart button
Bug reproduction:
1 - v19 and later on
2 - Even though you don't have a group attendance_user or attendance_manager and you are not the attendance manager of some employee
3 - You can see the smart button "monthly hours" in the employee form view
Bug cause:
1 - If the user is attendance officer (which means at least attendance manager of 1 employee) the smart button does always appear.
Bug solution:
1 - I declared new non-stored show_monthly_hours_button field to determine whether should I show the smart button or not.
2 - I used invisible in employee and employee.public views to hide the button when there is no authorization.
task - 6387595
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#276295The compute method should not depend whether or not the employee is active or not. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#280943
Original PR description
The compute method should not depend whether or not the employee is active or not. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#280943
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/65642fe89b [REL] 19.4.7 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/3005372b04 [FIX] functions: omit functions from the squisher [Task: 6452075](https://www.odoo.com/odoo/2328/tasks/6452075) https://github.com/odoo/o-spreadsheet/commit/7555012afa [FIX] Session: deactivate command squisher [Task: 6462247](https://www.odoo.com/odoo/2328/tasks/6462247) Co-authored-by
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/65642fe89b [REL] 19.4.7 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/65642fe89b [REL] 19.4.7 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/3005372b04 [FIX] functions: omit functions from the squisher [Task: 6452075](https://www.odoo.com/odoo/2328/tasks/6452075) https://github.com/odoo/o-spreadsheet/commit/7555012afa [FIX] Session: deactivate command squisher [Task: 6462247](https://www.odoo.com/odoo/2328/tasks/6462247) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
Before this commit, `onMediaEnded` assumed `state.currentSegment` was always set. However, `currentSegment` can be unset by `setPlaybackTime` when a segment ends into a gap of >2 seconds. If `onMediaEnded` runs while there is no current segment, `mediaSegments.indexOf(undefined)` returns sentiel -1, which wasn't checked for, so onMediaEnded logic attempts to fetch segment detail to assess the gap size. This leads to reading `.endSec` off the undefined `currentSegment`, and crashing with a Typ
Original PR description
Before this commit, `onMediaEnded` assumed `state.currentSegment` was always set. However, `currentSegment` can be unset by `setPlaybackTime` when a segment ends into a gap of >2 seconds. If `onMediaEnded` runs while there is no current segment, `mediaSegments.indexOf(undefined)` returns sentiel -1, which wasn't checked for, so onMediaEnded logic attempts to fetch segment detail to assess the gap size. This leads to reading `.endSec` off the undefined `currentSegment`, and crashing with a TypeError. This commit adds a guard so `onMediaEnded` does nothing when there is no current segment. task-6463227
*: website_event_exhibitor bug: `_get_srcset` defaulted `max_size` to '1920' when no `preview_image` option was given, causing srcset entries to be generated for image sizes larger than the rendered field. It also did not check whether each candidate field existed on the record, leading to missing or broken srcset entries. steps: - Add an event with a sponsor - add a logo to the sponsor - go on the website → events → the event you added - The sponsor have no logo fix: Fall bac
Original PR description
*: website_event_exhibitor bug: `_get_srcset` defaulted `max_size` to '1920' when no `preview_image` option was given, causing srcset entries to be generated for image sizes larger than the rendered…
*: website_event_exhibitor bug: `_get_srcset` defaulted `max_size` to '1920' when no `preview_image` option was given, causing srcset entries to be generated for image sizes larger than the rendered field. It also did not check whether each candidate field existed on the record, leading to missing or broken srcset entries. steps: - Add an event with a sponsor - add a logo to the sponsor - go on the website → events → the event you added - The sponsor have no logo fix: Fall back to `field_name` to cap the srcset at the size of the rendered field when `preview_image` is not set. Skip candidate fields not present on the record. reason: When rendering e.g. `image_512`, the srcset should not include larger sizes. Checking field existence avoids accessing fields the record does not carry. This bug already had fixes [1] and [2], this PR fixes the problem globally and reverts the old fixes. Bug introduced by https://github.com/odoo/odoo/commit/36e680feca4884940e020119de6a13cd7f927516. [1]: https://github.com/odoo/odoo/commit/6bd2de2f3dbdd1a54b85db1e5215ecbbe9049113 [2]: https://github.com/odoo/odoo/commit/c21602d98028ab135a997816eb2601bdbe6c0a61 task-6123503 Forward-Port-Of: odoo/odoo#270149
**Steps to reproduce:** 1. Install sale module 2. Log in as demo user 3. Open a product form 4. Hover over the product image **Issue:** - The pencil (Edit) and trash (Clear) buttons appear on the product image for users who have no write access to `product.template` - Clicking the pencil icon opens the media dialog, but attempting to save the new image throws an access error: *"You are not allowed to modify 'Product' (product.template) records."* - The buttons should not be visible whe
Original PR description
**Steps to reproduce:** 1. Install sale module 2. Log in as demo user 3. Open a product form 4. Hover over the product image **Issue:** - The pencil (Edit) and trash (Clear) buttons appear on the product image for users who have no write access to `product.template` - Clicking the pencil icon opens the media dialog, but attempting to save the new image throws an access error: *"You are not allowed to modify 'Product' (product.template) records."* - The buttons should not be visible when the field is readonly **Why this happens:** - Commit 63c0b17eca05c99507df2dcd3c43ae512d3fd7b0 introduced the `ImageFieldWithMediaDialog` template - This template inherits from `web.ImageField` and replaces the inner uploader `<div>` which is missing the readonly guard opw-6403982 Forward-Port-Of: odoo/odoo#280092
This commit adds a space between the user_ids field and the buttons in task kanban quickreate form. task-6443626 Forward-Port-Of: odoo/odoo#280880
Original PR description
This commit adds a space between the user_ids field and the buttons in task kanban quickreate form. task-6443626 Forward-Port-Of: odoo/odoo#280880
Automatically update the ruff config to the latest version generated on runbot
Original PR description
Automatically update the ruff config to the latest version generated on runbot
In this commit: - When only one preset remains available after filtering table identifier in self-order mode, automatically select it and skip the preset selection page. - This avoids showing a location selection page when there is no actual choice available to the customer. Task:6217791 Enterprise PR : https://github.com/odoo/enterprise/pull/122979 Forward-Port-Of: odoo/odoo#280722 Forward-Port-Of: odoo/odoo#274301
Original PR description
In this commit: - When only one preset remains available after filtering table identifier in self-order mode, automatically select it and skip the preset selection page. - This avoids showing a location selection page when there is no actual choice available to the customer. Task:6217791 Enterprise PR : https://github.com/odoo/enterprise/pull/122979 Forward-Port-Of: odoo/odoo#280722 Forward-Port-Of: odoo/odoo#274301
A traceback occurred whenever an error happened during the initial PDP registration process on the IAP side. task-6463731
Original PR description
A traceback occurred whenever an error happened during the initial PDP registration process on the IAP side. task-6463731
During the backport we discovered a programming error in `_get_peppol_document_params`. The super function can return `None` values for both `edi_user` and `document`. This can lead to a traceback when the variables are used. We do not have any known issues in 18.0 or higher versions. (Probably because the move send was heavily refactored.) But better safe than sorry. It could maybe happen with the batch sending or in case the "surrounding" logic is refactored in the future. task-None
Original PR description
During the backport we discovered a programming error in `_get_peppol_document_params`. The super function can return `None` values for both `edi_user` and `document`. This can lead to a traceback when the variables are used. We do not have any known issues in 18.0 or higher versions. (Probably because the move send was heavily refactored.) But better safe than sorry. It could maybe happen with the batch sending or in case the "surrounding" logic is refactored in the future. task-None Forward-Port-Of: odoo/odoo#279317
Steps to reproduce: 0. Create an employee with a fixed working schedule and an overtime ruleset, then enable Absence Management in attendances 1. Go to Attendances and make sure that the employee has no attendances recorded for the previous working day 2. Run the "Attendance: Detect Absences for employees" scheduled action 3. Observe the absence attendance created on the previous working day, along with the amount of overtime hours calculated 4. Create an attendance on the day that the ab
Original PR description
Steps to reproduce: 0. Create an employee with a fixed working schedule and an overtime ruleset, then enable Absence Management in attendances 1. Go to Attendances and make sure that the employee has…
Steps to reproduce: 0. Create an employee with a fixed working schedule and an overtime ruleset, then enable Absence Management in attendances 1. Go to Attendances and make sure that the employee has no attendances recorded for the previous working day 2. Run the "Attendance: Detect Absences for employees" scheduled action 3. Observe the absence attendance created on the previous working day, along with the amount of overtime hours calculated 4. Create an attendance on the day that the absence was recorded 5. Observe that the overtime hours on the absence attendance are not updated 5a. If a full day attendance is recorded on that day, the overtime hours on the absence attendance should change to 0, since we've now recorded hours worked for the day When an absence attendance is created from the Absence Management feature, overtime hours are calculated to represent the time the employee was unjustifiably absent on a given day. If an attendance is later created on the day the absence was recorded, the overtime hours should update to reflect the hours the employee actually worked. Changes were introduced in [this PR](https://github.com/odoo/odoo/pull/272447) that broke this functionality due to the use of `pytz`, which incorrectly calculated timezone offsets. This caused absence attendances to not be picked up by `_get_overtimes_to_update_domain()`, and overtime was not correctly updated. This commit ensures that we get proper time calculations with respect to the employees timezone. [opw-6380343](https://www.odoo.com/odoo/my-tasks/6380343?debug=assets) Forward-Port-Of: odoo/odoo#281844 Forward-Port-Of: odoo/odoo#279556
Before this commit, a call test where a participant card appears while in a call fails with: Unimplemented server route: /mail/rtc/channel/upgrade_connection The client sends that request a few seconds later, so only a test still running by then fails, as `Adjust view: switching between Tiled and Spotlight` does on master under load. This happens because the other participants of a test call are only records, so their peer connection negotiates no transceiver, and asking it to downl
Original PR description
Before this commit, a call test where a participant card appears while in a call fails with:
Unimplemented server route: /mail/rtc/channel/upgrade_connection
The client sends that request a few seconds later, so only a test still running by then fails, as `Adjust view: switching between Tiled and Spotlight` does on master under load.
This happens because the other participants of a test call are only records, so their peer connection negotiates no transceiver, and asking it to download the video of the card schedules a connection recovery instead. Recovering without a TURN server, which a test never has, asks the server to move the call to an SFU with that route, and the mock server implements join_call and leave_call only.
This commit registers the route with an empty handler, as no test has an SFU server to join.
Forward-Port-Of: odoo/odoo#281933
Forward-Port-Of: odoo/odoo#281736Before this commit, some layouts had the customer address on the right (light, boxed, bold, striped) and some had it on the left (bubble, wave, folder). For the latter, when an information_block with the address existed, it would be inserted before the address pushing it further right. This was inconsistent since the address position should not depend on whether an information_block is present or not. The customer address must stay in a fixed place to match the transparent window of the
Original PR description
Before this commit, some layouts had the customer address on the right (light, boxed, bold, striped) and some had it on the left (bubble, wave, folder). For the latter, when an information_block with…
Before this commit, some layouts had the customer address on the right (light, boxed, bold, striped) and some had it on the left (bubble, wave, folder). For the latter, when an information_block with the address existed, it would be inserted before the address pushing it further right. This was inconsistent since the address position should not depend on whether an information_block is present or not. The customer address must stay in a fixed place to match the transparent window of the envelope when sending a physical letter by snailmail. This commit fixes this issue by ensuring that in all cases the customer address position stays fixed regardless of the presence or absence of the information_block and regardless of the layout used for the letter. It also fixes the addresses displayed on the sale order report: 1) If invoicing address = partner address != shipping address or invoicing address != partner address = shipping address then the three addresses would be printed, even though 2 addresses are identical. 2) The shipping address and the invoicing address are now printed horizontally rather than vertically to get rid of the resulting large blank block under the partner address in that case. backport of: https://github.com/odoo/odoo/pull/276622 task-6340467 Forward-Port-Of: odoo/odoo#281937 Forward-Port-Of: odoo/odoo#273640