Thursday, December 4, 2025
19 changes · saas-18.4
Resolved issues and error corrections
This update allows Odoo to utilize a broader range of VAT testing values provided by our EDI partner, reflecting increased usage of the EDI integration. Previously, we only supported a limited set of VATs, but this change ensures compatibility with the partner's expanded testing capabilities. This improves the accuracy of VAT processing when using the EDI connection.
Original PR description
When we merged EDI for Guatemala we allowed two specific testing VATs [1]. Because our EDI is proving popular our EDI provider has now created a specific range of testing VATs just for Odoo. We allow them explicitly because they're not valid VATs. [1] 6ef9c1085cd648ad2bbd78caf4a83fe30c969d59 opw-5381791 Forward-Port-Of: odoo/odoo#238541 Forward-Port-Of: odoo/odoo#238459
This update prevents the import process from accidentally changing the names of existing journal codes. Previously, importing journal data would overwrite existing journal names, causing confusion and potential data inconsistencies. This fix ensures journal names remain accurate during the import process.
Original PR description
**Steps to reproduce:** * Install the **Accounting** module. * Go to **Accounting > Configuration > Settings**. * Download the **Import Journal Items** template. * Keep the default journal codes in…
**Steps to reproduce:** * Install the **Accounting** module. * Go to **Accounting > Configuration > Settings**. * Download the **Import Journal Items** template. * Keep the default journal codes in the template (e.g. *MISC*, *SAL*, *BNK*). * Import the file containing these existing journal codes into it by **Accounting > Configuration > Settings > Initial Setup > Import > Import Journal Items > Upload data file**. **Observed behavior:** * Existing journals have their names overwritten by the values provided in the import file. * For example, a journal with code **MISC** and name *Miscellaneous Operations* is updated to name **MISC** after import. **Cause:** * Journals are looked up by their `code`, but `_load_records()` passes both `name` and `id` for all rows. * As a result, existing journals are updated instead of preserved. **Fix:** * Pass only `id` for journals already found by code. * Pass `name` only when creating new journals. * This prevents unintended updates to existing journal names. opw-5345876 Forward-Port-Of: odoo/enterprise#100143
This update fixes a minor issue with the error message displayed when a Belgian company uses an Acerta code with an incorrect length. The message was unclear, leading to potential confusion. The fix ensures a more precise and understandable error message for users configuring payroll settings.
Original PR description
Steps to reproduce: 1. Install l10n_be_hr_payroll_acerta 2. Switch to a Belgian company 3. Go to Payroll → Configuration → Work Entry Types 4. Edit a record and enter an Acerta code with only 2 characters Issue: - The validation message is missing a space between `that` and `is` - The message wording is ambiguous (PO request - fdav) Fix: - Updated the validation message to: `The following work entry types have an Acerta code that is not between 3 and 6 characters` opw-5347488 Forward-Port-Of: odoo/enterprise#100432
This update ensures that calendar invitation emails are sent using the specified `email_from` field in the template, rather than defaulting to the event organizer's email. Previously, if the `email_from` was blank, the email would be sent from the organizer. This change improves email consistency and allows for customized sender addresses.
Original PR description
Problem: The `email_from` field of the mail template is not considered while sending calendar invites. Steps to reproduce: - Log in as admin and install `calendar`. - Open the email template named `Calendar: Meeting Invitation`. - Change the `email_from` to `"ABC" <abc@example.com>`. - Create an event with the admin as the organizer. - Add Marc demo as an attendee. - Check the invitation email: the email to Marc demo is sent by the admin instead of ABC Solution: The `email_from` field of the mail template is rendered and passed to `message_notify`. If the rendered value is empty, `None` is passed so that `_message_compute_author` computes a fallback using the `author_id`’s email (i.e. calendar event organizer or current user), ensuring the email is always sent with a valid sender. Task-5082075 Forward-Port-Of: odoo/odoo#228018
This update resolves an issue preventing users from applying shapes to GIF images within the website builder. The fix corrects a technical error in how GIFs were processed, now allowing shapes to be applied consistently. Additionally, the update restores the correct display of GIF file sizes in the builder, previously hidden due to the same underlying problem.
Original PR description
\* = html_builder, html_editor, website Before this fix, applying a shape on a GIF image in the website editor failed. The issue came from the `_processImage` function, which is called before…
\* = html_builder, html_editor, website Before this fix, applying a shape on a GIF image in the website editor failed. The issue came from the `_processImage` function, which is called before applying a shape. In this function, GIFs were handled as a special case, but that branch returned a different value than expected, causing the shape application to fail on GIFs. This commit fixes the return value for the GIF-specific branch so it matches the expected structure, making shape application work consistently across all image types. As a side effect, this also fixes the display of GIF file sizes in the website editor. When selecting an image or setting one as a background, the builder sidebar normally shows the image size. For GIFs, it showed "NaN kb" due to the same broken function. A past [PR](https://github.com/odoo/odoo/pull/223424) worked around this by hiding sizes for GIFs entirely. Since the root cause is now fixed, the size is correctly displayed again. task-[5071548](https://www.odoo.com/odoo/project/974/tasks/5071548) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a crash issue within the website builder when creating certain form fields, specifically those using 'Alias Domain' types with no associated records. The fix ensures a disabled input is displayed instead of a crash, improving the user experience and stability of website form creation.
Original PR description
With the [website builder refactor], the code was not robust in case there were no records for a many2one field in a form.
Steps to reproduce:
- Open website builder on a form in a new database
- Set action "Send an email"
- Add a field with type "Alias Domain" ("Option List" must be empty)
- Change "Selection type" to "Radio"
- Bug: crash
[website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
task-5238496This update corrects errors in how tax unit reporting is handled, particularly for OSS reports. It ensures that companies within a shared tax unit are correctly consolidated, and tax returns are always generated using the appropriate main company. This improves the accuracy and reliability of financial reporting.
Original PR description
This PR delivers multiple fixes to ensure consistent and accurate behavior when working with tax units across OSS and standard tax return reports: [FIX] l10n_eu_oss_reports: Correct Tax Unit…
This PR delivers multiple fixes to ensure consistent and accurate behavior when working with tax units across OSS and standard tax return reports: [FIX] l10n_eu_oss_reports: Correct Tax Unit Detection for OSS Reports OSS reports lack a country, causing _get_available_tax_units to return no results. As a consequence, only the environment's main company was considered. This fix ensures that when multiple companies belong to the same tax unit, their OSS reports are correctly consolidated under that shared unit. [FIX] account_reports: Link Tax Unit Returns to the Main Company When generating domestic tax returns for a company that is part of a tax unit, the main company of the unit should be used since it is responsible for filing. This update ensures tax return generation is always aligned with the appropriate main company. [FIX] account_reports: Enforce Main Company When Generating Report Options get_options previously relied on the order of companies within a tax unit, assuming the first entry was the main company. Because this order is not guaranteed, the call is now explicitly scoped using with_company to ensure the main company is always used when preparing report options. Forward-Port-Of: odoo/enterprise#99715
This update resolves a bug where animation settings were unintentionally reset when re-selecting text within the website builder. The fix ensures that animation options remain active after re-selecting text, improving the user experience and consistency. It corrects a comparison issue related to whitespace differences.
Original PR description
Steps to reproduce: case 1: 1. Select all text in the footer. 2. Apply an animation (e.g. slide). 3. Re-select the same text (e.g. by triple-clicking or drag-selecting). 4. Observe that the animation…
Steps to reproduce: case 1: 1. Select all text in the footer. 2. Apply an animation (e.g. slide). 3. Re-select the same text (e.g. by triple-clicking or drag-selecting). 4. Observe that the animation option resets unexpectedly. Case 2: 1. Select all text in a paragraph. 2. Apply a text highlight. 3. Re-select the same text (e.g. by triple-clicking or drag-selecting). 4. Apply an animation (e.g. on scroll). 5. Re-select the same text again. 6. Observe that the animation option resets unexpectedly. Cause: The previous comparison between `selection.textContent()` and `ancestor.innerText` did not account for differences in whitespace and formatting, leading to false mismatches even when the selected and ancestor text appeared identical. Fix: Normalized both the selection and ancestor text by collapsing multiple whitespace characters and trimming leading/trailing spaces before comparison. This ensures that visually identical text is treated as equal, maintaining the animation option state when re-selecting the same text.
This update resolves a bug that occurred when the tax upgrade script was run in different languages. The script relies on translated strings, and inconsistencies in language settings caused errors. This fix ensures the script functions correctly regardless of the user's language preferences, improving stability.
Original PR description
The script triggers a recompute of tax.repartition_lines_str, a tracked field that contains translated strings[^2]. If the local script is running in a different language as the rest of the upgrade,…
The script triggers a recompute of tax.repartition_lines_str, a tracked field that contains translated strings[^2]. If the local script is running in a different language as the rest of the upgrade, those strings will be translated in different languages and will trigger an error[^1] when they cannot be accessed in the dict. This can also fail during a local upgrade, not necesarily during an upgrade in the platform.
```
File "/home/odoo/src/odoo/19.0/addons/account/models/account_tax.py", line 477, in _message_log
self._message_log_repartition_lines(tracked_value_id[2]['old_value_char'], tracked_value_id[2]['new_value_char'])
File "/home/odoo/src/odoo/19.0/addons/account/models/account_tax.py", line 423, in _message_log_repartition_lines
diff_keys = [key for key in old_value if old_value[key] != new_value[key]]
File "/home/odoo/src/odoo/19.0/addons/account/models/account_tax.py", line 423, in <listcomp>
diff_keys = [key for key in old_value if old_value[key] != new_value[key]]
KeyError: 'Akun'
```
[^1]:https://github.com/odoo/odoo/blob/bf83a4efefedae61e06a6b29ad82e647fd673ce2/addons/account/models/account_tax.py#L423
[^2]:https://github.com/odoo/odoo/blob/bf83a4efefedae61e06a6b29ad82e647fd673ce2/addons/account/models/account_tax.py#L393-L397
Forward-Port-Of: odoo/odoo#238368This update fixes an issue where zero margins and spacing settings in reports weren't being applied correctly when using wkhtmltopdf. Now, users can accurately set margins and spacing to zero, allowing for fully customized report layouts. This ensures reports generate with the intended, precise spacing.
Original PR description
When constructing the wkhtmltopdf command arguments, the system retrieves values from the `specific_paperformat_args` dictionary using get and checks whether the returned value is falsy. Because 0 is a falsy value in Python, margin and header spacing values explicitly set to 0 are mistakenly ignored. As a result, the system incorrectly falls back to the default paperformat values instead of honoring the overrides provided in `specific_paperformat_args`. This commit updates the conditional checks so that values from `specific_paperformat_args` correctly override the paperformat defaults even when the override is 0. This allows users to intentionally remove all margins and spacing defined on the report. Task-5079740 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237284
This update resolves an issue where pressing the TAB key while adding notes to sale order lines would clear and remove the entered text instead of saving it. The fix ensures that users can now correctly add and save notes within the sale order line interface, improving data accuracy and usability.
Original PR description
## Versions 18.0 > saas-18.4 Fixed in 19.0 thanks to bc6592a8514d6557037868a0f42265070fa02263 introducing the `parseLabel` method: https://github.com/odoo-dev/odoo/blob/19e03df5d9546d3948c2a184a6f26db7ba3aec71/addons/account/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.js#L47-L51 ## Issue When adding a section or a note line in the sale order lines list view, pressing TAB key caused the line to be cleared and removed instead of being saved. ## Steps to reproduce - Open an invoice or create one for any customer: - Click either on "Add a section" or "Add a note"; - Write something down; - Press the TAB key. ## Fix Handle the field with the appropriate `useInputField` hook. opw-4967733 Forward-Port-Of: odoo/odoo#237375 Forward-Port-Of: odoo/odoo#230644
This update resolves a technical issue in the product configurator that caused errors when multiple product attributes were linked together. The fix ensures the configurator correctly displays all available attributes, regardless of whether they are shared across different product lines, leading to a more reliable and user-friendly experience.
Original PR description
Description of the issue/feature this PR addresses: When multiple `product.template.attribute.line` records reference the same `product.attribute`, the product configurator raises a `KeyError` at…
Description of the issue/feature this PR addresses:
When multiple `product.template.attribute.line` records reference the same `product.attribute`, the product configurator raises a `KeyError` at line 321.
Root cause: `ptals.attribute_id` returns a unique recordset (Odoo deduplicates), so `zip(ptals.ids, ptals.attribute_id.read(...))` produces fewer entries than expected when attributes are shared across lines.
```python
# Before: zip stops at shorter list, missing entries in attrs_map
attrs_map = dict(zip(ptals.ids, ptals.attribute_id.read(['id', 'name', 'display_type'])))
# After: preserve 1:1 mapping by iterating each ptal
attrs_map = {ptal.id: ptal.attribute_id.read(['id', 'name', 'display_type'])[0] for ptal in ptals}
```
Current behavior before PR:
`KeyError` raised when accessing `attrs_map[ptal.id]` for attribute lines whose ID was truncated by the `zip`.
Desired behavior after PR is merged:
Product configurator correctly maps all attribute lines regardless of whether they share the same underlying attribute.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#238292This update fixes a technical issue in the l10n_ch_hr_payroll module that was preventing accurate payroll calculations. The system was incorrectly referencing employee version records instead of the primary employee record, leading to potential data inconsistencies. This change ensures that payroll data is correctly linked to the most up-to-date employee information.
Original PR description
Commit [46052c4](https://github.com/odoo/enterprise/commit/46052c4bc5ad1bd2549a6125202e0671b56beac8) introduced the `hr.version` model, which contains historical information about an employee record. Some of the updated lines use the hr.version ID when they should use `hr.employee`. Ticket [5218215](https://www.odoo.com/odoo/project.task/5218215)
This update resolves an issue where promotion rewards automatically added to cart lines couldn't be removed. The fix ensures the correct context is passed to the removal process, now allowing users to successfully remove promotion rewards from their shopping carts. This improves the user experience and prevents unwanted promotions from remaining in orders.
Original PR description
Steps: - Add a loyalty program of type promotion - Program trigger should be Automatic - Go to Shop > Add a product that triggers the reward of promotion - Try to remove the promotion added from the cart lines Issue: - Remove does not work for the automatically applied promotion reward Cause: - Context is not properly passed to the unlink method that removes the cart line of the promotion reward. - Since the unlink method is not receiving context properly, removal is bypassed Fix: - Instead of adding context in `self`, adding it directly in the `order_line` context fixes the issue. task-5076061 Forward-Port-Of: odoo/odoo#226789
This update corrects a bug where vehicles marked for change (but with a 'no change' flag set) were incorrectly listed as available. The change ensures that vehicles slated for a change are properly identified as unavailable, improving the accuracy of vehicle availability reports. This resolves an issue impacting fleet management reporting.
Original PR description
Refine _get_available_vehicles_domain to consider only vehicles with plan_to_change_car or plan_to_change_bike set to True as available. This ensures vehicles planned for change but marked False are treated as unavailable. Related task: 4963484. Forward-Port-Of: odoo/enterprise#101014 Forward-Port-Of: odoo/enterprise#90812
This update prevents users from modifying existing approval requests. Allowing edits would have caused unpredictable behavior and potential errors within the system. This change ensures the integrity and reliability of the approval process.
Original PR description
There is no legitimate use case that should modify the approval request. This would result in unexpected behaviour. task-5269982 Forward-Port-Of: odoo/enterprise#101132 Forward-Port-Of: odoo/enterprise#100273
This update fixes a reporting issue by ensuring the NIF (tax identification number) is now included in the BOE export for model 347, as required by Spanish tax regulations. Previously, the system only included VAT, but this change ensures accurate reporting to the Agencia Tributaria, aligning with specific documentation requirements.
Original PR description
[FIX] l10n_es_reports: include NIF in boe export for model 347 The NIF must be included in the BOE export for modelo 347 https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos/347.pdf pages 3 & 12. Before this commit, we read the vat but if it doesn't start with 'ES' we return an empty string because we based on TIN. Now we'll read the vat (without 'ES' if it starts with it). The user is responsible to fill a correct number in the vat field of the company. opw-5207241 Forward-Port-Of: odoo/enterprise#100489
This update resolves a crash that occurred when saving website forms that used property fields. The issue stemmed from incorrect handling of property field types, specifically when whitelisting fields. The fix ensures property fields are correctly processed, improving website form stability and functionality.
Original PR description
[FIX] website, website_crm: fix crash on save if property field in form --- __Before commit:__ 1. Go to CRM app 2. Open a lead 3. Add a new property field by clicking on the cogwheel at the top left…
[FIX] website, website_crm: fix crash on save if property field in form
---
__Before commit:__
1. Go to CRM app
2. Open a lead
3. Add a new property field by clicking on the cogwheel at the top left
and then *Edit Properties*
4. Open the website builder
5. Drag a new form
- Set *Action* to *Create an Opportunity*
- Set *Sales Team* to *Sales*
6. Add a new field and set *Type* to the newly created property field
7. Save
=> Traceback:
`ValueError: Unable to whitelist field(s) ['xxxx'] for model 'crm.lead'`
__Cause:__
We are trying to whitelist a property field which is not an actual field
to the `crm.lead` model but rather a property of one of the `crm.team`.
__Fix:__
Filter the property fields to whitelist.
---
[FIX] html_builder: make builder_list work with non-integer ids
---
__Before commit:__
1. Go to CRM app
2. Open a lead
3. Click on the cogwheel at the top left and then on *Edit Properties*
- Set *Field Type* to *Selection*
- Add two values
4. Open the website builder
5. Drag a new form
- Set *Action* to *Create an Opportunity*
- Set *Sales Team* to *Sales*
6. Add a new field and set *Type* as the newly created property field
7. Click on *Add New Radio*
=> There are still items to add although there are already all included.
8. Click on an item
=> Two tracebacks appear:
- `TypeError: Cannot use 'in' operator to search for '_id' in null`
- `TypeError: Cannot read properties of null (reading 'id')`
__Cause:__
When adding item to the selection, the id is casted to `Number` although
it can be a string if the field type is a property.
__Fix:__
When comparing two ids, cast both side of the comparison to strings to
make sure a match can always be found.
task-5248526This update prevents a crash when users attempt to create or modify fields with incorrect domain settings. The fix handles errors during domain evaluation, ensuring a smoother user experience and preventing data creation issues. It improves the overall stability of the system when defining custom fields.
Original PR description
Currently an error is generated when the user tries to create or write fields with wrong domain. Steps to produce an error - Install sale_management and create a new field with the below detail -…
Currently an error is generated when the user tries to create or write fields
with wrong domain.
Steps to produce an error
- Install sale_management and create a new field with the below detail
- Model: `Sales order`
- Field Type: `one2many`
- Related Model: `sale.order`
- Relation Field `partner_id`
- Domain: `[('sale_order_id', 'in', sale_order_ids)]`
- Click on save
This error occurs because we have a constraint in the domain, and it is triggered
when the user modifies the domain at code line [1]. Inside this constraint, we use
`safe_eval` to evaluate the domain. During this evaluation, an error is raised because
the user entered an incorrect domain.
This commit fixes the above issue by wrapping `safe_eval` inside a `try–except`
block and raising a `ValidationError` with an appropriate message when an error occurs during domain evaluation.
[1]- https://github.com/odoo/odoo/blob/e4e2dca73213c33c487033dd404a7ca335960a66/odoo/addons/base/models/ir_model.py#L651-L654
sentry-6964956583
Forward-Port-Of: odoo/odoo#237937
Forward-Port-Of: odoo/odoo#236891