Daily updates from Odoo
Monday, October 6, 2025
34 changes · saas-18.4
Resolved issues and error corrections
This fix updates the live chat test environment so it includes the same user availability status information as the real server. It helps ensure automated tests better reflect actual behavior, reducing the chance of missed issues in live chat features.
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 an issue where a chat window could open even after the user had already seen the message in Discuss. The messaging frontend now recognizes messages that are already loaded and keeps the notification silent, reducing unnecessary interruptions.
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
Fixes an issue where validating Register Production/Serial in the shop floor could fail when multiple related quality checks existed. This prevents an error message from interrupting manufacturing operators and helps keep production workflows moving smoothly.
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
Scheduled background tasks now refresh their view of the system after an app is uninstalled. This prevents crashes caused by tasks trying to use fields from an app that is no longer installed, improving reliability for worker-based deployments.
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#228515This fix prevents Odoo Studio from crashing when a user removes calendar settings such as the color field. Empty values are now handled correctly instead of being mistaken for real field names, making view customization 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
This fix prevents manually adjusted delivery dates on invoices from being reset when invoice line quantities are changed. It helps ensure customer delivery information remains accurate after routine invoice edits.
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
This fix ensures Indian e-invoices report the correct GST rate and amounts for Special Economic Zone, export, and reverse charge sales. It updates tax and fiscal position handling so reported invoice data better matches Indian GST e-invoicing rules and reduces the risk of incorrect filings.
Original PR description
[FIX] l10n_in{,_edi}: Sale RCM and SEZ(With LUT) Steps to reproduce: 1. Install `l10n_in_edi` 2. Create an invoice with a RC tax/SEZ (with LUT) tax 3. Confirm and Process for E-invoice 4. See the EDI…
[FIX] l10n_in{,_edi}: Sale RCM and SEZ(With LUT)
Steps to reproduce:
1. Install `l10n_in_edi`
2. Create an invoice with a RC tax/SEZ (with LUT) tax
3. Confirm and Process for E-invoice
4. See the EDI content, The GST rate is 0%
Before this
For RC and SEZ (with LUT) the tax rate and tax amount were sent
as `0` and (data going wrong for SEZ/Exports) for Indian E-invoicing.
Following the fix:
1. We rename the the IGST x% (SZ/EX) -> IGST x% (EX)
2. Introducing new taxes for SEZ with LUT
3. Fiscal for Export and SEZ renamed to Export (same for LUT)
4. Introducing new fiscal for SEZ and SEZ (LUT)
5. In case of Special Economic Zone normal taxes (IGST) should be applied
because as per the [API Doc](https://einv-apisandbox.nic.in/version1.03/generate-irn.html#validations)
It states -
**However, in case of Reverse charge and Export transactions (EXPWP), Total value of Item can match with either with tax values or without tax values. That is, the total value of item can include or exclude the tax values as per the business requirements.**
So SEZ without LUT should be passed as normal IGST
For Export without LUT
Label | Taxes | credit | debit| Tags
-------------------------------------------------------------------------------------------------------------
Product A | 18% IGST S (EX) | 100 | | Base IGST
IGST 18% | | 18 | | IGST
IGST Paid on SEZ/Export Sales | | | 18|
Creditor | | | 180|
Invoice Total 100
EDI with {'rate': 18.0, 'IgstAmt': 18.0, 'TotItemVal': 100}
For SEZ without LUT
Label | Taxes | credit | debit | Tags
-----------------------------------------------------------
Product A | 18% IGST S (SEZ) | 100 | | Base IGST
IGST 18% | | 18 | | IGST
Creditor | | | 118|
Invoice Total 118
EDI with {'rate': 18.0, 'IgstAmt': 18.0, 'TotItemVal': 118}
For Export/SEZ with LUT
Label | Taxes | credit | debit | Tags
-----------------------------------------------------------
Product A | 18% IGST S (SEZ) | 100 | | Base IGST
IGST 18% | | 18 | | IGST
IGST 18% | | | 18 | IGST
Creditor | | | 100|
Invoice Total 100
EDI with {'rate': 18.0, 'IgstAmt': 0.0, 'TotItemVal': 100}
For RCM
Label | Taxes | credit | debit | Tags
-------------------------------------------------------------------------------
Product A | 18% IGST S RC | 100 | | Base IGST || BASE IGST RC
IGST 18% RC | | 18 | | IGST
IGST 18% RC | | | 18| IGST RC
Creditor | | | 118|
Invoice Total 100
EDI with {'rate': 18.0, 'IgstAmt': 0, 'TotItemVal': 100}
task-4878805
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#228871
Forward-Port-Of: odoo/odoo#213931This update adds validation for Indian GSTR1 reporting when sales involve reverse charge tax and SEZ transactions with LUT. It helps ensure tax reports remain accurate for these specific compliance scenarios, reducing the risk of incorrect filings.
Original PR description
Adding GSTR1 test case with RCM tax and SEZ (with LUT) see https://github.com/odoo/odoo/pull/213931 Forward-Port-Of: odoo/enterprise#95669 Forward-Port-Of: odoo/enterprise#87486
POS receipts now display preset information, such as customer address or time slot, centered in the receipt header. This improves receipt readability and creates a cleaner, more consistent presentation 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
Fixes an issue in bank reconciliation where exchange difference details could be assigned to the wrong selected line. This helps ensure accounting records stay accurate when reconciling multiple bank lines at once.
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
Fixes an issue where exchange difference entries could be linked to the wrong bank reconciliation line when multiple lines were reconciled together. This helps keep accounting records accurate and prevents confusion in multi-currency reconciliation workflows.
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
This fixes an automated sales planning check that could fail when run on non-working days. The change keeps the test focused on valid working dates, improving reliability without changing user-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 prevents customers from hitting an error when they quickly go back from an express checkout payment and try to pay again from an emptied cart. It improves checkout reliability and avoids a confusing failed payment flow for shoppers.
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
Publishing and sending planning schedules now keeps the filters users applied in the planning view, such as a selected role. This prevents accidentally publishing or notifying about unrelated shifts when the date range is changed.
Original PR description
To reproduce: ============= -Reset all planning.slot to draft -Search "Dev" role -In weekly Gantt view, click on publish & send -Change date to match the current month (or any other period) -Publish Problem: ========= We filter only by datetime and ignore domain from context : https://github.com/odoo/enterprise/blob/20b45f6c65c78a572a3f26b78f6ed458accf7c9f/planning/wizard/planning_send.py#L31-L33 Solution: ========= - Get active domain from context and override only it's date_time since it changed. opw-5017014 Forward-Port-Of: odoo/enterprise#93295
This update prevents hidden spacing markers from being added around icons in the wrong places within website snippets. It helps avoid unwanted formatting or display issues while editing pages that contain icons.
Original PR description
Description of the issue this PR addresses: Commit [1] adds feffs around icons that were descendant of a paragraph-related elements. This caused an issue in some website snippets where icons inside a `div` (dropped within a `p`) also received FEFFs. Though such snippets should not be allowed inside a `p` since they are block-level elements, and this will be addressed separately. In the meantime, this commit ensures that FEFFs are only applied to icons that are direct children of paragraph-related or formatting tags. [1]: https://github.com/odoo/odoo/pull/225994#issue-3396940401 task-5071184 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The ESG module demo data was adjusted so it no longer depends on accounting records tied to a specific country setup. This prevents errors when loading demo data in fresh databases using localizations such as India, making evaluations and demonstrations more reliable.
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 website cookie policy now links to the current Google Analytics 4 cookie information instead of an unavailable legacy page. This helps visitors access accurate privacy information when reviewing analytics cookie usage.
Original PR description
The previous URL for Google Cookie usage pointed to the legacy Universal Analytics page, which is no longer available since July 1, 2024. Steps to reproduce: 1. Go to Website Settings and enable the Cookies Bar. 2. Visit /cookie-policy on the website. 3. Click on the link "Analytics cookies and privacy information." 4. Observe that the page is no longer available. This commit updates the link to point to the current Google Analytics 4 documentation, ensuring users can access the correct cookie policy information. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229594
Fixes an inventory issue where unassigning and reassigning items from the Reception Report could reserve the wrong stock location. This helps ensure sales orders stay correctly linked to available incoming or existing stock, avoiding fulfillment delays and manual corrections.
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#229687 Forward-Port-Of: odoo/odoo#226120
Manufacturing orders now correctly include the operations defined for a selected kit variant, such as the red or blue version of a kit component. This prevents missing production steps when a finished product uses a kit with variant-specific operations.
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#228032This fix lets Spanish TicketBAI credit notes reference original invoices that were issued before the company started using TicketBAI in Odoo. It prevents valid refunds or corrections from being blocked simply because the original invoice came from a previous system.
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
This update fixes an unreliable automated check for public discussion channels by clicking the enabled button instead of relying on the Enter key. It helps reduce false build failures and keeps release validation more stable without changing the user experience.
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
Field service project settings now show the correct label for the timesheet product when a customer is selected. This prevents confusion caused by the sales order line label 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
The payroll document generation process now skips payslips when the related employee contact is missing. This prevents scheduled PDF generation from failing and keeps payroll document processing running smoothly for other employees.
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
Exporting a Belgian 325 PDF without any 281.50 forms now shows a helpful message instead of a server error. This prevents user confusion and explains that a transaction with a 281.50 tag is needed before generating the PDF.
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
Fixes an issue where highlight effects in website page templates could be carried over incorrectly when creating a new page from a preview. This ensures selected templates render their highlights consistently, reducing visual glitches for website editors.
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 fixes an issue in the website builder where showing the header or footer from the Invisible Elements panel did not reliably persist after saving. Business users can now manage page header and footer visibility more confidently without extra steps or unexpected changes.
Original PR description
With the initial [website builder refactor], clicking on the eye of the entry of the footer or the header in the "Invisible Elements" panel only temporarily changed their visibility. Additional clicks in the options were needed for their visibility to persist. This commit restores the previous behavior where clicking on the eye in the "Invisible Elements" panel for the header and the footer would also change the option. Steps to reproduce: - Open website builder - Click on the footer - Disable "Page Visibility" - Click on the eye next to "Footer" in the "Invisible Elements" panel - Save - Bug: the footer is invisible, but it was just before save [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Fixed an issue where Belgian EC Sales List XML exports could omit the month when opened from the VAT Return page without manually selecting a period. The export now uses the company’s tax period settings so the XML includes the correct month or quarter, helping businesses submit complete compliance files.
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
This fixes an issue where the ChatGPT chat window could appear behind a modal window, preventing users from interacting with it. The change ensures the chat window displays in the correct layer when opened from a dialog, improving usability without changing the feature itself.
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
The website builder now clearly disables the remove button when a carousel has only one slide left. This prevents confusion by showing users that at least one carousel slide must remain.
Original PR description
Steps to reproduce: - Drop a carousel snippet - In the builder options, click on the "-" button to remove all items except the last one. => The button is still displayed as working (not disabled), even though clicking on it won't remove the last slide. To clarify that this is the expected behavior, we disable the button if there is only one carousel item left.
Deleting an invoice that had been sent by post now also removes the related snail mail letter record. This prevents the scheduled mail processing job from failing later on deleted invoice references, improving reliability for accounting and postal invoice workflows.
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
Accounting dashboard upload areas and drag-and-drop buttons now use theme-aware backgrounds instead of fixed grey colors. This improves visual consistency and readability, especially for users working in dark mode.
Original PR description
Current behavior before PR: - Drag & drop buttons and upload drop zones of dashboard cards had hardcoded backgrounds (#F2EDF0 / grey), which did not adapt to dark mode. Desired behavior after PR is merged: - Removed hardcoded background colors from drag & drop button and upload drop zone cards on dashboard and updated their background to adapt in light & dark modes. Changes implemented: - Removed hardcoded background color (`#F2EDF0`) from `account_drag_drop_btn` & `drag_to_card` CSS classes. - Removed overriding background-color property from `o_drop_area` CSS class. - Updated background-color of `o_drop_area` in `o_account_dashboard_kanban_view` CSS class to `o-view-background-color`. task-5092460 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227707
Cancelled manufacturing work orders in backorder situations no longer receive an expected duration as if the work had been performed. This helps keep manufacturing time tracking and related cost calculations accurate when orders are partially completed and split.
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
The Chilean electronic invoicing test now handles cases where optional demo data is not installed. This prevents unnecessary test failures and helps keep validation stable across different installation 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
This update fixes an issue that could block users from validating backordered delivery orders in warehouses using a 2-step delivery process. It ensures stock reservations are adjusted correctly for newly created lines, reducing disruption in package and lot-tracked delivery workflows.
Original PR description
# Problem Unreserve issue preventing users from validating a delivery order with 2-step delivery warehouse configuration. Introduced in the following commit:…
# Problem Unreserve issue preventing users from validating a delivery order with 2-step delivery warehouse configuration. Introduced in the following commit: https://github.com/odoo/odoo/commit/13567aa27250f5798bbe42648eeac82241dbb780 # Steps to reproduce on the runbot: - Activate packages - Edit the warehouse to deliver in 2-steps - Create a product tracked by lot - Create two lots with 5 qty each - Create a sale order with 10 qty and confirm - Check the delivery order and assign: => 2 units to lot1 and create a pkg for it => 1 units to lot1 without pkg => 3 to lot2 without package - Validate the delivery and create a backorder - go to pick backorder and try to validate - Unreserve issue pops up - For further details, check: [#225948](https://github.com/odoo/odoo/issues/225948) # Solution: Conditional subtracting limited to new lines only. Task ID: opw-5086289 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229994 Forward-Port-Of: odoo/odoo#229420