Skip to content

Conversation

@Feyensv
Copy link

@Feyensv Feyensv commented Jan 20, 2026

No description provided.

MaxTheWhale and others added 30 commits January 13, 2026 21:40
Before this commit, if an electronic payment failed (e.g. due to the
payment terminal/IoT box not being reachable) and the user subsequently
tried to cancel the payment from the POS, they would reach a blocked
state. The payment never cancels but it cannot be deleted.

This commit adds a 'Force cancel' button, similar to the 'Force done'
button already present, to allow the user to get unblocked in this
situation.

task-5485237

closes odoo#243475

X-original-commit: af5a744
Signed-off-by: Yaroslav Soroko (yaso) <yaso@odoo.com>
Signed-off-by: Max Whale (mawh) <mawh@odoo.com>
Before this commit, the hint in the call settings was not taking into
account if it was deafen or mute. On top of that the icon in the menu
was showing the deafen icon but with the unmute label. When deafened,
this was redundant with the undeafen button as well since unmute and
undeafen are practically doing the same thing.

Now, when deafen is activated, only the undeafen button is shown in the
call menu and the hint in the call actions is undeafen not unmute.

closes odoo#243252

X-original-commit: 0c7b1ca
Signed-off-by: Kevin Gerard (kege) <kege@odoo.com>
This commit upgrades our PDF/A compliance from 3B to 3A, and fixes a few
issues previously undetected due to the different PyPDF libraries we're
currently supporting that made the previous PDF fails even the 3B
validation.

Improvement 1:

PDFA validators were previously detecting our file as 3B. Hence we
update the metadata content `conformance` to `A`.

Issue 2:

When using `._pypdf` library, we failed the 6.1.2-2 and 6.8-1 rule even
though we have implemented them on the previous version. It seems that
this is caused by the `if SUBMOD...` check only ensuring it's not equal
to `_pypdf2_2` (which makes it trigger for the new `_pypdf`). Hence, we
reclarify the comments and fix the IF check.

Issue 3:

After implementing issue 2, it seems that a traceback occurs everytime
we're using `._pypdf` and calling the pdf write method. This is because
the added characters on the header can't be decoded with `UTF-8`. Hence
we change it to other greater-than-127-bytes characters that can still
be decoded with `UTF-8`. (The actual character used here doesn't matter).

Improvement 4:

To be compliant with the new 3A rules (additional rules not there in 3B
when we first implemented them), we add a minimal mark info dictionary
and document structure on the PDF catalog object (`_root_object`).

task-None

closes odoo#243493

X-original-commit: 34c5fcf
Signed-off-by: Laurent Smet (las) <las@odoo.com>
Signed-off-by: Yosua Nicolaus (yoni) <yoni@odoo.com>
Before this commit:

- When multiple lines were selected within a block, any empty text nodes between
  them would also receive a font wrapper when applying a color.
- As a result, it appeared as though an extra line was being inserted when the
  color was applied.

After this commit:

- Empty text nodes that are not visible and are not zero-width space or
  line-break nodes are now filtered out before the font tag is created.
- This prevents font wrappers from being created around those nodes.

task-5344051

closes odoo#242946

X-original-commit: 8537dbf
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Export HrApplicant model so that it can be used in other modules

Task-[5461729](https://www.odoo.com/odoo/5778/tasks/5461729)
Enterprise PR odoo/enterprise#103402

closes odoo#243514

X-original-commit: d5bd32d
Related: odoo/enterprise#104136
Signed-off-by: Louis Wicket (wil) <wil@odoo.com>
Signed-off-by: Yuchen Huang (yhu) <yhu@odoo.com>
Both Flutterwave and Worldline may respond with plain text rather than
JSON-formatted responses when a Cloudflare outage occurs. This would
lead to a traceback in Odoo when trying to extract the error message
from the request response.

This commit introduces a fallback to the text content of the response
when any provider fails to parse the response as a JSON content.

opw-5403982

closes odoo#243370

X-original-commit: 3a9519c
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
Before this commit, starring a message in a thread without write
access would result in an access error.

This happens because since [1] a message is marked as starred by
writing on the `starred_partner_ids` field of mail.message instead of
the `starred_message_ids` field of res.partner.
This results in an access error when the uses does not have write
access.

This commit fixes the issue by adding a sudo call to the write of
`starred_partner_ids`, which is acceptable because a user should
always be able to star a message they can read.

[1] odoo#219282

task-5481662

closes odoo#243531

X-original-commit: 404b949
Signed-off-by: Giorgio Tocco (gito) <gito@odoo.com>
…ts are applied on child PO

Issue:
In a child company, adding a product from a Purchase Agreement
to a Purchase Order does not apply the associated parent company's purchase taxes

Cause:
In the onchange, taxes were filtered by company:
`taxes_ids = fpos.map_tax(line.product_id.supplier_taxes_id.filtered(lambda tax: tax.company_id == requisition.company_id)).ids`

This filter fails for taxes belonging to the parent company, so they were not applied on the child company purchase order

Steps to reproduce:
- Create a company branch and switch to it
- Enable `Purchase Agreements` in Settings
- Create a product with a Purchase Tax (ex. 15%)
- Create a Purchase Agreement for any vendor with this product
- Create a RFQ for the vendor and add the agreement
- Observe that the tax is not applied

opw-5121243

closes odoo#243539

X-original-commit: 71e918c
Signed-off-by: Lancelot Semal (lase) <lase@odoo.com>
Signed-off-by: Corentin Heinix (cohe) <cohe@odoo.com>
Before this commit:
-------------------------
- In the product form view, when creating new packaging, a pop-up form opens to
  Create a new Unit of Measure (UoM), and if the user tries to assign a barcode
  Within that form, a second pop-up opens instead of assigning the barcode
  directly.
- In the second pop-up, if the user creates the same UoM again, it causes data
  duplication; the same UoM gets created in 'Units and  Packagings' with a
  default quantity of 1 without reference unit. This incorrect behavior leads to
  confusion when selecting the UoM later.

Steps to reproduce:
-------------------------
1. Install the 'sale_stock' module.
2. Enable Units of Measure & Packagings in stock.
3. Create or open any product.
4. Go to the Sales tab.
5. Create new packaging (e.g., Pack of 5), set the quantity and reference unit,
   and try to create a barcode.
6. A second pop-up form opens to again create a new UoM and assign the barcode.
7. It causes data duplication; the same UoM gets created in 'Units and
   Packagings' with a default quantity of 1 without reference unit.

Cause of the issue
-------------------------
When assigning a new barcode to a UoM, the field could not fetch the
corresponding UoM(In uom.uom) record because it did not yet exist in the
database. As a result, the system opened another pop-up to create the same
UoM(In product.uom) again and assign a barcode to it.

After this commit:
-----------------------
- The barcode field is hidden until the UoM is created.
- Once the packaging is saved, users can edit it to assign a barcode to the
  specific UoM of the product.
- This improves the flow by preventing duplicate UoM creation and ensuring a
  clear, single-step process for assigning barcodes to product packaging.

Task ID:5023229

closes odoo#243538

X-original-commit: d96d2fa
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Harshil Patel (hapt) <hapt@odoo.com>
Steps to reproduce:
===================
1- Go to a project task & log any note.
2- Edit & Click the additional "+" and click "Open Full Composer"
3- Click on Save.

-> traceback.

Cause:
======
When entering edit mode, the composer was created without a thread
reference, causing "Cannot read properties of undefined
(`this.props.composer.thread is undefined`)" errors in
`onClickFullComposer`.

Solution:
=========
We shouldn't have "open-full-composer" action in editing messages

opw-5443985

closes odoo#243512

X-original-commit: fc2d623
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
Signed-off-by: Saif Allah Ben Khalil (sben) <sben@odoo.com>
**PROBLEM**
Generated OIOUBL files don't pass schematrons validations.

**STEP TO REPRODUCE**
1. Install the l10n_dk module.
2. Create a dk partner with an adress, and VAT number (DK12345674 for
   example, don't forget to add a street number for the DK Company
   address).
3. Create an invoice for the DK partner, and download the xml.
4. Use this validator https://oioubl.nemhandel.dk/validation (Odoo
   Peppol IAP validator use oioubl version 3.0 which is not the version
   we want to test).

**CAUSE**
We used wrong codelist for schemeID (oiubl3.0 https://oioubl-demo.nemhandel.dk/oioubl/kodelister/ElectronicAddressSchemeCode-3.0.html) instead of the one we should used (oioubl2.1 https://oioubl21.oioubl.dk/Codelists/en/urn_oioubl_scheme_endpointid-1.1.html).

opw-5379474

closes odoo#243545

X-original-commit: d9c1370
Signed-off-by: Léo Gizard (legi) <legi@odoo.com>
Signed-off-by: Wala Gauthier (gawa) <gawa@odoo.com>
In this pr (odoo#206494), we changed the way
downpayment accounts are set. Before, it was set on product categories,
now, it's set on res.settings.

But with this change, and unexpected behavior occurs. In case the downpayment account
is not set in the setting, we try to predict the account to put, but the prediction
is wrong, it's predicting based on the partner, but it should be based on
the db history.

This commit fix that, and brings back the old prediction.

task-5473406

closes odoo#243515

X-original-commit: ea7c82d
Signed-off-by: John Laterre (jol) <jol@odoo.com>
… portal

Steps to reproduce
------------------

The database has two different websites.

A payment provider is enabled for just one of them (website1).

When a sale order is created on the sales app and the customer accesses it in its portal on the website2, he is able to pay with the payment provider which is only enabled on website1.

The problem also occurs when previewing the customer’s portal view.

Why it's happening
------------------

When accessing an order via “/my/orders/<int:order\_id>”, the portal_order_page method calls _get_compatible_providers without passing the website_id. The overriding logic in website_payment then defaults to considering all activated payment methods as compatible, regardless of website restrictions.

As no website_id is provided, the overriding method from the payment_provider extension in website_payment module considers every activated payment methods as compatible.

The Fix
-------

We now add the current website's id to the method if none has been added before.

opw-5172444

closes odoo#243546

X-original-commit: ca40f78
Signed-off-by: Samuel Wertz (sawer) <sawer@odoo.com>
This commit fixes the issue where applications are not matched with
thier count among companies in a multi-company environment.
The domain on company was removed from `_get_similar_applicants_domain`
also same function is now used in `compute_application_count`.

task-5375876

closes odoo#243583

X-original-commit: 6c901f7
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
Since odoo#206619, the fixed test has used a wrong value for `group_public_id`, as
if it's not set, the default is `Internal User`. This change sets it to `None`
to make the channel public.

closes odoo#243581

X-original-commit: d03197d
Signed-off-by: Maryam Kia (maki) <maki@odoo.com>
Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
Before this commit:
- Changing the working schedule the day before a non-refused leave caused the leave to be refused.
- For multi-day leaves, changing the working schedule  before the end, split the leave into two records, both kept in the same state.
- Changing the working schedule while a cancelled leave existed raised an error.

After this commit:
- Changing the working schedule the day before a leave now resets the leave to draft and recomputes its duration.
- For multi-day leaves, changing the working schedule before the end splits the leave into two leaves:
  - the first keeps its original state,
  - the second is set to draft.
- Cancelled leaves are excluded from the working schedule change flow.

task-5420417

closes odoo#243547

X-original-commit: 4105747
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
Signed-off-by: Karim Omrane (kaom) <kaom@odoo.com>
This commit corrects a regression intoduced in [1]: the messaging
menu now subtracts the channels needaction counter from the inbox
counter, rather than adding it

[1] odoo#229751

closes odoo#243593

X-original-commit: 9b41289
Signed-off-by: Giorgio Tocco (gito) <gito@odoo.com>
Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
When a non-admin user (base.group_user) operates in a
multi-company environment with only some companies active
in their context, the `res_company_rule_employee` record
rule blocks access to `company_ids` when trying to read
all assigned companies, causing an Access Error while
trying to change profile picture or preferred lang

closes odoo#243650

X-original-commit: fe15ac7
Signed-off-by: Krzysztof Magusiak (krma) <krma@odoo.com>
When creating an order, if due to some reason the company_id is not set
on the order data, we set it to the company of the POS session's config.

opw-5470175

closes odoo#243652

X-original-commit: 9cb8e4b
Signed-off-by: David Monnom (moda) <moda@odoo.com>
Signed-off-by: Pedram Bi Ria (pebr) <pebr@odoo.com>
Fix issue when saving a branch company sharing the same VAT and
Codice Fiscale as its parent. The proxy user search fails because
`account_edi_proxy_client.user` is looked up in the branch company
instead of the parent one. The same applies when searching the
demo user to remove.

Steps to reproduce:
- Create a company with VAT and Codice Fiscale
- Create a branch company with the same VAT and Codice Fiscale
- Enable IT EDI on the main company
- Select only the branch company and try to save parameters
- Observe error since we will try to create a proxy user on the IAP
server for an already existing company (the parent one).

opw-5391668

closes odoo#243661

X-original-commit: 2a10133
Signed-off-by: Paolo Gatti (pgi) <pgi@odoo.com>
Signed-off-by: Louis Gobert (loug) <loug@odoo.com>
New package odoo.orm was added in PR
odoo#182727
The new package's name must be specified in
``TranslationModuleReader._export_translatable_resources`` to allow the
framework to export its code translations.

closes odoo#243714

X-original-commit: 90cb6d1
Signed-off-by: Krzysztof Magusiak (krma) <krma@odoo.com>
Signed-off-by: Chong Wang (cwg) <cwg@odoo.com>
This commit:
- Add three reference fields to invoice PDF for Chorus Pro compliance:
  Buyer Reference, Contract Reference, and Purchase Order Reference.
  These fields appear in the invoice header when set on the invoice.

task-5410836

closes odoo#243717

X-original-commit: c438a79
Signed-off-by: Florian Gilbert (flg) <flg@odoo.com>
Since the [website builder refactor], when the user is previewing an
option, they can still type text an use shortcuts in the editor in
the page. When the preview is reverted, the state of the editable is
restored to what is was before the start of the preview, thus losing any
edits made by the user while the preview was active.

This commit fixes that issue by reverting the preview as soon as the
user inputs text or starts a shortcut in the editor. This may still
lose some edits from the user if a preview has an async "apply" and the
edits are made in parallel to it. After sureying the existing options,
the ones with async previews are rare usually not hoverable (only
accessible in a dropdown, that take away focus when opened): 2 actions
in `website_sale` using the action `templatePreviewableWebsiteConfig`
in buttons.

Steps to reproduce:
- Open website bulider
- Click in the text of the footer
- Move the pointer to hover a previewable option (like shadows)
- Type text
- Move the pointer to end the preview
- Bug: The typed text is removed

[website builder refactor]: odoo@9fe45e2
task-5374435

X-original-commit: be03273
Part-of: odoo#243656
Signed-off-by: Francois Georis (fge) <fge@odoo.com>
Signed-off-by: Sébastien Blondiau (blse) <blse@odoo.com>
Since the [website builder refactor], all user actions from the builder
that can change the state of the editable revert the preview (if any),
except undo/redo.

Using the shortcuts for undo while a preview is ongoing may lead to
inconsistent state and behavior. Thus with this commit, it reverts any
preview before undo/redo from the builder.

Steps to reproduce:
- Open website bulider
- Click on a column (for example in the footer)
- Change the color in the sidebar
- Move the pointer to hover a previewable option (like shadows)
- Press `ctrl+z` 2 times (to undo the color change)
- Move the pointer to end the preview
- Bug: The color is restored and cannot be undone
    (despite the undo button being enabled)

[website builder refactor]: odoo@9fe45e2
task-5374435

closes odoo#243656

X-original-commit: ff7aa99
Signed-off-by: Francois Georis (fge) <fge@odoo.com>
Signed-off-by: Sébastien Blondiau (blse) <blse@odoo.com>
Before this commit, computing a back link (e.g., finding all pricelist
items for a specific product template) required iterating over the
entire collection of related records for every single record that
accessed the property. In a POS with 1,000 products and 10,000
pricelist items, this resulted in $O(N \times M)$ complexity, causing
noticeable UI lag during initialization or search.

This commit introduces an indexed approach using a reactive effect.
The first time a back link is accessed, an inverted index (Map) is built
for the entire relation. Subsequent accesses by any record instance
become a simple $O(1)$ Map lookup.

opw-5448113

closes odoo#243651

X-original-commit: b697f16
Signed-off-by: David Monnom (moda) <moda@odoo.com>
Signed-off-by: Pedram Bi Ria (pebr) <pebr@odoo.com>
In some rare cases it would seem that some systems construct emails with
attachments reporting '*/*' as the Content-Type.

While trying to parse such content in Odoo, it causes issues with the standard
CPython email library, as no standard handler exists for '*/*' content-types:

Example error:
```
File "/usr/lib/python3.13/email/contentmanager.py", line 25, in get_content
raise KeyError(content_type)
KeyError: '*/*'
```

This is not compliant with valid MIME types defined in RFC2046/section-3,
but in real life scenarios, blocking the processing of an incoming email in Odoo
because of this might be excessive.

While not a perfect solution, we will assume that attachments falsly reported
as '*/*' are to be processed as 'application/octet-stream' content types.
This should cover most use-cases, and if it still fails, we will consider that
it's up to the original email sender to be RFC compliant.

OPW-5425093

closes odoo#243721

X-original-commit: 8f92694
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Joel Rodrigues Vitória (jorv) <jorv@odoo.com>
When a link to the portal is sent from the chatter via message or log note,
the preview of the link triggers that the page was viewed by customer.

As a solution a variable was added to the request headers coming from the
previewer.

opw-5237785

closes odoo#243694

X-original-commit: 8688f5a
Signed-off-by: Lina Eweis (liew) <liew@odoo.com>
Steps to reproduce:
- Install industry Hair Salon
- Settings > Invoicing > Fiscal Localization
- Switch to Jordan fiscal localization

Issue:
Action will fail with error
```
ERROR: update or delete on table "account_journal" violates foreign key constraint "pos_payment_method_journal_id_fkey" on table "pos_payment_method"
DETAIL:  Key (id)=(6) is still referenced from table "pos_payment_method".
```

Analysis:
It occurs because, when switching CoA, the system attempt to delete and
re-create journals. However, the hair salon industry initialize a PoS
configuration that will create a default payment method based on one of
those journal, thus the system will raise a constraint error on delete.
A solution is to manually enforce cascade delete when we are switching
CoA.

opw-5145235

closes odoo#243707

X-original-commit: 1eb2e8a
Signed-off-by: Antoine Dupuis (andu) <andu@odoo.com>
Signed-off-by: Andrea Grazioso (agr) <agr@odoo.com>
Currently, the behavior of the "Maximum closing difference" feature
with employees depends on the user connected in the backend and not
the employee using the pos.

Steps to reproduce:
-------------------
* Set max closing difference as 0
* Have 1 admin user and 1 pos user
* Have 2 employees
* Set admin user and employee 1 as advanced employees of the pos
* Set pos user and employee 2 as basic employees

* Make sure you are logged as the admin in the database
* Open pos (could be a session opened by other user)
* Log in with Admin user
* Try to close the pos with a difference of 10 -> You can, ok
* Log in with employee 1 (advanced)
* Try to close the pos with a difference of 10 -> You ca but shouldn't

* Now log in the database as pos user
* Open pos (could be a session opened by other user
* Log in with employee 1 (advanced)
* Try to close the pos with a difference of 10 -> You cannot, ok
* Log in with Admin user
* Try to close the pos with a difference of 10 -> you cannot but should

Why the fix:
------------
Employees that have no linked user should not ba able to override the
max difference.

Employees who have a connected user should only be able to override
the max difference if their user is admin of the pos.

opw-5184041

closes odoo#241857

X-original-commit: b288a86
Signed-off-by: Sarah Bellefroid (sbel) <sbel@odoo.com>
This commit adds a function to the IndexedDB wrapper which allows
to retrieve all keys of a given table. This will be useful for our
future work on the offline mode, to know what's available in the
cache and disable/enable the UI in offline accordingly.

Part of task~5424765

Part-of: odoo#242494
Related: odoo/enterprise#103491
Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
adsa-odoo and others added 29 commits January 19, 2026 21:53
Current behaviour before commit:

Steps to reproduce:

- Create a m x n table
- Write some text in a cell, apply color on text
- Delete text and keep empty colored element
- Select cell
- Trying to remove format throws infinite loop error
  in removeAllColor

Desired behaviour after commit:

Clicking on remove format button should remove color
from empty colored element without causing traceback.

task-5454993

closes odoo#244260

X-original-commit: 3b51297
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Adnan Saiyed (adsa) <adsa@odoo.com>
Before this commit:
- The POS product info popup displayed only the first tax from `tax_details`,
  which meant multiple applied taxes were not visible.
- The logic fetched a single tax name instead of all tax applied to the product.

After this commit:
- The POS store sends a full list of tax names instead of a single name.
- The popup template displays all tax names, comma-separated.

task-5406826

closes odoo#244453

X-original-commit: 5b738da
Signed-off-by: Stéphane Vanmeerhaeghe (stva) <stva@odoo.com>
Signed-off-by: Meet Jivani (meji) <meji@odoo.com>
Before this commit, when right-clicking on a link in a message body,
this was showing the list of message actions in dropdown.

This is a problem because right-click on link has features like
"Open link" / "Copy link" and so on. They were over-shadowed by the
right-click on message for showing of message actions.

This commit prevent the showing of message actions in dropdown from
right-click in links in message body, so that the browser context
menu is open instead in that scenario, showing features like
"Open link" and "Copy link".

closes odoo#244350

X-original-commit: 7c616ae
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
**Steps to reproduce:**
- Go to the sequence interface, and chose the config #1 for a pos.order
- In the prefix field, enter something with characters that are not numbers
- Go to a PoS with config #1 active and make a purchase
- A traceback appears saying that we can't convert the sequence to an Integer

**Why the fix:**
Having a custom prefix with letters used to work, but in version
19, we now store the sequence_number with the prefix, which can
be composed of characters which can not be stored in an Integer field
such as sequence_number.

To prevent this error, we remove the prefix and the suffix (which
has the same issue) from the sequence_number before storing it.
We then add the prefix and the suffix back when computing the
order's name, so that it's consistant with the prefix and the
suffix the user chose.

This is the way the order's name was computed before version 19.0,
which saw the prefix and suffix disappear from the order's name.

opw-5386575

closes odoo#244366

X-original-commit: 67fc637
Signed-off-by: Adrien Guilliams (adgu) <adgu@odoo.com>
Signed-off-by: Arthur Nanson (artn) <artn@odoo.com>
…ores

Our webservice client (`zeep`) connections lacked a way to use
`certificate.certificate` models to verify the connection with
server identification.
This is rather complicated, since PyOpenSSL only allows
filenames with their default methods.
We now add the feature to pass these certificate records, load them
into memory buffers, and add them to the CA store.

task-5068741

closes odoo#244502

X-original-commit: 06ddce0
Signed-off-by: Antoine Boonen (aboo) <aboo@odoo.com>
Signed-off-by: Paolo Gatti (pgi) <pgi@odoo.com>
Installing the Netherlands localisation creates two Domestic fiscal positions,
both incorrectly configured. This commit removes the empty duplicate fiscal
position and properly defines the NL Domestic fiscal position by setting the
Country Group, leaving Country empty, and disabling VAT requirement.

task-5489829

closes odoo#244503

X-original-commit: e7f6bfb
Signed-off-by: John Laterre (jol) <jol@odoo.com>
…n report

Steps to reproduce:
1. Install the Sale app.
2. Enable developer mode and go to Decimal Accuracy.
3. Set the "Product Price" precision to 3 digits.
4. Create a quotation and print the report.

Issue:
The decimal precision of the unit price is not respected in the report.

Cause:
The unit price field in the report uses the `monetary` widget, which ignores
the Decimal Accuracy configuration and enforces currency precision instead.

Solution:
Remove the `monetary` widget from the unit price field in the report so that
Decimal Accuracy is applied correctly.

opw-5418665

closes odoo#244505

X-original-commit: 59c5edb
Signed-off-by: Khushi Srivastava (khsr) <khsr@odoo.com>
When importing a large file in multiple batches , Odoo incorrectly
displays a "Resume" prompt at the end of the process, even though all
records have been successfully imported.

Steps to reproduce:

1. Create a CSV file with enough records to trigger at least 2 batches
2. Go to any list view and select "Import records".
3. Upload the file and click "Import".
4. Wait for the import to complete.
5. Observe that despite an "X records successfully imported"
   notification, a warning "Click 'Resume' to proceed..." appears.

The issue occurs because the `importRes.nextrow` state variable is
updated during intermediate batches but is not cleared when the final
batch completes.

* In `_executeImportStep`, if `nextrow` is returned (intermediate
  batch), `importRes.nextrow` is updated.
* If `nextrow` is falsy (final batch), the loop is stopped, but
  `importRes.nextrow` retains the value from the previous batch.
* `executeImport` checks `importRes.nextrow` to decide whether to show
  the `"Resume"` message, leading to a false positive caused by the
  stale value.

This commit fixes the issue by explicitly setting `importRes.nextrow` to
`0` in `_executeImportStep` when the server indicates completion
(returns a falsy `nextrow`).

opw-5343837

closes odoo#244506

X-original-commit: 6a17293
Signed-off-by: Luca Vitali (luvi) <luvi@odoo.com>
Signed-off-by: Séna Serge Nshimiyimana (sesn) <sesn@odoo.com>
Issue:
The forecasted inventory view assumed that line.reservation was always a
`stock.picking`. In manufacturing flows, the reservation can be an
`mrp.production`, which caused incorrect navigation to a `stock.picking`
record.

Fix this by comparing both model and id when checking if the reservation
differs from the outgoing document, and by opening the reservation using
its actual model. This ensures the correct document is shown and avoids
duplicate or invalid links in the "Used by" column.

Steps to reproduce:
- Create a v19 db with sale,mrp,sale_stock with `--demo-true`.
- Go to products -> search for 'FURN_0269' product and open form view.
- open forecasted smart button for forecasted reeport.
- check the used by column for mrp reservation
   - i.e,: `WH/MO/00001 - WH/MO/00001` appears twice.
   - clicking on first, opens correct record of `mrp.production` where
     the units is reserved.
   - clicking on the second, navigate to false record of `stock.picking`
     by taking the id of `mrp.produciton` as the reserve is having
     `_name: "mrp.production"`

For UI reference check the PR description for better understanding.

opw-5481220
upg-3804157

closes odoo#244551

X-original-commit: d5a3f98
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
Signed-off-by: Akash Pandey (apan) <apan@odoo.com>
The `test_form_view_embed_thread` ensures that the live chat list
view redirects to the discuss app and that the bus subscription for
the selected channel is properly made. This ensure that a live chat
agent looking at a channel will receive the latest updates for the
conversation.

To ensure the bus subscription is made, the bus service is patched
in order to detect calls to add or remove methods. However, we
only wait for `whenReady` which is not enough to guarantee the
bus is already exposed via `odoo.__WOWL_DEBUG__`.

This PR ensure we wait for the list view to be displayed, which
ensures the webclient is mounted and the debug info is already
set.

runbot-234928

closes odoo#244583

X-original-commit: c49f842
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
…pets

Before this commit:
The product comparison bottom bar had a z-index of only 3 (or 4 when expanded).
This low z-index value caused it to be overlapped by any website snippets using
grid mode with more than 3 items, as grid items conventionally have incremental
z-index values (1, 2, 3, 4, ...) for JavaScript consistency.

The issue was not limited to s_banner_categories but affected all grid-based
snippets, making the comparison bar inaccessible when positioned behind snippet
content.

Solution:
Increase the comparison bar's z-index to -modal (1055 in Bootstrap),
ensuring it always appears above regular page content including grid snippets,
while still remaining below actual modals and dialogs.

After this commit:
The comparison bar consistently appears on top of all snippet content,
ensuring users can always access and interact with product comparisons
regardless of the page layout or snippet configuration.
opw:5426163
Reverting the commit : odoo@0cda08f

closes odoo#244584

X-original-commit: 26eba2c
Signed-off-by: Lina Eweis (liew) <liew@odoo.com>
Signed-off-by: Khushi Ajaykumar (khaj) <khaj@odoo.com>
Description:
Products created from the website frontend were automatically published
even without a category assigned, contradicting the "Unpublished."
placeholder expectation.
The issue had three root causes:
1. JavaScript (new_content.js) forced default_is_published: true
2. XML action context contained website_published: True
3. Both caused products to be published regardless of category
Fixed by:
- Removed default_is_published from JS product creation handler
- Removed website_published from action context
After this PR:
Now products remain unpublished until a category is assigned,
matching the intended UX indicated by the placeholder text.
opw-5408903

closes odoo#244556

X-original-commit: a3b681a
Related: odoo/enterprise#104806
Signed-off-by: Lina Eweis (liew) <liew@odoo.com>
Signed-off-by: Khushi Ajaykumar (khaj) <khaj@odoo.com>
Description of the issue:

- When removing a snippet, the link popover stayed open because its
  `pointerdown` handler didn’t trigger, leaving the popover visible even after
  its selected content element was removed.
- A previous fix used { capture: true } on the document `pointerdown` listener,
  but this also triggered when interacting with the link type `dropdown` and
  color picker, closing the popover triggers `applyCallback` and causing nested
  links to be created.

After this commit:

- Close the link popover from `on_will_remove_handlers` before the target
  element is removed from the DOM.
- This ensures the popover closes when removing the snippet.

task-5359000

closes odoo#244391

X-original-commit: 2e4d38e
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Samit Bharatbhai Bhadiyadra (sbbh) <sbbh@odoo.com>
with this commit:-
 - We are adding support for Ukrainian Tax ID numbers of 8 digits, which was
   12 previously.
 - The following formats are now accepted:
   - National company numbers: 8 digits (e.g., 12345678)
   - European company numbers: 8 digits prefixed with 'UA' (e.g., UA12345678)
   - Individual numbers: 12 or 10 digits (e.g., 123456789012)
 - This change allows users to enter Ukrainian TINs that were previously
   incorrectly rejected due to length restrictions.

task-5414806
opw-5373469

closes odoo#244617

X-original-commit: 05200c9
Signed-off-by: Josse Colpaert (jco) <jco@odoo.com>
Signed-off-by: Deep I Joshi (dijo) <dijo@odoo.com>
Attendance: Officer/Admin without Employee rights (either Officer/Admin) will
not be able to access the Attendances Onboarding menu.

task-5267189

closes odoo#244465

X-original-commit: f808c8e
Signed-off-by: Mélanie Peyrat (mepe) <mepe@odoo.com>
Signed-off-by: Dhruvi Jigneshkumar Shah (djsh) <djsh@odoo.com>
…assertion

This commit fixes a failing assertion in `test_channel_get_livechat_visitor_info`.
The test fails since [*] because the demo data sets the OdooBot time zone to
'Europe/Brussels', while the test was asserting it to be False.
This commit explicitly sets the time zone of the OdooBot partner record and
updates assertions accordingly.

[*] odoo#210094

runbot-237778

closes odoo#244582

X-original-commit: f1e6c64
Signed-off-by: Matthieu Stockbauer (tsm) <tsm@odoo.com>
Signed-off-by: Aryankumar Riteshkumar Mehta (mear) <mear@odoo.com>
Before this commit, the "Copy Message Link" test was
sometimes failing. It happens for two reasons:
- It presses "ctrl+v" with the intent of copying the
message link in the composer but doesn't check if the
composer is focused (it should not be as the test clicks
away to copy the link).
- It then presses "enter" with the intent of posting the
message, without checking if the composer is filled or
even ready to send.

This test replaces the "press" steps:
- "ctrl+v" is replaced by `insertText`: we already check
that the copy works and "press" is less reliable.
- We click on the send button when enabled.

runbot-237538

closes odoo#244621

X-original-commit: f58f273
Signed-off-by: Matthieu Stockbauer (tsm) <tsm@odoo.com>
When we set the foreign currency rate on invoices, it won't be used when exporting the report.

Make sure to use the correct currency rate.

task-5404816

closes odoo#244628

X-original-commit: 64b7975
Related: odoo/enterprise#104860
Signed-off-by: John Laterre (jol) <jol@odoo.com>
When the server stops, pool errors can occur. It's due to the server
stop function calling `sql_db.py@close_all()`. If this occurs before
the dispatcher loop wakes up, the `__exit__` function of the cursor
context manager will raise an error, because the connection has already
been popped from the pool.

As for interface errors in [1], pool errors should be ignored during server
shutodwn.

runbot-229800

[1]: odoo#99849

closes odoo#244637

X-original-commit: 8e2b18a
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
Signed-off-by: Matthieu Stockbauer (tsm) <tsm@odoo.com>
…n test

What is fixed
-------------

The test_payment_provider_visibility_with_portal didn't pass due to a multi company issue.
In demo data, "Demo" payment provider exists for different companies which led the search method to return every one of them. Trying to assign the shop website id to each of them then raises an error as their company_id are inconsistent.

The fix
-------------

We now ensure only one provider is selected and its company is the same as the website's company.

Runbot error : 237822

closes odoo#244627

X-original-commit: f46abe5
Signed-off-by: Samuel Wertz (sawer) <sawer@odoo.com>
1. Activate Peppol in the main company for both sending and receiving;
2. Create a branch company;
3. Activate Peppol in the branch and select "Send from parent company";
=> Error message: "Cannot register a user with a receiver application".

opw-5725278

closes odoo#244626

X-original-commit: 9a6a51d
Signed-off-by: Claire Bretton (clbr) <clbr@odoo.com>
…t 66

64 stands for "Special agreement"
66 stands for "New outlet discount"

opw-5478324

X-original-commit: b839513
Part-of: odoo#243977
Signed-off-by: Claire Bretton (clbr) <clbr@odoo.com>
Signed-off-by: Laurent Smet (las) <las@odoo.com>
Bebat is a non-profit organization in Belgium that collects, sorts, and recycles used batteries.

Currently, whatever the recycling tax applied, we report is as AEO for
"Collection and recycling - The service of collection and recycling products."

However, since Bebat is about recycling batteries, we have to use CAV instead for
"Battery collection and recycling - The service of collecting and recycling batteries."

opw-5474752

X-original-commit: 7619e9e
Part-of: odoo#243977
Signed-off-by: Claire Bretton (clbr) <clbr@odoo.com>
Signed-off-by: Laurent Smet (las) <las@odoo.com>
closes odoo#243977

X-original-commit: 7efe2dc
Signed-off-by: Claire Bretton (clbr) <clbr@odoo.com>
Signed-off-by: Laurent Smet (las) <las@odoo.com>
The function `parseBoxShadow` uses a regex to decompose the shadow
parameters from a string. The regex was made to match values set by
the shadow option. But if the shadow is customized by the user through
another mean than the website builder (like writing custom html), the
value of `box-shadow` in the `style` attribute does not match the regex.
And the function throws an error.

This commit prevents the error and returns an empty object instead.

Steps to reproduce:
- Open website builder
- Select a column in the footer
- Set a shadow on the column
- With the debug tools, remove the color from the `box-shadow` property
  of the `style` attribute of this element
- Bug: Crash when you try to change any color from builder

task-5500414

closes odoo#244576

X-original-commit: d714854
Signed-off-by: Francois Georis (fge) <fge@odoo.com>
Signed-off-by: Sébastien Blondiau (blse) <blse@odoo.com>
In this commit, we fix an embedded action test that failed because
when clicking on the sliders to show the top bar, the dropdown was directly
opened as there is only one visible action
(since this commit: odoo@a5709e8).

We then adapt the test to wait for the dropdown to open automatically,
and then when it's the case, create the new custom embedded action.

closes odoo#244625

X-original-commit: 8e927c5
Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
Signed-off-by: Maxime de Neuville (mane) <mane@odoo.com>
When opening the sidebar in translation mode, translated elements must be
preloaded before the sidebar renders. Without preloading, the fetch requires
an extra tick to complete, causing tests that immediately check sidebar content
to fail because the sidebar isn't fully open yet.

runbot-237540

closes odoo#244622

X-original-commit: d6e91b6
Signed-off-by: Francois Georis (fge) <fge@odoo.com>
Signed-off-by: Serhii Rubanskyi (seru) <seru@odoo.com>
Since the support for exclusions on optional products was dropped,
those two values were given but not used anymore.

Taking this opportunity to remove them as they trigger unused
method arguments linting checks
@robodoo
Copy link

robodoo commented Jan 20, 2026

This PR targets the un-managed branch odoo-dev/odoo:master-ruff-anv, it needs to be retargeted before it can be merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.