Daily updates from Odoo
Monday, October 6, 2025
61 changes · 19.0
Security fixes and vulnerability patches
This fix prevents Helpdesk tickets from being linked to a customer contact belonging to a different company than the ticket. It helps ensure users only see and access tickets for the companies they are allowed to work with, avoiding access errors and potential unauthorized visibility.
Original PR description
**Issue**: It is possible to associate a partner that belongs to a different company than the ticket’s company. As a result, some users could see tickets in the list view that they should not have access to. When attempting to open those tickets, an error was raised. Even worse, in some cases (see the associated ticket), certain users were still able to access them. **Steps to reproduce**: - Create two companies (A and B) - Switch to company A - Open the Helpdesk application - Create and open a ticket - Select both companies A and B - Assign a partner linked to company B to the ticket - Save it opw-4926497 Forward-Port-Of: odoo/enterprise#96193 Forward-Port-Of: odoo/enterprise#93201
Enhancements to existing features
The bank matching edit line wizard now shows only the line name instead of combining it with the reference. This keeps long references from disrupting the layout while still leaving the reference visible in the kanban view.
Original PR description
Problem: - The reference field was displayed together with the bill name, causing misalignment when the reference is quite long in the edit line wizard. Solution: - Updated the edit line wizard to display only the line's name. - The reference remains visible in the kanban view, it is only removed in the edit line wizard. task-5113489 Forward-Port-Of: odoo/enterprise#95575
Email handling now avoids loading large unnecessary message content into memory during common operations. This reduces the risk of out-of-memory failures and improves processing speed for mail-heavy databases, while keeping the same user-facing behavior.
Original PR description
Modifications are made around read, filtered, list comprehension. The read function usually does not prefetech fields other than stated. But in this case, since the fields are related fields from…
Modifications are made around read, filtered, list comprehension. The read function usually does not prefetech fields other than stated. But in this case, since the fields are related fields from another model, The fields of the other model are prefeteched. This includes the body which can be very big in size and cause an out of memory error. Filtered does not need other fields and keeps them unnecessarily in cache. List comprehension where it has a reference to specific field inside the model also triggers the prefetecher. Benchmark: | |Number of queries| SQL time| Python time|| |-------|----------------------------|----------------|---------------|-| |with prefetch| 82| 1.887 | 7.898| Out of memory| |Without prefetch| 120| 0.385 | 5.973| | The benchmark with the prefetch was done locally with increasing the memory limit. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211075 Forward-Port-Of: odoo/odoo#183893
This update adds documentation for an internal testing utility used by the HTML editor team. It helps developers understand and use the tool more consistently, supporting more reliable future updates without changing the user experience.
Changing a folder to not be discoverable no longer automatically makes the files inside require a direct link. This keeps folder visibility settings from unexpectedly restricting access to existing documents, making document sharing behavior more predictable for users.
Original PR description
Changing the discoverability to not propagate to its children. Previously setting a folder to Discoverable to 'No' would result in all the files also requiring a link to access them, which is unwanted behaviour. Task-4996667
The spreadsheet selector grid now receives focus automatically when opened, so users can start interacting with it right away. This reduces extra clicks and makes spreadsheet editing feel smoother and faster.
Original PR description
Task: 5106371
IoT connections now reuse saved IoT box information so devices can continue receiving requests when the internet connection is unavailable. This reduces unnecessary server calls and improves reliability for connected hardware and self-ordering flows during network interruptions.
Original PR description
In order to make the `iot_http` service work offline, we cache the iot box records until there is a full action failure. This avoids useless orm calls and in the meantime, allow making requests to the iot box without internet connection. Community PR: odoo/odoo#226839 Forward-Port-Of: odoo/enterprise#93895
VoIP call recordings are now saved in a single audio channel instead of stereo. This reduces storage usage while keeping recordings suitable for typical business review and compliance needs.
Original PR description
Task-5082457
This change keeps the main company first while sorting the other selected companies in the user's session context. This reduces duplicate cache entries for equivalent requests, helping improve consistency and avoid unnecessary repeated processing.
Original PR description
The `allowed_company_ids` key encodes the ids of the companies the user is currently logged in. There's always a "main" company, the first one, which acts as default company. The order for the others is not relevant. Before this commit, those ids weren't sorted. This was a (small) problem for the rpc caches, because that list of ids is present in the context, which is stringified in the cache keys. So the same request but with `allowed_company_ids`, e.g., `[3,1,2]` and `[3,2,1]` would result in 2 different keys in the cache, and could thus lead to cache misses even though we already did the same request. This commit thus sorts the ids (except for the one). Task~5104126 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
Resolved issues and error corrections
This fix updates the live chat test mock so it includes the same user availability status information as the real server. It helps prevent incorrect test results and improves confidence that live chat behavior is validated accurately.
Original PR description
**Description of the issue this PR addresses:** Add missing im_status field in mock server **Current behavior before PR:** Previously, the `im_status` field was available on the server side, but it was missing in the mock server implementation used in tests. **Desired behavior after PR is merged:** This PR updates the mock `DiscussChannelMember` model to include `im_status` in the list of stored partner fields, ensuring that test scenarios accurately reflect server behavior. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229865
This fixes a crash that could occur when validating Register Production/Serial from the shop floor after duplicate quality checks were created. Manufacturing users can now complete production validation without being blocked by an unexpected error.
Original PR description
When user tries to validate Register Production/Serial in shop floor, A traceback will appear. Steps to reproduce the error: - Install ``mrp_workorder`` and ``quality_control`` modules with demo data…
When user tries to validate Register Production/Serial in shop floor, A traceback will appear. Steps to reproduce the error: - Install ``mrp_workorder`` and ``quality_control`` modules with demo data - Go to Quality > Create a new Control point > Product: Table Top > Operations: Manufacturing > Save - Create a new MO > Product: Table Top > Confirm > Shop Floor > Click on Assembly 1 > Click on 3 dots > Update Instructions > Improvement Suggestion > Add a step > Propose Change > Validate - Click on 3 dots > Register Production/Serial > Validate - Go back to MO > Quality Checks > Duplicate the newly created quality check > Shop Floor > Click on Assembly 1 > Click on 3 dots > Register Production/Serial > Validate Traceback: ``ValueError: Expected singleton: quality.check(1, 5)`` https://github.com/odoo/enterprise/blob/5103383df3ddf23503e2c7817c5129a742a7800f/mrp_workorder/models/mrp_workorder.py#L846-L848 When User clicks on the validate, ``current_check`` may include several quality checks without a ``previous_check_id``. The code expects only one record, which causes a traceback. sentry-6839419788 Forward-Port-Of: odoo/enterprise#93624
This fix prevents Odoo from opening a chat window when a message has already been received and seen through another part of the app. It reduces unnecessary interruptions for users in Discuss while keeping message notifications consistent.
Original PR description
Before this commit, if a message was already received in the store by another medium than the bus, it was still handled not-silently when receiving the bus notification `discuss.channel/new_message`. This could lead to opening a chat window when a message was already seen by the user in the discuss app. This commit changes the handling of new messages in the frontend and overrides the silent flag when the record already exists. fixes-runbot-230700 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227445
This fix ensures scheduled background jobs refresh their system information before running after an app is installed or removed. It prevents worker crashes caused by jobs using outdated data, improving reliability for databases running with multiple workers.
Original PR description
**step to reproduce:** - start a database with worker, use `--max-cron-thread=1 --workers=2` - Add a sample cron, which runs every minute(just so that we can see the status) - install helpdesk -…
**step to reproduce:**
- start a database with worker, use `--max-cron-thread=1 --workers=2`
- Add a sample cron, which runs every minute(just so that we can see the status)
- install helpdesk
- uninstall helpdesk
**Observation**
- traceback in console
```
2025-09-25 06:07:26,389 18450 ERROR ? odoo.service.server: Worker WorkerCron (18450) Exception occurred, exiting...
Traceback (most recent call last):
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/service/server.py", line 1171, in _runloop
self.process_work()
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/service/server.py", line 1270, in process_work
base.models.ir_cron.ir_cron._process_jobs(db_name)
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/addons/base/models/ir_cron.py", line 139, in _process_jobs
registry[cls._name]._process_job(db, cron_cr, job)
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/addons/base/models/ir_cron.py", line 331, in _process_job
now = fields.Datetime.context_timestamp(ir_cron, datetime.utcnow())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
....
....
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/models.py", line 3873, in fetch
fetched = self._fetch_query(query, fields_to_fetch)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/addons/base/models/res_users.py", line 546, in _fetch_query
records = super()._fetch_query(query, fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/models.py", line 3965, in _fetch_query
self.env.cr.execute(query.select(*sql_terms))
File "/home/odoo/odoo/codebase/odoo/17.0/odoo/sql_db.py", line 335, in execute
res = self._obj.execute(query, params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
psycopg2.errors.UndefinedColumn: column res_users.helpdesk_target_closed does not exist
LINE 1: ...s"."odoobot_state", "res_users"."odoobot_failed", "res_users...
```
Issue:
- traceback occurred, as the system is try to fetch fields related to helpdesk module
which do not exists now after uninstalling it.
- cron in case of workers, use daemon threads [1]
- the uninstalled happened with main thread and registry is updated.
- the daemon thread is unaware of this change.
- the `_process_jobs` uses the registry, without checking if it needs reload
[1]: https://github.com/odoo/odoo/blob/e82fdfaf621f45515b92c891334595250accbfbd/odoo/service/server.py#L582-L587
FIx:
- when assigning the registry, we check if needs a reload or not.
opw-5062313
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#229556
Forward-Port-Of: odoo/odoo#228515The employee offer form now automatically uses the correct employee when creating a new offer from the Offers button. This prevents confusion for HR users and helps ensure offers are linked to the intended employee.
Original PR description
#### Steps to reproduce Employees -> Create employee (or select employee) with offer -> Offers smart button -> New: wrong employee name in "Offer for ..." #### Reason Wrong key passed to context of the offers view via action_show_offers method #### Solution Replace key 'default_employee_version_id' with 'default_employee_id' task-5003544 Forward-Port-Of: odoo/enterprise#92073
This fixes an issue where emails or tickets containing an image formatted with a caption area but no actual caption could fail to open. Odoo now handles these images safely, preventing tracebacks for users reviewing related helpdesk tickets or messages.
Original PR description
When a image that has a figure tag without fig caption tag is rendered in a caption area it create a traceback. ### Steps to reproduce: * Write an email with an image that has a "figure" tag but no "fig caption" * Send it to an helpdesk alias to create a ticket * Open the ticket -> traceback ### Issue: When a "figure" tag was processed, it wasn't taking into account the possibility of not having "figcaption" which created the traceback. https://github.com/odoo/odoo/blob/2769717bb0632ee7b813e131a94e77885b54493f/addons/html_editor/static/src/others/embedded_components/plugins/caption_plugin/caption_plugin.js#L56-L59 opw-5080370 Forward-Port-Of: odoo/odoo#228858
This fixes a crash when users remove certain calendar view settings in Studio, such as the color field. Empty values are now handled correctly instead of being treated as invalid field names, making Studio edits more reliable.
Original PR description
On a calendar with studio, try to remove the "color" attribute, or any other that should contain the name of a field. Before this commit there was a crash because the value sent to the server in this case is `undefined` (`null` in JSON or `None` in python), which was stringified and yielding an actual string that was not a field name After this commit, NULL values are not stringified, instead they should represent the emptiness of the attribute. opw-4938351 Forward-Port-Of: odoo/enterprise#95439
Breadcrumb labels now refresh correctly when users switch the Odoo interface language. This prevents navigation labels from staying in the previous language, reducing confusion for multilingual users.
Original PR description
[FIX] web: update breadcrumb display name on language switch Versions -------- - 19.0+ Steps ----- 1. Switch the user interface language in Odoo 2. Navigate through the application using breadcrumbs…
[FIX] web: update breadcrumb display name on language switch Versions -------- - 19.0+ Steps ----- 1. Switch the user interface language in Odoo 2. Navigate through the application using breadcrumbs 3. Observe the breadcrumb display names Issue ----- When switching languages, the breadcrumb display names remain in the previous language and do not update to reflect the new language. Cause ----- The action data cached in sessionStorage retains the display names in the original language. When language is switched, the cached action data is not invalidated, causing breadcrumbs to show outdated translated text. Solution -------- Detect language changes by comparing the current user context language with the cached action's language context. When a language mismatch is detected, clear the cached action data from sessionStorage to force a fresh load with properly translated display names. Signed-off-by: PA Sitthipong <sitthipong114@gmail.com> <img width="466" height="198" alt="OdooBugLanguageSwitch" src="https://github.com/user-attachments/assets/83302c7f-bc66-40e4-a310-e7087da1e747" />
The HTML editor’s automated tests now better reflect how the editor behaves in real use after inserting HTML. This helps prevent inaccurate test results and reduces the chance of unnoticed issues reaching users.
Original PR description
The insert HTML tests were using `dom.insert` directly without consistently triggering a step afterwards, leading to results that weren't always representative of the editor's reality. This ensures consistency in that regard. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now open the AI assistant from the Physical Inventory list and ask questions without triggering an error. The fix handles pages that do not have a linked action, improving reliability for Inventory users.
Original PR description
Currently an error is generated when a user tries to send a message to AI while the current page is in `Physical Inventory`list view. Steps: - Install `Inventory` - Go to Inventory > Operations >…
Currently an error is generated when a user tries to send a message to AI while the current page is in `Physical Inventory`list view. Steps: - Install `Inventory` - Go to Inventory > Operations > Physical Inventory - Click the AI icon from the systray menu. - Ask anything in AI >>> error generated Error: ```UnboundLocalError:cannot access local variable 'current_action' where it is not associated with a value``` This issue arises because in line [1] of the code, the variable `current_action` is assigned a value inside an `if-elif` block based on `action.type`. However, since the `Physical Inventory` page does not have any associated action, the variable `current_action is` never set. Consequently, attempting to access this variable results in an error. This commit fixes the above issue by initializing the `current_action` variable as `None` outside the `if-elif` block and adding handling for cases when `current_action` is `None`. [1] - https://github.com/odoo/enterprise/blob/2ea15cc9c7c5f114b3786b256c64e269b3e3a313/ai/models/ai_agent.py#L750-L755 sentry-6913801088
Product pages now keep the selected image crop shape when shoppers open the zoom-on-click image carousel. This prevents thumbnails from unexpectedly appearing square, giving stores a more consistent and polished product display.
Original PR description
Steps ----- 1. Open a product page in eCommerce; 2. open the editor; 3. change the auto-crop setting to a non-default value; 4. enable zoom-on-click; 5. save & click to zoom. Issue ----- The thumbnails use a square aspect ratio. Cause ----- Their aspect ratio is hardcoded to be '1/1'. Solution -------- 1. When instantiating the `ProductImageViewer` dialog, get the aspect ratio used by `.oe_website_sale`, and propagate it into a class name. 2. Use the CSS rules introduced by 670b1daa2254d to apply the correct aspect ratio based on the class name. opw-4908881
This fix prevents an error when users edit a spreadsheet list and set the Medium field matching in the Sales dashboard. It improves reliability for dashboard editing by avoiding an invalid filter update that caused a traceback.
Original PR description
Steps to reproduce (in enterprise): 1. Open the Sales dashboard 2. Edit the first list 3. Try to set the "Medium" field matching => Traceback The test is in enterprise as the issue is triggered only by editing the spreadsheet. Task: 5101093 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
Fixes an issue where a manually adjusted delivery date on an invoice could be overwritten after changing product quantities and confirming the invoice. This preserves user-entered delivery information and helps keep invoicing and delivery records accurate.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have a sale order with deliverable products & no payment terms; 2. confirm order & validate delivery; 3. create an invoice; 4. modify the delivery date; 5.…
Versions -------- - 17.0+ Steps ----- 1. Have a sale order with deliverable products & no payment terms; 2. confirm order & validate delivery; 3. create an invoice; 4. modify the delivery date; 5. save changes; 6. change product quantity of a line & confirm invoice. Issue ----- The delivery date got reset. Cause ----- The `_compute_show_delivery_date` method gets called, which triggers the recomputation of the `_compute_delivery_date` due it the latter having `line_ids.sale_line_ids.order_id` as its `depends`. Due to the way how `depends` works, if any of the fields in the record chain gets modified, the compute gets triggered. In this case, because we modified a `line_ids` record by changing the quantity, it will therefore recompute the delivery date, overwriting the custom value. Solution -------- As we only want the delivery date to be recomputed when the `effective_date` on the order changes, we should add it to the `depends` to trigger the compute in that scenario. In other scenarios, e.g. modifying the move or one of its lines, we don't want to trigger a recompute, which we can achieve by always including `delivery_date` via `_get_protected_vals` on create/write. opw-4996654 Forward-Port-Of: odoo/odoo#229932 Forward-Port-Of: odoo/odoo#223946
A test was added to ensure editing a Sales dashboard list no longer triggers an error when selecting the Medium field matching. This helps protect dashboard editing from regressions and supports a smoother reporting experience.
Original PR description
Steps to reproduce: 1. Open the Sales dashboard 2. Edit the first list 3. Try to set the "Medium" field matching => Traceback This commit contains only the test as the fix is in the community PR. Task: 5101093
This fixes inconsistent line breaks on IoT printer status receipts. The change makes printed status information easier to read and more predictable for users checking printer output.
Original PR description
This PR makes the newlines the same after every line on the status receipt
Point of Sale receipts now show preset information, such as customer addresses or time slots, centered in the receipt header. This makes printed receipts look cleaner and more consistent for customers.
Original PR description
We now want to center preset infos on receipt header (customer address or time slot) in POS. task-id: 5048706 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226831
This update restores a missing setup link for Spanish reports that was accidentally left out during a previous code update. It helps ensure the Spanish reporting module loads all required components correctly, reducing the risk of reporting setup issues.
Original PR description
Little oopsie while fw-porting https://github.com/odoo/enterprise/pull/96106
This fixes an issue in the Resource module where work time rate searches could behave incorrectly after a recent refactor. The correction helps prevent related automated checks or scheduling calculations from failing, keeping resource planning more reliable.
Original PR description
The `_search_work_time_rate` implimination was missed up on refactor at odoo/odoo#219608 runbot error: 231181 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue in bank reconciliation where an exchange difference entry could be linked to the wrong selected line when multiple lines were reconciled together. The change helps ensure foreign currency reconciliation records are matched accurately, reducing accounting discrepancies.
Original PR description
When selecting multiple lines in the bank rec widget (reconcile button), it could happen that one of those lines have a exchange diff move linked to it. In this case, the exchange move id was placed on the first line all the time which could be wrong. This commit will change the use of indexes to use the reconciled line of the exchange diff move. no task id Forward-Port-Of: odoo/enterprise#94160
Field service project settings now show the correct label for the timesheet product when a customer is selected. This avoids confusion by preventing the sales order line label from appearing in the wrong place.
Original PR description
Steps to reproduce: - Install the `industry_fsm_sale` module. - Open the FSM app. - Go to Projects. - Open a project’s settings. - Select a customer. Issue: The label for the timesheet product is not displayed. Instead, the label for the sale order line appears on FSM projects. Cause: In the PR, https://github.com/odoo/odoo/pull/128967 changed the project settings form structure by wrapping `sale_line_id` in a `div` and separating its label, breaking the xpath for `timesheet_product_id`. Fix: - Update the XPath for `timesheet_product_id` to target the correct container. - Hide the `sale_line_id` label on FSM projects. task-4581748 Forward-Port-Of: odoo/enterprise#96022
Bank reconciliation now links exchange difference entries to the correct selected line instead of always using the first line. This prevents incorrect accounting references when reconciling multiple bank lines at once, improving accuracy for multi-currency transactions.
Original PR description
When selecting multiple lines in the bank rec widget (reconcile button), it could happen that one of those lines have a exchange diff move linked to it. In this case, the exchange move id was placed on the first line all the time which could be wrong. This commit will change the use of indexes to use the reconciled line of the exchange diff move. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226034
The ESG module's demo data was adjusted so it no longer depends on accounting records tied to a specific country setup. This prevents installation errors when businesses use another fiscal localization, such as India, and helps new databases load demo data successfully.
Original PR description
**Note: issue not reproducible in runbot, but in fresh database** **Step to reproduce:** - in fresh database, install esg module - go to setting > invoicing > add india as Fiscal Localization -…
**Note: issue not reproducible in runbot, but in fresh database**
**Step to reproduce:**
- in fresh database, install esg module
- go to setting > invoicing > add india as Fiscal Localization
- change company name, ex "test"
- goto setting > load demo data
**Observation:**
- You will receive traceback
```
raise ParseError('while parsing %s:%s, somewhere inside\n%s' % (
odoo.tools.convert.ParseError: while parsing /home/odoo/odoo/codebase/enterprise/saas-18.4/esg/demo/demo_data.xml:567, somewhere inside
<record id="esg_emission_factor_line_assignation_4" model="esg.assignation.line">
<field name="esg_emission_factor_id" ref="esg_zero_emission_factor"/>
<field name="account_id" model="account.account" search="[('code', '=', '630000')]"/>
</record>
2025-09-11 08:45:07,458 82617 INFO esg184 odoo.addons.base.models.ir_module: module esg: no translation for language en_IN
2025-09-11 08:45:07,479 82617 ERROR esg184 odoo.sql_db: bad query: b'INSERT INTO "esg_activity_type_esg_emission_factor_rel" ("esg_emission_factor_id", "esg_activity_type_id") VALUES (1, 2) ON CONFLICT DO NOTHING'
ERROR: insert or update on table "esg_activity_type_esg_emission_factor_rel" violates foreign key constraint "esg_activity_type_esg_emission_fact_esg_emission_factor_id_fkey"
DETAIL: Key (esg_emission_factor_id)=(1) is not present in table "esg_emission_factor".
```
**Cause:**
- The demo data relies on few account.account record which belong to [USA company](https://github.com/odoo/odoo/blob/9805d09dff64de835de0c764da8c6e213d6b88aa/addons/account/data/template/account.account-generic_coa.csv#L38)
https://github.com/odoo/enterprise/blob/b8a20b02e27322d0db5781f8d84946e54bbcbf03/esg/demo/demo_data.xml#L569
https://github.com/odoo/enterprise/blob/b8a20b02e27322d0db5781f8d84946e54bbcbf03/esg/demo/demo_data.xml#L620-L628
- when we installed `india` Localization and changed the company name, USA company could not be created when loading demo data and hence the account records were not created, causing traceback
**Fix:**
- make demo data independent of any localization
opw-5048417
Forward-Port-Of: odoo/enterprise#94540The sales planning test now avoids selecting the current day when that day is not a working day. This prevents false test failures and helps keep delivery checks stable without changing customer-facing behavior.
Original PR description
Before this commit, the tour was failing on non-working days as the focused day was the current date. This commit removes the focus on the current date so that only working dates are selected. Additionally, this commit also fixes the formatting issues of the modified file. runbot error 226741 Forward-Port-Of: odoo/enterprise#96239
This fix lets Spanish TicketBAI credit notes be sent even when the original invoice was issued through a previous invoicing system before TicketBAI was adopted. It prevents valid refunds from being blocked while keeping checks for newer invoices that should already be in TicketBAI.
Original PR description
…re starting to use Tbai 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#225938
Fixed an issue that could prevent some upgrades from completing when timesheet attendance reporting data was processed. The change ensures the report query uses the correct employee reference, avoiding a database comparison error.
Original PR description
In the affected query, the variable "employee_id" is undefined in the scope where it is used. This leads postgres to interpret it as a variable with default type VARCHAR and to the impossibility to compare it against an integer. We just qualify the variable name so it now works as expected. Failing upgrade requests: [3103245](https://upgrade.odoo.com/odoo/request/3103245) [3121291](https://upgrade.odoo.com/odoo/request/3121291) Fixes https://github.com/odoo/odoo/pull/192434/commits/c97ecfa7fc091f763329af589b69db2292931163 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228580 Forward-Port-Of: odoo/odoo#225401
This fixes small visual issues in Odoo Mail where some thread action buttons appeared too tall and mobile messaging menu text was misaligned. The mail interface now looks more consistent and polished for users, especially on mobile devices.
Original PR description
Current behavior before PR: 1. Since [1], in thread actions like `Mark all read` and `Unstar all`, buttons had extra height because aspect-ratio was applied even when there was no icon, making the UI…
Current behavior before PR: 1. Since [1], in thread actions like `Mark all read` and `Unstar all`, buttons had extra height because aspect-ratio was applied even when there was no icon, making the UI look uneven. 2. Since [2], text in the messaging menu tab in mobile was not centered, leading to misaligned UI. Desired behavior after PR is merged: - Aspect-ratio is applied only if an icon exists in the action button, fixing the height issue. - Added a class to center text in the messaging menu tab, improving visual alignment. [1]: https://github.com/odoo/odoo/pull/225216 [2]: https://github.com/odoo/odoo/pull/228657 Task-5145022 1. Before/ After <div style="display: flex;"> <img style="margin-right: 10%;" height="145" alt="image" src="https://github.com/user-attachments/assets/a9fcffdc-5e56-454f-882a-dc5296decd47" /> <img height="136"style="margin-right: 10%;" alt="image" src="https://github.com/user-attachments/assets/105ce999-4e15-4c67-9b62-01c666c6fc2d" /> </div> 2. Before/ After <img width="691" height="114" alt="image" src="https://github.com/user-attachments/assets/6aa4965c-a34f-4058-bdb9-4d91f4ac9146" /> <img width="688" height="94" alt="image" src="https://github.com/user-attachments/assets/ce110144-9314-4b2f-aa30-bf12b7ecf1ec" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Manufacturing orders for products that include variant-specific kit components now correctly include the matching kit operations, such as the right color-related work step. This prevents missing shop floor instructions when a final product uses a specific kit variant.
Original PR description
### Steps to reproduct: - Create 2 products: Final Product (FP), Kit Product (KP) - On KP add a Color attribute with 2 values: Blue, Red - Create a KIT bom for KP wtih 2 operations: - OP: paint it…
### Steps to reproduct:
- Create 2 products: Final Product (FP), Kit Product (KP)
- On KP add a Color attribute with 2 values: Blue, Red
- Create a KIT bom for KP wtih 2 operations:
- OP: paint it Blue, apply on Color: Blue
- OP: paint it Red, apply on Color: Red
- Create a bom for FP with only one component line:
- 1 x Red Kit Product
- Create a MO for 1 unit of FP
#### > The operation was not created using the kit bom
### Cause of the issue:
Even if the bom exploded to find the operations to add on the MO: https://github.com/odoo/odoo/blob/2dfcbe53c80d2d8fe5b6d9828eea90a1d214c2e4/addons/mrp/models/mrp_production.py#L579-L599 The `_skip_operation_line`:
https://github.com/odoo/odoo/blob/2dfcbe53c80d2d8fe5b6d9828eea90a1d214c2e4/addons/mrp/models/mrp_routing.py#L164-L174 is checking if the product of the main bom has the attributes of the operation rather than the kit product used as component.
opw-5080856
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#229810
Forward-Port-Of: odoo/odoo#228032The payroll document generation process now skips payslips when the related employee contact is missing. This prevents scheduled payroll PDF generation from failing and helps keep automated payroll document handling running smoothly.
Original PR description
Currently an error occurs when the **'Payroll: Generate pdfs'** scheduled action runs and tries to create a document for a payslip belonging to an employee who does not have a related partner.…
Currently an error occurs when the **'Payroll: Generate pdfs'** scheduled action runs and tries to create a document for a payslip belonging to an employee who does not have a related partner. **Prerequisites:** - Ensure HR is enabled in `settings>Documents` **Steps to Reproduce:** 1) Install `documents_hr_payroll` module.(with Demo) 2) Navigate to the Employees App. 3) Select any Employee(e.g Abigail Peterson) and open form view. >- click on **contacts** smart button. >- Delete that Record 4) Create a confirmed Payslip for the selected Employee(e.g Abigail Peterson). 5) Activate Developer mode and navigate to schedule Actions. >- Search for 'Payroll: Generate pdfs'. >- Run Manually. Error: `NotNullViolation: null value in column 'partner_id' of relation 'documents_access' violates not-null constraint` Root Cause: When the partner is deleted, the value received from `_get_document_partner` at [1] is `False`, which later on tries to create the `documents.access` record for the new document, it fails because no partner is available to assign access rights, resulting in the error. Solution: This commit prevent Error by ensuring `_check_create_documents` method doesn't allow document creation without valid partner. [1]: https://github.com/odoo/enterprise/blob/99a8d83edb42f172d0dd35c91743fa0c9653dcbb/documents_hr_payroll/models/hr_payslip.py#L20C1-L21 sentry-6814524392 Forward-Port-Of: odoo/enterprise#96191 Forward-Port-Of: odoo/enterprise#92865
This fixes an automated mail test by clicking the enabled button instead of relying on the Enter key, which could behave inconsistently depending on focus timing. The change helps keep validation runs stable and reduces false failures without changing customer-facing functionality.
Original PR description
Pressing Enter is prone to race conditions as it requires the proper element to have the focus at the right time. Clicking on the button directly when it is enabled should be preferred. https://runbot.odoo.com/odoo/runbot.build.error/233169 Forward-Port-Of: odoo/odoo#229872
Chilean electronic delivery guide XML now shows the quantity actually delivered instead of the quantity originally requested. This prevents overstated quantities when partial deliveries are validated without a backorder, improving document accuracy and compliance.
Original PR description
**Issue** When the delivered quantity of a product is less than the originally demanded quantity, the generated Delivery Guide XML shows the demand (product_uom_qty) instead of the actual delivered…
**Issue** When the delivered quantity of a product is less than the originally demanded quantity, the generated Delivery Guide XML shows the demand (product_uom_qty) instead of the actual delivered quantity (quantity). This results in an incorrect quantity being displayed in the DTE. **Steps to Reproduce** 1. Install the Accounting module, Chilean localization, Sales module, and l10n_cl_edi_stock. 2. Create and confirm a new Sale Order. 3. Click on the Delivery smart button. 4. Adjust the delivered quantity to a value lower than the demand, save, and validate with no backorder. 5. Generate the Delivery Guide. 6. Open the generated DTE XML and observe that the quantity is incorrect. **Root Cause** The quantity displayed in the DTE is taken from product_uom_qty, which represents the planned quantity to be moved, not the actual delivered quantity. The correct field to use is quantity, which reflects the real delivered amount. **Fix** Change the XML output to use quantity instead of product_uom_qty to accurately reflect the actual delivered quantity in the DTE. Opw-4892276 Forward-Port-Of: odoo/enterprise#93260 Forward-Port-Of: odoo/enterprise#89633
When a subcontracted purchase receipt quantity is reduced, Odoo now keeps one manufacturing order open as long as the receipt process is still active. This prevents the workflow from getting stuck and allows later receipt quantity updates to continue correctly.
Original PR description
Steps to reproduce: - Unarchive subcontracting operation type - Create a storable product P1 with a BoM: - BoM type: Subcontracting - Subcontractor: Azure Interior - Component C1 (route: Resupply…
Steps to reproduce:
- Unarchive subcontracting operation type
- Create a storable product P1 with a BoM:
- BoM type: Subcontracting
- Subcontractor: Azure Interior
- Component C1 (route: Resupply Subcontractor on Order)
- Create a purchase order:
- Vendor: Azure Interior
- 10 units of P1
- Confirm the PO → 2 pickings are created:
- Resupply of 10 units of C1
- Receipt of 10 units of P1
- Confirm and validate the resupply of C1
- Components are reserved in the subcontracting MO
- Validate the consumption of 10 units in the receipt
- The MO is updated to 10
- Update the quantity of P1 to 0 in the receipt
Issue:
The manufacturing order is cancelled. As a result, subsequent updates on the receipt cannot recreate MOs.
Fix:
When reducing the receipt quantity, cancel only the extra MOs, but always keep at least one open MO if a subcontracting move is still ongoing.
opw-4792379
Forward-Port-Of: odoo/odoo#225236
Forward-Port-Of: odoo/odoo#223858Customers who quickly use the browser back button after starting an express checkout payment can now try paying again without hitting an error. This prevents a failed checkout flow when the cart has already been converted into an order, improving reliability during payment retries.
Original PR description
This error occurs when trying to make a payment again from the cart. Steps to reproduce: --- - Install the **website_sale** module (with demo) - Activate **Demo** payment provider - Go to Website > Shop > Add a **Warranty** product to Cart > View cart - Pay with Demo > Pay - Click the back button(chrome navbar)(Instantly) - Now again Pay with Demo > Pay Traceback: --- `ValueError: Expected singleton: sale.order()` At [1], this error occurs because **order_sudo** is empty. This happens when there is no product in the cart — typically because, upon clicking **Pay**, a sale order is created for the product, and when the user navigates back, the cart is empty. [1]- https://github.com/odoo/odoo/blob/125fc3028debb311e9f6ad25d8c46699b77525f0/addons/website_sale/controllers/main.py#L1307-L1312 sentry-5682671428 Forward-Port-Of: odoo/odoo#229858
Partner ledger initial balances now include reconciled accounting lines that do not have a partner assigned. This prevents mismatches between opening balances and totals when reviewing reports across different financial periods.
Original PR description
### Issue: The partner ledger does consider lines without partners when calculating the initial balance. ### Steps to reproduce: - Create an invoice in 2025 - Create an entry in 2025 without partner…
### Issue: The partner ledger does consider lines without partners when calculating the initial balance. ### Steps to reproduce: - Create an invoice in 2025 - Create an entry in 2025 without partner for the same amount - Reconcile the two - Open the partner ledger for 2025, everything is correct - Change the dates to 2026, the amount of the initial balance ignores the entry but not the totals ### Cause: The method `_get_sums_without_partner` is called for the totals, but not for the initial balance. Its purpose is to add the amounts of the lines without partners that were reconciled with lines with a partner. ### Solution: Call `_get_sums_without_partner()` in `_get_initial_balance_values()` add the results before returning the initial balances. As this is the same logic as `_query_partners()` we create a new method. This method needs to be called with the dates of the initial balance in the options. So we create a duplicate of the options and input the new dates options. opw-5068790 Forward-Port-Of: odoo/enterprise#96125 Forward-Port-Of: odoo/enterprise#95881
Exporting a Belgian 325 PDF without any generated 281.50 forms now shows a clear user message instead of a server error. This helps users understand they need to record a transaction with a 281.50 tag before generating the PDF, while keeping normal PDF and ZIP exports unchanged when data exists.
Original PR description
### Problem When clicking **"Export PDF"** on a 325 form that has **no generated 281.50 forms**, Odoo raised a **server error**: This happened because the method assumed that at least one attachment…
### Problem When clicking **"Export PDF"** on a 325 form that has **no generated 281.50 forms**, Odoo raised a **server error**: This happened because the method assumed that at least one attachment would always be generated, even if no eligible transactions were present. --- ### Steps to Reproduce 1. Go to **Accounting → Reporting → 325 Form**. 2. Create a 325 form for a year without any transactions on accounts tagged with **281.50**. 3. Do not generate any 281.50 forms (`form_281_50_ids` is empty). 4. Click **Export PDF**. **Result before fix:** - Crash with `IndexError: list index out of range`. --- ### Solution - Added a safeguard check before accessing attachments. - If no attachments exist, raise a **UserError** instead of crashing. **New behavior:** > *“No 281.50 lines found to generate a PDF. Please record a transaction with a 281.50 tag first.”* This gives users a instruction on how to resolve the issue. --- ### Result After Fix - **User error message** replaces traceback. - **Normal behavior preserved** when attachments exist: - One file → direct download. - Multiple files → zipped download. --- task-5090120 Forward-Port-Of: odoo/enterprise#94877
This fix ensures the cohort view's tests reflect updated behavior when users change languages. It helps confirm that actions and breadcrumbs reload correctly, keeping navigation labels consistent with the selected language.
Original PR description
This commit adapts a cohort test w.r.t. the changes done in odoo/odoo#230046.
Fixes an issue where exporting the Belgian EC Sales List XML from the VAT Return page could omit the month or quarter when no period was manually selected. The export now uses the company’s tax period settings, helping ensure Belgian tax reporting files are complete and consistent.
Original PR description
**Issue** When accessing the EC Sales List report via the smart button from the VAT Return page, downloading the XML without explicitly selecting a period omits the <Month> element—even though a…
**Issue** When accessing the EC Sales List report via the smart button from the VAT Return page, downloading the XML without explicitly selecting a period omits the <Month> element—even though a month is visibly preselected. **Steps to Reproduce** 1. Install the Accounting module and Belgium localization. 2. Go to the Accounting dashboard. 3. Open the VAT Return via the "Miscellaneous Operations" section. 4. Click the smart button to access the EC Sales List report. 5. Use the gear icon to export the XML. 6. Observe that the XML <Period> section only includes the <Year>—the <Month> is missing. **Root Cause** If no period is explicitly selected, the report uses a period_type of "tax_period". However, this value was not handled when generating the XML, so the logic to include the \<Month> or \<Quarter> elements skipped it. As a result, only the \<Year>, which is always included, was rendered. **Fix** Extend the handling of tax_period to derive the period from the company’s tax periodicity settings and adjust the filter accordingly. This ensures that the generated XML always includes the \<Month> or \<Quarter> element, in addition to \<Year>, whenever the report is based on a tax period. Opw-4702613 Forward-Port-Of: odoo/enterprise#93647 Forward-Port-Of: odoo/enterprise#89290
The AI live chat website block now behaves more consistently with website themes and during page editing. The update improves readability, accessibility, layout, and fullscreen behavior, creating a smoother experience for visitors and website editors.
Original PR description
Resolve theme options compatibility, editing behavior, accessibility and design problems affecting UX and standards compliance. Adherence to theme options: - Apply border-radius correctly to target…
Resolve theme options compatibility, editing behavior, accessibility and design problems affecting UX and standards compliance. Adherence to theme options: - Apply border-radius correctly to target elements - Fix bg-color applying to text-area instead of intended container Edition: - Remove resize/style options on the column since these are not retained on save - Fix the preview that mismatch with actual rendered result - Resolve title/form misalignment in edit mode - Ensure "OR" text readability across different background colors - Preserve container size when the "fullscreen" feature is activated Accessibility: - Add missing focus state for form fields - Add role="presentation" to icons - Add role="button" to anchor tags functioning as buttons Design: - Reduce oversized title font size - Adjust container width on xl and xxl breakpoints - Smooth fullscreen transition to prevent abrupt activation | 19.0 | this PR | |--------|--------| | <img width="1092" height="424" alt="image" src="https://github.com/user-attachments/assets/5cd85204-b9af-4810-9458-c4c96dad562d" /> | <img width="1083" height="409" alt="image" src="https://github.com/user-attachments/assets/b83f2d18-0135-4f5d-b420-11f58070c8a3" /> | task-5089787
This fix prevents rare crashes when users quickly interact with website builder options that reload the editor, such as product page image layout settings. It improves the reliability of editing product pages and strengthens automated tests so the issue is caught consistently.
Original PR description
*: website_sale __Current behavior before commit:__ Some builder actions (e.g `ProductPageImageLayoutAction`) reload the editor after being applied. If another button in the builder is pressed…
*: website_sale __Current behavior before commit:__ Some builder actions (e.g `ProductPageImageLayoutAction`) reload the editor after being applied. If another button in the builder is pressed rapidly, `refreshCurrentItem` might be called after the editor is destroyed leading to the following error in [`isApplied`]: `TypeError: Cannot read properties of undefined (reading 'getAction')`. The "Product page options" test fails in rare occasion due to this issue. __Description of the fix:__ - Add a safety guard to make sure the editor is not destroyed before calling `refreshCurrentItem`. - Add some checks at the end of the test in order for the crash to appear consistently (if the fix is not applied). - Make the test more robust (some code is backported from [this commit]). [this commit]: https://github.com/odoo/odoo/commit/670b1daa2254d76 [`isApplied`]: https://github.com/odoo/odoo/blob/f258b263136f606f7896/addons/html_builder/static/src/core/utils.js#L939 Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/232649 Forward-Port-Of: odoo/odoo#227739
SEPA Direct Debit payments are now found correctly during processing after an earlier system change affected how transactions are searched. This helps prevent payment processing failures for customers using SEPA Direct Debit.
Original PR description
After commit 772d8a6f2e66b13f352b56621912e33e7edcccc2,transaction search was changed to rely only on `provider_code`, instead of `custom_mode`. However, the `sepa_direct_debit` logic was not updated accordingly, resulting in transactions no longer being found. This commit adapts the code to the new search logic by using `provider_code` for transaction lookup.
This fixes a display issue where the ChatGPT plugin chat window could appear behind a modal window, making it unusable. The chat dialog now appears in front as expected, so users can continue interacting with it without interruption.
Original PR description
This PR fixes an issue with the chatgpt plugin where the chat window was rendered beneath the modal, making it unusable. The fix modifies the z-index of modal windows when the `openDialog` function of the chatgpt plugin is called. Forward-Port-Of: odoo/enterprise#94909
This fix ensures highlighted text effects appear correctly when users preview and create new website pages from templates. It prevents preview-only highlight markup from being copied into the final page, helping published pages keep the intended visual design.
Original PR description
Starting from [1], the code from the "Snippets Preview" and the "New Page Templates Preview" was adapted to be able to build a highlight using its simplified format when provided in XML. The goal of this PR is to fix the new page DOM when a template with highlights is selected. The DOM will be simply cloned and used for the created page, so we need to reset the inner highlights to their minimal format. [1]: https://github.com/odoo/odoo/commit/4a29fa66003ce1f42a7011bc56fc019f34a887f5 task-4215788 Forward-Port-Of: odoo/odoo#185820
This change ensures the web tour testing tools are loaded automatically when unit tests run. It reduces test setup complexity and helps prevent avoidable test failures, with no expected impact on regular users.
Original PR description
In this commit, we add the appropriate bundles in assets_unit_test. These bundles will only be loaded if we run unit tests (i.e. in debug mode). As a result, we no longer need to run preloadbundle in unit tests. 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
Cancelled manufacturing work orders in backorder flows no longer receive an expected duration as if work had been performed. This prevents inflated or inconsistent manufacturing cost calculations when production is split into backorders.
Original PR description
### Issue: In this bug, the workorder duration being set to duration_expected is causing issues in backorder. To reproduce: 1- Create a Bill of Materials with at least two operations at two work…
### Issue: In this bug, the workorder duration being set to duration_expected is causing issues in backorder. To reproduce: 1- Create a Bill of Materials with at least two operations at two work centers 2- Create a manufacturing order and confirm it. 3- Complete the first operation and edit the quantity on the second operation so there is a backorder for the remaining quantity. 4- In the second work order, the first operation is cancelled, Finish the 2nd operation 5- As you can see, the cancelled operation duration is set to expected duration which is wrong. ### Cause: This issue is caused because of: https://github.com/odoo/odoo/blob/8f0e40286da7b144bfa17880a257406dd8585e57/addons/mrp/models/mrp_production.py#L1774-L1779 Which if work.order.state is `cancel`, the duration will set to `duration_expected`. This will eventually cause issue here: https://github.com/odoo/odoo/pull/222075/commits/8f0e40286da7b144bfa17880a257406dd8585e57#diff-fac872ffb03b811c4976eb2e52991ec544265332df814d92cfda658a5b917423L348 which is fixed by not making the state into `progres` if the state is `cancel`. But that doesn't fix the fact that the cancelled workorder has duration set and it might cause inconsistencies in manufacturing costs. related: #222075 opw-4931653 Forward-Port-Of: odoo/odoo#229975 Forward-Port-Of: odoo/odoo#229742
Changing the interface language now refreshes saved navigation state so breadcrumbs and restored pages appear in the new language. This prevents users from seeing outdated translated labels after reloading, creating a more consistent multilingual experience.
Original PR description
Before this commit, when changing lang, the breacrumbs was still displayed in the former language after the reload (and it persisted even if the user reloaded again). This was due to the fact that we store in the session storage the current action and state, so we can restore it and avoid some rpcs at reload. This commit fixes the issue by detecting the lang change and clearing the session storage in that case. closes #230032 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
The base module test for translation export was simplified so it no longer starts a full Odoo instance. This makes automated checks faster and more dependable, reducing false failures in the development pipeline.
Original PR description
Spawning an Odoo instance goes beyond testing the i18n command. We just need to see if given the right command, something gets actually exported. So, we got rid of all complexity, and just avoided subprocessing, wiring directly to the command itself, in the current process. This removes timeout problems and a lot of undeterminism. [link](https://runbot.odoo.com/odoo/error/227540) runbot-227540 Forward-Port-Of: odoo/odoo#229755
The reception report now keeps existing warehouse stock reservations intact when users unassign and reassign incoming items to an order. This prevents sales deliveries from showing missing availability even when stock is actually present.
Original PR description
### Issue: #### Steps to reproduce: 1- Activate routes & locations and enable Reception Report 2- Enable Show reception report at validation from operation type: receipts 3- Create a product with…
### Issue: #### Steps to reproduce: 1- Activate routes & locations and enable Reception Report 2- Enable Show reception report at validation from operation type: receipts 3- Create a product with vendor. Put 2 unit on `WH/Stock/Shelf1` 4- Create a Sales Order for 3 units. 5- Create a PO for 1 unit and validate/receive. 6- On the Reception Report, click Assign to link incoming to sales pick 7- Open the sales pick in a new tab, observe there are 2 moves which first one is 1 and 2nd one is 2 8- On the reception report, click Unassign, then Assign again Back on the Pick, only 1 move (the one with quantity of 2) is reserved; checking availability reserves nothing although stock exists. #### Cause: When unassigning from the Reception Report, the system incorrectly unreserves stock that was already in `Shelf1` instead of unreserving the incoming move which the location_id is `WH/Stock`: User clicks Unassign on the Reception Report. `report_stock_reception.action_unassign()` is invoked. That calls `stock_move._do_unreserve()`. `_do_unreserve()` unpicks quants referenced by the `move.move_line_ids`. At this moment one of the `move_line_ids` points to `WH/Stock/Shelf1`, so `_do_unreserve()` removes the reservation from that `shelf1` quant. Consequence: `shelf1` stock(which should have remained reserved) becomes free. The receipt quant at `WH/Stock` remains reserved/ unavailable. When the user clicks Assign again, the system cannot reserve because it is alreade reserved by another move and therefore it is unavailable. #### Root cause: Now we look earlier in the flow to see why the move had a move_line pointing to `WH/Stock/Shelf1` in the first place. Earlier, in `report_stock_reception.action_assign` in the first assign: We create a new move from current outgoing move: https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/report/report_stock_reception.py#L224-L231 And we link current move_lines to the new move: https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/report/report_stock_reception.py#L245-L259 new_out.move_line_ids now contains move lines for multiple source locations, here in our case `[WH/Stock/Shelf1, WH/Stock]` The loop in above code does not check `move_line_id.location_id` when selecting lines. The first matching line in the iteration can be the `shelf1` one, so the code links the `shelf1` move_line to out instead of the `WH/Stock` move_line, which is a mismatch and causes the out move having different location with its move_line, which later will going to cause problem is unassign as explained. ### Fix: We can sort move_line_ids in a way that which line have the same location as potential ins' dest locations come first as better candidates: ```diff - for move_line_id in new_out.move_line_ids: + matching_locations = potential_ins.location_dest_id + for move_line_id in new_out.move_line_ids.sorted(lambda ml: ml.location_id not in matching_locations): ``` opw-4944047 Forward-Port-Of: odoo/odoo#229954 Forward-Port-Of: odoo/odoo#226120
When an invoice sent by post is deleted, its related Snailmail letter is now removed too. This prevents the scheduled letter-processing task from crashing on missing invoice records, keeping postal invoice handling reliable.
Original PR description
When an account move linked to a snailmail letter is deleted, the cron ``Snailmail: process letters queue`` crashes with a traceback. Steps to reproduce the error: - Create a new invoice > Confirm > Send > Select ``By post`` > Send - Reset to Draft > Delete the invoice - Run the cron ``Snailmail: process letters queue`` Traceback: ``` MissingError Record does not exist or has been deleted. (Record: account.move(1,), User: 1) ``` Solution: Ensure that when a move is deleted, its related Snailmail letters are also deleted. sentry-6883768061 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227823
Safari users editing WebP images will no longer see a quality slider that cannot actually change the image. The editor now disables that option when the browser does not support WebP compression and shows a clear message, reducing confusion during website content editing.
Original PR description
Scenario: - select a WebP image in the editor with safari - change the quality with the slider Result: - the size and the image quality don't change Cause: Safari doesn't support HTMLCanvasElement.toDataURL() with WebP, so the image is exported in PNG instead which is lossless and doesn't support compression. Fix: Disable the quality for WebP images if this is not supported (in safari + iOS webview) and display a message. opw-4979378 closes odoo/odoo#224342 X-original-commit: ecc89796f7344d49359b6c378676628d0de2bb80
A Chilean electronic invoicing test now safely skips a demo-only certificate check when demo data is not installed. This prevents avoidable test failures and helps keep validation runs consistent across different setups.
Original PR description
The test `test_demo_certificate_serial_number` failed when running without demo data, since the XMLID `l10n_cl_edi.l10n_cl_demo_certificate` is only present in demo mode. This commit updates the test to use `raise_if_not_found=False` and skip gracefully when the demo certificate is not available. The assertion now only runs if the certificate exists, ensuring the test passes consistently both with and without demo data. [RB-231573](https://runbot.odoo.com/odoo/error/231573) Forward-Port-Of: odoo/enterprise#95917
The analytic distribution widget now filters analytic accounts by the document's company. This prevents users from seeing or choosing accounts from other companies, supporting proper multi-company data separation.
Original PR description
**Description of the issue/feature this PR addresses:** When creating or editing an analytic distribution, the analytic account selection does not respect the company context. This allows users to…
**Description of the issue/feature this PR addresses:** When creating or editing an analytic distribution, the analytic account selection does not respect the company context. This allows users to see and select analytic accounts from other companies, which violates the multi-company record rules. <img width="669" height="333" alt="2025-09-08_09-28" src="https://github.com/user-attachments/assets/488eb4b1-fdfa-49ca-a57e-8f46a264107d" /> **Current behavior before PR:** The analytic account dropdown in the analytic distribution widget shows analytic accounts from all companies, instead of being restricted to the current company. **Desired behavior after PR is merged:** The analytic account selection in the analytic distribution widget is filtered by company. Only analytic accounts belonging to the document company will be displayed, ensuring compliance with multi-company record rules. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228935 Forward-Port-Of: odoo/odoo#225835
Code cleanup and technical improvements
This update renames an internal color picker setting so its purpose is clearer to developers. It does not change how users interact with the editor, but it helps reduce confusion and future maintenance risk in website editing tools.
Original PR description
*: html_builder, web. When this prop was added in this [commit], it was named themeColorPrefix, which does not reflect its purpose properly. It could mistakenly be taken as a prop for the theme tab of the color picker, when actually it's a prefix CSS variable names used to display colors correctly. [commit]: https://github.com/odoo/odoo/commit/62bdb31587f2586d6d45f53d264e193028b3c860
Documentation and clarification updates
A new individual contributor agreement signature was added to the project records. This supports legal clarity around contributions and helps keep the project’s licensing documentation complete.
Original PR description
closes 230023