Daily updates from Odoo
Monday, September 1, 2025
36 changes · 18.0
Resolved issues and error corrections
This fix ensures employee time-off timesheets are recreated correctly when a related public holiday is deleted or its working calendar changes. It prevents missing or duplicated timesheet entries, helping payroll and project reporting remain accurate after holiday schedule updates.
Original PR description
…ay change **Steps to reproduce** - Create a public holiday without a calendar during a work day. - Create a leave for an employee overlapping the public holiday for a time off type generating…
…ay change **Steps to reproduce** - Create a public holiday without a calendar during a work day. - Create a leave for an employee overlapping the public holiday for a time off type generating Timesheets. Validate it. - Expected: on the day of the public holiday, no timesheet is generated for the `hr.leave` to avoid duplication. - Either delete the public holiday, or set a calendar on it different than the one defined on the employee. - Issue: the public holiday timesheet has been deleted, but its deletion should've lead to the creation of the `hr.leave` timesheet that we didn't create at the time the public holiday existed. - Second issue: after that, change the calendar of the public holiday to the same as the employee's. Still a missing timesheet. **Solution** We can use `_reevaluate_leaves` to find the leaves affected by changes in public holidays. `_generate_timesheets` then re-generates the timesheets as if the leave was just validated (the call to `list_work_time_per_day` ignores the already present resource.calendar.leave). We also check missing public holidays timesheets to fix the second issue. opw-4819697 Forward-Port-Of: odoo/odoo#216901
This fix prevents an error in Spain's Veri*Factu electronic invoicing flow when a company has no tax ID recorded. It makes the batch sending check more reliable, avoiding interruptions caused by incomplete company setup.
Original PR description
Replaced `['NIF']` with `.get('NIF')` to avoid a `KeyError` when the company does not have a NIF.
When the VAT value is not set on the company and the `_send_as_batch_check` method is executed, the system raises an error from [1].
This PR updates the code to use `.get('NIF')` instead of direct access, making it more robust.
[1]: https://github.com/odoo/odoo/blob/dff2423ac320fdb97d6bf1f106dc84be1d71cac2/addons/l10n_es_edi_verifactu/models/verifactu_document.py#L1165
**sentry-6829500308**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix ensures online point-of-sale payment orders send their order date in the expected universal time format. It helps prevent timezone-related mismatches between the customer-facing payment flow and the backend records.
Original PR description
In 2a5f1ab, we formatted the `order_date` with `toFormat(...)`, however, that transforms the date into local, while the backend expects it to be in UTC. In this commit, we set the date tz back to UTC before formatting it. opw-4942697
Return slips for returned deliveries are now generated in the customer's preferred language. This avoids confusion for customers and keeps return documentation consistent with their sales order language.
Original PR description
In this bug, the language of return label is not set properly. The return label should be in customer language. To reproduce: 1- Create a quote for a client with a specific lang, e.g. fr and and confirm the order 2- In Delivary, return the order 3- Print Return slip 4- As you can see the return label is in wrong language In this fix, we put the template inside a wrapper template. It makes it be translated correctly. opw-4945685
Journal entry numbers can no longer be changed directly from the list view when the entry is not in draft. This helps preserve accounting data integrity and prevents accidental edits to finalized entries.
Original PR description
**Issue** It was possible to edit the journal entry number in the list view even when the entry state was not 'draft'. **Steps to Reproduce** 1. Go to Accounting > Accounting > Journal Entries. 2. Select any journal entry. 3. Double-click on the Journal Number field and attempt to edit it. **Root Cause** The 'name' field in the list view did not have a readonly attribute, allowing inline editing regardless of the journal entry's state. Opw-5009421 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change restores the ability to find products in purchase orders using a vendor's product code or name. It reverses a previous display change that showed extra vendor information but unintentionally made supplier-based product searches fail.
Original PR description
This reverts commit 28d53e0e565e266ca3fa2b67e359b4383fa42c36. The commit displayed both product name and vendor name in a purchase order form. However, it breaks the search using the vendor code/name. https://github.com/odoo/odoo/pull/223250 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Hungarian electronic invoicing now classifies credit notes more accurately when an invoice has already received a payment. This prevents incorrect STORNO submissions to NAV and helps businesses keep tax reporting aligned with the actual payment history.
Original PR description
Before this PR: - Previously, a credit note was marked as STORNO if the base invoice's residual amount was zero, regardless of whether any payments had been made. This led to incorrect STORNO reports being sent to NAV in cases where the invoice had been partially or fully paid before reversal. After this PR: - If any payment was made, the credit note is marked as MODIFY instead of STORNO. Example: - Case 1: No payments before reversal Invoice: 1000 Credit Note 1: -100 Credit Note 2: -900 => Credit Note 1 should be sent as a Modification, Credit Note 2 as STORNO. - Case 2: Payments before reversal Invoice: 1000 Payment: -100 Credit Note: -900 => The Credit Note should be sent as a Modification. task-4818762 Forward-Port-Of: odoo/odoo#211831
This fix prevents projects from failing to open when a saved embedded action points to a module that has since been uninstalled. It cleans up those saved actions properly, so users are not blocked by outdated Timesheets-related filters after uninstalling the app.
Original PR description
The system failed to evaluate the embedded action, which refers to the Uninstalled module. Steps to produce: 1. Install `Project` and `Timesheets`. 2. Go to Project and open any project. 3. Click on…
The system failed to evaluate the embedded action, which refers to the Uninstalled module.
Steps to produce:
1. Install `Project` and `Timesheets`.
2. Go to Project and open any project.
3. Click on the embedded action icon and select `Timesheets`.
4. Save the view from the embedded action's icon.
5. Now, Uninstall `Timesheets`.
6. Now, go to that Project and try to open it.
Error:-
`KeyError: 'allow_timesheets'`
`ValueError: Invalid field in filter of project.project:
[('allow_timesheets', '=', True)]`
Solution:-
- Here,
https://github.com/odoo/odoo/blob/e7efc2c3ad70aa9273412b089a71a9ade75ad525/odoo/addons/base/models/ir_embedded_actions.py#L19
- Also, use `ondelete="cascade"`. but `ondelete="cascade"` not works on `ir.actions.actions`.
https://github.com/odoo/odoo/blob/e7efc2c3ad70aa9273412b089a71a9ade75ad525/odoo/addons/base/models/ir_actions.py#L117-L127
We should remove `ondelete="cascade"` from the `action_id` field and add explicit unlink logic for `ir.embedded.actions`in the unlink method.
Sentry - 6495174314
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prDeleting a group chat from the messaging menu is corrected so users no longer encounter an unexpected error. This improves reliability in the Discuss messaging experience and avoids disruption when managing conversations.
Original PR description
task-4860196
This fix prevents an error when sales teams use lead assignment filters based on custom CRM lead properties. Businesses can now use property-based rules reliably to route leads to the right salespeople.
Original PR description
The system gives an error if we set the filter in the relation of lead_properties. Steps to Produce: 1. Install the `CRM` module. 2. CRM > Configuration > Settings. 3. Enable the `Rule-Based…
The system gives an error if we set the filter in the relation of lead_properties. Steps to Produce: 1. Install the `CRM` module. 2. CRM > Configuration > Settings. 3. Enable the `Rule-Based Assignment` and save the changes. 4. CRM > Reporting > Leads, then go to list view. 5. Click on NEW and add the required values. 6. From the gear icon, click on Add properties, set a random value, and then save. 7. CRM > Sales > Teams. 8. Click on the 3 dots of any team and click on Configuration. 9. Add the new salesperson and set the Lead Assignment Filter like Properties > Property 1(name of the property you added in lead form view) - is equal - demo (values of that property that you gave previously) and then save. 10. Click the gear icon and select the CRM: Lead Assignment. Error: `AttributeError: ' dict ' object has no attribute '_fields'` Solution: The code filters records based on complex domain conditions and combines matching IDs using logical operators. It also supports special fields like properties. Sentry - 6544761414
This fixes a mismatch where quality checks could remain linked to the original receipt after part of a transfer was moved into a new wave. Users will now see and process the right quality checks on the correct picking, reducing errors during receipt and wave operations.
Original PR description
*{quality_control,stock}_picking_batch ### Steps to reproduce: - Got to Quality > Quality control > Control Point - Create a quality control point: - Operation: receipt - Control per quantity or…
*{quality_control,stock}_picking_batch
### Steps to reproduce:
- Got to Quality > Quality control > Control Point
- Create a quality control point:
- Operation: receipt
- Control per quantity or product
- Create a and confirm a receipt transfer with 2 products
- Go to the receipt list view > select your receipt > Wheel action > Add to wave > Add to a new wave > Add only one of the move line to the wave
#### > A new picking is created and the move line reassigned to it but the related quality check picking_id is not updated.
> In particular, there is no "quality check" button on the new picking and the "quality check" button of the first picking allows you to process a QC related to the wave transfer.
### Cause of the issue:
While the move lines or move are can be moved to a new picking during the `_add_to_wave` call:
https://github.com/odoo/odoo/blob/605e47a85561614c17fe2e6f59618610f87c69bb/addons/stock_picking_batch/models/stock_move_line.py#L69-L90 Nothing is done with respect to the quality check which pciking_id field is not computed:
https://github.com/odoo/enterprise/blob/d73f7ef6fe61ccddbe1fe4e32c1670611ba3c5d2/quality/models/quality.py#L185
### Fix:
While the quality check measured on move_line are linked to a move line, the quality checks measured on products and operation are not. For the first kind, we rely on an override of the write method of stock move lines to reassign the check to the apporpiate picking. For the other kinds, we add a post batch hook to unlink the obsolete checks and recreate the appropiate one. Note that since operation and product types are created during the action confirm of moves and since certain moves will be created and auto confirm during the new picking creation here: https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock_picking_batch/models/stock_move_line.py#L90 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L857 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L1263-L1267 https://github.com/odoo/enterprise/blob/b99d7073a34b24d4d3b863278e68f292fdd3c0b0/quality_control/models/stock_move.py#L12-L15 we rely on the `extra_move_mode` to avoid quality check creation during this step (as they will be created in the hook).
Enterprise: https://github.com/odoo/enterprise/pull/92951
opw-5009635
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#223852This fixes an issue where an empty PDF attached to a sales quote could trigger an error during validation. The system now skips the encryption check when there is no document content, helping quote setup and data loading complete reliably.
Original PR description
If the document is empty we don't need to check for encryption. Otherwise we risk getting an error. ``` Traceback (most recent call last): File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line…
If the document is empty we don't need to check for encryption. Otherwise we risk getting an error.
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line 544, in _tag_root
f(rec)
File "/home/odoo/src/odoo/18.0/odoo/tools/convert.py", line 444, in _tag_record
record = model._load_records([data], self.mode == 'update')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5500, in _load_records
data['record']._load_records_write(data['values'])
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5418, in _load_records_write
self.write(values)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4827, in write
real_recs._validate_fields(vals, inverse_fields)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 1631, in _validate_fields
check(self)
File "/home/odoo/src/odoo/18.0/addons/sale_pdf_quote_builder/models/product_document.py", line 46, in _check_attached_on_and_datas_compatibility
utils._ensure_document_not_encrypted(base64.b64decode(doc.datas))
File "/home/odoo/src/odoo/18.0/addons/sale_pdf_quote_builder/utils.py", line 12, in _ensure_document_not_encrypted
if pdf.PdfFileReader(io.BytesIO(document), strict=False).isEncrypted:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/18.0/odoo/tools/pdf/__init__.py", line 91, in __init__
super().__init__(stream, strict)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 317, in __init__
self.read(stream)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 1408, in read
self._basic_validation(stream)
File "/home/odoo/.local/lib/python3.12/site-packages/PyPDF2/_reader.py", line 1449, in _basic_validation
raise EmptyFileError("Cannot read an empty file")
PyPDF2.errors.EmptyFileError: Cannot read an empty file
```
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-prThis fixes a crash that could happen when testing a CSV import containing an unsupported company-related field. Instead of failing with an error, the import test now handles the missing field conversion gracefully, helping users validate files without interruption.
Original PR description
The system will crash when we import a CSV with a field `employee_properties_definition` and click on `Test`. Steps to Produce: 1. Install `Employees`. 2. Go to Settings > User & Companies > Companies > Import Records. 3. Upload a file with the column title `employee_properties_definition` and provide any data. 4. Click on `Test`. Error:- `TypeError: 'NoneType' object is not callable`. Solution:- - To handle the case where the converter is `None`, resulting in a `TypeError`, I included TypeError in the `except` block. This ensures graceful handling when a field's converter is not properly defined. Sentry - 5854109138 I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents Odoo from crashing when a user saves a report or view with empty source content. Instead of failing with an error, the system now handles the empty content safely, improving stability for users working with Studio and reports.
Original PR description
The system will crash when they get the view where the arch is null. Steps to Produce: 1. Install `Sales` and `Studio`. 2. Sales > Toggle studio > Reports. 3. Click on New > External. 4. `Add a separator` to the page after `Expression` and save the report. 5. On the right side, click on `Edit Source`. 6. Remove all content and save the report. Error: `lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1` Solution: - I used the try-except block to prevent the application from crashing when `view.arch` is empty. Sentry - 6288795955 Related Enterprise PR-https://github.com/odoo/enterprise/pull/84503 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When Greek MyDATA bill retrieval fails due to access or data issues, the system now records a warning instead of a full error traceback. This reduces unnecessary error noise for expected user-side problems and makes logs easier to review.
Original PR description
Currently, the system logs an error when a `RequestException` or `ValueError` occurs while fetching MyDATA bills.
**Error:**
`Something when wrong when fetching MyDATA bill: HTTPError('403 Client Error: Forbidden for url: https://mydataapidev.aade.gr/RequestDocs?mark=0&dateFrom=03%2F04%2F2025&dateTo=02%2F07%2F2025`
**Root Cause:**
At [1], using `_logger.error` for `RequestException` or `ValueError` causes unnecessary tracebacks for user-side issues, such as forbidden access.
[1]
https://github.com/odoo/odoo/blob/1b657cf1e1ce43874a3ede307b2f8ad68216aa56/addons/l10n_gr_edi/models/res_company.py#L54-L55
This commit ensures `RequestException` or `ValueError` are logged as warnings instead of `error`, preventing unnecessary tracebacks and correcting the `typo` in the log message.
sentry–6713444740The website editor now handles temporary connection problems when accessing Odoo's media service. This prevents a DNS or network hiccup from causing a visible error, making media browsing more reliable for users.
Original PR description
The error was probably caused by a temporary failure in DNS resolution, preventing the domain `media-api.odoo.com` from being translated into an IP address.
Error:
`ConnectionError: HTTPSConnectionPool(host='media-api.odoo.com', port=443): Max retries exceeded with url: /media-library/1/search (Caused by NameResolutionError('<urllib3.connection.HTTPSConnection object at 0x72ea796dfce0>: Failed to resolve 'media-api.odoo.com' ([Errno -2] Name or service not known)'))`
Solution:
- Wrapped the HTTP request in a `try-except` block to catch and handle request-related exceptions.
sentry-6544378472
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prSales orders now correctly remove all nested combo product lines when a parent combo product is deleted. This prevents an error that could block users from saving orders after replacing combo items with another combo product.
Original PR description
Currently, an error occurs when a combo product is added to a sales order, and one of its combo items is replaced with another combo product, then the original parent combo product is deleted. Steps…
Currently, an error occurs when a combo product is added to a sales order, and one of its combo items is replaced with another combo product, then the original parent combo product is deleted. Steps to reproduce: - Create a sales order and add a combo product to it. - Modify one of the combo items by replacing it with another combo product. - Delete the original parent combo product from the order lines and save. Error: `ValueError: Expected singleton: sale.order.line()` The error occurs because the parent combo item is deleted, which causes `line.virtual_id` to become False. As a result, the filter [1] returns no matching records, and ensure_one() fails by raising a singleton error due to receiving zero records. This happens because the function [2] called from onchange in `sales_order` [3] that performs all the changes only checks the first level of combo items and doesn’t handle cases where those items are also combo products with their own linked items. This commit fixes the error by properly deleting all nested combo items in the sales order, ensuring no leftover items from nested combos remain that could cause errors. [1] - https://github.com/odoo/odoo/blob/7bb84621b773cdd7e9984222d61d70d622f8ac43/addons/sale/models/sale_order_line.py#L1567-L1569 [2] - https://github.com/odoo/odoo/blob/57b4056798b9a380027fd3da1c4f3965249a4509/addons/sale/models/sale_order_line.py#L1572-L1591 [3] - https://github.com/odoo/odoo/blob/7bb84621b773cdd7e9984222d61d70d622f8ac43/addons/sale/models/sale_order.py#L922 sentry-6653847384 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website setup now continues safely if the default homepage has been deleted. This avoids a crash during website creation and lets users complete configuration even when the original homepage record is no longer available.
Original PR description
The error occurred because the website.homepage view was deleted. When the website configurator attempted to access it, a ValueError was raised. Steps to replicate: - Initialize a DB without any apps installed. - Manually install website and wait till u reach `Website Configurator` page. - Duplicate the current window and search for `views`, search `homepage` and delete the first record that you find. - Go to `website > site > pages` and delete the record with page title as `Home`. - Go back to the page with website configurator and build the website. Error: `ValueError: No record found for unique ID website.homepage. It may have been deleted.` Solution: - Used `raise_if_not_found=False` with `viewref()` to avoid crashing if the homepage view is missing. - Safely skipped rendering the homepage instead of raising an error. sentry-6311940742 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Manufacturing setup now requires a reference sequence, preventing users from saving an incomplete operation type that can later break sample loading or manufacturing order creation. This avoids a confusing system error and makes the manufacturing workflow more reliable when demo data is not installed.
Original PR description
The error was caused by missing `sequence_id` during Manufacturing Order creation. This led to an invalid SQL query where `id = False`. Steps to Replicate: - Install `MRP` without any demo data (--without-demo=1). - Go to `Inventory > Configuration > Operation Types`, click on `Manufacturing`. - Remove the value from the field `Reference Sequence` and Save. - Go to Shop Floor and then click on `Load Samples` and the error should occur. Error: `UndefinedFunction: operator does not exist: integer = boolean LINE 1: SELECT number_next FROM ir_sequence WHERE id=false FOR UPDAT...` Solution: - Made the `Reference Sequence` field required to prevent errors caused by leaving it empty during record creation. sentry-6589772561 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Editing a reordering rule linked to an existing manufacturing order no longer triggers an unexpected error. This keeps inventory planning updates working smoothly when businesses adjust replenishment settings for manufactured products.
Original PR description
Currently, an error is encountered while editing a Reordering Rule which is already related to some confirmed MO. **Setup:** - Install mrp and sale_management. - Create a storable product with the…
Currently, an error is encountered while editing a Reordering Rule which is already related to some confirmed MO. **Setup:** - Install mrp and sale_management. - Create a storable product with the Manufacture route enabled and its on-hand quantity set to 0. - Create a Bill of Materials (BoM) for the product and also add at least 1 component. - Create a Reordering Rule for the product with Min Quantity 0 and Max Quantity 0. **steps to reproduce:** - Create and confirm a Sales Order for 40 units of the product. This generates a Manufacturing Order (MO). - Navigate to the generated MO and add a line for Work Order(set Expected Duration: 1000min). - Edit the product's Reordering Rule (e.g., change the min Quantity). for steps reference you can use [this video](https://drive.google.com/file/d/120srSySVHI0FzaWCruz0LVIBKCjK4oOL/view?usp=sharing) **Error:** `KeyError: 1` **Root Cause:** - The KeyError is triggered when a reordering rule is edited. At this moment, the system calls the `_quantity_in_progress` method to update the forecast. This method prepares a results dictionary (res) that only knows about the ID of the record currently being edited (which might be a new, unsaved record with a temporary ID). - The issue arises in the loop that processes confirmed Manufacturing Orders, at [1], the value of orderpoint.id is still `<NewId origin=2>` and on trying to access it at [1] causing an error [1]- https://github.com/odoo/odoo/blob/f1e11af050aa4d7be40e5179dc67a74ff81de076/addons/mrp/models/stock_orderpoint.py#L138 **Solution:** This commit ensures that only valid orderpoint IDs are processed at [1] Sentry-**6135193468**
Payment attempts using Adyen now handle unreachable or incorrectly configured API addresses without producing large technical error tracebacks. This keeps logs cleaner and helps teams focus on the underlying configuration issue instead of noisy system error reports.
Original PR description
Currently, an error occurs when the Adyen API endpoint is unreachable due to invalid domains or DNS resolution issues, the system logs a full traceback. **Error:** `ConnectionError:…
Currently, an error occurs when the Adyen API endpoint is unreachable due to invalid domains or DNS resolution issues, the system logs a full traceback.
**Error:**
`ConnectionError: HTTPSConnectionPool(host='000.adyen.com', port=443): Max
retries exceeded with url: /checkout/V71/paymentMethods (Caused by
NameResolutionError('<urllib3.connection.HTTPSConnection object at
0x7c4ec2c8f140>: Failed to resolve '000.adyen.com' ([Errno -2] Name or service
not known)'))`
**Root Cause:**
At [1] and [2], using `logger.exception` for `HTTPError` and `ConnectionError` causes unnecessary tracebacks for user-side issues like invalid API domains.
[1]
https://github.com/odoo/odoo/blob/bfb9c0141e595c97cd25ace1a219183cc213b0c4/addons/payment_adyen/models/payment_provider.py#L124-L127 [2]
https://github.com/odoo/odoo/blob/bfb9c0141e595c97cd25ace1a219183cc213b0c4/addons/payment_adyen/models/payment_provider.py#L132-L133
This commit ensures `ConnectionError` and `HTTPError` are logged as `warnings` instead of `exceptions`, preventing unnecessary tracebacks.
sentry - 4955120723Activating PEPPOL Electronic Invoicing no longer fails when a company profile has no country set. This helps users complete setup more reliably and avoids an unexpected error during configuration.
Original PR description
Currently, an error occurs when attempting to activate `PEPPOL Electronic Invoicing` without a country set on the company profile. **Steps to produce:** - Install `l10n_be` and `account_peppol` modules. - Switch to `BE Company CoA`. - Navigate to: `Settings > Users & Companies > Companies > BE Company CoA` and remove the `country name` from the `Address`. - Open `Settings`, search `'PEPPOL Electronic Invoicing'`, and click on `'Activate Electronic Invoicing'`. **Error:** `AttributeError: 'bool' object has no attribute 'upper'` **Root Cause:** At [1], `wizard.company_id.country_code` is `False`, and calling `.upper()` on it raises an `error`. [1] https://github.com/odoo/odoo/blob/c88c1e2f69c7cb25ac9c51d91ea7f47c9236e229/addons/account_peppol/wizard/peppol_registration.py#L83 This commit prevents error when user activate `PEPPOL Electronic Invoicing` and country is not set on company profile. Sentry – 6680941491
The website editor now handles incorrectly formatted web addresses more gracefully when users add image links. Instead of triggering a technical error, it shows a clear validation message so users can correct the URL by including the proper prefix such as http:// or https://.
Original PR description
Currently, an error occurs when the user adds an invalid URL without a scheme (e.g., http:// or https://). **Steps to produce:** - Install the `website` module. - Open the Website app and click `Edit`. - From the `Categories` section, drag and drop the `Images snippet` onto the page. - Double-click on the image. - In the `Documents` tab, enter `'www.kalkiranonlinestore.com'` in the `Add URL` field and click `Add URL`. **Error:** **MissingSchema: Invalid URL 'www.kalkiranonlinestore.com': No scheme supplied. Perhaps you meant https://www.kalkiranonlinestore.com?** **Root Cause:** At [1], the URL is missing a valid scheme (`http:// or https://`), causing an error. [1] https://github.com/odoo/odoo/blob/9f45d0de54f8349c18cabeb08be95c9b841b98b4/addons/html_editor/controllers/main.py#L255 This commit ensures an error message is raised when the user provides an invalid URL format. Sentry – 5967688614
Odoo no longer crashes when the Accounting Audit Trail menu item has been deleted or is unavailable. This keeps users from seeing an error page during normal navigation and makes the system more resilient to menu configuration changes.
Original PR description
Currently, If a user deletes the `account.account_audit_trail_menu` record from Settings → Technical → User Interface → Menu Items, ValueError is encountered.
**Steps to Reproduce:**
1) Install the `Accounting (account + accountant)` modules.
2) Activate Developer Mode, Navigate to `Settings → Technical → User Interface → Menu Items`.
3) Search for `Audit Trail` and **delete** the corresponding menu item.
4) Refresh any page.
**Error:**
ValueError: External ID not found in the system: account.account_audit_trail_menu** **Traceback (most recent call last)
**Root Cause:**
- The override of `_load_menus_blacklist()` unconditionally calls `env.ref('account.account_audit_trail_menu')`, which, by default, raises if that XML-ID is absent.
**Solution:**
- Use the `raise_if_not_found=False` flag on `env.ref()` and only append the menu ID when the reference actually exists.
Sentry-6590284629This fix stops spreadsheet pivots from offering JSON-based fields, such as Analytic Distribution, as grouping columns. Users can build Sales Order Line pivots without hitting a crash caused by unsupported field types.
Original PR description
Steps to reproduce: - Create a spreadsheet with a pivot on Sales Order Lines - Add "Analytic Distribution" as column => Boom Note that the test for this fix is add in the enterprise codebase Task-5055300 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
Uploading a file to a request or replacing a file through the manage versions dialog now shows progress on the existing document instead of creating a duplicate card or row. This reduces confusion for users and keeps the document list accurate during uploads.
Original PR description
Step to reproduce: 1. Upload a file to a request: - Create a Request. - Upload a file for that request. - Another Kanban card / List row is created showing the upload progression. 2. Upload a file into the manage version dialog. - Manage version for an existing document. - Upload a new document. - Another Kanban card / List row is created showing the upload progression. The upload progression should be shown on the existing document. Task-4863051
The Chilean electronic invoicing demo data now includes the required certificate identifier, preventing errors when users test sending invoices to the SII. This helps trial and training environments work out of the box without affecting production certificates.
Original PR description
**Issue** When installing l10n_cl_ed, the `subject_serial_number` field is left empty. This causes an error when attempting to send an invoice to the SII. **Steps to Reproduce** 1. Install Accounting and l10n_cl_edi 2. Create and confirm an invoice 3. Click "Send Now to SII" 4. Error: Invalid Operation **Root Cause** The `subject_serial_number` is not set during installation, and this field is required for electronic document generation. **Fix** Restore the behavior from version 17.0 by setting a default `subject_serial_number` if it's missing and the certificate is available. This ensures the demo data is functional and allows users to test the SII integration out-of-the-box. Opw-4961801
The rental checkout test now waits for the cart and page updates to finish before checking totals. This helps prevent false build failures caused by timing issues, improving confidence in the rental sales flow.
Original PR description
steps to reprduce: 1. duplicate multi enterprise 18.0 database 2. run the tour `website_sale_change_rental_duration` in the duplicated database inspired from: https://github.com/odoo/enterprise/commit/c7542e897c537650966497065db9c7d033dcb8ee added a delay to wait when choosing the rental duration, after page is loaded when go to cart , check if the next page is loaded before checking untaxed amount build_error-227718
The XML export for Belgium’s EC Sales List now includes the expected month or quarter when opened from the VAT Return, even if the user did not manually choose a period. This prevents incomplete tax report exports and reduces the risk of filing issues caused by missing period information.
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
The tax report no longer fails with a server error after changing its root report configuration. This keeps accounting users from being blocked when opening tax reports and improves reliability of financial reporting workflows.
Original PR description
**[FIX] account_reports: ensure join on account_move for tax report base amount calculation** Fixes a server error in the generic tax report where `account_move_line__move_id` was referenced without an explicit join. The fix adds a conditional join on `account_move` to make fields like `always_tax_exigible` available, preventing `UndefinedTable` during SQL execution. Steps to reproduce: 1 - in a fresh db or runbot go to `Accounting > Config > Accounting Reports`. 2 - Open the Tax Report and change the `Root Report` to Balance Sheet. 3 - Save and try to open the tax report. opw-4990771
Fixes an issue where a website form configured through Studio to send an email could fail during submission. This helps prevent lost customer inquiries and avoids error logs when businesses customize website forms for outgoing emails.
Original PR description
Currently, an error occurs when submitting the 'Send Email' form. Steps to Reproduce: - Install the `website` and `web_studio` modules. - Go to `website` > `Click on Edit` > `Drag and drop form`. -…
Currently, an error occurs when submitting the 'Send Email' form. Steps to Reproduce: - Install the `website` and `web_studio` modules. - Go to `website` > `Click on Edit` > `Drag and drop form`. - click the form and in actions select the `more models`, and select `outgoing mails(mail.mail)` model and `save`. - `Submit` the form, and the error appears in the `logs`. **Error:** `KeyError: 'website_form_signature'` **Cause:** This error occurs when submitting the "Send Email" form from the website. By default, the form action is `"Send an E-mail"`, and when the user `changes` the form’s model to outgoing mails (mail.mail), which also has the action "Send an E-mail," the system checks the existing model [1] and retrieves it. Since `shouldRerender` is set to false, [2] is not executed, and as a result, the `email_to(hidden field)` is not present in the form. And the website_form_signature is added from [3], but due to the condition at [4], the code at [3] is not executed. When it is accessed at [5], KeyError is raised. **Fix:** This commit ensures that when the user changes the model, `rerenderXml` is executed so that the `hidden field` is also added. [1]: https://github.com/odoo/enterprise/blob/359a1c546fc9e4bc113517bf6ea912a70a9ea123/website_studio/static/src/website_form_editor.js#L155-L156 [2]: https://github.com/odoo/enterprise/blob/359a1c546fc9e4bc113517bf6ea912a70a9ea123/website_studio/static/src/website_form_editor.js#L174-L178 [3]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L252 [4]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/tools.py#L236 [5]: https://github.com/odoo/odoo/blob/82639728f2bcb4e7786f120de2aeba3f5fbab209/addons/website/controllers/form.py#L88 sentry-6746753251
When items from a receipt are moved into a new wave transfer, their related quality checks are now moved or recreated on the correct transfer. This prevents staff from missing required checks on the new transfer or completing checks from the wrong receipt.
Original PR description
*{quality_control,stock}_picking_batch ### Steps to reproduce: - Got to Quality > Quality control > Control Point - Create a quality control point: - Operation: receipt - Control per quantity or…
*{quality_control,stock}_picking_batch
### Steps to reproduce:
- Got to Quality > Quality control > Control Point
- Create a quality control point:
- Operation: receipt
- Control per quantity or product
- Create a and confirm a receipt transfer with 2 products
- Go to the receipt list view > select your receipt > Wheel action > Add to wave > Add to a new wave > Add only one of the move line to the wave
#### > A new picking is created and the move line reassigned to it but the related quality check picking_id is not updated.
> In particular, there is no "quality check" button on the new picking and the "quality check" button of the first picking allows you to process a QC related to the wave transfer.
### Cause of the issue:
While the move lines or move are can be moved to a new picking during the `_add_to_wave` call:
https://github.com/odoo/odoo/blob/605e47a85561614c17fe2e6f59618610f87c69bb/addons/stock_picking_batch/models/stock_move_line.py#L69-L90 Nothing is done with respect to the quality check which pciking_id field is not computed:
https://github.com/odoo/enterprise/blob/d73f7ef6fe61ccddbe1fe4e32c1670611ba3c5d2/quality/models/quality.py#L185
### Fix:
While the quality check measured on move_line are linked to a move line, the quality checks measured on products and operation are not. For the first kind, we rely on an override of the write method of stock move lines to reassign the check to the apporpiate picking. For the other kinds, we add a post batch hook to unlink the obsolete checks and recreate the appropiate one. Note that since operation and product types are created during the action confirm of moves and since certain moves will be created and auto confirm during the new picking creation here: https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock_picking_batch/models/stock_move_line.py#L90 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L857 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L1263-L1267 https://github.com/odoo/enterprise/blob/b99d7073a34b24d4d3b863278e68f292fdd3c0b0/quality_control/models/stock_move.py#L12-L15 we rely on the `extra_move_mode` to avoid quality check creation during this step (as they will be created in the hook).
Community: https://github.com/odoo/odoo/pull/223852
opw-5009635
Forward-Port-Of: odoo/enterprise#92951Odoo Studio now avoids crashing when a report's source content is accidentally left empty. This helps users continue working safely instead of hitting an error page when editing custom reports.
Original PR description
The system will crash when they get the view where the arch is null. Steps to Produce: 1. Install `Sales` and `Studio`. 2. Sales > Toggle studio > Reports. 3. Click on New > External. 4. `Add a separator` to the page after `Expression` and save the report. 5. On the right side, click on `Edit Source`. 6. Remove all content and save the report. Error: `lxml.etree.XMLSyntaxError: Document is empty, line 1, column 1` Solution: - I used the try-except block to prevent the application from crashing when `arch` is empty. Sentry - 6288795955
Users checking the latest AFIP rate with expired or invalid certificate credentials will no longer hit a confusing system error. The process now blocks the action when credentials are invalid, helping Argentine localization users understand and resolve the issue more reliably.
Original PR description
An error occurs when a user attempts to check the latest AFIP rate while their certificate has expired and the certificate key is null. **Error:** `TypeError: argument should be a bytes-like object or ASCII string, not 'bool'` **Root Cause:** When the user tries to check the `latest AFIP rate` with an expired certificate and a certificate key having invalid or null `pem_key`, the system attempts to access `pem_key` at [1], causing a `TypeError`. [1]- https://github.com/odoo/enterprise/blob/b185bd5bf9bb828fca83330ed4bde4ef8c9aa726/l10n_ar_edi/models/certificate.py#L54 **Solution:** This commit prevents error by ensuring that user cannot check `latest AFIP rate` with invalid credentials. Sentry-6640198098
Spreadsheet pivots now avoid offering fields that cannot be grouped, preventing a crash when users choose the Analytic Distribution field on sales order lines. This keeps spreadsheet reporting more reliable and avoids disruption while building pivot views.
Original PR description
…elds Steps to reproduce: - Create a spreadsheet with a pivot on Sales Order Lines - Add "Analytic Distribution" as column => Boom Task-5055300
Fixes an issue where a reconnected blackbox could be treated as a new device if the Raspberry Pi assigned it a different serial port. Existing blackbox configurations are now preserved by matching the device name and updating its identifier instead of creating a duplicate.
Original PR description
Before this commit, if a blackbox was unplugged and re-plugged, and it was assigned a different serial port by the Raspberry Pi, it would show up as a new device in the database meaning the existing…
Before this commit, if a blackbox was unplugged and re-plugged, and it was assigned a different serial port by the Raspberry Pi, it would show up as a new device in the database meaning the existing configuration wouldn't work. After this commit, we handle the blackbox as a special case, and if the name of the device matches exactly with our existing blackbox, we update its identifier instead of creating a new device. This does require a new device specific check in the controller which is quite ugly. Another approach would have been to make the identifier of the blackbox equal its FDM ID instead of the serial port, but this was not done for the following reasons: - Changing the identifier format in stable would cause all existing clients' blackboxes to become unconfigured once their IoT box restarts. - Making the identifier different to the serial port would require a hack in the blackbox driver to change its own identifier and update the devices dictionary, since the serial interface assumes all devices use the port as their identifier. task-5055027