Friday, July 10, 2026
240 changes
1 change
Resolved issues and error corrections
### Description of the issue/feature this PR addresses: International production payments processed via Redsys are failing with error code 9754 (SIS0754). This rejection occurs because the EMV3DS (3D Secure 2.0) payload is sending the billAddrState field with an invalid ISO code format for non-Spanish customers or customers without a state configured. ### Current behavior before PR: The _redsys_prepare_merchant_parameters method hardcodes the billAddrState key into the DS_MERCHANT_EMV3DS di
Original PR description
### Description of the issue/feature this PR addresses: International production payments processed via Redsys are failing with error code 9754 (SIS0754). This rejection occurs because the EMV3DS (3D…
### Description of the issue/feature this PR addresses: International production payments processed via Redsys are failing with error code 9754 (SIS0754). This rejection occurs because the EMV3DS (3D Secure 2.0) payload is sending the billAddrState field with an invalid ISO code format for non-Spanish customers or customers without a state configured. ### Current behavior before PR: The _redsys_prepare_merchant_parameters method hardcodes the billAddrState key into the DS_MERCHANT_EMV3DS dictionary payload. If self.partner_state_id.code is missing or empty, Odoo sends an empty/falsy value. Because Redsys enforces strict EMV3DS format validation, it rejects the entire transaction for having an invalid state format rather than simply ignoring the empty value. ### Desired behavior after PR is merged: The DS_MERCHANT_EMV3DS dictionary is now constructed dynamically. The billAddrState key is only appended to the payload if a valid state code actually exists for the partner. RedSys allows this field to be optional, so omitting the key entirely when unavailable causes Redsys to skip the validation for that specific field, allowing certain international payments to process successfully. opw-6237764 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#274912 Forward-Port-Of: odoo/odoo#270899
1 change
Resolved issues and error corrections
Version: --------- - saas-18.4+ Steps to reproduce: ---------------------- 1. Install `stock` and `purchase` module 2. Create a storable and tracking product with a vendor. 3. Create a reordering rule: Route = Buy, Min Qty = 10, Max Qty = 20 and Trigger `manual` 4. Create a receipt for 10 units from the vendor and confirm it.(Mark as todo). 5. Observe the Order button is hidden in reorder rule(expected—incoming qty covers the minimum) 6. Delete the receipt move line. 7. Open reord
Original PR description
2 changes
Resolved issues and error corrections
`_add_manual_models` builds Python model classes for custom ("manual") `ir.model` records with a raw `SELECT *` on the `ir_model` table, then hands each row to `_instanciate_attrs`, which reads a fixed list of expected columns (`model`, `name`, `abstract`, `transient`, `order`, `fold_name`, `info`) via dict subscription (`model_data['xxx']`). This assumes every one of these fields is always backed by a real database column. That assumption breaks whenever a field originally declared as stored
Original PR description
`_add_manual_models` builds Python model classes for custom ("manual") `ir.model` records with a raw `SELECT *` on the `ir_model` table, then hands each row to `_instanciate_attrs`, which reads a…
1 change
Resolved issues and error corrections
**Steps to reproduce:** - Install Accounting and l10n_ar_withholding - Switch to an Argentinian company (e.g. (AR) Responsable Inscripto) - Create a 0% Payment Withholding tax: * Tax Type: Customer Payment Withholding * Amount: 0.00 % * Add an account for the tax distribution lines - Create an invoice with a tax - Confirm the invoice - Pay the invoice: * Withholdings: - Add a line with the created 0% Payment Withholding tax - Add a line with another Payment
Original PR description
1 change
Resolved issues and error corrections
**Steps to reproduce:** - Install the `l10n_it_edi` module and switch to an IT Company. - Create and confirm an invoice for a non-Italian customer. - Send the invoice, making sure that only `by Email` is enabled. - Attempt to send the invoice again. **Issue:** - In `18.0`, the XML file is not generated when re-sending an invoice that was previously sent only by email. - Starting from `19.0`, attempting to `Send to Tax Agency` raises an error: `UnboundLocalError: cannot access local
Original PR description
19 changes
Enhancements to existing features
The PLM document view has been adjusted to better match the updated document management layout. This removes an unnecessary “Variant” banner and helps documents display and integrate more cleanly for users.
Original PR description
The goal is to remove the “Variant” banner and ensure the XPath follows the new document view structure so it can integrate properly. PR: https://github.com/odoo/odoo/pull/259695 upgrade PR: https://github.com/odoo/upgrade/pull/9990 task-5946575
Version: --------- - saas-18.4+ Steps to reproduce: ---------------------- 1. Install `stock` and `purchase` module 2. Create a storable and tracking product with a vendor. 3. Create a reordering…
Version:
---------
- saas-18.4+
Steps to reproduce:
----------------------
1. Install `stock` and `purchase` module
2. Create a storable and tracking product with a vendor.
3. Create a reordering rule: Route = Buy, Min Qty = 10, Max Qty = 20
and Trigger `manual`
4. Create a receipt for 10 units from the vendor and confirm it.(Mark as todo).
5. Observe the Order button is hidden in reorder rule(expected—incoming qty covers the minimum)
6. Delete the receipt move line.
7. Open reordering rule and check order button
Issue:
------
After deleting a confirmed incoming move, the Order button on the reordering rule
does not reappear, even though there is no longer any incoming quantity to cover
the minimum threshold.
Cause:
-------
https://github.com/odoo/odoo/blob/adabd8cc47b1c5992f0f92631da73977be8beaca/addons/stock/views/stock_orderpoint_views.xml#L55-L56
The Order button visibility is driven by `qty_to_order > 0` on the orderpoint.
`qty_to_order` itself resolves to `qty_to_order_computed` (a stored field) when no
manual override is set:
https://github.com/odoo/odoo/blob/adabd8cc47b1c5992f0f92631da73977be8beaca/addons/stock/models/stock_orderpoint.py#L317-L319
```
qty_to_order─depends─>qty_to_order_computed (stored)
│
└─ reads qty_forecast (non-stored, computed)
│
└─ depends on product_id.stock_move_ids.
```
`_compute_qty_to_order_computed` checks whether `qty_forecast < product_min_qty`.
If so, it calculates how much to order to reach `product_max_qty`. When a confirmed
incoming move exists, its quantity is included in `qty_forecast`,
https://github.com/odoo/odoo/blob/adabd8cc47b1c5992f0f92631da73977be8beaca/addons/stock/models/stock_orderpoint.py#L347
This return False.
So, `qty_to_order_computed = 0` → button hidden.
To avoid recomputing `qty_to_order_computed` for all orderpoints on every stock
move change severe performance issue — see [Commit](https://github.com/odoo/odoo/commit/6f2d1b26b34129cfbd62d2fe44f306bfe89794b5
),
`qty_forecast` is intentionally excluded from
`@api.depends` on `qty_to_order_computed`. Instead,
`_update_orderpoints()` is called selectively from `create()` and `write()` to
schedule a targeted recompute via `env.add_to_compute()`.
However, `unlink()` never called `_update_orderpoints()`, so deleting a move left
`qty_to_order_computed` stale at 0 — the Order button stayed hidden permanently.
Solution:
---------
- `_update_orderpoints()` now returns the found orderpoints recordset.
- `unlink()` calls `_update_orderpoints()` before deletion to capture the affected
orderpoints (product_id / location data still accessible), then calls
`_compute_qty_to_order_computed()` immediately after `super().unlink()`.
opw-6174454
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#275119
Forward-Port-Of: odoo/odoo#264039`_add_manual_models` builds Python model classes for custom ("manual") `ir.model` records with a raw `SELECT *` on the `ir_model` table, then hands each row to `_instanciate_attrs`, which reads a fixed list of expected columns (`model`, `name`, `abstract`, `transient`, `order`, `fold_name`, `info`) via dict subscription (`model_data['xxx']`).
This assumes every one of these fields is always backed by a real database column. That assumption breaks whenever a field originally declared as stored on `ir.model` gets redeclared as non-stored (`store=False`) by another module inheriting the same model: Odoo correctly drops the now-unneeded column during that module's `_auto_init()`, but any code still doing `SELECT *` on the table no longer gets that key in the result row, and the subscript access raises a bare `KeyError`. This aborts the *entire* registry load, for every model in the database, not just the one whose field changed -- because `_add_manual_models` runs once per registry load and any database with at least one manual/custom model exercises it.
This is exactly the scenario introduced by 267bec440d56 ("[IMP] base: add IrModel.abstract field"): it added a new, plain stored `abstract` field on `ir.model`. `web_studio` has independently defined its own `abstract` field on `ir.model` since 2016 (ac1129f6577), as a computed, `store=False` field. Once both are loaded together, Odoo's field- merging logic settles on the `store=False` definition, so `_auto_init()` drops the `abstract` column -- and any database that also has at least one manual model (built through Studio, or via a module that dynamically generates SQL-view-backed models) then fails to boot its registry at all:
File ".../odoo/orm/model_classes.py", line 554, in _add_manual_models
attrs = env['ir.model']._instanciate_attrs(model_data)
File ".../odoo/addons/base/models/ir_model.py", line 487, in _instanciate_attrs
'_abstract': bool(model_data['abstract']),
KeyError: 'abstract'
Fix `_instanciate_attrs` to fall back to a sane default instead of assuming the column exists. This doesn't just patch the `base`/ `web_studio` collision -- it hardens `_add_manual_models` against any future field made non-stored by an inheriting module, which is otherwise a silent, whole-database-breaking failure with no visible relation to whichever module actually changed the field.
A companion fix removing web_studio's now-redundant override (the actual root cause of the collision) is proposed separately.
Steps to reproduce:
1. Install `base` and `web_studio` together (or in either order) --
Odoo's field-merging settles on web_studio's `store=False`
definition, but leaves the `abstract` column physically in place;
it is not dropped automatically.
2. Have at least one manual model in the database (`state='manual'`
on `ir.model`, e.g. created through Settings > Technical > Models).
3. Actually remove the now-orphaned `abstract` column -- e.g. via the
OCA `database_cleanup` module's column-purge wizard
(`cleanup.purge.wizard.column`), which explicitly targets exactly
this kind of column (computed + non-stored fields are excluded
from its "keep" list, so `abstract` gets flagged and dropped).
4. Restart Odoo / reload the registry: it fails to boot entirely with
a KeyError on that field name, for every model, not just the one
whose owning module changed.
Related: odoo/enterprise#123572
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#275092**Steps to reproduce:** - Install Accounting and l10n_ar_withholding - Switch to an Argentinian company (e.g. (AR) Responsable Inscripto) - Create a 0% Payment Withholding tax: * Tax Type: Customer Payment Withholding * Amount: 0.00 % * Add an account for the tax distribution lines - Create an invoice with a tax - Confirm the invoice - Pay the invoice: * Withholdings: - Add a line with the created 0% Payment Withholding tax - Add a line with another Payment
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_ar_withholding - Switch to an Argentinian company (e.g. (AR) Responsable Inscripto) - Create a 0% Payment Withholding tax: * Tax Type: Customer…
**Steps to reproduce:**
- Install Accounting and l10n_ar_withholding
- Switch to an Argentinian company (e.g. (AR) Responsable Inscripto)
- Create a 0% Payment Withholding tax:
* Tax Type: Customer Payment Withholding
* Amount: 0.00 %
* Add an account for the tax distribution lines
- Create an invoice with a tax
- Confirm the invoice
- Pay the invoice:
* Withholdings:
- Add a line with the created 0% Payment Withholding tax
- Add a line with another Payment Withholding tax
- Create Payment
- Go to the payment
**Issue 1:**
When clicking on the first withholding line, a JS error is raised due to a missing index (i.e. currency_id).
**Cause 1:**
One of the fields has an aggregate sum function applied on it (i.e. amount_currency).
As it is a monetary field, the corresponding currency field is required in the view.
**Issue 2:**
When resetting the payment to draft, the withholding line with the 0% tax is deleted.
As the withholding table is not editable, it is not possible to add the line again.
**Cause 2:**
When the payment is reset to draft, the state of the associated journal entry is also set to draft and a "_sync_dynamic_lines" is triggered, which remove tax lines having a zero amount during the process.
**Solution 2:**
Keep all the lines with a Customer Payment Withholding tax as it is not possible to add a withholding line in the payment afterwards.
opw-6298058
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#274604
Forward-Port-Of: odoo/odoo#271555**Steps to reproduce:** - Install Accounting and l10n_ar_withholding - Switch to an Argentinian company (e.g. (AR) Responsable Inscripto) - Create a 0% Payment Withholding tax: * Tax Type: Customer…
**Steps to reproduce:**
- Install Accounting and l10n_ar_withholding
- Switch to an Argentinian company (e.g. (AR) Responsable Inscripto)
- Create a 0% Payment Withholding tax:
* Tax Type: Customer Payment Withholding
* Amount: 0.00 %
* Add an account for the tax distribution lines
- Create an invoice with a tax
- Confirm the invoice
- Pay the invoice:
* Withholdings:
- Add a line with the created 0% Payment Withholding tax
- Add a line with another Payment Withholding tax
- Create Payment
- Go to the payment
**Issue 1:**
When clicking on the first withholding line, a JS error is raised due to a missing index (i.e. currency_id).
**Cause 1:**
One of the fields has an aggregate sum function applied on it (i.e. amount_currency).
As it is a monetary field, the corresponding currency field is required in the view.
**Issue 2:**
When resetting the payment to draft, the withholding line with the 0% tax is deleted.
As the withholding table is not editable, it is not possible to add the line again.
**Cause 2:**
When the payment is reset to draft, the state of the associated journal entry is also set to draft and a "_sync_dynamic_lines" is triggered, which remove tax lines having a zero amount during the process.
**Solution 2:**
Keep all the lines with a Customer Payment Withholding tax as it is not possible to add a withholding line in the payment afterwards.
opw-6298058
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#274604
Forward-Port-Of: odoo/odoo#271555**Steps to reproduce:** - Install the `l10n_it_edi` module and switch to an IT Company. - Create and confirm an invoice for a non-Italian customer. - Send the invoice, making sure that only `by…
**Steps to reproduce:** - Install the `l10n_it_edi` module and switch to an IT Company. - Create and confirm an invoice for a non-Italian customer. - Send the invoice, making sure that only `by Email` is enabled. - Attempt to send the invoice again. **Issue:** - In `18.0`, the XML file is not generated when re-sending an invoice that was previously sent only by email. - Starting from `19.0`, attempting to `Send to Tax Agency` raises an error: `UnboundLocalError: cannot access local variable 'attachment_name' where it is not associated with a value` **Root cause:** At [1], `_get_alerts` method does not check whether the invoice was previously sent only by email. As a result, the warning banner is not displayed, and allows the user to `Send to Tax Agency`. **Fix:** Restore the expected behavior by preventing `Send to Tax Agency` when the invoice was previously sent only by email. Instead, display the appropriate warning message instructing the user to delete the PDF attachment before sending to the Tax Agency, matching the behavior in `17.0` (confirmed with PO). [1]: https://github.com/odoo/odoo/blob/c0d8d36481e106f0209521bbb127cb3b1ad1059a/addons/l10n_it_edi/models/account_move_send.py#L27-L33 opw-6293519 Forward-Port-Of: odoo/odoo#269547
The subscription portal now shows the “Change Plan” option as a lighter, less prominent button. This better reflects that changing plans is optional and helps avoid nudging customers toward an unintended action.
Original PR description
When changing the plan is allowed from the portal, a "Change Plan" button is shown in the subscription sidebar. It was styled as a primary button, which wrongly suggests to the customer that this is an action they are expected to take. Make it a light button instead. task-6280700
The WhatsApp message status icon now appears before message actions, keeping it in a consistent spot. This makes message threads easier to scan and improves readability for users.
Original PR description
Display the WhatsApp message status icon before the message actions to keep it consistently positioned and improve message readability. **before:** <img width="581" height="108" alt="image" src="https://github.com/user-attachments/assets/3971d86d-6210-4d26-87ca-88f425dd090d" /> **after** <img width="341" height="164" alt="image" src="https://github.com/user-attachments/assets/503f2861-34bf-4371-8ccd-4e1c6bc3f874" /> task-6085748
The Knowledge options dropdown has been simplified by removing non-essential icons while keeping menu text neatly aligned. The “Move To” action label was also clarified as “Move To...”, making the menu easier to scan without changing its functionality.
Original PR description
This commit removes non-essential icons from the knowledge options dropdown. It adds an invisible icon class to keep text alignment consistent and updates the "Move To" label to "Move To...". Related: odoo/odoo#271256 Task~6279545
Resolved issues and error corrections
Downloading a Knowledge article as a PDF no longer includes unwanted scrollbars or an open menu overlay. This makes exported articles look cleaner and more professional, especially for longer content or when the browser is zoomed in.
Original PR description
The Download PDF option of an article prints the page with the browser. On screen, the article body is inside .o_scroll_view_lg, which scrolls when the content is longer than the screen:…
The Download PDF option of an article prints the page with the browser. On screen, the article body is inside .o_scroll_view_lg, which scrolls when the content is longer than the screen: https://github.com/odoo/enterprise/blob/79f8defa04476e1b939dc8bb5449a775137aed62/knowledge/static/src/scss/knowledge_views.scss#L170-L177 The print stylesheet used to force overflow: visible on every div, so this container did not scroll when printing. It also hid every child of the body except the action manager, so the navbar and open dropdowns were left out of the print. Commit https://github.com/odoo/enterprise/commit/69612c80ea0aec5ccf2c2857449da03e61273457 rewrote knowledge_print.scss to scope its rules to the Knowledge view and removed both rules. The scroll container now keeps its fixed height and its scrollbar when printing, so the scrollbar is drawn in the print preview and on every page of the PDF. The dropdown opened to reach Download PDF is printed on top of the article when it overlaps the page area, which happens when the browser is zoomed in. Add overflow: visible to the print rule of knowledge_print.scss that already targets .o_scroll_view and .o_scroll_view_lg with position: static. That rule exists to undo the screen positioning of the scroll containers when printing, so the overflow reset belongs there. Its selector is also more specific than the screen one, so the value applies without !important, like position: static already does. Restore the rule that hides the body children other than the action manager, scoped to the Knowledge view like the rest of the file since the print stylesheet is now loaded on every page. Before: <img width="497" height="703" alt="image" src="https://github.com/user-attachments/assets/44aa3366-3fc8-4382-8aa2-84625fa4b6d8" /> After: <img width="497" height="703" alt="image" src="https://github.com/user-attachments/assets/8b6eb2bc-37a3-4666-b871-0e6149c41fea" /> Steps to reproduce: 1. Open the Knowledge app and create an article 2. Paste enough text in the article to fill more than one PDF page 3. Zoom the browser to 200% 4. Click the three dots in the top right corner, then Download PDF 5. Check the print preview or the saved PDF => A scrollbar is drawn on the right edge of every page and the dropdown menu is printed on top of the article Ticket [link](https://www.odoo.com/odoo/project.task/6279174) opw-6279174 Forward-Port-Of: odoo/enterprise#120249
The website generator now links products to categories using unique identifiers instead of category names. This prevents products from being assigned to the wrong category when different categories share the same name, improving storefront accuracy.
Original PR description
Before we matched categories with products but names but this was less reliable in the case that we had multiple categories with the same name. e.g. Accessories (for men) and Accessories (for women). This new method allows for this and makes the matching more reliable. Forward-Port-Of: odoo/enterprise#122143
Employees with flexible or missing working schedules will no longer see misleading expected hours in the Timesheet Assistant or systray. The change keeps total logged hours visible while only showing expected hours when a fixed or average schedule makes them meaningful.
Original PR description
**Steps to reproduce:** 1. Create an employee without a fixed working schedule. 2. Configure the employee with variable hours per day, per week, or no working hours at all. 3. Open the Timesheet Assistant or the Timesheet systray. 4. Observe that expected hours are displayed (over 0h 00m or over 24h 00m). **Cause:** Expected working hours were always computed and displayed, even for resources without a fixed schedule. **Fix:** Only compute expected working hours when the employee has a fixed or average schedule, and rely on the computed working hours to control the display of expected hours while keeping total hours always visible. task-6321760 Forward-Port-Of: odoo/enterprise#123068 Forward-Port-Of: odoo/enterprise#122232
Helpdesk closing reminder emails are now sent only for tickets in stages that are actually configured for automatic closure. This prevents customers from receiving misleading warnings for tickets that will not be closed automatically.
Original PR description
**Problem:** When a team restricts automatic closing to specific stages (from_stage_ids), the closing-reminder email is still sent to every inactive ticket in the team, including tickets in stages…
**Problem:** When a team restricts automatic closing to specific stages (from_stage_ids), the closing-reminder email is still sent to every inactive ticket in the team, including tickets in stages that are never auto-closed. **Steps to reproduce:** 1. On a helpdesk team, enable Automatic Closing with a reminder and set "In Stages" (from_stage_ids) to one specific stage 2. Leave a ticket inactive in a different, non-folded stage until it reaches the reminder threshold (auto_close_day - reminder_delay) **Current behavior:** The ticket gets a "your ticket will be closed soon" reminder even though it is not in an auto-close stage and will never be closed. **Expected behavior:** Only tickets that would actually be auto-closed (those in from_stage_ids) should receive the reminder. **Cause of the issue:** The reminder selection filters on auto_close_ticket_reminder and the reminder date only; unlike the auto-close selection, it does not apply the team's from_stage_ids condition. **Fix:** Reuse the same stage condition used to select tickets for closing when selecting tickets for the reminder, so the reminded set stays consistent with the set that will be auto-closed. opw-6291237 Forward-Port-Of: odoo/enterprise#120732
GIFs in Facebook feed comments now show a preview image instead of appearing missing. Users can click the preview to open the animated version on Facebook, making comment content easier to review from Odoo.
Original PR description
Bug === When opening the comments modal of the feed view, the GIF images are not visible. Technical ========= The API does not return the GIF, it only returns the MP4 and the JPG. So we show the fixed image, and when clicking on it, it opens the video on Facebook. Task-6241607 Forward-Port-Of: odoo/enterprise#123181 Forward-Port-Of: odoo/enterprise#118619
The Sign template screen now adapts better when header text becomes longer, such as in translated interfaces. This prevents tag fields from visually overlapping the header, making the page easier to read and use.
Original PR description
Description: - The `.o_sign_template_tags_and_save` container relied on a hardcoded vertical offset (`top: 65px`) while being absolutely positioned. This assumed a fixed control panel height and…
Description: - The `.o_sign_template_tags_and_save` container relied on a hardcoded vertical offset (`top: 65px`) while being absolutely positioned. This assumed a fixed control panel height and caused the tags container to overlap with the header content when the neutralized red header bar expanded to multiple lines due to longer translated strings. - Replaced `top: 65px` with `top: auto` to remove the dependency on a fixed vertical offset and allow the element to be positioned according to its computed static position. - Reduced the height of `.o_field_widget.o_field_many2many_tags` from `50px` to `35px` to better fit the available space within the header area and prevent visual overlap between tag rows and surrounding elements. - This change preserves the existing positioning strategy while making the layout resilient to variable header heights caused by translations and other content-dependent UI variations. 19 - https://github.com/odoo/enterprise/blob/3db8db2eac3dff1485c6a1c977c80e573bfe6cab/sign/static/src/scss/sign_backend.scss#L486 Before fix: <img width="1874" height="443" alt="image" src="https://github.com/user-attachments/assets/196feab3-3460-4ed9-9f57-d7744e9c4e4b" /> After fix: <img width="1319" height="412" alt="image" src="https://github.com/user-attachments/assets/93ae5bcd-f0f0-4999-9cf7-f83b82d689ac" /> Forward-Port-Of: odoo/enterprise#120590 Forward-Port-Of: odoo/enterprise#118937
The point of sale payment screen now only runs India-specific invoice logic when the company is in India. This prevents unnecessary errors in other countries and keeps invoice toggling reliable for affected users.
Original PR description
Toggle invoice button was making a call in IN localization even when not in a IN country. This was causing an error in runbot 940146. This commit fixes the issue by checking if the country is IN before making the call. In `pos_settle_due` the method signature was not correct. Forward-Port-Of: odoo/enterprise#123539
Fixes an issue where selecting restricted users or resources on an appointment slot could crash the form. This keeps appointment slot setup usable and ensures choices are limited to the users and resources configured for the appointment type.
Original PR description
Clicking the "Restrict to User" or "Restrict to Resources" field on a slot crashed with:
invalid input syntax for type integer: "appointment_type_id.staff_user_ids"
The field domain was a quoted string instead of a list, so it was passed through as a literal value. Remove the domain: it never filtered anything and only broke the form.
opw-6349497
Forward-Port-Of: odoo/enterprise#122651The SEPA Direct Debit payment option no longer shows the backend-oriented “(provider)” label to customers. This keeps the checkout and payment experience clearer and more professional for end users.
Original PR description
Commit e90e1cd0 mistakenly suffixed the name of the SEPA Direct Debit `payment.method` record with "(provider)" while making payment methods provider-specific, aligning it with the `account.payment.method` record. However, `payment.method` records are customer-facing and should therefore not display hints intended for backend users. Forward-Port-Of: odoo/enterprise#123507
The Frontdesk app now correctly includes the component it needs to display scheduling information. This helps prevent errors when using Frontdesk features that rely on the planning timeline view.
Original PR description
runbot-237869 Forward-Port-Of: odoo/enterprise#123613 Forward-Port-Of: odoo/enterprise#122292
This fix prevents the grid view from crashing when a user hovers or edits a cell while the underlying data is refreshed. It improves reliability for users working with grid-based screens by safely ignoring outdated cell references and adds coverage to prevent the issue from returning.
Original PR description
Follow-up to PR https://github.com/odoo/enterprise/pull/122948, which
replaced the useGridCell useLayoutEffect with onMounted+onPatched. The
migration introduced an undeterministic bug, sometimes logging:
TypeError: Cannot read properties of undefined (reading 'row')
at updateGridCell -> onPatched
CAUSE: In the migration we dropped the dep-array: the effect now runs on
EVERY patch, not only when reactive.cell changes. When a cell is hovered
/edited and the model data is then rebuilt, reactive.cell still points at
the old cellEl whose dataset.row/column no longer resolve, so getCell()
returns undefined and `state.cell.row` throws the error above.
FIX: Introduce a new guard that was not required beofre
Link the underterministic error:
https://runbot.odoo.com/odoo/runbot.build.error/941501?menu_id=405Canadian check printing now hides check numbers on payment stubs when pre-numbered checks are used. This keeps the stub layout consistent with the actual check and avoids showing duplicate or unwanted numbering.
Original PR description
The check itself respected the check_manual_sequencing field, but the stubs did not. Hide the numbers on stubs as well, exactly like on US checks. task-6343701 Forward-Port-Of: odoo/enterprise#122565
Code cleanup and technical improvements
Spreadsheet-related screens were updated to use the newer Owl 3 framework patterns. This is an internal modernization that helps keep spreadsheet features maintainable and compatible without changing expected user workflows.
Original PR description
*=spreadsheet_sale_management As part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives.
This change updates several Odoo Enterprise apps to use a newer shared method for detecting small screens, preparing the product for the next version of its interface framework. It should not change day-to-day behavior, but helps keep mobile and responsive views reliable as the underlying technology evolves.
Original PR description
This commit is a step to remove the env. The env does not exist in owl3 anymore but still exists in odoo. In this commit, `isSmall` is removed from the env, we can get it from the ui service.
The web enterprise home menu was updated as part of the Owl 3 migration, replacing older internal update handling with the newer supported approach. This helps keep the interface maintainable and ready for future platform improvements without changing business workflows.
Original PR description
As part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives.