Thursday, February 26, 2026
40 changes · saas-19.2
New functionality added to Odoo
This update integrates the new 'pos_edi_ubl' and 'l10n_jo_edi_pos' modules into Odoo's Weblate localization platform. This ensures that the translations for these modules can be managed and updated efficiently, supporting international expansion and compliance requirements.
Original PR description
This commit adds the new modules of pos_edi_ubl and l10n_jo_edi_pos to weblate. Forward-Port-Of: odoo/odoo#250727 Forward-Port-Of: odoo/odoo#250324
Resolved issues and error corrections
This update resolves an issue where an unnecessary 'add inputs' button was appearing on Swiss payroll payslips. This change ensures a cleaner and more user-friendly experience for users in Switzerland, aligning the payroll interface with Swiss regulations. The fix was triggered by recent updates to the Swiss localization.
Original PR description
don't show add inputs button on payslips on the swiss localization. Forward-Port-Of: odoo/enterprise#107962 Forward-Port-Of: odoo/enterprise#107958
Features or functions removed from Odoo
This update removes unnecessary call buttons from the AI-powered live chat feature. This simplifies the user interface and improves the overall experience for users interacting with the AI agent. The change addresses a minor usability issue.
Original PR description
This commit will remove call buttons in livechat with ai agent. Task-5932845 Forward-Port-Of: odoo/enterprise#108444
Code cleanup and technical improvements
This update enhances website builders by automatically suggesting existing website pages and anchors when users select URLs. The change replaces an older system with a new, more efficient component, providing a better user experience for creating website content.
Original PR description
When website is installed, all URL pickers should suggest existing website pages and anchors. Before this commit, the `WebsiteUrlPicker` used `autocompleteWithPages` to suggest internal links. This…
When website is installed, all URL pickers should suggest existing
website pages and anchors.
Before this commit, the `WebsiteUrlPicker` used `autocompleteWithPages`
to suggest internal links.
This commit removes the usage of `autocompleteWithPages` and
replace `WebsiteUrlPicker` with `BuilderUrlPicker` with an Autocomplete
component completely to provide internal link and anchor
suggestions.
Key Changes:
- Introduce `AutoCompleteBuilderUrlPicker` component extending the base
`AutoComplete` component.
- Patch BuilderUrlPicker to:
- Replace its input with AutoCompleteBuilderUrlPicker.
- Provide a `sources` getter delegating suggestions to
loadOptionsSource.
- Handle selection vs input through `isOptionSelected`.
- Extract and reuse loadOptionsSource in website utils.
- Move `loadOptionsSource` to utils.
- Add `title` prop and `isOptionSelected` flag to AutoComplete to
properly differentiate selection vs input.
Enterprise PR: [106706](https://github.com/odoo/enterprise/pull/106706)
task-5260613
Forward-Port-Of: odoo/odoo#250359
Forward-Port-Of: odoo/odoo#226324This update fixes an issue where the documentation index wasn't correctly reflecting the latest changes. Previously, the system was caching outdated documentation, leading to potential inconsistencies. Now, the index is rebuilt dynamically when the 'disable cache' option is enabled, ensuring users always have access to the most current documentation.
Original PR description
Access /doc/index.json with the "disable cache" checkbox from the devtools checked. To index is generated again (emitting warnings in the logs may some docstrings be broken) but it still uses the attachment that was cached by the server. It should not use the server attachment. Reference-to: c67f64d7025c ([FIX] api_doc: respect no-cache directive on index) 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#249591 Forward-Port-Of: odoo/odoo#249504
This update resolves an issue where the website builder's sidebar incorrectly switched to a 'block' tab when using the translate mode, triggered by hiding and showing sections. The fix ensures the 'customize' tab remains active, providing a smoother and more consistent experience for users managing website translations.
Original PR description
With commit 3a80ac79c5b0193911e8ddab442660b315562639, the builder option plugin is not a custom one in translate. And the builder option plugin automatically switches to a fallback tab (instead of customize tab) when containers are de-activated. This happens when the user hides an invisible element. This commit fixes it by skipping swithing to fallback tab if the builder is in translation mode. Steps to reproduce: - Open website builder - Drop a section - Make it invisible on desktop - Add a language to the website - Open builder in translate mode - Click on the eye of invisible elements to show the invisible section - Click again to hide it - Bug: the sidebar left the "customize" tab and switched to "block" tab task-5475107 Forward-Port-Of: odoo/odoo#242618
This update resolves a technical issue that could cause Odoo Enterprise to crash when Avatax company credentials are unavailable. The fix prevents a crash by handling the situation gracefully within the Avatax integration process, ensuring stability and continued functionality.
Original PR description
When `_find_avatax_credentials_company` returns `None`, `_get_avatax_service_params` crashes accessing `.avalara_commit` on it. `_find_avatax_credentials_company` should probably return an empty `res.company` recordset when it cannot find a company, but for stability reasons we won't change the return value and instead fix it locally in `_get_avatax_service_params`. opw-5939708 Forward-Port-Of: odoo/enterprise#108192
This update fixes an issue where sales order statuses were displayed in an incorrect alphabetical order within the Kanban view. The change ensures that statuses like 'Cancelled', 'Quotation', 'Sale Order', and 'Quotation Sent' appear in the logical order expected by users. This improves the clarity and usability of the sales order management process.
Original PR description
Steps to produce: --- - Install sales module. - Open sales module > orders > switch to kanban view. - Then make it group by status. Observation: --- - The order of status is not proper. - It comes as…
Steps to produce: --- - Install sales module. - Open sales module > orders > switch to kanban view. - Then make it group by status. Observation: --- - The order of status is not proper. - It comes as Cancelled, Quatation, Sale order, Quatation sent. Root cause: --- - When we perform Group By > Status, the method `web_read_group()` is executed. then in chain `_web_read_group()` calls `read_group()` without providing any explicit `orderby`. Inside `read_group()`, if orderby is not provided, it sets the order to the grouped field itself. - Inside `_read_group()`, the SQL query constructed with an order by clause on the grouped field (state). Therefore, the values are retrieved in alphabetical order as `cancel, draft, sale, sent`. Solution: --- - Define `group_expand` on the `state` field. During `read_group()`, `_read_group_fill_results()` calls this method and reorders the groups accordingly. - This overrides the alphabetical SQL order returned by `_read_group()` and ensures the correct logical status order in Kanban view. opw-5497664 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248776
This update corrects a formatting issue in the Eco Voucher export file, ensuring it aligns with the specific requirements of the Monizze system. This resolves a potential compatibility problem that could have prevented accurate data transfer for tax reporting. The change ensures seamless integration with our financial reporting partner.
Original PR description
This commit realigns the xlsx header with what's expected by Monizze for the eco voucher export. Forward-Port-Of: odoo/enterprise#108668
This update corrects a problem where payment reference data from a specific data source (Codabox) was incorrectly formatted, often with extra spaces. The change automatically removes these spaces before processing, ensuring accurate record creation and preventing potential data errors. This improves the reliability of bank statement imports.
Original PR description
Before this commit, when we do the creation of the automatic reco models, it was possible that the payment ref ended with a lot of empty spaces. To avoid that, we now strip the payment ref before the creation of the reco model. Data coming from codabox where wrongly formatted since the payment ref could have space at the end or the start and even in the middle. By using a split join we solve that issue. task-5926548 Forward-Port-Of: odoo/enterprise#107421
This update resolves an issue where the location selector would unexpectedly gain focus when no location was initially selected. This improvement ensures a smoother and more intuitive user experience for users managing deliveries within Odoo.
Original PR description
Forward-Port-Of: odoo/odoo#250680
This update fixes a previous issue where searching for archived accounts didn't display their associated journal entries. Now, users can view all journal items, regardless of whether an account is archived, providing a more complete financial overview. This improves reporting accuracy and simplifies account management.
Original PR description
This commit makes it possible to see the journal items for archived account when searching for the account. Previously, when searching for an account that is archived, its journal items weren't shown. task-5905559 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250420 Forward-Port-Of: odoo/odoo#249422
This update resolves a technical issue that caused a 'Singleton Error' when users configured multiple 'Buy' or 'Manufacture' routes for their products. The fix ensures that only one default route is selected, preventing errors during the replenishment process. This improves product availability and stability.
Original PR description
Followup to previous fix: 705e27a2d3d9e3c4d075a1e8fb599333a504a316 If the user configured his database with more than one Buy or Manufacture route, the `_get_route_domain` would trigger a Singleton…
Followup to previous fix: 705e27a2d3d9e3c4d075a1e8fb599333a504a316
If the user configured his database with more than one Buy or Manufacture route, the `_get_route_domain` would trigger a Singleton Error.
# Steps to Reproduce:
- Create new Manufacture Route:
- Create new Warehouse W2
- Create new 'Manufacture 2' route (no rule yet)
- Go to the 'Manufacture' route
- Select the new rule for W2, expand popup
- Update the route to 'Manufacture 2'
- Create new Product P
- Storable
- Create Basic BoM
- Product form -> Actions wheel -> Replenish => Singleton Error
OPW-5960493
---
## Configuration
<img width="1844" height="628" alt="image" src="https://github.com/user-attachments/assets/b90c070c-4af5-427c-bd3d-79904a7881a0" />
## Traceback
```
RPC_ERROR
Odoo Server Error
Occured on 102180409-19-0-design-theme.runbot119.odoo.com on model product.replenish on 2026-02-25 08:12:03 GMT
Traceback (most recent call last):
File "/data/build/odoo/odoo/http.py", line 2273, in _serve_db
return service_model.retrying(serve_func, env=self.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/service/model.py", line 185, in retrying
result = func()
^^^^^^
File "/data/build/odoo/odoo/http.py", line 2328, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/http.py", line 2543, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_http.py", line 355, in _dispatch
result = endpoint(**request.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/http.py", line 788, in route_wrapper
result = endpoint(self, *args, **params_ok)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/web/controllers/dataset.py", line 32, in call_kw
return call_kw(request.env[model], method, args, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/service/model.py", line 94, in call_kw
result = method(recs, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/web/models/models.py", line 1964, in onchange
defaults = self.default_get(missing_names)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/purchase_stock/wizard/product_replenish.py", line 12, in default_get
res = super().default_get(fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/stock/wizard/product_replenish.py", line 77, in default_get
res['route_id'] = self.env['stock.route'].search(self._get_route_domain(product_tmpl_id), limit=1).id
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/purchase_stock/wizard/product_replenish.py", line 92, in _get_route_domain
domain = super()._get_route_domain(product_tmpl_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/addons/mrp/wizard/product_replenish.py", line 51, in _get_route_domain
domain = Domain.OR([domain, Domain('id', '=', manufacture_route.id)])
^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/orm/fields_misc.py", line 114, in __get__
raise ValueError("Expected singleton: %s" % record)
ValueError: Expected singleton: stock.route(6, 20)
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#250580This update corrects a display issue where the tooltip icon in the HTML Builder wasn't correctly mirrored for right-to-left languages (RTL). The fix ensures that the icon appears correctly regardless of the user's language setting, improving the builder's usability for international users. This resolves a previous bug introduced during a recent update.
Original PR description
Among other things, commit [0aba7f3] added a `?` icon on builder options with a tooltip. However: - since [94e17fd], the key `state.tooltip` was removed from the BuilderRow component (to use `props.tooltip` directly), but the XML wasn't properly adapted in 19.0. - the icon isn't mirrored in RTL languages. This commit fixes both issues. [0aba7f3]: https://github.com/odoo/odoo/commit/0aba7f383c86dec00e9fc6d324a5bfdec7a19707 [94e17fd]: https://github.com/odoo/odoo/commit/94e17fd9845486a959f2544e1b26199abc96a56a task-5109547 Forward-Port-Of: odoo/odoo#250232 Forward-Port-Of: odoo/odoo#244024
This update fixes an issue where the FAIA report incorrectly classified partners as suppliers instead of customers, particularly when credit notes were involved. The change allows a partner to be recognized as both a customer and supplier, ensuring accurate reporting of balances and improving the reliability of the SAFT report.
Original PR description
1. Create a contact (with minimal details). 2. Create a customer invoice for that contact **last month** with `quantity = 300`. 3. Create a credit note for that invoice **this month**. 4. Create…
1. Create a contact (with minimal details). 2. Create a customer invoice for that contact **last month** with `quantity = 300`. 3. Create a credit note for that invoice **this month**. 4. Create another customer invoice for the same contact **this month** with `quantity = 100`. In the FAIA report (XML), within the General Ledger section, the partner is incorrectly classified as a supplier instead of a customer. In the method _saft_fill_report_partner_ledger_values from account_saft, he partner type is determined based on whether the balance is negative. However, a negative balance can result from a credit note, where the partner is still a customer and not a supplier. Furthermore, a partner can be both a supplier and a customer. This commit allows a partner to be both a customer and a supplier. If both receivable and payable are 0 we set the partner type to customer to keep the behavior from e9640caf29e967fe7d8c6fe303b5a8d7a866437e opw-5360924 Forward-Port-Of: odoo/enterprise#108197 Forward-Port-Of: odoo/enterprise#100749
This update corrects a minor oversight in the invoice matching process within the Odoo Enterprise accounting module. The tolerance setting for matching invoices was unintentionally left unchanged after a previous update, leading to potential inaccuracies. This fix ensures accurate reconciliation of bank statements and invoices.
Original PR description
During this commit:https://github.com/odoo/enterprise/commit/15d26e62f14bb0224712a1712b47ebe16c3b8702 we forgot to change one part of the hardcoded tolerance. task-5952881 Forward-Port-Of: odoo/enterprise#108377 Forward-Port-Of: odoo/enterprise#108112
This update resolves an issue where duplicate receipts were appearing on point of sale tickets. The problem stemmed from a system error triggered by a specific user interaction, leading to unnecessary receipt confirmations. This fix ensures accurate receipt generation for customers.
Original PR description
This PR fixes two same worldline receipts appearing on the point of sale ticket Reproduced by blocking the action url in browser but not the event one. Websocket fallback action is sent and the confirmation is sent both to the longpolling and websocket, resulting in _setCardAndReceipt method being called twice. Forward-Port-Of: odoo/enterprise#108570
This change addresses a technical issue where a syntax error during UI view rendering could cause a crash. The fix ensures that a 'None' value is assigned before an error occurs, preventing the 'UnboundLocalError'. This improves the stability of the user interface.
Original PR description
When syntax error will raise ``node`` will not assign. So, assign ``None`` before error will surpess. Note:- found it during testing. ``` Traceback (most recent call last): File…
When syntax error will raise ``node`` will not assign. So, assign ``None`` before error will surpess.
Note:- found it during testing.
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/19.0/odoo/http.py", line 2273, in _serve_db
return service_model.retrying(serve_func, env=self.env)
File "/home/odoo/src/odoo/19.0/odoo/service/model.py", line 185, in retrying
result = func()
File "/home/odoo/src/odoo/19.0/odoo/http.py", line 2328, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/src/odoo/19.0/odoo/http.py", line 2543, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/src/odoo/19.0/odoo/addons/base/models/ir_http.py", line 355, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/19.0/odoo/http.py", line 788, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/odoo/19.0/addons/web/controllers/dataset.py", line 32, in call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/odoo/src/odoo/19.0/odoo/service/model.py", line 94, in call_kw
result = method(recs, *args, **kwargs)
File "/home/odoo/src/odoo/19.0/addons/web/models/models.py", line 113, in web_read
values_list: list[dict] = self.read(fields_to_read, load=None)
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 3490, in read
return self._read_format(fnames=fields, load=load)
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 3747, in _read_format
vals[name] = convert(record[name], record, use_display_name)
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 6686, in __getitem__
return self._fields[key].__get__(self)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 1746, in __get__
self.compute_value(recs)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 1917, in compute_value
records._compute_field_value(self)
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 4952, in _compute_field_value
determine(field.compute, self)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 81, in determine
return needle(*args)
File "/home/odoo/src/odoo/19.0/odoo/addons/base/models/ir_ui_view.py", line 366, in _compute_invalid_locators
if invalid_locator := assess_locator(source, spec):
File "/home/odoo/src/odoo/19.0/odoo/addons/base/models/ir_ui_view.py", line 330, in assess_locator
if node is None:
UnboundLocalError: local variable 'node' referenced before assignment
```
opw-5956964
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#250589This update fixes a technical issue that was disrupting automated payment flows within Odoo. The previous version was encountering errors due to uncertain data, which has now been addressed by simply removing the problematic information. This ensures smooth and reliable processing of incoming payments.
Original PR description
The last iteration[^1] was preventing automated flows from running smoothly because it was raising an error. Instead, we now just remove the unsure data. [^1]: 1794fce234735ed174599891435d4e2accc1632 Forward-Port-Of: odoo/odoo#250941
This update resolves an issue where certain Intrastat codes (99450000, 99500000, 99600000 & 99700000) were incorrectly marked as expired. The fix ensures these codes remain active, aligning with official Belgian regulations outlined in the Intrastat manual, preventing potential reporting discrepancies.
Original PR description
99450000, 99500000, 99600000 & 99700000 were erroneously expired. They are still active : https://www.nbb.be/doc/dd/onegate/data/intrastat_manual_basis_en.pdf page 13 Forward-Port-Of: odoo/enterprise#108451
This update resolves an issue where users could trigger a type error when creating custom domain filters in the sale order list. The fix ensures that the system correctly handles cases where a field name is missing, preventing the error and allowing users to create filters as intended. This improves the usability of the sales order filtering feature.
Original PR description
Currently, an error occurs when user tries to validate a domain with no field name. Steps to install: - Install `sale_management` > Open sale order list view > Turn on debug mode. - Click on search…
Currently, an error occurs when user tries to validate a domain with no field name.
Steps to install:
- Install `sale_management` > Open sale order list view > Turn on debug mode.
- Click on search bar > Custom filter > Click on field and remove its field name written below the list of fields.
- Click validate.
Error:
```
TypeError: Empty field name in condition ('', '=', 1)
```
Cause:
- As the field name was emptied by the user the [line] will raise a TypeError during the domain validation.
- Till `19.0` any error during domain validation was handled through [here] which was later changed to handle only ValueErrors through this [commit].
Solution:
- Handled TypeErrors during domain validation.
[line]: https://github.com/odoo/odoo/blob/260b9c0417ed2278429fcdd7f50d61786d4e9beb/odoo/orm/domains.py#L841
[here]: https://github.com/odoo/odoo/blob/a220fb71c036c93fa1e75d4d37127e5eda0118f9/addons/web/controllers/domain.py#L34
[commit]: https://github.com/odoo/odoo/commit/a1434c32e9f4dd226d512677fd96e3051b908d8b#diff-e5da86414a8020b2843fb359453238e4977027d30f73f1fa792ca63ddd8fa2a7L34-R23
sentry-7278978488
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#249993This update fixes a bug in the Point of Sale (POS) system where a product with a unique serial number would cause an error when the ‘Lot/Serial number(s) required’ dialog was discarded. The fix prevents further actions from being taken after discarding this dialog, ensuring a smoother POS experience for users.
Original PR description
Steps to reproduce: = - Configure a product with `Tracking`=`By Unique Serial Number` - Open POS and click on the configured product. - The “Lot/Serial number(s) required” dialog opens. - Click `Discard`. Issue: = - The following error occurs: `TypeError: Cannot read properties of undefined (reading 'modifiedPackLotLines')` Fix: = - Stop further steps to add the product when the lot/serial number dialog is discarded. Reference: = - https://github.com/odoo/odoo/pull/238635/files#diff-9e8905c1e88dc96f9145acda2c6a165fb14a58e0d2cfb5b3b6049411918ba27dL913-L914 task-5505855 related pr: https://github.com/odoo/enterprise/pull/108263 Forward-Port-Of: odoo/odoo#245165
This update fixes a confusing error message users received when generating leads without sufficient credits. Instead of a generic message, the system now correctly indicates when credits are unavailable, providing a clearer experience for users. This ensures a smoother process for lead generation activities.
Original PR description
Before this commit, when the user uses CRM to generate new leads and does not have credits, the error message they would get is "Your request did not return any result (no credits were used). Try removing some filters." This commit fixes this in _perform_request by instead of expecting InsufficientCreditError raised it now expects the credit_error flag to be set. task-5925047 Forward-Port-Of: odoo/odoo#250433
This update corrects a technical issue preventing invoices sent via Peppol from passing validation. The system was incorrectly using 'UNSPSC' instead of the required 'TST' code for the commodity classification. This change ensures compliance with Peppol standards and allows invoices to be successfully processed.
Original PR description
**Steps to reproduce:** * Install the **product_unspsc** module. * Create a product with a **UNSPSC category**. * Create and post an invoice for this product. * Send the invoice via **Peppol**.…
**Steps to reproduce:** * Install the **product_unspsc** module. * Create a product with a **UNSPSC category**. * Create and post an invoice for this product. * Send the invoice via **Peppol**. **Observed behavior:** * Peppol validation fails with error **[BR-CL-13]**: *“Item classification identifier identification scheme identifier MUST be coded using one of the UNTDID 7143 list.”* * The XML uses `listID='UNSPSC'` in `cbc:ItemClassificationCode`. **Cause:** * The `listID` attribute was set to the literal string **'UNSPSC'**. * According to the **UNCL7143** code list, the correct scheme identifier for UNSPSC is **'TST'**, not 'UNSPSC'. **Fix:** * Replace `listID='UNSPSC'` with `listID='TST'` when generating the commodity classification node. * Update and extend tests to validate the correct scheme identifier. * Same for CPV code from the documentation i's code is also changed to 'STI'. ref: https://docs.peppol.eu/poacc/billing/3.0/codelist/UNCL7143/ opw-5948723 Forward-Port-Of: odoo/odoo#249788
This update resolves intermittent test failures related to image loading on the website. By proactively fetching and caching images, the test suite now completes much faster – reducing the time from 26.7 seconds to 15.4 seconds. This improves the stability and reliability of our website tests.
Original PR description
Background option tests were failing in nightly builds sometimes because of the network hang. This commit aims to fix the errors by prefetching the images and caching them. Here's the `background_option` test suite and the total time it took to finish with a throttled network (fast 4G) before and after the commit, respectively. | Before commit | With commit | |--------|--------| |<img width="610" height="224" alt="image" src="https://github.com/user-attachments/assets/a98fb1fe-27a1-4f73-901f-7d7ade8ecd86" />|<img width="610" height="224" alt="image" src="https://github.com/user-attachments/assets/c9ed0948-8112-4f2b-b843-c887c9302b76" />| | 26.7 (s) | 15.4 (s) | runbot-237641 Forward-Port-Of: odoo/odoo#250578 Forward-Port-Of: odoo/odoo#249074
This update corrects a technical issue where the 'is_company' field wasn't accurately determined in Odoo's localization modules for Brazil and Ecuador. Specifically, it now correctly identifies companies based on their identification type (CNPJ and RUC) and, for other countries, flags a partner as a company if a VAT number is provided. This ensures accurate reporting and compliance.
Original PR description
`is_company` was not correctly computed in some localization modules. This commit adds a compute method for: - l10n_br*: Company if identification type is CNPJ - l10n_ec*: Company if identification type is RUC For foreign partners (country ≠ BR/EC), a partner is considered a company if a VAT is provided. Follow-up of: https://github.com/odoo/odoo/pull/211043 Task-5947797 Forward-Port-Of: odoo/odoo#249037
This update corrects a bug in Odoo's localization modules (l10n_br and l10n_ec) that incorrectly identified companies. Now, the system accurately determines if a partner is a company based on their identification type (CNPJ or RUC) in Brazil and Ecuador. For other countries, a partner is considered a company if a VAT is provided.
Original PR description
`is_company` was not correctly computed in some localization modules. This commit adds a compute method for: - l10n_br*: Company if identification type is CNPJ - l10n_ec*: Company if identification type is RUC For foreign partners (country ≠ BR/EC), a partner is considered a company if a VAT is provided. Follow-up of: https://github.com/odoo/enterprise/pull/86089 Task-5947797 Forward-Port-Of: odoo/enterprise#107674
This update corrects a bug in the website's image carousel that prevented correct navigation in right-to-left languages like Arabic. By adding a specific HTML attribute, the carousel now correctly displays the next and previous images when using the arrow keys, ensuring a consistent user experience regardless of the website's language setting.
Original PR description
Some libraries expect to find the language direction on the HTML element (e.g. Bootstrap). As we didn't set it, there were some issues. For instance on the website: - set the website language to some RTL language (e.g. Arabic) - drop an image gallery snippet and save - navigate with the keyboard to the carousel and start using the arrows to switch images => Pressing left should show the _next_ image, and pressing right should show the _previous_ image (contrary to LTR languages). This is illustrated by the image indicators at the bottom of the carousel (the 1st image is on the right, the last image on the left). But without `dir="rtl"` on the HTML element, the arrows keep their LTR behavior: pressing left goes to the previous image, and right to the next image. task-5109547 Forward-Port-Of: odoo/odoo#250668 Forward-Port-Of: odoo/odoo#240611
This update fixes an issue where the payroll update process would fail when a common working schedule was deleted. The fix ensures that payroll data continues to update correctly, even after a schedule is removed, preventing data inconsistencies. This impacts all supported countries.
Original PR description
*:ae,au,bd,be,ch,eg,id,jo,ke,lt,lu,ma,my,nl,pk,pl,ro,sk,tr,us When the ``Standard 40 hours/week`` working schedule is deleted and the ``Payroll: Update data`` cron runs, a traceback is raised. For…
*:ae,au,bd,be,ch,eg,id,jo,ke,lt,lu,ma,my,nl,pk,pl,ro,sk,tr,us
When the ``Standard 40 hours/week`` working schedule is deleted
and the ``Payroll: Update data`` cron runs, a traceback is raised.
For ``l10n_us_hr_payroll`` module
Steps to reproduce the error:
- Install ``l10n_us_hr_payroll`` module with demo data
- Go to Employees > Configuration > Settings > Change Company Working Hours
- Go to Working Schedules > Delete ``Standard 40 hours/week`` working schedule
- Run the ``Payroll: Update data`` cron
Traceback:
```py
ValueError: External ID not found in the system: resource.resource_calendar_std
ParseError: while parsing /home/odoo/src/enterprise/l10n_us_hr_payroll/data/hr_payroll_structure_type_data.xml:3, somewhere inside <record id="structure_type_employee_us" model="hr.payroll.structure.type">
<field name="name">United States: Employee</field>
<field name="default_resource_calendar_id" ref="resource.resource_calendar_std"/>
<field name="country_id" ref="base.us"/>
</record>
```
The ``Payroll: Update data`` cron updates payroll data that references
the ``Standard 40 hours/week`` working schedule.
If the user has deleted this working schedule, the external ID no longer exists,
leading to the above traceback.
sentry-7166574553
Forward-Port-Of: odoo/enterprise#108730
Forward-Port-Of: odoo/enterprise#106950A small typo in the code processing messages from Mercado Pago was causing errors and preventing successful payments. This update corrects the typo, ensuring Mercado Pago payments are now processed correctly. This resolves a technical issue impacting payment functionality.
Original PR description
On receiving a message from Mercado Pago on the webhook, there was a typo causing a traceback and preventing the payment from being confirmed. This commit corrects the typo. opw-5953884 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250818
This update resolves a visual issue in the Discuss app where a horizontal scrollbar would appear on smaller screens. The fix adjusts how the app's layout adapts to different window sizes, ensuring a consistent and usable experience for all users. This improves the app's responsiveness and usability.
Original PR description
Before this commit, when Odoo browser had a relatively small width but still desktop width, the Discuss app had sometimes an horizontal scrollbar. Steps to reproduce: - Open General with Demo data on…
Before this commit, when Odoo browser had a relatively small width but still desktop width, the Discuss app had sometimes an horizontal scrollbar. Steps to reproduce: - Open General with Demo data on 1080p monitor - have window take slightly below half of screen width => The Discuss app has horizontal scrollbar, from sidebar non-compact, message list, and the member panel all open at once. This horizontal scrollbar comes from the General demo data that has a sub-thread preview from the 1st message. A sub-thread preview has a max-width of 400px, which shouldn't be an issue on itself. However due to parented container not having `min-width: 0`, it didn't want to shrink lower than this max-width. This commit fixes the issue with `o-min-width-0` on the parented container to make sure this can shrink lower than the sub-thread preview's max width of 400px. Task-5956698 Before / After <img width="882" height="635" alt="Screenshot 2026-02-20 at 16 36 14" src="https://github.com/user-attachments/assets/516b66a1-f8d2-4ee9-b62f-6d94dfe98d11" /> <img width="884" height="637" alt="Screenshot 2026-02-20 at 16 37 07" src="https://github.com/user-attachments/assets/987f418c-f7e2-477b-ae9c-6c68d6a21ec5" /> Forward-Port-Of: odoo/odoo#249846
This update resolves an issue where contract signing requests would fail with error messages due to a missing link between the contract and an employee offer. The fix checks if an offer exists before attempting to update the contract, ensuring proper signature validation and preventing redirect errors. This improves the user experience for employees and administrators.
Original PR description
Steps to reproduce: 1- On an employee page, create a new signature request for a document through the gear icon 2- Log in with the employee (ex. Marc Demo) and sign the contract 3- It will be signed but you will still get an <error 404 not found> page as it redirects to an offer that does not exist 4- Log in with the admin again to counter sign the document 5- You will get an error saying contract end date cannot be before contract start date Cause of the bug: We don't have an offer linked to the document we're signing. We can test this with the demo employee_contract.pdf or Employee Termination.pdf. The logic inside the sign() function will try to update the employee's version with fields from the offer which we don't have as it assumes this is a new offer. Fix done: Check if we have an offer linked to this sign request at first, if not return the default behavior that validates the signature. task-5423393 Forward-Port-Of: odoo/enterprise#102934
This update corrects a discrepancy in payslip calculations for employees using the private car daily allowance. The daily amount is now rounded to two decimal places, ensuring the displayed value aligns with the total amount calculated by multiplying quantity and rate on payslips. This improves the accuracy and transparency of payroll reporting.
Original PR description
Round the computed daily private-car salary rule amount to 2 decimals so the displayed per-day value matches Quantity × Amount on payslips. References task-5917569 Forward-Port-Of: odoo/enterprise#108498 Forward-Port-Of: odoo/enterprise#106753
This update resolves an issue where gift card payments on Ecuadorian POS orders were incorrectly flagged as requiring an SRI payment method. The fix automatically applies the SRI payment (code '01') when a POS order has no associated payments, ensuring accurate invoicing and compliance. This prevents errors and improves the user experience for customers using gift cards.
Original PR description
When a POS order has no payment associated (e.g. when the order is fully paid with a gift card), the SRI payment method was not set on the invoice Steps to reproduce: ------------------- * Create a PoS in Ecuador with the l10n_ec_edi_pos module installed * Create a gift card program and some gift cards * Create a PoS order and pay it fully with a gift card and invoice it > Observation: You get an error saying that the SRI payment method is required Why the fix: ------------ When setting the SRI payment method on the invoice, we check if there are more than 1 payment associated with the order, and if not we fallback on the SRI payment with code "01" opw-5432004 Forward-Port-Of: odoo/enterprise#107966
A recent change was causing the 'Publish & Send' button to disappear in the scheduling interface. This fix removes a temporary workaround and directly addresses the root cause by removing the unnecessary condition affecting button visibility. This ensures the 'Publish & Send' button remains visible when scheduling.
Original PR description
## Issue Since commit https://github.com/odoo/enterprise/commit/a0f44c2bdb2, `planning_test_tour_no_email` is failing when trying to click on the (missing) `Publish & Send` button. ## Cause The…
## Issue
Since commit https://github.com/odoo/enterprise/commit/a0f44c2bdb2, `planning_test_tour_no_email` is failing when trying to click on the (missing) `Publish & Send` button.
## Cause
The commits adds the `my_planning_action` attribute to the context when opening the `Schedule by Resource`. This allowed to display the `I Take It!` button when opening an open shift, but it also removed the `Publish & Send` button, as its condition to be invisible consistently contains `context.get('my_planning_action')` [[1](https://github.com/odoo/enterprise/blob/6892fbda8717effdf3eac06eb6783f1c238ce789/planning/views/planning_views.xml#L11), [2](https://github.com/odoo/enterprise/blob/6892fbda8717effdf3eac06eb6783f1c238ce789/planning/views/planning_views.xml#L78-L79), [3](https://github.com/odoo/enterprise/blob/6892fbda8717effdf3eac06eb6783f1c238ce789/planning/views/planning_views.xml#L273-L274)].
## Fix
The objective is to fix the bug from previous commit https://github.com/odoo/enterprise/commit/a0f44c2bdb2 differently. Instead of adding the `my_planning_action` to the context, we remove the conditions on the `I Take It!` button.
runbot-241028
Forward-Port-Of: odoo/enterprise#108333This update resolves a technical issue preventing the account reports annotation tour from functioning correctly. The change adjusts the confirmation button used in the tour to align with recent styling updates, ensuring the tour now triggers as intended. This improves the user experience for accessing and utilizing account reports.
Original PR description
This PR updates the account reports annotation tour to use the correct confirmation button after the dialog styling change, fixing the failing test trigger. community: https://github.com/odoo/odoo/pull/247708 task-5873845
This update resolves an issue where the stock valuation report was displaying inaccurate unit costs due to floating-point precision problems. The fix ensures more reliable calculations, particularly when dealing with small inventory quantities, preventing inflated or negative values. This improves the accuracy of inventory reporting.
Original PR description
Problem: In the `stock.avco.report`, there is a chance for floating point inaccuracies to cause avco unit cost to inflate. This occurs specifically when the remaining quantity is calculated to be a…
Problem: In the `stock.avco.report`, there is a chance for floating point inaccuracies to cause avco unit cost to inflate. This occurs specifically when the remaining quantity is calculated to be a positive number extremely close to 0. There are also issues with negative avco value that are tangential to this error. Solution: We will mirror the iterative logic from `_run_avco`, being sure to account for whether we have moved from negative quantity to positive or vice versa. Also, before calculating avco value as `total_value / total_quantity`, we will ensure `total_quantity` is not a floating point number very close to 0 to avoid unit cost inflation. Steps to replicate (Runbot 19): Have storage locations enabled to make this easier to test 1. Product with tracked inventory, avco perpetual valuation, non-zero cost 2. Set the on hand quantity to -0.3 Units 3. Set the on hand quantity to -0.2 Units 4. Set the on hand quantity to 0 Units (A well-known python quirk, that .1 + .2 = 0.30000000000000004) Go to the stock report and inspect the unit cost history for the product, note 1. The nonsense Unit Cost on the top row 2. The negative Unit Cost on the 2nd row Note to reviewer: I discussed this issue briefly with dafr, who pointed out that there are further adjustments to come with the `_run_avco` method, and several other issues with this report that are not addressed by this PR. However, the problems with this report are affecting a customer so we'd like to push these fixes forward for now. opw-5430300 Forward-Port-Of: odoo/odoo#245141
This update streamlines the process of adding and locating bank accounts within Odoo Enterprise. The changes consolidate how bank accounts are handled across multiple modules, leading to a more consistent and reliable experience for users. This enhancement improves data accuracy and simplifies bank integration for financial transactions.
Original PR description
*: account_invoice_extract,hr_constract_salary,payment_sepa_direct_debit Forward-Port-Of: odoo/enterprise#108238
This update fixes a problem that was preventing accurate payslip calculations for employees with specific salary rules. The issue stemmed from how the system handled temporary input fields, leading to an error. This change ensures payslips are computed correctly regardless of how input fields are initially added or hidden.
Original PR description
**Steps to reproduce** - Have a salary rule - Condition based on: Salary Input - Input on: Employee - On the employee form, click on "Add inputs" in the Payroll tab - Add an input - Enter a value - Click on "Inputs" to fold the section and hide the input - Try to compute a new payslip for this employee, error: `ValueError: invalid literal for int() with base 10: 'separator_1'` **Cause** By default, the separator doesn't have a `value` key, but after the first interaction to hide its elements, it is added to keep track of the folded state (see `_toggleSeparators` in `web`). **Solution** Ensure separators are ignored. opw-5928247 Forward-Port-Of: odoo/enterprise#108731 Forward-Port-Of: odoo/enterprise#107326
This update simplifies the way website URLs are displayed in the AI Live Chat feature. The previous method has been replaced with a new component, `BuilderUrlPicker`, to improve the user experience and maintainability of the website. This change ensures consistent and reliable URL presentation.
Original PR description
This commit replaces the use of `WebsiteUrlPicker with `BuilderUrlPicker` community PR: [226324](https://github.com/odoo/odoo/pull/226324) task-5260613 Forward-Port-Of: odoo/enterprise#108497 Forward-Port-Of: odoo/enterprise#106706