Daily updates from Odoo
Tuesday, October 7, 2025
127 changes
18 changes
Enhancements to existing features
The Brazilian AvaTax product form now shows “LC116 Code” instead of “Mercosul NCM Code” when configuring services. This reduces confusion by using the correct terminology for service tax codes while keeping product code labeling unchanged.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435 Forward-Port-Of: odoo/enterprise#96228 Forward-Port-Of: odoo/enterprise#95404
This update streamlines how developers configure website builder options, making related settings easier to keep together and reuse. It mainly affects appointment, online booking, and rental website features, helping future improvements be delivered more consistently with limited direct user impact.
Original PR description
The commit: 1. use static property to configure a builder option 2. introduce the concept of dependencies to access the plugin's shared in builder option 3. make a plugin context the same for Plugin,…
The commit:
1. use static property to configure a builder option
2. introduce the concept of dependencies to access the plugin's shared
in builder option
3. make a plugin context the same for Plugin, BuilderOption and
BuilderAction to have the same API in each class.
Before this commit, to define an option, we had to define a javascript
object that would contain the information of the option within the
`builder_options` resource.
```js
class MyPlugin extends Plugin {
resources: {
builder_options: [
{
selector: "div.selector",
template: "my.owlTemplate",
cleanForSave() {}
// ... other option props
}
]
}
}
// For a custom component
class MyPlugin extends Plugin {
resources: {
builder_options: [
{
selector: "div.selector",
template: MyCustomComponent,
cleanForSave() {}
// ... other option props
}
]
}
}
class MyCustomComponent extends BaseOptionComponent {
// ...
}
```
When building anything for the builder, there is 3 classes that are
important: `Plugin`, `BaseOptionComponent`, `BuilderAction`.
In practice, the option object defined in builder_options feels
strange. On the other hand, making the configuration of the option as
a static property of the component somehow feels simpler as everything
related to that option is defined in the same class.
```js
class MyPlugin extends Plugin {
resources: {
builder_options: [MyCustomComponent]
}
}
class MyCustomComponent extends BaseOptionComponent {
static template = "my.owlTemplate";
static selector = "div.selector";
static cleanForSave(context) {}
// ...
}
```
To have the same mental context in the 3 important class, they all
share the same API (`dependencies`, `dispatchTo`, `getResource`, ...)
(see `Editor.getPluginContext`)
To access a plugin shared method, it's now the same for `Plugin`,
`BuliderAction` and `BaseOptionComponent`:
```js
class MyCustomComponent extends BaseOptionComponent {
static selector = "mySelector";
static dependency = "myPlugin";
myMethod() {
this.dependencies.myPlugin.pluginMethod();
}
}
```
To access a resource, dispatch, ...:
```js
class MyCustomComponent extends BaseOptionComponent {
static selector = "mySelector";
myMethod() {
const resource = this.getResource('myResource');
}
}
```The website HTML builder now uses a cleaner internal structure for configuring editing options and sharing functionality between builder components. This makes future website editing features easier to build and maintain, with little direct impact on end users.
Original PR description
1. use static property to configure a builder option 2. introduce the concept of dependencies to access the plugin's shared in builder option 3. make a plugin context the same for Plugin, BuilderOption and BuilderAction to have the same API in each class. See https://github.com/odoo/odoo/pull/220746
Resolved issues and error corrections
The message shown when fetching bank transactions finds no results now displays correctly instead of showing raw formatting tags. This makes the banking workflow clearer and more professional for users when filters or transaction fetches return no matches.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
The website profile email validation banner now remains hidden after a user closes it. This prevents confusing repeat messages about email validation and creates a smoother account experience.
Original PR description
### Issue 1: The validated email success banner wasn’t triggering the RPC call because Bootstrap’s `data-bs-dismiss="alert"` removed the element from the DOM before the handler could run. ### Issue 2 Closing the banner previously triggered `/profile/validate_email/close` RPC, which reset `validation_email_done` to false. This mistakenly caused the “email sent” banner to reappear, confusing users. ### Solution - Overwrite Bootstrap’s `close.bs.alert` event to trigger the RPC when the success banner is dismissed. - Set `validation_email_sent = False` so the banner stays hidden after being closed. Task-5049533 Forward-Port-Of: odoo/odoo#229913 Forward-Port-Of: odoo/odoo#225872
Fixes Belgian EC Sales List reporting when a company's VAT number was entered without the country prefix. This prevents incorrect trimming of VAT numbers and ensures Belgian reports consistently use Belgium as the country code.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
This fix makes Mail channel mention suggestions more reliable when replying in channel threads. It corrects a test setup and mock response format so the issue is consistently covered and future regressions are easier to catch.
Original PR description
Back-port of https://github.com/odoo/odoo/pull/230157 https://runbot.odoo.com/odoo/runbot.build.error/233201 Problematic line introduced: https://github.com/odoo/odoo/pull/209240 Test introduced: https://github.com/odoo/odoo/pull/226563 Test adapted to be more deterministic: remove current user from channel to ensure the channel is always found through the suggestion route. Fixed returned format of mock server.
Employees with flexible working hours will no longer see weekends automatically marked as unavailable in the timesheet grid. This prevents misleading greyed-out days for people who can choose when they work, making time entry clearer and more accurate.
Original PR description
To reproduce: ============= 1- Update employee worktime to be flexible 2- Go to timesheets -> saturday & sunday are marked grey Problem: ======== Can't apply https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/resource/models/resource_calendar.py#L511 This logic cannot be applied when an employee's work time is flexible, since they can work whenever they want. Fix: ==== When employee work time is flexible we just return empty list for the unavailable dates. opw-5031144 Forward-Port-Of: odoo/enterprise#96181 Forward-Port-Of: odoo/enterprise#94346
Odoo now handles Gelato cancellation updates without crashing when a removed email template is no longer available. Instead of trying to send that missing notification, it records the cancellation status in the sales order chatter so teams can still see the update.
Original PR description
After an order is canceled on Gelato, we receveive a webhook with an `fulfillmentStatus` of `cancel` and while processing it, it crash with: ``` ValueError: External ID not found in the system: sale.mail_template_sale_cancellation ``` The mail template used to notify the status change has been removed in odoo/odoo@2c858ed15e50, so instead we simplify log the information on the sale order chatter. opw-5110226 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230121
Opening the Helpdesk ticket list with no tickets now works correctly instead of crashing. This improves reliability for teams starting with an empty ticket queue or after clearing all tickets.
Original PR description
When accessing the Helpdesk ticket list view with zero tickets, the view previously crashed due to improper handling of folded sample data. This commit ensures that sample data folding does not trigger errors when the view is empty, improving overall stability. Steps to reproduce: 1. Navigate to Helpdesk > Teams > Tickets. 2. Ensure there are no tickets. 3. Switch to list view. Task-4971510
Users can now create automated actions in Documents that generate journal entries for credit card journals. This fixes a blockage that prevented credit card statement workflows from being set up correctly.
Original PR description
We are unable to create an action to create a credit card statement on a journal with type credit card Allow to create a Server Action to create Journal Entries in journals of type "Credit Card" in Documents. task-5123868 Forward-Port-Of: odoo/enterprise#95905
This fixes an issue where users could paste text into protected, non-editable areas while editing website content. The change helps preserve locked content and prevents accidental modifications in the website builder.
Original PR description
When the selection is on text inside an element which is not `contenteditable` and is a inside the editable root, the user could paste text that would get inserted. This commit prevents that by ignoring `paste` events when selection is in a `contenteditable=false`. Steps to reproduce: - On `form/help-1`, open website builder - Select the text of "Help" title - Paste text - Bug: text is inserted task-4367641 Forward-Port-Of: odoo/odoo#228149
This fix makes an automated test for signed document cleanup reliable by avoiding timing edge cases around deletion dates. It helps prevent false test failures without changing how users work with documents.
Original PR description
Steps to reproduce
==================
Launch the test `test_gc_clear_bin` a few times
It will eventually fail:
documents.document(544,) is not false :
trash document should be deleted after gc_clear_bin
Cause of the issue
==================
The domain for wether a record should be deleted contains `('write_date', '<=', fields.Datetime.now() - relativedelta(days=deletion_delay)`
The tests fails when the write_date is in the same second as the test run.
This is because fields.Datetime.now() replaces microseconds by 0.
https://github.com/odoo/odoo/blob/14073faf1fa272b8d3411b4fe6f42c279058459d/odoo/fields.py#L2378
Solution
========
Since records needs to be at least "deletion_delay" old, we add a margin of 30 seconds to make sure they match
runbot-224207
Forward-Port-Of: odoo/enterprise#95926A test setup for Peruvian electronic invoicing now gives the test user the needed sales permission when demo data is disabled. This prevents false test failures and helps keep invoicing quality checks reliable.
Original PR description
Issue: - user is missing a group to create sale order for `test_invoice_down_payment_foreign_currency` without demo data Step to reproduce - run odoo enterprise with : `-i sale,l10n_pe_edi --without-demo=True --test-tags test_invoice_down_payment_foreign_currency` Solution: - add corresponding group to user related [to PR](https://github.com/odoo/enterprise/pull/93885) runbot-233038
Moving an opportunity into an empty CRM pipeline stage no longer triggers an error when recurring revenue is enabled. This keeps the sales pipeline usable and prevents interruptions during normal drag-and-drop work.
Original PR description
**Steps to reproduce:** 1.Install crm 2.Enable 'Recurring Revenues' from settings 3.Go to CRM > 'My pipeline' > Create a record here 4.Enable debug mode 5.Either create a new stage or move records from any stage to make an empty stage 6.Move created record to an empty stage **Issue:** This Traceback accurs : "Uncaught Promise > Invalid props for component 'AnimatedNumber': 'value' is not a number" **Cause:** https://github.com/odoo/odoo/blob/5ade756227abf58769ff904651628a3ccaf8e19a/addons/web/static/src/views/view_components/animated_number.js#L8-L21 AnimatedNumber expects a numeric value for its value prop. When moving to an empty stage, the aggregate value is false, which is not a valid number for the component. **Solution:** Check for the rrmAggregate value to render the component. opw-4972672
Users can now open the overview for completed manufacturing orders even when no bill of materials is linked. This prevents an erroneous unit-of-measure error and helps teams review production records without interruption.
Original PR description
Steps to reproduce: - Create a storable product “P1” - Create a manufacturing order to produce one unit of P1: - add any component - Mark the MO as done - Try to open the MO overview Issue: An error is raised because the MO has no BoM. But in the function we try to compute the missing quantity in the BoM's UoM, but since no BoM is linked, there is no UoM available. Error message: "The unit of measure Unit defined on the order line doesn't belong to the same category as the unit of measure %(product_unit)s defined on the product. Please correct the unit of measure defined on the order line or on the product. They should belong to the same category." Fix: Skip the computation of missing BoM quantities when no BoM is linked, allowing the MO overview to be opened without error. opw-5112132 Opw-5105544 Opw-5119897 Forward-Port-Of: odoo/odoo#229707
Documentation and clarification updates
This updates the recorded corporate contributor agreement information for ForgeFlow. It keeps Odoo's legal contribution records current and does not change product functionality for users.
Original PR description
Forward-Port-Of: odoo/odoo#230040
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
10 changes
Enhancements to existing features
The Brazilian AvaTax product setup now shows the correct LC116 label when configuring services instead of referring to Mercosul NCM, which applies to goods. This reduces confusion for users entering fiscal information and improves the supporting tooltip explanation.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435 Forward-Port-Of: odoo/enterprise#96228 Forward-Port-Of: odoo/enterprise#95404
The state selection search field no longer has extra spacing around it. This makes it visually consistent with similar selection fields across Odoo and improves the overall form experience.
Original PR description
There is a 2% margin added when searching for country states Remove this margin to have the field look like the majority of `many2one` fields task-5123126 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
The bank journal message shown when no transactions are found now displays correctly instead of showing raw HTML text. This improves clarity for users when fetching bank transactions or changing filters with no matching results.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
Closing the email validation banner now keeps it hidden instead of making the “email sent” message appear again. This avoids confusing repeat prompts and gives users a smoother profile experience.
Original PR description
### Issue Closing the banner triggered `/profile/validate_email/close` RPC, which reset `validation_email_done` to false. This mistakenly caused the “email sent” banner to reappear, confusing users. ### Solution Set `validation_email_sent = False` so the banner stays hidden after being closed. Task-5049533 Forward-Port-Of: odoo/odoo#229913 Forward-Port-Of: odoo/odoo#225872
Belgian EC sales reports now correctly handle company VAT numbers even when users entered them without the Belgian country prefix. This prevents valid VAT numbers from being shortened incorrectly and helps keep Belgian reporting accurate.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
Employees with flexible working hours will no longer see weekends incorrectly marked as unavailable in the timesheet grid. This avoids confusion for people who can work on any day and makes time entry reflect their flexible schedule.
Original PR description
To reproduce: ============= 1- Update employee worktime to be flexible 2- Go to timesheets -> saturday & sunday are marked grey Problem: ======== Can't apply https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/resource/models/resource_calendar.py#L511 This logic cannot be applied when an employee's work time is flexible, since they can work whenever they want. Fix: ==== When employee work time is flexible we just return empty list for the unavailable dates. opw-5031144 Forward-Port-Of: odoo/enterprise#96181 Forward-Port-Of: odoo/enterprise#94346
Opening the Quality Points button from a product in Point of Sale no longer triggers an error. The fix ensures the correct quality control view is opened, preventing users from being blocked when reviewing quality points for products.
Original PR description
**Step to Reproduce** 1- Install point_of_sale and quality_control. 2- Open POS -> Product -> Product 3- Open any product and click the Quality Points smart button → traceback occurs **Issue**…
**Step to Reproduce** 1- Install point_of_sale and quality_control. 2- Open POS -> Product -> Product 3- Open any product and click the Quality Points smart button → traceback occurs **Issue** `UncaughtPromiseError > OwlError Uncaught Promise > The following error occurred in onWillStart: ""quality.point"."product_variant_count" field is undefined."` **Root Cause** https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/point_of_sale/views/product_view.xml#L23-L25 - View reference is passed in the context. - When this context is propagated to `action_see_quality_control_point`, https://github.com/odoo/enterprise/blob/7b777bffbebfb6503bb348005e9ce076825926e4/quality_control/models/quality.py#L579-L584 https://github.com/odoo/enterprise/blob/2e08282ca275bf1e66c58e28391f11f8bd7884d2/quality_control/views/quality_views.xml#L859-L868 - Than traceback occurs because the action does not pass a `view_id`. - When the context contains `list_view_ref`, it attempts to load the product template list view with the `quality.point` model. - This leads to a traceback since the fields defined in that view do not exist on the `quality.point` model. **Solution** - Pass a proper `view_id` from the Python side to ensure the correct view is loaded, preventing `list_view_ref` from forcing to load an invalid template. **opw-** **5090505**
This fix makes an automated cleanup test for signed documents more reliable by avoiding timing-related failures. It helps keep internal validation stable without changing day-to-day user behavior.
Original PR description
Steps to reproduce
==================
Launch the test `test_gc_clear_bin` a few times
It will eventually fail:
documents.document(544,) is not false :
trash document should be deleted after gc_clear_bin
Cause of the issue
==================
The domain for wether a record should be deleted contains `('write_date', '<=', fields.Datetime.now() - relativedelta(days=deletion_delay)`
The tests fails when the write_date is in the same second as the test run.
This is because fields.Datetime.now() replaces microseconds by 0.
https://github.com/odoo/odoo/blob/14073faf1fa272b8d3411b4fe6f42c279058459d/odoo/fields.py#L2378
Solution
========
Since records needs to be at least "deletion_delay" old, we add a margin of 30 seconds to make sure they match
runbot-224207
Forward-Port-Of: odoo/enterprise#95926Documentation and clarification updates
This update refreshes ForgeFlow's corporate contributor agreement documentation. It keeps Odoo's legal contributor records current and has no expected impact on day-to-day product functionality.
Original PR description
Forward-Port-Of: odoo/odoo#230040
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
8 changes
Resolved issues and error corrections
The message shown when bank transaction fetching or filtering finds no results now displays correctly instead of showing raw formatting code. This makes the banking workflow clearer and more professional for users when no transactions are available.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
This fix prevents subscription invoices from accidentally overwriting the correct values on combo product sections. It also avoids adding unnecessary information to those sections, helping invoices stay accurate and cleaner for customers.
Original PR description
This commit improve fix of PR https://github.com/odoo/enterprise/pull/90989 to avoid overriding right combo section values and avoid setting unnecessary values on the section. opw-5069278 Forward-Port-Of: odoo/enterprise#94776
Belgian EC Sales reporting now handles company VAT numbers that were entered without the BE country prefix. This prevents incorrect removal of the first two VAT digits and ensures Belgian reports consistently use Belgium as the country.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
This fixes an intermittent failure in automated tests for signed document cleanup. It adds a small timing margin so documents marked for deletion are consistently recognized as old enough to remove, improving release stability without changing user-facing behavior.
Original PR description
Steps to reproduce
==================
Launch the test `test_gc_clear_bin` a few times
It will eventually fail:
documents.document(544,) is not false :
trash document should be deleted after gc_clear_bin
Cause of the issue
==================
The domain for wether a record should be deleted contains `('write_date', '<=', fields.Datetime.now() - relativedelta(days=deletion_delay)`
The tests fails when the write_date is in the same second as the test run.
This is because fields.Datetime.now() replaces microseconds by 0.
https://github.com/odoo/odoo/blob/14073faf1fa272b8d3411b4fe6f42c279058459d/odoo/fields.py#L2378
Solution
========
Since records needs to be at least "deletion_delay" old, we add a margin of 30 seconds to make sure they match
runbot-224207
Forward-Port-Of: odoo/enterprise#95926Users who are allowed to print and send SEPA Direct Debit mandates can now generate, email, and reopen the related PDF attachments without needing an extra accounting read-only permission. This prevents failed mandate emails and avoids blocking users from accessing documents they created.
Original PR description
Removing the groups restriction from the `mandate_pdf_file` field in model `sdd.mandate` because it was causing issues when using the `sdd.mandate.send` wizard. Any user who has access to the `sdd.mandate` model can use this wizard to print and send the record. During this process, the system generates a PDF and stores it in the `mandate_pdf_file` binary field, linking the resulting attachment to the record. The previous group restriction prevented users who were not part of the `account.group_account_readonly` group from sending the email with the attachment. Even if the email was somehow sent, those users still couldn’t access the attachments they themselves had generated and sent. With this change, any user who is allowed to send and print `sdd.mandate` records will also be able to generate and later access the corresponding attachments. Forward-Port-Of: odoo/enterprise#96119
This update adds an automated test for the batch payment reconciliation flow to help prevent a previously reported issue from returning. It does not change user-facing behavior, but improves confidence that accounting workflows remain stable in future releases.
Original PR description
Add test for PR opw-5057109 Forward-Port-Of: odoo/enterprise#94304
The payroll accounting tests for Hong Kong were updated so their sample time off data includes the required leave allocations. This prevents validation errors during automated testing and helps keep payroll-related releases stable.
Original PR description
Issue: Unit tests are failing because test data was created without leave allocations, leading to validation errors. Fix: Added leave allocation data for time off types which requiring allocation in some tests. build_error-230409 Forward-Port-Of: odoo/enterprise#93160
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
16 changes
Enhancements to existing features
The Brazilian AvaTax product setup now shows the service-specific LC116 Code label instead of Mercosul NCM Code when configuring services. This reduces confusion for users by matching the label and tooltip to the correct Brazilian service tax classification.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435 Forward-Port-Of: odoo/enterprise#96228 Forward-Port-Of: odoo/enterprise#95404
This update changes how AI and WhatsApp conversations identify and manage the person on the other side of a chat. It helps keep chat participant information more consistent across messaging features, reducing the risk of mismatched or duplicated conversation details.
Original PR description
task-4675831
This update streamlines automated checks for the online shop by using more appropriate test helpers and starting tests closer to the relevant product pages. It helps keep eCommerce testing faster, clearer, and easier to maintain without changing the customer-facing shopping experience.
Original PR description
* use the right tour utils * start tours from product page when there is no reason to start from shop page
The point of sale integration for UrbanPiper has been adjusted to stay compatible with recent product option changes in Odoo. This helps restaurants keep managing product attributes consistently when syncing menus and orders with delivery platforms.
Original PR description
task-4731792
The Sign app now uses one shared rule to decide when the PDF upload button appears. This reduces duplicate setup behind the scenes, making the interface easier to maintain without changing how users work.
Original PR description
Before this PR, the upload PDF button used the same logic and conditions in both templates and requests, causing duplicate code. This PR adds a single condition to manage the upload button for both templates and requests, reducing duplication and improving clarity.
Resolved issues and error corrections
A test for the Chilean electronic invoicing module now skips cleanly when optional demo data is not installed. This prevents false test failures in environments that run without demo data, improving reliability without changing customer-facing behavior.
Original PR description
The test `test_demo_certificate_serial_number` failed when running without demo data, since the XMLID `l10n_cl_edi.l10n_cl_demo_certificate` is only present in demo mode. This commit updates the test to use `raise_if_not_found=False` and skip gracefully when the demo certificate is not available. The assertion now only runs if the certificate exists, ensuring the test passes consistently both with and without demo data. [RB-231573](https://runbot.odoo.com/odoo/error/231573) Forward-Port-Of: odoo/enterprise#95917
The message shown when no bank transactions are found now displays correctly instead of showing raw formatting codes. This improves clarity for users when fetching transactions or changing filters produces no results.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
Employees with flexible working schedules will no longer see Saturdays and Sundays incorrectly marked as unavailable in the timesheet grid. This keeps the timesheet view aligned with flexible work arrangements, where employees may work on any day.
Original PR description
To reproduce: ============= 1- Update employee worktime to be flexible 2- Go to timesheets -> saturday & sunday are marked grey Problem: ======== Can't apply https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/resource/models/resource_calendar.py#L511 This logic cannot be applied when an employee's work time is flexible, since they can work whenever they want. Fix: ==== When employee work time is flexible we just return empty list for the unavailable dates. opw-5031144 Forward-Port-Of: odoo/enterprise#96181 Forward-Port-Of: odoo/enterprise#94346
The Belgian EC sales report now correctly handles VAT numbers entered without the Belgian country prefix. This prevents valid VAT numbers from being shortened incorrectly and helps keep Belgian tax reporting accurate.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
Users can now open the AI assistant from the Physical Inventory list and send messages without hitting an error. The fix handles pages that do not have a linked action, improving reliability for Inventory users.
Original PR description
Currently an error is generated when a user tries to send a message to AI while the current page is in `Physical Inventory`list view. Steps: - Install `Inventory` - Go to Inventory > Operations >…
Currently an error is generated when a user tries to send a message to AI while the current page is in `Physical Inventory`list view. Steps: - Install `Inventory` - Go to Inventory > Operations > Physical Inventory - Click the AI icon from the systray menu. - Ask anything in AI >>> error generated Error: ```UnboundLocalError:cannot access local variable 'current_action' where it is not associated with a value``` This issue arises because in line [1] of the code, the variable `current_action` is assigned a value inside an `if-elif` block based on `action.type`. However, since the `Physical Inventory` page does not have any associated action, the variable `current_action is` never set. Consequently, attempting to access this variable results in an error. This commit fixes the above issue by initializing the `current_action` variable as `None` outside the `if-elif` block and adding handling for cases when `current_action` is `None`. [1] - https://github.com/odoo/enterprise/blob/2ea15cc9c7c5f114b3786b256c64e269b3e3a313/ai/models/ai_agent.py#L750-L755 sentry-6913801088 Forward-Port-Of: odoo/enterprise#96253
This update adds test coverage for an issue where editing a Sales dashboard list and choosing the Medium field matching could trigger an error. It helps ensure spreadsheet dashboard filters behave reliably and avoids a disruptive traceback for users.
Original PR description
Steps to reproduce: 1. Open the Sales dashboard 2. Edit the first list 3. Try to set the "Medium" field matching => Traceback This commit contains only the test as the fix is in the community PR. Task: 5101093 Forward-Port-Of: odoo/enterprise#95990
Documents can now create server actions for journal entries in journals marked as Credit Card. This removes a blocker for teams that manage credit card statements through Documents and need the same automation available for other journal types.
Original PR description
We are unable to create an action to create a credit card statement on a journal with type credit card Allow to create a Server Action to create Journal Entries in journals of type "Credit Card" in Documents. task-5123868 Forward-Port-Of: odoo/enterprise#95905
This update removes an unused Lithuanian payroll input type and adds safeguards to prevent duplicate payroll input selection keys. It helps keep payroll configuration cleaner and reduces the chance of inconsistent salary rule setup.
Opening a spreadsheet-based quality step in the shop floor workflow now works without displaying a traceback. This removes a distracting error for manufacturing operators while keeping the spreadsheet step behavior unchanged.
Original PR description
To reproduce: - Make a new BOM for new product P, with 1 operation on assembly line 1 - Add a spreadsheet step to the operation - Make a MO for 1x P - Open shop floor, assembly line 1, click on the spreadsheet step Current behaviour: - The spreadsheet step opens correctly, but we get a traceback Expected behaviour: - The spreadsheet step opens correctly, no traceback task-4965313 Forward-Port-Of: odoo/enterprise#94657 Forward-Port-Of: odoo/enterprise#91505
Code cleanup and technical improvements
This update standardizes the internal name of a messaging component used by several Enterprise apps. It helps keep the Enterprise codebase aligned with the main Odoo platform and should not change day-to-day user workflows.
Original PR description
\* = account_accountant, ai, ai_website_livechat, documents, hr_recruitment_extract, iap_extract, spreadsheet_edition, whatsapp Enterprise counter-part. https://github.com/odoo/odoo/pull/229944
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
29 changes
Enhancements to existing features
Brazilian service fiscal setup now shows the correct LC116 Code label instead of Mercosul NCM Code. This reduces confusion for users configuring services while keeping product code labeling unchanged.
Original PR description
Purpose:- - In Brazil, NCM is a code that has an acronym to specify the Mercosul Common Name for products, and for services, the right name is LC116 (Complementary Law 116), which specifies the federal code for a service. - But we have the same field `l10n_br_ncm_code_id` to configure both NCM for goods and LC116 for services and the same table can be used for both the cases. - So while configuring fiscal information for a service, user don't understand why it still shows the NCM label instead of LC116. Before this commit:- - Label `Mercosul NCM Code` was displayed for services confusing users. After this commit:- - Label `Mercosul NCM Code` is replaced with `LC116 Code` only for services. - Tooltip is also improved for better understanding. task-5096435 Forward-Port-Of: odoo/enterprise#96228 Forward-Port-Of: odoo/enterprise#95404
This update adds extension points for the automatic wave process in warehouse batch picking. It makes it easier for businesses with custom warehouse rules to adapt when transfers are automatically grouped, without changing the core process.
Original PR description
This improvement just adds some hook methods that allow to decapsulate the logic of auto waves so its doable to extend the conditions for auto-waving. cc @moduon fyi @Shide TODO: for the sake of clarity I just inserted the hook method logic but a cleaner approach would be to extract the whole logic of each hook into their own separate method --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227873
Resolved issues and error corrections
This update prevents crashes in the Chilean electronic invoicing integration when processing incoming emails. It keeps the module compatible with recent internal mail handling changes, helping related automated workflows run reliably.
Original PR description
Description of the issue/feature this PR addresses: Found while investigating [#230014](https://github.com/odoo/odoo/issues/230014) Current behavior before PR: Crashes because of not being aligned with new name of task-4982132. Desired behavior after PR is merged: No crash. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The help message shown when no bank transactions are found now displays correctly instead of showing raw formatting tags. This makes the bank synchronization experience clearer when fetching transactions or changing filters returns no results.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
Users who close the email validation message will no longer see a confusing follow-up banner reappear. This keeps the profile page experience clearer after an email has already been validated or the notice has been dismissed.
Original PR description
### Issue 1: The validated email success banner wasn’t triggering the RPC call because Bootstrap’s `data-bs-dismiss="alert"` removed the element from the DOM before the handler could run. ### Issue 2 Closing the banner previously triggered `/profile/validate_email/close` RPC, which reset `validation_email_done` to false. This mistakenly caused the “email sent” banner to reappear, confusing users. ### Solution - Overwrite Bootstrap’s `close.bs.alert` event to trigger the RPC when the success banner is dismissed. - Set `validation_email_sent = False` so the banner stays hidden after being closed. Task-5049533 Forward-Port-Of: odoo/odoo#229913 Forward-Port-Of: odoo/odoo#225872
This update aligns automated tests with the newer editor behavior for selection placeholders. It helps keep quality checks accurate without changing what business users see or do.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/225576 Since the introduction of selection placeholders, we don't need to ensure an empty paragraph after a trailing table. This adapts a test to this new behavior. task-4129699
This update fixes several visual alignment issues in the HTML Builder option panels, including blurry guide lines, uneven picker padding, and inconsistent picker heights. Users get a more stable and polished editing experience when configuring fonts, shadows, visibility, and background image options.
Original PR description
This PR fixes several options-related issues in the HTML Builder: 1. Improved the vertical sublevel line, which appeared blurry due to the transform property and an incorrect height. You can see the…
This PR fixes several options-related issues in the HTML Builder: 1. Improved the vertical sublevel line, which appeared blurry due to the transform property and an incorrect height. You can see the problem by "zooming out" multiple times. 2. Harmonized the padding of the visibility layout options and the background image position to align with the other pickers. 3. Fixed the height of the font-family picker: when you select a font-family, the height of the picker may change according to your selection (that's the case with Roboto for example - It's more "apparent" in the case of headings when it's next to the delete button as shown in the screenshot.) 4. Fixed the height of the “None” shadow option => these 2 issues where caused by the font metrics. task-4985348 1 & 2 <img width="423" height="500" alt="image (1)" src="https://github.com/user-attachments/assets/a9304b67-607a-424a-94de-dd3dacece84f" /> 3 <img width="1037" height="293" alt="Screenshot 2025-10-02 at 13 14 37" src="https://github.com/user-attachments/assets/d5982d34-2987-49d9-95cf-c78294521995" /> 4 <img width="1542" height="231" alt="image" src="https://github.com/user-attachments/assets/13cbfa8f-dd72-41dc-82f2-c371f6ff2d77" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229086
This fix ensures Belgian EC sales reports handle VAT numbers correctly even when users entered them without the Belgian country code. It prevents valid VAT numbers from being shortened incorrectly and keeps the report country code consistently set to Belgium.
Original PR description
It could happen that the user set his vat number without the country code before the number. In this case, we removed the two first digits of the vat number. Also changing other occurrence using the company_vat to get the country, since we are in the belgian ec sale list, the country_code should be 'BE' everytime task-5039969 Forward-Port-Of: odoo/enterprise#93377
Employees with flexible working schedules will no longer see Saturdays and Sundays incorrectly marked as unavailable in the timesheet grid. This avoids confusion for teams that can record work on any day.
Original PR description
To reproduce: ============= 1- Update employee worktime to be flexible 2- Go to timesheets -> saturday & sunday are marked grey Problem: ======== Can't apply https://github.com/odoo/odoo/blob/ce2d134d3e8e5c0d96529c1d0490f1e0c5e28294/addons/resource/models/resource_calendar.py#L511 This logic cannot be applied when an employee's work time is flexible, since they can work whenever they want. Fix: ==== When employee work time is flexible we just return empty list for the unavailable dates. opw-5031144 Forward-Port-Of: odoo/enterprise#96181 Forward-Port-Of: odoo/enterprise#94346
The IoT box image build process now uses the correct dependency location for Raspberry Pi images. This prevents build failures caused by choosing the wrong package path during the image creation process.
Original PR description
When building an image in v19.0, we try to install `aiortc` from path. The requirements.txt contain two path: one for rpis and one for other linux machines. While building, we `chroot` from the builder's machine to the rpi filesystem, so the plateform is still the host machine's one, but the filesystem is the rpi's. To fix this, we hardcoded the right path in the `init_image` script.
This fix ensures copied website configurator pages remain connected to the correct website. It prevents build errors and helps website setup flows complete reliably.
Original PR description
This PR resolves the runbot build error https://runbot.odoo.com/odoo/runbot.build.error/232963 Standalone script test_02_theme_default_generate_primary_templates Reason: The issue was introduced by commit [1], which creates a copy of configurator pages but does not set the website_id field on the new copy. As a result, the copied page is missing its website association, leading to error. [1]:https://github.com/odoo/odoo/commit/4231c9e545f
This update adjusts the Sales Subscription area so it remains aligned with related changes in the main Odoo platform. It helps keep subscription behavior reliable after upstream updates, with no expected change to everyday business workflows.
Original PR description
See also - https://github.com/odoo/odoo/pull/227241
The bank configuration dashboard now uses adjusted colors so information remains easy to read when dark mode is enabled. This improves usability for users who work with the accounting bank synchronization screens in dark mode.
Original PR description
This commit adjusts dashboard bank colors to enhance readability in dark mode. task-5122380 Requires: - https://github.com/odoo/odoo/pull/229228 | Before | After | |--------|--------| | <img width="653" height="385" alt="image" src="https://github.com/user-attachments/assets/b7a661d9-d979-498d-b099-a7efb9ab134c" /> | <img width="641" height="302" alt="Capture d’écran 2025-09-30 à 14 45 06" src="https://github.com/user-attachments/assets/f2351a7d-dbc7-4f23-af04-0b6801b2f186" /> |
This fixes a rare timing issue that could cause an automated session timeout test to fail even though the product behavior was not actually broken. The change makes the test more reliable, reducing false alarms in the validation pipeline.
Original PR description
Error seems very rare on the runbot (only one occurrence recorded) but happens pretty often when I run the tours locally, and is "sticky". The problem is that it's possible for an RPC to run between…
Error seems very rare on the runbot (only one occurrence recorded) but happens pretty often when I run the tours locally, and is "sticky". The problem is that it's possible for an RPC to run between the instant where the identity check is invalidated / times out and the next check of `retryUntil` (especially since that only checks every second, but even with a smaller interval it would likely still have a window of opportunity for the race). If that happens and the RPC doesn't otherwise handle RPC errors internally (which whatever calls `discuss.channel.channel_fetched` apparently does not as that's what causes the issue both locally and on runbot), then the session timeout will trigger an `RPC_ERROR` which will get logged as an `ERROR` to the driver, which causes the tour to fail. The workaround isn't exactly sexy: if we see an RPC hit with a check identity timeout then instead of returning the error we convert it to an infinite wait (a promise which never resolves), which avoids failing the tour. This seems preferrable to trying to return a success as we can't know what future RPCs falling into that same interval would need to return. https://runbot.odoo.com/odoo/error/232711
Canceled Gelato orders can now be processed without triggering an error in Odoo. Instead of trying to use a removed email template, the cancellation status is recorded directly on the sale order activity log, keeping teams informed and avoiding disruption.
Original PR description
After an order is canceled on Gelato, we receveive a webhook with an `fulfillmentStatus` of `cancel` and while processing it, it crash with: ``` ValueError: External ID not found in the system: sale.mail_template_sale_cancellation ``` The mail template used to notify the status change has been removed in odoo/odoo@2c858ed15e50, so instead we simplify log the information on the sale order chatter. opw-5110226 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230121
This fix stops users from pasting text into parts of website editor content that are meant to be locked from editing. It helps preserve protected page elements and avoids accidental changes while editing website pages.
Original PR description
When the selection is on text inside an element which is not `contenteditable` and is a inside the editable root, the user could paste text that would get inserted. This commit prevents that by ignoring `paste` events when selection is in a `contenteditable=false`. Steps to reproduce: - On `form/help-1`, open website builder - Select the text of "Help" title - Paste text - Bug: text is inserted task-4367641 Forward-Port-Of: odoo/odoo#228149
Internal agents who are viewing a WhatsApp conversation without being added as members can now translate messages. This removes an unnecessary limitation and helps support teams understand customer conversations while monitoring them.
Original PR description
Before this commit, when an agent that is not member of whatsapp but is peeking the conversation, the agent could not translate the message. This happens because the translation feature is limited to internal users, but this was determined based on the self member relational field. This works when the agent is a member but when not a member this was arbitrarily disabling the feature. This commit fixes the issue by looking at whether the user is internal or not, based on self persona independently on whether the agent is member or not of the conversation. Task-5111383 Forward-Port-Of: odoo/enterprise#95913 Forward-Port-Of: odoo/enterprise#95474
This fix makes tests around mentioning discussion channels more reliable by ensuring channel suggestions are found through the intended path. It also corrects the mock server response format, reducing false build failures and helping keep messaging features stable.
Original PR description
https://runbot.odoo.com/odoo/runbot.build.error/233201 Problematic line introduced: https://github.com/odoo/odoo/pull/209240 Test introduced: https://github.com/odoo/odoo/pull/226563 Test adapted to be more deterministic: remove current user from channel to ensure the channel is always found through the suggestion route. Fixed returned format of mock server.
This update fixes an automated test used to verify the online shop rental purchase flow. It helps ensure the test runs consistently, reducing false failures during quality checks.
Original PR description
In this commit, we ensure tour succeed each time by clicking on hidden element.
This fix prevents an error when employees who belong to manually created user groups open their preferences. Odoo now ignores groups that lack system identifiers, keeping the HR-related preferences flow stable for affected users.
Original PR description
After this commit: odoo/odoo@f409d38bcc858642a981d1b2c765dbe37b3fbd36 all the user groups are being added in the context This caused an IndexError when the user belonged to a group that does not have an external XML ID (e.g., a manually created group), because _get_external_ids() returns an empty list for such groups. The fix adds a conditional check to skip empty lists, ensuring that only groups with XML IDs are added to the context. Steps to reproduce before the fix: - Go to Settings → Users & Companies → Groups → create a new group. - Add the current user to this new group. - Go to the odoo Dashboard → click on My Preferences. 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
Users can now create document actions that generate journal entries for credit card journals. This removes a blocker for teams processing credit card statements through Documents and keeps the workflow consistent with other journal types.
Original PR description
We are unable to create an action to create a credit card statement on a journal with type credit card Allow to create a Server Action to create Journal Entries in journals of type "Credit Card" in Documents. task-5123868 Forward-Port-Of: odoo/enterprise#95905
Live chat agents who are viewing a conversation without being assigned as members can now use message translation. This removes an unnecessary limitation and helps agents understand customer conversations more effectively.
Original PR description
Before this commit, when an agent that is not member of livechat but is peeking the conversation, the agent could not translate the message. This happens because the translation feature is limited to internal users, but this was determined based on the self member relational field. This works when the agent is a member but when not a member this was arbitrarily disabling the feature. This commit fixes the issue by looking at whether the user is internal or not, based on self persona independently on whether the agent is member or not of the conversation. Task-5111383 Forward-Port-Of: odoo/odoo#229294 Forward-Port-Of: odoo/odoo#228449
This fixes a rare, timing-related failure in the Mail app's automated call invitation test. It helps keep quality checks stable without changing the user experience.
Original PR description
Before this commit, the `test_07_call_invitation_ui` test could fail in a non-deterministic way. At some point, the test tries to open the channel invitation camera preview which sometimes does not open because the component state is lost due to outdated bus notifications. In detail: - Invitation is received after calling the `/mail/data` route. - Notification resulting from channel creation are received. However, invitation was not yet created at that point, leading to invitation deletion. - Notification resulting from invitation creation is received, the invitation is shown again but the component state is lost. In practice, this rarely happens and is not critical. This commit fixes the issue by clearing the notifications before starting the tour. fixes runbot-233231
The India reports module no longer applies an unnecessary tax unit check when creating GSTR tax returns. This prevents avoidable validation issues because the system already assigns the correct tax unit automatically.
Original PR description
This commit removes a check of tax unit constraint. It is not useful for now because system creates the tax returns, and it sets the `tax_unit_id` according so we can remove the constraint. reference task task-4750259
This fix prevents an unwanted horizontal scrollbar from appearing in the color picker after a recent layout change. Users will see a cleaner, stable color selection panel that stays within its intended width.
Original PR description
Description of the issue/feature this PR addresses: - Due to a recent [refactor](https://github.com/odoo/odoo/commit/edc9d5bb9582db704ed02051ee4adb3801ddfaa9#diff-f2da6e6a1009564765335a3006ab73d76120e094d3554786c9acbe15b79f9fe0R7), the margin start (`ms-1`) was applied to all tabs of the color picker instead of only the first one, and `me-1` to the last one. Because color picker has fixed width, this change introduced scrollbar. Desired behavior after PR is merged: - Added `px-1` to the parent element so that the color picker remains fixed and does not scroll horizontally. task-5103832 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The web interface now handles long view names better in the mobile bottom sheet, such as longer translated labels. This prevents awkward wrapping or cramped layout, making navigation clearer for users in different languages.
Original PR description
This commit adds some CSS rules to have a better layout when there are long view title in some language (e.g.: in French: "Tableau croisé dynamique") task-5139101 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change stabilizes an automated test for the Discuss app by accounting for the OdooBot channel opening first. It reduces false test failures, helping releases and maintenance runs proceed more reliably without changing user-facing behavior.
Original PR description
Before this commit, the `test_05_can_create_channel_tour` could sometimes fail. The test checks that creating a channel from the form view adds it to the sidebar. The failure happened because the tour relied on a breadcrumb showing "Discuss". When first opening the discuss app, the "OdooBot" channel appears, so the breadcrumb shows "OdooBot" instead. This commit fixes the issue by giving the "OdooBot" channel time to open and updating the breadcrumb selector. fixes runbot-233232 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
Fixed an issue in the online store product image viewer where the active thumbnail could appear off-center when product images used automatic sizing. This improves the shopping experience for customers viewing products with media of different dimensions.
Original PR description
Versions -------- - 19.0+ Steps ----- 1. Open eCommerce editor on product page; 2. set image ratio to 'auto'; 3. enable zoom-on-click; 4. add extra media with different sizes; 5. close editor & click on product image; Issue ----- The thumbnail row on the bottom isn't centering the active image properly. Cause ----- The `_updateCarousel` hook added in cfc9814feba08 centers the images with the assumption that they all have identical widths. As of commit 7c0020e054dc5, this is no longer guaranteed, if the `auto` image ratio is chosen. Solution -------- Modify the centering logic to calculate the appropriate position based on the thumbnail currrent offset. As this requires the images to be loaded, we add `_updateCarousel` as an event listener on the last image, listening for the `load` event. opw-4937009
Miscellaneous changes
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
Original PR description
Fixes a typo in the i18n directory. no task-id Forward-Port-Of: odoo/enterprise#96417
11 changes
Resolved issues and error corrections
The bank transaction fetch screen now shows its help message correctly when no transactions are found. This avoids confusing raw formatting text appearing to users and makes the banking workflow feel more polished and consistent.
Original PR description
Before this commit : - The help message shown when no transactions were fetched by the 'Fetch Transactions' button in the 'Bank' journal contained raw html tags, as markup was not getting applied. - Also, removing a filter (without reloading) and applying another filter that resulted in no matches, the same issue occurred. After this commit: - The help message is now consistently rendered with markup applied. task-4942234 Forward-Port-Of: odoo/enterprise#95514
New user signatures now place the user's name in a layout element that avoids extra spacing when lines are added. This prevents duplicated paragraph spacing in default signatures, while existing signatures remain unchanged unless users update them manually.
Original PR description
Prior to this commit, the default signature for users was their name wrapped in a `p`. This is not what we want, because a `HTMLParagraphElement` natively has a margin-bottom, and when a user creates a newline from a paragraph, it duplicates itself. After this commit: the user name is wrapped in a `div` instead. This does not update existing users signatures. To switch to a `div`, they will have to select the desired lines, and change their type from "Paragraph" to "Normal". task-5149570
Mega menus now adapt properly when used with vertical website navigation layouts such as sidebar or hamburger menus. This prevents overlapping content and provides a cleaner browsing experience for visitors using those header styles.
Original PR description
Steps to Reproduce : 1. Add a Mega Menu through Menu Editor 2. Switch the header template to Sidebar 3. Once done --> Open the mega menu; it will overlap with one another. Issue: Vertically aligned navbars like the sidebar and hamburger navbar, have styling issues with the mega menu. The mega menu is designed according to the full width of the screen, which leads to not look good mega menu when opened in a limited-spaced navbar. Fix: This commit adds the style particularly to vertical navbars, such that the styling of the mega menu is proper even in these navbars. Task: 4684074 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The appraisal skills list now scrolls horizontally on mobile, so users can access the justification field and add or remove buttons. This prevents important appraisal skill details and actions from being hidden on smaller screens.
Original PR description
Horizontal scrolling has been disabled on the appraisal skills list. An unwanted side effect of that is that the justification field along with the add and remove buttons are not visible on mobile. This PR re-enables the scrolling and removes some dead css. task-5001344 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#222161
The appraisal skills list now allows horizontal scrolling on mobile devices again. This ensures users can see and use the justification field as well as add and remove controls when completing appraisals on smaller screens.
Original PR description
Horizontal scrolling has been disabled on the appraisal skills list. An unwanted side effect of that is that the justification field along with the add and remove buttons are not visible on mobile. This PR re-enables the scrolling and removes some dead css. task-5001344 Forward-Port-Of: odoo/enterprise#91882
This fix adjusts how mail editor save actions are handled in automated checks, making them wait until saving is actually possible. It helps reduce false runbot failures and improves confidence in mail-related quality checks without changing end-user functionality.
Original PR description
This commit tries to solve runbot issues with mail html fields widget. It seems clicking on the save button manually is not generating a call to the backend. This could be due to the fact the button is not enabled due to the data being invalid. Therefore using the clickSave util could be useful in those situation since waiting that the button becomes enabled. This solution is not 100% sure to fix the issue in all cases but manually disabling the button is creating the issue we can observe in those runbots. There is a good chance it might work. fixes-runbot-231582 fixes-runbot-233049 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adds a safeguard to avoid a rare division-by-zero error during electronic invoice calculations when values round down to zero. It helps keep invoice generation more reliable and protects against possible future edge cases.
Original PR description
[FIX] account_edi_ubl_cii: float comparison safeguard. This fix solves a potential issue where the `delivered_qty * price_unit` is too close to zero making it pass the float comparison check, later we divide against the same product, but this time wrapped in `curency.round` which may round it to zero, resulting in a division by zero error. Whilst I found no functional way to reproduce the issue as the value of price_unit should already be zero when we get here but, the fix is to simply safeguard from potential future changes. Ticket [link](https://www.odoo.com/odoo/project.task/5013588) opw-5013588
Fixed an issue that prevented users from viewing the Options tab on survey questions opened from the Questions and Answers menu. This restores access to question option details and avoids an error that interrupted survey setup or review.
Original PR description
Currently, you cannot view a survey question's option through the 'Questions and Answers' menu.
### Steps to reproduce
* install and open 'survey'
* access all survey questions from the menu 'Questions and Answers' > 'Questions'
* open any question and try to view the 'Options' tab
You will be met with the following traceback:
```
EvalError: Can not evaluate python expression: ({'referenceValue': parent.session\_speed\_rating})
Error: Name 'parent' is not defined
```
### Cause
'parent' here refers to a survey container record and works only inside sub-views of relational fields.
opw-5026204
---
Backport of 89b502614e4b185cf722c733f42f9a646aaed564Saving a product in Point of Sale without making changes no longer alters how its name appears. This prevents internal reference codes from being added to product names in the PoS interface and customer receipts.
Original PR description
Before this commit, editing a product in the PoS (even without making changes) would update the product name in the UI. The internal reference was automatically prefixed to the product name, and this formatting persisted through to the receipt. With this commit, saving a product without modifications will no longer alter the product name displayed in the PoS. Steps to reproduce: 1. Open any PoS 2. Choose any product 3. Click the (i) icon to view the product information 4. Click Edit (no need to change anything) 5. Click Save opw-5073848 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website settings now check domain values before saving, so malformed entries no longer trigger a system error. Users receive a clear validation message instead, reducing confusion and preventing failed configuration changes.
Original PR description
Currently, an error occurs when user tries to save an invalid domain. Steps to replicate: - Install `website_sale`. - Go to `Settings > Website`. - In the domain field, give value as `[`. (any normal URL with a square bracket will also work). - Save and error will occur. Error: `ValueError: Invalid IPv6 URL` Cause: - The error happens because `config.get_base_url()` returns a malformed URL (like containing stray `[`), which makes urljoin [1] raise the error. Solution: - The solution prevents error by adding a constraint and raising a user-friendly `ValidationError` if the URL is invalid. [1]: https://github.com/odoo/odoo/blob/77398aefc291d33264b039e38681f0cd8f65483f/addons/website_sale/models/res_config_settings.py#L135 sentry-6805151048 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Miscellaneous changes
Description of the issue/feature this PR addresses: In the POS, when selecting events with limited number of seats, It displays "10 gauche" in french which is a mistake. it should display "places restantes" instead of "gauche" since we are talking about a direction (left, right).. Current behavior before PR: The translation is incorrect in pos_event. Desired behavior after PR is merged: Fix the the translation by displaying "places restantes" instead of "gauche" --- I confi
Original PR description
Description of the issue/feature this PR addresses: In the POS, when selecting events with limited number of seats, It displays "10 gauche" in french which is a mistake. it should display "places restantes" instead of "gauche" since we are talking about a direction (left, right).. Current behavior before PR: The translation is incorrect in pos_event. Desired behavior after PR is merged: Fix the the translation by displaying "places restantes" instead of "gauche" --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
8 changes
Resolved issues and error corrections
Appointments created from the backend now automatically use the default location set on the appointment type when no specific location is entered. This keeps backend-created appointments consistent with website bookings and ensures confirmation emails include the expected location details.
Original PR description
Issue: - There is a difference in appointment booked from website and from backend for location field. - Location field is present in `appointment.type` and in `calendar.event` model. - When booking…
Issue: - There is a difference in appointment booked from website and from backend for location field. - Location field is present in `appointment.type` and in `calendar.event` model. - When booking from website, location field is filled from `appointment.type`, https://github.com/odoo/enterprise/blob/f770ea9ff9b56954d8f23bf151b31ca89568969b/appointment/controllers/appointment.py#L806 https://github.com/odoo/enterprise/blob/f770ea9ff9b56954d8f23bf151b31ca89568969b/appointment/models/appointment_type.py#L986-L988 while in case of backend, location field only considers field from `calendar.event`. - In this case, when the mail is sent on event creation, location is not added in mail. Step to reproduce: - Install `website_appointment`. - Book an appointment for "dental care" (demo data). - Open the appointment from backend, check in mail, location info is present in mail. - Create an appointment from backend, keep location field empty. - Notice, location info is not in mail sent. Fix: - Pre-populate location field from `appointment.type`. opw-5062535
Text highlighting added to eLearning articles now displays consistently in both the normal view and fullscreen slide player. This fixes a visual mismatch that could make course content look incomplete or less polished for learners.
Original PR description
**Steps to reproduce:** - Go to eLearning course on the website - Edit an article - Add the highlighting effect on the text - Save the changes - The text is properly displayed in normal article - Go to the fullscreen version - The highlighting is not present in this version **Issue:** This is an ordering issue caused by the dynamic rendering of fullscreen slides. When in normal mode, the content is initialized and then the `TextHighlight` widget is started. But the rendering of the slides in fullscreen mode is delayed and occurs after the widget is applied. **Fix:** Recreate and restart the widget on `_renderSlide` in the `slides_course_fullscreen_player`` opw-4978798 related: https://github.com/odoo/odoo/commit/f64c9f27f1a9106bc009ad2f696845f2c5c58066 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Correcting translated code in the swedish translation of base. Removes js errors if Swedish is used.
Original PR description
Correcting translated code in the swedish translation of base. Removes js errors if Swedish is used.
The app name translation no correct
Original PR description
The app name translation no correct
This fix stops Odoo from recreating the default admin employee record during updates when a company has already removed or replaced it. It helps keep HR configurations aligned with each client's own workflow and avoids unwanted default data returning after upgrades.
Original PR description
The `employee_admin` is a default admin option. Later when clients set up their work flow they set up their own admin employee. This record is not present, and it doesn't make sense recreate it with every update. 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#228117
Code cleanup and technical improvements
This change reorganizes how product revaluation information is prepared in inventory accounting. It makes the process easier for custom add-ons to adapt without changing the standard behavior for users.
Original PR description
This allows to make it hookable by custom addons This was split from https://github.com/odoo/odoo/pull/160527 cc @pfertyk @sys-odoo @Whenrow --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Miscellaneous changes
This term is hard coded on a JS method. Our client wants to change its meaning, thus I am creating this pr to add it.
Original PR description
This term is hard coded on a JS method. Our client wants to change its meaning, thus I am creating this pr to add it.
Description of the issue/feature this PR addresses: ir.module.module,description:base.module_website_sale_stock tr localization Current behavior before PR: the expressions are written in English Desired behavior after PR is merged: Giving the expressions for the ir.module.module,description:base.module_website_sale_stock model in Turkish I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)
Original PR description
Description of the issue/feature this PR addresses: ir.module.module,description:base.module_website_sale_stock tr localization Current behavior before PR: the expressions are written in English Desired behavior after PR is merged: Giving the expressions for the ir.module.module,description:base.module_website_sale_stock model in Turkish I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)