Skip to content

Conversation

@pull
Copy link

@pull pull bot commented Mar 31, 2025

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

@pull pull bot added 👽 merge-conflict Resolve conflicts manually labels Mar 31, 2025
sbbh-odoo and others added 28 commits November 6, 2025 05:53
Description of the issue:

- The image toolbar failed to open when the editable had lost focus.
- Previously, focusEditable() exited early if the active element was inside
  the editable, even when the actual document selection wasn’t.

Solution:

- Updated the condition in focusEditable() to also check whether the document
  selection is inside the editable.
- Now it only returns early when both the active element and the selection are
  within the editable.

task-5117272

closes #234562

X-original-commit: 3cdd4f9
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Samit Bharatbhai Bhadiyadra (sbbh) <sbbh@odoo.com>
Steps to Reproduce:
-------------------------
1. Install the Website and Employees modules.
2. Create a Test User and It's Employee.
3. On the Employee record, go to Private Information, create a Bank Account
with a custom Account Holder Name.
4. Log in to the Website using the Test User.
5. Navigate to My Account and click Edit Information.
6. Fill in the address details (without changing the Name) and click Save.
7. Go back to the Employee’s Bank Account and check the Account Holder Name.

Observation:
-------------------------
The Account Holder Name was overwritten to the partner's name.

Issue:
-------------------------
In `_compute_account_holder_name` method,
https://github.com/odoo/odoo/blob/c3b543631bde96260082484a3baac19d942f6b9f/odoo/addons/base/models/res_bank.py#L104-L107
The Account Holder Name is always recomputed using the Partner’s name.
When submitting the form from the frontend, the name field is included in the
values sent to update the Partner, even if the user did not actually change
the name.
https://github.com/odoo/odoo/blob/be3a4283c383d187570f5a73f337030e6ae9d05c/addons/portal/controllers/portal.py#L196-L205
which re-triggers this compute and as a result, the Partner’s name overwrites
the Account Holder Name on the linked Bank Account

Solution:
--------------------------
Prevent the Account Holder Name compute method from being triggered when
updating information from the frontend if the Partner’s name has not been
changed.

opw-5059247

closes #234669

X-original-commit: 0110668
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Joyal Patel (pajo) <pajo@odoo.com>
Steps to reproduce:
1. Install the Project module.
2. Create a new project and share it with a user.
3. Log in as that user.
4. Open the shared project Kanban view and try to edit a stage.
5. Try to search for more projects.

Issue:
A traceback occurs when clicking on 'Search More'.

Fix:
Prevent stage editing in shared project Kanban view.

task-5176630

closes #234664

X-original-commit: a83e8fd
Signed-off-by: Xavier Bol (xbo) <xbo@odoo.com>
Signed-off-by: Maan Pankajbhai Patel (maap) <maap@odoo.com>
How to reproduce
================
Write an operation or calculation in datetime field like +1d or +=1d
or copy/paste a value in field. As the focus is lost, button reappears
in the field. Then, the getInputs method in useDateTimePicker hook
must (as this name suggests it) return input elements.

The fix
=======
We filter on tagName === 'input' elements

closes #234611

X-original-commit: 0d5c98b
Signed-off-by: Bastien Pierre (ipb) <ipb@odoo.com>
Signed-off-by: Pierre Pulinckx (pipu) <pipu@odoo.com>
The util function `isBlock` caches the display style of elements it
tests so it doesn't test them twice. But the qweb plugin's normalize
handler modifies some elements to give them the `data-oe-t-inline`
attribute, which in turn makes them inline whereas they were blocks
before. This means that if `isBlock` is called on these elements before
the attribute is set, it will cache the wrong value. This ensures that
the attribute is set before other normalize handlers call `isBlock`.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
This introduces the `system_node_selectors` resource, which represents
nodes that should be ignored by the editor. In other words, if the
editor had a VDOM, it would be absent from it. It allows us to refactor
a little bit by better separating concerns, and paves the way for the
selection placeholder plugin.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
This introduces the `empty_node_predicates` resource, which makes use of
the previously added `system_node_selectors` to further separate
concerns and refactor the remove plugin.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
With the introduction of selection placeholders in the next commit,
inserting paragraphs when clicking on the edges of the editable will not
be necessary anymore.

The tests that are affected were skipped so they can be unskipped when
the placeholders are introduced.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
Currently, there is no way to put our cursor between two
`contenteditable=false` blocks, between two tables, before the first
block in the editable or after the last one.

This introduces placeholder blocks with no height in these places, in
which the user can put their selection (which will show as a horizontal
blinking line). They can then start typing and the placeholder will be
persisted. At the end of the document, this is bypassed and the
placeholder will be persisted as soon as the selection is in it.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
Since the introduction of selection placeholders, inserting paragraphs
before and after banners is not necessary anymore.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
Since the introduction of selection placeholders, inserting paragraphs
before and after captions is not necessary anymore.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
Since the introduction of selection placeholders, inserting paragraphs
before and after columns is not necessary anymore.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
Since the introduction of selection placeholders, inserting paragraphs
before and after tables of contents is not necessary anymore.

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
When inserting one or more blocks with `dom.insert`, we split the
current block, which can result in an empty block after the one(s) we
inserted. Since before the introduction of selection placeholders, it
was impossible to create a new block after a trailing unsplittable
element, a `[contenteditable=false]` or a table, we were keeping these
empty blocks (see commit [1]).

For example:

```html
<p>abc[]</p>
```
-> insert a table
->
```html
<p>abc</p>
<table>...</table>
<p><br></p>
```

That trailing paragraph is unexpected and is now removed.

Commit [1]: 4147fbb

task-4129699

Part-of: #234185
Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
The syntax highlighting embedded component has no margin, but the `pre`
it contains does. Since selection placeholders position themselves based
on the margins of their neighbors, they appeared wrongly positioned in
this case. This applies the `pre`'s margin to its container instead, to
make things easier.

task-4129699

closes #234185

Related: odoo/enterprise#98693
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Antoine Guenet (age) <age@odoo.com>
closes #234502

Signed-off-by: Didier Debondt (did) <did@odoo.com>
This reverts [1] because the is_a_bot check is not reliable.
Many crawlers spoof user agents or ignore robots rules, so they still
index every tag combination and overload tag clouds.
We revert while we look for a better protection.

[1]: 1d07b74

closes #234649

X-original-commit: f06d58e
Signed-off-by: Benoit Socias (bso) <bso@odoo.com>
Signed-off-by: Benjamin Vray (bvr) <bvr@odoo.com>
Add missing currency symbol next to the event ticket price
in the event form view.

Task-5114075

closes #234632

X-original-commit: 16e889b
Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
Signed-off-by: Amélie Dieudonné (amdi) <amdi@odoo.com>
## Versions
17.0+

## Issue
Boleto is an offline, one-time-use payment method and cannot be tokenized with most payment providers (e.g., Adyen: https://docs.adyen.com/payment-methods/boleto-bancario/, Nuvei: https://www.nuvei.com/apm/boleto).

## Exception
Stripe allows a form of tokenization by storing the customer's billing information and regenerating a new Boleto for each payment (cf. https://docs.stripe.com/payments/boleto). Technically, the Boleto itself is not reusable — Stripe simulates tokenization by associating customer info with new Boleto transactions.

## Fix
To maintain consistent behavior and avoid provider-specific edge cases, tokenization is disabled for Boleto payments globally.

opw-5156718

closes #234672

X-original-commit: 02e8f16
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
Signed-off-by: Pierre Lamotte (pila) <pila@odoo.com>
When a TCP connection is not closed cleanly, it can take
minutes to detect a closed WebSocket connection. During this
time, no messages are received. This can happen in slow or
unstable network conditions.

Browsers do not expose WebSocket ping/pong mechanisms. To detect
dead connections quickly, periodic application level messages are sent
if no messages were either sent or received within a minute.

This approach ensures quicker detection compared to relying on the OS
TCP timeout, which is typically set to a high value.

closes #234647

X-original-commit: e9ae6c6
Signed-off-by: Matthieu Stockbauer (tsm) <tsm@odoo.com>
… mode

Issue:

In this bug, barcode scanner is disabled in barcode_manual
kiosk mode.

To reproduce:
1- Create a db with hr_attendance installed
2- Set `Kiosk Mode` to `Barcode / RFID AND Manual Selection`
3- Open `Kiosk Mode`. As you see the scanner is disabled.

`t-att-disabled` shouldn't be set to `barcode_manual` as it
should not be disabled in `barcode_manual` mode.

Also there is no need of `t-att-disabled` attribute at all as:
https://github.com/odoo/odoo/blob/f6b430245b98fb55cac7c8303b7f5bd8a3e1c84e/addons/hr_attendance/static/src/public_kiosk/public_kiosk_app.xml#L113-L114
the `KioskBarcodeScanner` will not be mounted if the mode is
manual.

opw-5153954

closes #234643

X-original-commit: 0e7c068
Signed-off-by: Jurgen Gjini (jugj) <jugj@odoo.com>
Signed-off-by: Mohammadmahdi Alijani (malj) <malj@odoo.com>
Steps to reproduce:
1. Connect a receipt printer to an IoT box, and pair the IoT box with
   Odoo.
2. In the device form for the receipt printer, click the 'Test' button.

Expected behaviour:
- Status receipt is printed and a 'Test page printed' notification is
  shown on the screen.

Actual behaviour:
- Status receipt is printed but no notification is shown on the screen.

In #229731, a QR code was added to the test status receipt
printer action. This was achieved by directly sending commands to the
printer with the `escpos` library, bypassing the `print_raw` method.

However, by bypassing the `print_raw` method it also bypassed the status
events that are normally sent to inform the Odoo user of the outcome of
the print.

This commit adds back these events to the receipt test print action.

closes #234629

X-original-commit: b6c23da
Signed-off-by: Louis Travaux (lotr) <lotr@odoo.com>
Signed-off-by: Max Whale (mawh) <mawh@odoo.com>
This commit is repeating caafc9a, but
after the merge of 179480d that undid
parts of it

task-5176469

closes #234644

X-original-commit: e41b19c
Signed-off-by: Colin Louis (loco) <loco@odoo.com>
Signed-off-by: Sébastien Blondiau (blse) <blse@odoo.com>
This commit reworks entirely the ActionSwiper component with the 'forwards'
animationType. This has been done to create a more engaging animation, with
the content area being moved following the user's finger on the screen. Each state
value implying a rerender has been replaced by non state dependent alternatives
to avoid unnnecessary redraws of the swiper content.

The commit also allows to set custom content in surrounding areas, such as a
preview of the item nearby that replaces the current content when the animation
is done. This is used to create a continued experience in the calendar, showing
other instances of the calendar arround the current period being visible instead
of a blank screen. By default, no content is set (settings app for example).

By improving the 'forwards' animation with a more natural UX, the props associated
with a fixed swipable experience has be removed. It is also no longer useful to
support a custom distance ratio before expecting the content to change, so the
dedicated props has been dropped as well.

Also, the 'hasTouch' check to determine whether or not the component has a true
purpose or if we can simply render the main content has been directly moved
inside of the component. This reduces the need of duplicated code to check the
same thing.

Tests have been added or adapted to assert the newest scenarios and behaviors.
- Calendar helpers have been improved and now wait for fullcalendar to be interactive
before dragging elements.
- A few patches were previously made to disable the swiping feature, which didn't
allow to test fully the standard calendar behavior, and meant the feature wasn't
entirely tested.
- A test verifies that the range is enlarged when the model loads
- A test checks the rerender count of the controller when loading the data (after a
search or a date change)

A new variable value is now exported from views utils, since the same value is being
used at multiple locations in the codebase, for the same use case: enabling selection
after a delay when touch starts. This will improve the consistency accross views by
using the same value.

task-4800846

Part-of: #231638
Signed-off-by: Adrien Dieudonné (adr) <adr@odoo.com>
This commit makes the value being used for enabling touch selection more
consistent, since we now export the same 400ms value from the views utils.
It will avoid the risk of changes in behavior, by using a common value.

closes #231638

Signed-off-by: Adrien Dieudonné (adr) <adr@odoo.com>
Versions
--------
- 17.0+

Steps
-----
1. Edit the `sale.report_saleorder` report using `web_studio`.
2. Add the `amount_untaxed` field next to the "Untaxed Amount" subtitle.
3. Create or navigate to a quotation and click on the "Preview" action.

Issue
-----
A traceback occurs during the rendering of the
`sale.sale_order_portal_template` template.
```
Error while render the template
KeyError: 'doc'
Template: sale.document_tax_totals
Path: /t/t/tr/td[1]/span
Node: <span t-field="doc.amount_untaxed"/>
The error occurred while rendering the template sale.document_tax_totals and evaluating the following expression: <span t-field="doc.amount_untaxed"/>
```

Cause
-----
In the `sale.report_saleorder_document` template, `doc` is used as the
variable name for the current sale order. Consequently, the studio edit
uses this variable name to modify the `sale.document_tax_totals`
template called within `sale.report_saleorder_document`. However, the
`sale.sale_order_portal_template` template, used for the portal preview,
also calls `sale.document_tax_totals` but uses `sale_order` as the
variable name for the current order.

Solution
--------
Add an alias `doc` for `sale_order` during the rendering of
`sale.document_tax_totals` when called in the portal report preview.

opw-5136553

closes #234458

X-original-commit: fa070bc
Signed-off-by: Victor Feyens (vfe) <vfe@odoo.com>
Signed-off-by: Lionel Piraux (lipi) <lipi@odoo.com>
Before this commit, we could not jump to messages in mailboxes.

This happens because the `useMessageHighlight()` hook prevented
jumping to messages in thread that were not their origin thread.

This commit fixes the issue by removing this limitation specifically
for mailboxes.

opw-4948798
opw-5087102

closes #234668

X-original-commit: 23ab654
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
Steps to reproduce:
- Create a Sale Order with at least one product line & confirm it.
- Open the delivery
- Change the picking's SO to another one

Issue:
A traceback will happen, as the `Command` expects an id, not a record

Aside from the traceback, we need to think of what it implies to change
the SO on a picking like this. If the move have a sale_line_id, it
doesn't make sense to have some still related to one SO while the
picking itself is linked to another one.

Now tries to do a basic matching of the moves based on their product
within the newly set Sale Order.

sentry-6921046230

closes #234610

X-original-commit: 763400a
Signed-off-by: Steve Van Essche <svs@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
nees-odoo and others added 30 commits November 12, 2025 20:37
…page

Steps to Reproduce:
- Login with Admin, start a meeting, open the member list.
- Join the meeting with a guest, using the invite link.
- Change the guest name from the welcome page.
- Admin member list doesn't show updated guest name.

Before this commit, the guest appeared as `Guest` in the member list
even after updating their name on the welcome page.

This commit ensures the guest name is updated and displayed instantly
upon joining, providing a smoother and more consistent experience.

task-5062702

closes #235245

X-original-commit: 47e561b
Signed-off-by: Matthieu Stockbauer (tsm) <tsm@odoo.com>
Steps to reproduce:
- open livechat support with at least 1 human agent available
- click on button to open chat window
- immediately close the chat window
=> crash

This happens from welcome message triggering message seen code, which
triggers access to `hasEveryoneSeen` which implies
`membersThatCanSeen` being accessed in compute. When closing the chat
window, the chat window is closed then the channel is deleted.
Deletion of the the channel makes deletion of channel object and then
the thread object. As the message is still present on channel object
deletion, it retriggers compute of `hasEveryoneSeen` which also
calls `membersThatCanSeen` on `thread` object still alive for a short
time. In this getter, `this.channel` of `thread` was not guarded,
thus it crashed.

This commit fixes the issue by guarding access of `this.channel` in
this flow like in the many other flows of `thread` model that
accesses `this.channel`.

closes #235310

Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
Currently performance on `_compute_amount()` is bottlenecked by `__get__()` calls on fields on `line_ids`.
We tackle this bottleneck by warming the cache with `fetch()`

Benchmark on reconciling 2 account moves with ~70k lines each
|          |Total Time|Allocated Memory|Queries|
|----------|----------|----------------|-------|
|Before    |43.23s    |2GB             |993    |
|After     |18.60s    |1GB             |693    |

opw-5098543

closes #235217

X-original-commit: 8cdc64b
Signed-off-by: William André (wan) <wan@odoo.com>
It's impossible to create an attendance for an employee without ruleset.
To solve this problem, this PR adds a default ruleset with 2 rules: one for
overtime, and another one for non working days.

Those data are the same as the data added in the
upgrade/migrations/hr_attendance/saas~18.5.2.0 post-migrate script.

task-5082628

closes #234628

X-original-commit: bc039d7
Related: odoo/enterprise#98952
Related: odoo/upgrade#8809
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
Steps to reproduce:
-------------------------
1. Install the Knowledge app
2. Open any document and use `/media` to open the media dialog
3. Go to the Videos tab in the dialog
4. In another browser tab, open the Vimeo website
5. Copy any Vimeo video link and paste it into the dialog

Observation:
-------------------------
When pasting a Vimeo link, a traceback occurs:
```
TypeError: Cannot read properties of undefined (reading 'match')
    at EmbeddedVideoSelector.parseTimeToSeconds
```

Issue:
-------------------------
In the following function,
https://github.com/odoo/odoo/blob/b5ed2d5a3e4ac9379ed15549dd9c8e08547181bb/addons/html_editor/static/src/main/media/media_dialog/video_selector.js#L350-L353
This happens because the code splits the Vimeo URL using `#t`. If the URL does
not contain `#t`, the result is undefined, which is then passed to the
`parseTimeToSeconds` function.

Solution:
-------------------------
Added optional chain operator in `parseTimeToSeconds` for safe validation of
`value` before calling `.match()`

opw-5221403

closes #235271

X-original-commit: 483ce81
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Joyal Patel (pajo) <pajo@odoo.com>
Re-clicking the current date filter (relative/month/quarter/year/range)
triggered redundant RPCs and chart re-animations. In Custom Range, clicks
inside inputs also bubbled to the dropdown item, causing unwanted updates.

This commit:

Stop event bubbling inside Custom Range inputs to avoid spurious updates.

In GlobalFiltersCoreViewPlugin.allowDispatch(), return NoChanges when the
incoming value equals the current filter value (currentFilterValue).

closes #235270

Task: 5187275
X-original-commit: 654a39d
Signed-off-by: Lucas Lefèvre (lul) <lul@odoo.com>
Signed-off-by: Dhrutik Patel (dhrp) <dhrp@odoo.com>
*: test_website, base, website, website_blog, website_event,
   website_event_track, website_payment, website_sale, test_assetsbundle

Before this commit when a module was updated all ir.asset records were
reset to their defined `active` state, if defined.
This causes assets related to old snippet versions to be made inactive
even if those old snippet versions are used inside existing pages.

It used to work when the activation of assets was made through view
inheritance because when views are defined through a `<template>` tag,
the `active` attribute is in fact ignored during updates since [1],
except for new records since [2].

This commit introduces an `<asset>` tag in the XML import format.
It is an alias of `<record ... model="ir.asset">` with the additional
feature that it avoids taking the `active` field into account during
updates for existing `ir_asset` records, just like `<template>` if the
`active` field is mentioned as attribute of the tag.
We then rely on the `website_disable_unused_snippets_assets` cron to
properly disable any unused asset at a later stage (note that the bug
being fixed here was mitigated by the fact that cron also re-enabled
assets which were disabled by mistake... but that might happen only a
few days later).

Another approach was to overload `_load_records_write` in `base`'s
`ir_asset.py` to avoid taking the `active` field into account when
updating records:
```py
    def _load_records_write(self, values):
        values.pop('active', None)
        super()._load_records_write(values)
```
But this is not as stable because it changes the way `ir.asset` records
are imported when the `<record>` tag is used. In the end we chose to be
consistent and do exactly the same as `<template>`, as this also allows
more and should be entirely stable.

[1]: 2d296cb#diff-175c28787c272a219b9275f79262a48af9aa029e718f45077fd609737559e84eR803-R804
[2]: f1c70d4#diff-175c28787c272a219b9275f79262a48af9aa029e718f45077fd609737559e84eR801-R804

task-2963840

closes #235226

X-original-commit: 906ae8a
Related: odoo/enterprise#99233
Related: odoo/documentation#15239
Related: odoo/design-themes#1179
Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
Co-authored-by: qsm-odoo <qsm@odoo.com>
The method `getFilterDisplayValue` would not handled `undefined`
values for boolean global filters, causing crashes when exporting
to Excel.

closes #235284

Task: 5188932
X-original-commit: 9c70239
Signed-off-by: Lucas Lefèvre (lul) <lul@odoo.com>
Signed-off-by: Adrien Minne (adrm) <adrm@odoo.com>
Before this commit, when in a discuss call in the Discuss app with
sidebar not compact and a right panel open, click on Discuss sidebar
would overflow horizontally the UI.

This happens because the rearrange of tiles of the discuss call grid
would be triggered from sidebar toggle state change, but the
rearrange of tiles was mistakenly coded to preserve the height of
main tile. This is a problem with discuss call sidebar because while
the overall height of call view should stay unchanged, the main
card must have its height reduced to compensate with discuss call
sidebar when shown.

This commit fixes the issue by resetting temporarily the height of
call card tile in `arrangeTiles()`, so that it takes into account
when it has to adapt its height.

closes #235307

X-original-commit: b4ec57f
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
Steps to reproduce:
- Install `stock_delivery`
- Have some package in stock
- Create a delivery, and without saving:
  - Add a carrier
  - Click on the 'Move a Pack' button
  - Try to select a package to add.

Issue:
A ValidationError occurs, seemingly for an unsuitable company_id

The main issue is that due to the `partner_id` field that is required if
a carrier is set, the save that precedes the opening of the Dialog isn't
done properly, and no picking can be assigned to the created move lines.

In such cases, we can just avoid opening the Dialog if the picking
cannot be saved.

Task-5116567

X-original-commit: 39d8e8d
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
Currently, the putaway rules weren't checking other levels of packages
and were only checking the package directly linked to the move line.

Now, we always want to consider the outermost package of each move line,
rather than its direct package. Which means that if we have a putaway
rule for pallets and one for boxes, if we register a picking that should
move several packages on a pallet, then these should be all moved
towards the pallets location.

Also fixed `outermost_package_id`, as it wasn't properly recomputed when
necessary. Now it always refer to a package, which can be itself if the
package has no destination container.

Task-5116567

X-original-commit: 82e79e7
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
As routes can be defined on package types, it's now possible to have
multiple package type that could fit for a single move line.

We now consider every parent package these package have to check if they
have package type with routes linked to them.

Task-5116567

X-original-commit: 5a2ad09
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
The Picking Operations report should also display the source/destination
parent of packages along with its location.

Task-5116567

X-original-commit: 851643a
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
Currently, the 'Remove' button on packages from picking/batches was too
strong. There was no easy way of removing just one level of package
(like the outermost one).

Doing it on an entire package would remove all contained packages as
well, which can be very annoying, especially for moving packages from
one pallet to another.

It is still possible to remove all layers at the same time, but you now
need to select all related packages before removing them.

Task-5116567

X-original-commit: e90e5c5
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
- Keep the 'Package' stat button in the same order for pickings &
  batches
- Avoid having less space between the fa-icon and the text when the
  picking is done
- Display the 'Package' stat button for package histories for batches as
  well
- Only display the 'Package' stat button for pickings when there's at
  least one destination package. This isn't done for batches on purpose,
  as we need to keep a way to add new entire packages.

Task-5116567

X-original-commit: 6716ab7
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
Previously, when selecting an existing package to assign to a move line
(either directly or through the put in pack wizard), we could not select
a package used in the picking, even though it had the same destination.

Task-5116567

X-original-commit: 29a7143
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
Currently in the put/pack in pack process, the selection of move lines
through `_to_pack` would prioritize picked move lines, but only within
the same "group" (i.e. all move lines that either have a pack or not)

Which means that when you had the following move lines:
- ML1: picked in PACK01
- ML2: not picked without package

If you used the 'Put in Pack' button, it would be ML2 that would be
packed, as that one didn't have any package yet.

Now it would be ML1 that would be selected, until ML2 is picked as well.

Task-5116567

X-original-commit: 4c2b9bb
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
Steps to reproduce:
- Go to any product, open its quants
- Create a new line and create an empty package without name

The package is displayed as 'Unnamed' until the quant is saved, where
its real name is displayed.

Despite having their name required, packages can be created without one.
In such case, a name will be generated based on their appropriate
sequence (i.e. from package type or base package sequence).

However, when records are created through an auto-complete in js, the
records aren't reloaded after their creation. This meant that since the
name is computed python-side, there would be no name to display until
the whole record is saved (as this would reload the record), thus the
'Unnamed' packages.

To avoid this, we need to override some props of FromViewDialog to force
the reload after creation.

Task-5116567

X-original-commit: aaad780
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Part-of: #235111
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
- Properly displays the current source package in batches 'Moves' list.
- Now uses `display_name` instead of `name` for quant's display_name. It
  allows to use package-specific context for autocomplete as well.

Task-5116567

closes #228837

closes #235111

X-original-commit: 2a2b3c5
Related: odoo/enterprise#95648
Related: odoo/enterprise#99187
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
Signed-off-by: Quentin Wolfs (quwo) <quwo@odoo.com>
This test had a bug: `self.env['hr.employee']._fields.keys()` may contain
fields that do not exist in an `hr.employee` record.

Now, employee fields that cannot be accessed are filtered out using
`hasattr()`. To avoid further crashes.

Runbot build error: https://runbot.odoo.com/odoo/runbot.build.error/233942
Bug has been introduced by task-5103739

task-5254322

closes #235323

X-original-commit: cc4472a
Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
…nal change

**Steps to reproduce:**
1. Install `l10n_ar` localization.
2. Create two sales journals with the `Use documents` option enabled and
   disabled.
3) Create an invoice and add a customer and change the journal to with
   `use documents` and save the record
4) Now change the jornal to without `use documents` and try to save it

**Observed behavior:**
The `Document Type` and `Document Number` fields fail to show or hide
properly when switching between journals with different `Use documents`
configurations.

**Cause:**
The `_compute_l10n_latam_use_documents` method lacked the
`@api.depends` decorator with appropriate dependencies. As a result,
when the journal is changed on an invoice, the
`l10n_latam_use_documents` field was not recomputed, leading to incorrect
visibility of related fields.

**Fix:**
Add the missing `@api.depends('journal_id.l10n_latam_use_documents',
'move_type')` decorator to ensure the field recomputes whenever the
journal or its `Use documents` setting changes.

opw-5220202

closes #235352

X-original-commit: ac52095
Signed-off-by: Laurent Smet (las) <las@odoo.com>
Signed-off-by: Raj Bhuva (bhra) <bhra@odoo.com>
A journal is still excluded from the ledger even if it is archived.
To reproduce:
* create a new journal
* create a journal entry impacting the P&L in that journal
* create a Multi-Ledger (journal group) excluding this journal
* archive the journal
* open the P&L

The journal entry is impacting the report, because the journal is not
excluded.

task-5251383

closes #235353

X-original-commit: dee42a4
Signed-off-by: John Laterre (jol) <jol@odoo.com>
Signed-off-by: William André (wan) <wan@odoo.com>
Steps
-----
1. Have `sale_renting` but not `sale_stock_renting` installed;
2. create an event with a ticket;
3. make the ticket's product rentable;
4. change ticket's product type to Goods;
5. publish the event to website;
6. register for the event via website;
7. go to payment.

Issue
-----
AttributeError: 'bool' object has no attribute 'tzinfo'

Cause
-----
By making it a rental product, it creates a rental order, but as
registering for an event via website doesn't have any way to add rental
dates, rental lines cannot be processed & rendered as expected.

Solution
--------
Prevent users from changing the `service_tracking` away from `'event'`
by adding an `api.constrains` to `product.product` on `service_tracking`
and `event_ticket_ids`.

opw-5207045

closes #235366

X-original-commit: afcbd98
Signed-off-by: Jérémy Hennecart (jeh) <jeh@odoo.com>
Signed-off-by: Levi Siuzdak <sile@odoo.com>
Before this commit, when using livechat for visitors on mobile
devices, click on input would zoom on input of about 115%.

This zoom would hide send button at the very end of composer input,
and would force users to pinch-to-unzoom, making the UX quite poor.

This problem happens because mobile devices have an auto-zoom feature
that is triggered when font-size is below 16px. The discuss UI is
designed with 14px font size (web client font size), and since
14px < 16px, it zooms on input focus to about 115%.

This commit fixes the issue by using a font-size of 16px specifically
for livechat visitor on mobile devices, so that this doesn't
auto-zoom. Note that this problem doesn't happen on the web client
even though this uses a font-size of 14px because it specifically
disable the autozoom feature:
https://github.com/odoo/odoo/blob/17.0/addons/web/views/webclient_templates.xml#L250

This solution is not practical for livechat, for which it has to work
on any external website.

opw-5229076

closes #235355

X-original-commit: 0259ddb
Signed-off-by: Matthieu Stockbauer (tsm) <tsm@odoo.com>
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
If the selection of the document is not set and the user presses the
delete key, the delete handler of the list plugin throws an error.

Steps to reproduce (in 19.0, where the issue was discovered):
- Open website builder
- Drop the video inner snippet in the header
- Double-click & drag from the video to just outside the video
- Click once on the video
- Press "delete"
- Bug: Traceback

task-5186954

closes #235362

X-original-commit: 300f3ad
Signed-off-by: David Monjoie (dmo) <dmo@odoo.com>
Signed-off-by: Sébastien Blondiau (blse) <blse@odoo.com>
## Version
18.2+
SEO Schema refactoring from task-3866937

## Issue
The markup always contains the price without taxes, no matter the website settings for pricing display (with or without taxes).

## Steps to reproduce
- Go to Website settings:
  - Choose "Taxes Included" for "Display Product Prices".
- Got to the shop and select any product on which taxes apply (e.g. Customizable Desk):
  - Open console and execute `JSON.parse(document.querySelectorAll('[type="application/ld+json"]')[1].innerHTML)[0]['hasVariant'][0]['offers']['price']`;
  - The found price and the displayed price (visible on the page) are different

## Fix
Allow tax inclusion based on parameter to mimic template's behavior on variants too depending on the website.
https://github.com/odoo/odoo/blob/52a6d88a188d5456262428847aed229f117da8ed/addons/website_sale/models/product_template.py#L377-L430

opw-4923780

test

closes #235364

X-original-commit: eb39d0f
Signed-off-by: Valeriya Chuprina (vchu) <vchu@odoo.com>
Signed-off-by: Pierre Lamotte (pila) <pila@odoo.com>
Versions
--------
- 17.0+

Steps
-----
1. Have a product with a purchase cost;
2. have sale margins enabled;
3. add a the product to a quotation;
4. change pricelist to one with a different currency;
5. note that the line's cost gets updated;
6. change order state to confirmed, then canceled, then back to draft;
7. change pricelist again.

Issue
-----
The purchase cost no longer update.

Cause
-----
The `_compute_purchase_price` override in `sale_stock_margin` doesn't
pass the line to `super` if it `has_valued_move_ids`. This hook only
checks for the existence of linked `move_ids` on the record with no
regard for their state.

Solution
--------
1. Move the `has_valued_move_ids` hook from `sale` to `sale_stock`.
2. Only return `True` if any of the moves aren't in draft or canceled.

opw-5147321

closes #235176

X-original-commit: 8769725
Signed-off-by: Tiffany Chang (tic) <tic@odoo.com>
Signed-off-by: Levi Siuzdak <sile@odoo.com>
Following the style revamp of the o-spreadsheet lib, we introduced a
class o-input (differs from odoo o_input) in order to avoid collision
with the odoo classes which tend to be altered in dark mode which
spreadsheet does not support.

However, we still relied on the default behaviour of odoo classes to
mark specific inputs as invalid or missing.

This commit ensures that missing/invalid are always marked as such while
make preventing the dark mode to break the default layout.

Task-4878174

closes #235387

X-original-commit: 5fb5fb4
Related: odoo/enterprise#99315
Signed-off-by: Rémi Rahir (rar) <rar@odoo.com>
Signed-off-by: Pierre Rousseau (pro) <pro@odoo.com>
When w try to read the work entries, we've got an access rights error if
we are not attendance manager.

As we are still supposed to read the work entries, we get the attendance
interval in sudo

closes #235383

X-original-commit: 5ac13f1
Signed-off-by: Pierre Masereel (pim) <pim@odoo.com>
When writing value with the wizard, we wrote the value of related field of the company to prevent multiple write from happening.

Now, we handle the write too in case the wizard is created with default value instead of created beforehand.

It's also now possible to specify the fields that are to be written to handle more cases in overrides.

closes #235382

X-original-commit: 26163c1
Related: odoo/enterprise#99312
Signed-off-by: Julien Alardot (jual) <jual@odoo.com>
Signed-off-by: Léo Leclerc (leol) <leol@odoo.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

👽 merge-conflict Resolve conflicts manually

Projects

None yet

Development

Successfully merging this pull request may close these issues.