Daily updates from Odoo
Navigate
Branch
Thursday, December 4, 2025
148 changes
19 changes
New functionality added to Odoo
This update adds support for payroll calculations in eight additional US states: Vermont, Illinois, Virginia, Washington D.C., Arizona, Idaho, Oregon, and North Carolina. This expansion ensures Odoo accurately handles US tax and payroll regulations for businesses operating in these locations.
Original PR description
…, NC) With this, we add support for 8 more states in the US payroll: Vermont, Illinois, Virginia, Washington D.C., Arizona, Idaho, Oregon and North Carolina. Task: 5247501 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#238240 Forward-Port-Of: odoo/odoo#237908
This update expands Odoo's US payroll functionality to include support for eight additional states: Vermont, Illinois, Virginia, Washington D.C., Arizona, Idaho, Oregon, and North Carolina. This enhancement ensures accurate payroll calculations and compliance for businesses operating in these regions.
Original PR description
With this, we add support for 8 more states in the US payroll: Vermont, Illinois, Virginia, Washington D.C., Arizona, Idaho, Oregon and North Carolina. Task: 5247501 Forward-Port-Of: odoo/enterprise#101040 Forward-Port-Of: odoo/enterprise#99278
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
19 changes
Resolved issues and error corrections
This update prevents the import process from changing existing journal names. Previously, importing journal data would overwrite the names of existing journals, causing confusion and potential data discrepancies. The fix ensures journal names remain consistent during import, maintaining data integrity.
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 confusing error message related to Acerta codes in the Belgian payroll system. The original message was unclear, leading to potential user confusion. The fix replaces the message with a clear and concise instruction: 'The following work entry types have an Acerta code that is not between 3 and 6 characters'.
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 email address defined in the meeting template, rather than defaulting to the organizer's email. Previously, if the template's 'email_from' field was blank, the invitation would use the organizer's email. This change improves email personalization and accuracy.
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 corrects a previous issue where users could select time off types without allocation requirements within group allocation settings. The change ensures that only time off types requiring allocation are displayed, aligning with the standard allocation process and preventing incorrect time off requests. This improves data accuracy and simplifies the allocation workflow.
Original PR description
To reproduce: ============= - Create time off tyoe that does not require allocation - Go to timeoff > Allocation > Group allocation -> you can select the created time off type Problem: ======== we didn't have a domain on `holiday_status_id` field, so all time off types were available for selection. Solution: ========= Add a domain on `holiday_status_id` field to only show time off types that require allocations the same way as when creating a single allocation. opw-5113959 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228617
This update fixes an issue where vehicles marked for change (but with a 'no change' flag set) were incorrectly shown as available. The change ensures that vehicles slated for a change are accurately identified as unavailable, improving the reliability of vehicle availability reporting. This impacts how vehicles are tracked for fleet management.
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 resolves a problem where the tax upgrade script incorrectly translated strings based on the local Odoo environment's language. This caused errors when the script attempted to access translated values in the wrong language. The fix ensures consistent translation across all Odoo environments.
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 scanning a lot multiple times during barcode picking would incorrectly create a backorder. The change ensures that quantity updates are applied correctly to the relevant lines, preventing unnecessary backorders and improving order fulfillment accuracy. This resolves a bug related to how the system processes lot scans.
Original PR description
**Steps to reproduce:** - create a product tracked by lot - create a lot with a quantity of 2 - create a new sale order - add two sale order lines, both for a quantity of 1 of the product - confirm -…
**Steps to reproduce:** - create a product tracked by lot - create a lot with a quantity of 2 - create a new sale order - add two sale order lines, both for a quantity of 1 of the product - confirm - open the picking in barcode - scan the stock location - scan the lot - scan the lot another time - validate **Current behavior:** a backorder is created **Expected behavior:** No back order should be created **Cause of the issue:** After scanning the lot for the first time we have the following situation: two lines : - one with a quantity of 1, qty_done of 1 and reserved_uom_qty of 1 - one with a quantity of 1, qty_done of 0 and reserved_uom_qty of 1 both lined grouped in a parent line with quantity of 1 qty_done of 1 and reserved_uom_qty of 2 All of this is correct. when scanning the lot for the second time: _findLine iterates through the lines to select the right line to use. _findLine calls _lineIsNotComplete on the first line to check if it's complete (this first line is complete). https://github.com/odoo/enterprise/blob/58d55868750b827a9d5ebd8b4ab2cc23c4445eca/stock_barcode/static/src/models/barcode_model.js#L1684 But _lineIsNotComplete will actually do the check on the parent line (which is not complete), so the return value will be true. https://github.com/odoo/enterprise/blob/58d55868750b827a9d5ebd8b4ab2cc23c4445eca/stock_barcode/static/src/models/barcode_picking_model.js#L1338 As a consequence, the quantity will be added in the first line and we will have a qty_done of 2 in the first line and a qty_done of 0 in the second line. Which will lead to the creation of a back order opw Forward-Port-Of: odoo/enterprise#100626 Forward-Port-Of: odoo/enterprise#99774
This update resolves an issue in the German localization (l10n_de) module where changing a product's cost in a multi-company environment would trigger tax access errors. The problem stemmed from fetching taxes in a privileged (sudo) environment, leading to incorrect data. This fix, implemented in Odoo 19.0, corrects this by removing the privileged environment, ensuring accurate tax calculations.
Original PR description
from v18.0 to v18.4, in a multi-company environment, when a product with no income/expense account had its cost changed, all the taxes for other companies were being fetched which caused access errors when trying to view it after a manual save. This happens because the fetch is happening in a sudo environment because the stock valuation layer was being created as sudo, so all taxes were being fetched and probably because of cache pollution they were not being filtered properly, this is not happening in v19.0 because the stock valuation layer was removed, so everything is being called in a normal user environment, refer to this commit-08b62a4 task-5117882 Forward-Port-Of: odoo/odoo#236931
This update fixes an issue where zero margin and spacing overrides in report design were being ignored. Now, users can accurately set all margins and spacing to zero, providing greater control over report output. This ensures reports are generated as intended, regardless of specified margin values.
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 the ChatGPT plugin button was disabled when no text selection was made in the HTML editor. Now, the button correctly opens the chat window with either the standard AI buttons or a simplified version without AI buttons, depending on whether a text selection is present. This ensures consistent and reliable access to the ChatGPT plugin.
Original PR description
This PR fixes an issue with the toolbar button. Before when no selection were applied in the HTML Editor, the button would be disabled.
This PR introduce a fix that makes the button enabled in two scenarios:
- Either the user has no selection, clicking the button will then open the chat window without any AI button, as it does with the powerbox buttons,
- Or the user has a selection, then clicking the button will result in opening the chat window with the AI buttons as it was already the case.
If the user has a selection that is empty, then the button remains visible but is disabled.This update fixes a technical issue in the product configurator that caused errors when multiple product attributes were linked together. The change ensures that all product attributes are correctly mapped, regardless of whether they share the same underlying attribute, leading to a more reliable and accurate product configuration 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#238292A test within the Odoo Enterprise payroll module was failing due to a missing default account configuration when no demo data was present. This update adds a default account to the test environment and adjusts the accounting rules to ensure the test runs successfully, maintaining the stability of the payroll system.
Original PR description
Steps to reproduce: Install hr_payroll_account on a fresh db without demo data. Run the test test_payment_hr_payslip. The test fails. Cause: With demo data, the us payroll was installed and with it, the payroll accounts were configured. Without demo data, default account is missing. Fix: Add a default account in the test and fix the amount balance with a new debit rule to balance the credit one. Task: 5386528 Runbot Error: 161615
This update resolves a problem where email templates were being incorrectly parsed, leading to errors. The fix ensures that all HTML elements, except for void elements, are properly closed, improving the reliability of email content generation. This prevents template rendering issues when sending emails.
Original PR description
**Step to Reproduce:** - install Subscription (with demo data) - try to edit `Subscription: Payment Reminder` email template **Observation:** - Traceback for faulty template **Cause** For outgoing…
**Step to Reproduce:**
- install Subscription (with demo data)
- try to edit `Subscription: Payment Reminder` email template
**Observation:**
- Traceback for faulty template
**Cause**
For outgoing mails, we are using output_method = 'xml' when normalizing html content
https://github.com/odoo/odoo/blob/cb5176df98490ef04c0aac481f010bd2ac2f2424/odoo/orm/fields_textual.py#L580-L587
when this content is parsed using DOMParser in browser,
https://github.com/odoo/odoo/blob/cb5176df98490ef04c0aac481f010bd2ac2f2424/addons/html_editor/static/src/html_migrations/html_upgrade_manager.js#L61-L63
we might get different result.
For a very basic template like this:
```
<div>
<t t-if="ctx.get('error')">
<pre t-out="ctx['error'] or ''" />.
</t>
<t t-else="">
<span>some text</span>
</t>
</div>
```
when parsed using Domparser(), return a faulty template:
```
<div>
<t t-if="ctx.get('error')">
<pre t-out="ctx['error'] or ''">.
<t t-else="">
<span>some text</span>
</t>
</pre>
</t>
</div>
```
Issue roots because of use of self-closing tags, which are valid for xml but not for html
**Fix:**
- we forcefully replace all self-closing tags(which are not void elements) with a closing tag.
- see list of void elements https://developer.mozilla.org/en-US/docs/Glossary/Void_element
opw-5234345
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update corrects a visual issue where the activity badge within the bank reconciliation widget was misaligned. The change removes a styling class that was causing the misalignment, ensuring the badge now appears correctly positioned on the icon. This improves the user experience and visual consistency of the bank reconciliation feature.
Original PR description
Current behavior before PR: The activity badge inside the bank reconciliation widget was misaligned, <img width="55" height="60" alt="image" src="https://github.com/user-attachments/assets/0f99ea55-fedd-401a-a65e-226296070e32" /> Desired behavior after PR is merged: The activity badge now sits in the correct position on the icon. <img width="62" height="55" alt="image" src="https://github.com/user-attachments/assets/abf96aed-73d4-4153-8e0a-56937d4ff08a" /> Changes implemented: - Removed `fa-fw` class. - Removed the unnecessary 'fa-fw' class from comment and paperclip icon. task-5354994 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where promotion rewards automatically added to shopping carts couldn't be removed. The fix ensures that removing a promotion reward from a cart line now functions correctly, improving the user experience and preventing unwanted rewards from remaining in orders. This change was made to address a bug impacting order management.
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 resolves an issue where the Point of Sale app for Mexican companies was incorrectly flagging an error when the 'Invoice to Public' setting was set to 'Yes' for customers without a country or zip code. The fix ensures this setting is properly updated, preventing the error and allowing users to correctly generate public invoices as required by Mexican regulations.
Original PR description
In the POS of a Mexican company, when requesting an invoice, the user is asked to set the invoice to public or not. If the customer does not have a recognized ZIP code or country, setting the invoice…
In the POS of a Mexican company, when requesting an invoice, the user is asked to set the invoice to public or not. If the customer does not have a recognized ZIP code or country, setting the invoice to public **should not** raise an error, but it does. This is because the `l10n_mx_edi_cfdi_to_public` field is not correctly updated in the ORM, which leads to the UserError below being triggered, as `l10n_mx_edi_cfdi_to_public` is always set to `False` if it's not updated by its `_compute` method.
https://github.com/odoo/enterprise/blob/dd89c2c72039c9910cc0a303bca332f4103c08f6/l10n_mx_edi/models/account_move_send.py#L54-L55
The said field is not properly updated because it is a compute field.
Such fields are not transferred to the ORM because of the two following
conditions from the POS: [[1](https://github.com/odoo/odoo/blob/5c2280d089f248dff67df980bee1ce6a4156f2c9/addons/point_of_sale/static/src/app/models/related_models.js#L205-L206), [2](https://github.com/odoo/odoo/blob/5c2280d089f248dff67df980bee1ce6a4156f2c9/addons/point_of_sale/static/src/app/models/related_models.js#L895-L896)]
To minimize behavioral changes, the required field (`l10n_mx_edi_cfdi_to_public`) is simply added at the end of the serialization process.
Once this field is correctly shared with the ORM, the UserError is not longer raised when the *Invoice to Public* field is set to "Yes" in the POS.
Steps to reproduce the initial error:
1. Install the following app and module:
- Point of Sale (`point_of_sale`)
- Mexican Localization for the Point of Sale (`l10n_mx_edi_pos`)
2. Set the company to a Mexican one (e.g., *ESCUELA KEMPER URGATE*)
3. Open the POS app
4. Open a register
5. Select a product and click *Add*
6. Click *Payment*
7. Set the Customer to a new customer with only a name (no Country/ZIP Code)
- Click "Cash" to set the Remaining to 0
8. Toggle the *Invoice* button, set the *Invoice to Public* to *"Yes"* and click *Ok*
9. Click *Validate*.
10. An error *"Invalid Operation, CFDI not set to Public"* appears.
opw-5171035
Forward-Port-Of: odoo/enterprise#101162
Forward-Port-Of: odoo/enterprise#99871This update resolves an error that occurred when creating time off requests. Specifically, the system would fail if a start date was removed and then the employee was changed. The fix ensures the system only checks for past dates when a start date is provided, preventing the error.
Original PR description
Currently, an error occurs when creating a time off request for an employee. Steps to Reproduce: - Install the `hr_holiday` module. - Go to `Management > Time Off`. - Create a `new time off` and…
Currently, an error occurs when creating a time off request for an employee. Steps to Reproduce: - Install the `hr_holiday` module. - Go to `Management > Time Off`. - Create a `new time off` and `remove the start date`. - Now `change the employee`. `AttributeError: 'bool' object has no attribute 'date'` This error occurs when creating a time off request for an employee. If the start date is removed and then the employee is changed, the compute method [1] runs to determine whether the time off can be approved and to update the states [2]. During this process, the system checks whether the time off date is in the past, and since the start date is missing, it results in the error [3]. This commit ensures that the system only checks whether the time off is in the past when a start date is provided. [1]- https://github.com/odoo/odoo/blob/aa53689d3c593a8a41479c51edc2b01e3c284f96/addons/hr_holidays/models/hr_leave.py#L594-L597 [2]- https://github.com/odoo/odoo/blob/aa53689d3c593a8a41479c51edc2b01e3c284f96/addons/hr_holidays/models/hr_leave.py#L1279 [3]- https://github.com/odoo/odoo/blob/aa53689d3c593a8a41479c51edc2b01e3c284f96/addons/hr_holidays/models/hr_leave.py#L1237 No Task ID --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a potential issue where users could modify approval requests, which could lead to unpredictable behavior within the system. The change prevents edits to approval requests, ensuring data integrity and a stable approval process. This improves system reliability.
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 ensures the NIF (tax identification number) is correctly included in the BOE export for model 347 reports, as required by Spanish tax regulations. Previously, the system only included VAT if it started with 'ES'. Now, the system reads the VAT regardless, but relies on the user to provide a valid VAT number for the company.
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
9 changes
Enhancements to existing features
This update enhances the system's ability to retrieve information related to signed documents. Previously, limitations prevented accessing additional data from the 'sign.send.request.signer' model when working with many-to-many signers. Now, customization is enabled, allowing for more comprehensive data retrieval, improving sign management workflows.
Original PR description
The class `SignerX2Many` is inheritable, but if we need another value from the o2m, we can't use it because the `signerX2Many` is not exportable. Enable `signerX2Many` customization, allowing more fields to be read from the `sign.send.request.signer` model. Forward-Port-Of: odoo/enterprise#99977
Resolved issues and error corrections
This update prevents the system from accidentally changing the names of existing journals during the import process. Previously, importing journal data would overwrite existing journal names with values from the import file. This fix ensures that existing journal names are preserved, maintaining data integrity.
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 in the Belgian payroll module (l10n_be_hr_payroll_acerta) related to the error message displayed when an Acerta code is invalid. The message has been clarified to be more user-friendly and accurate, ensuring users receive clear guidance on code length requirements. This improves the overall user experience and reduces potential confusion.
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 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#101051 Forward-Port-Of: odoo/enterprise#100273
This update corrects a minor issue in how vehicle availability is determined, specifically for vehicles undergoing a change. It now correctly excludes vehicles with a 'plan_to_change' flag set to 'False', ensuring accurate availability reporting. This ensures the system accurately reflects vehicle status for payroll and fleet management.
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 resolves a bug where field syncs would disappear after inserting a new row in the Quote calculator spreadsheet. The fix ensures that field syncs are correctly maintained when expanding the spreadsheet, preventing data inconsistencies. This improves the reliability of quote calculations.
Original PR description
Steps to reproduce: - create a Quote calculator spreadsheet - add a field sync on A1 - autofill it down on a few cells - select row B - right click and "Insert row above" => some field syncs disapeared Forward-Port-Of: odoo/enterprise#101066
This update ensures the NIF (tax identification number) is now included in the BOE export for model 347 reports, as required by Spanish tax regulations. Previously, the system only included VAT, but this change corrects that to align with specific reporting requirements outlined in official documentation. Users are responsible for accurately entering the NIF in the company's VAT field.
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 an issue where users couldn't assign analytic distributions to batch payments during bank reconciliation, leading to validation errors. The fix removes a restriction that was preventing edits to these payments, now allowing users to correctly apply analytics for improved financial reporting and tracking. This ensures accurate reconciliation processes.
Original PR description
**Issue** Users were unable to set analytic distributions on batch payments via the bank reconciliation widget. This limitation could lead to validation errors. **Steps to Reproduce** 1. Create two customer payments 2. Group them into a batch and validate it 3. Open the bank reconciliation widget 4. Create a bank statement line 5. Navigate to the batch payment tab and click on the batch payment 6. Attempt to click on the batch payment line **Root Cause** The method handleLineClicked was overridden in a way that prevented the call to the parent implementation when the flag was 'new_batch', disabling interactivity for these lines. **Fix** The restrictive override of handleLineClicked was removed. All fields in the Manual Operations tab are made read-only, except for analytic distributions, as this is the only field users should be allowed to edit in this context. Opw-4757131 Forward-Port-Of: odoo/enterprise#89858
This update fixes an issue where the VAT summary report for Argentinian invoices was incorrectly calculating totals when multiple IIBB taxes were applied. The fix ensures that VAT amounts are counted accurately, matching the totals displayed in the accounting form. This improves the reliability of financial reporting for Argentinian customers.
Original PR description
**Issue** When using a VAT tax marked as price included, together with multiple IIBB taxes on the same invoice, the VAT summary report displays an incorrect total. Specifically, the VAT amount is…
**Issue** When using a VAT tax marked as price included, together with multiple IIBB taxes on the same invoice, the VAT summary report displays an incorrect total. Specifically, the VAT amount is counted multiple times, once for each IIBB tax, leading to an inflated total. **Steps to Reproduce** 1. Install the Accounting app and the Argentinian localization (l10n_ar) 2. Set the 21% VAT Purchase tax as Included in Price 3. Create a vendor bill applying the 21% VAT tax and at least two IIBB taxes 4. Open the VAT summary report for that bill Expected Behaviour: The total in the VAT summary should match the total shown in the accounting form view, with each tax counted only once. **Root Cause** The VAT summary report in the Argentinian localization relies on an SQL query to aggregate tax information for each `account.move`. The query joins `account_move_line` with `account_tax`, `account_tax_group`, and the many-to-many relation table `account_move_line_account_tax_rel`. Each `account_move_line` related to a VAT tax line (via `tax_line_id`) is joined with the `account_move_line_account_tax_rel` table. If that base line is related to multiple IIBB taxes, the join multiplies the VAT line once per IIBB tax since multiple matching rows exist. **Fix** The solution separates the logic for computing tax lines and base lines into two distinct subqueries. Each is aggregated independently to prevent duplication caused by one-to-many and many-to-many joins. The results are then joined using the unique `account_move_line.id`, ensuring each tax amount is counted exactly once in the final totals. opw-4776861 Forward-Port-Of: odoo/enterprise#97951 Forward-Port-Of: odoo/enterprise#85873
20 changes
New functionality added to Odoo
This pull request integrates holiday functionality into the core HR Payroll module. It updates various files to align with the existing payroll system, ensuring accurate tracking and reporting of employee time off. This enhancement improves payroll accuracy and reporting capabilities.
Original PR description
TaskID: 4179953
Enhancements to existing features
This update replaces all 'Cancel' buttons with 'Discard' throughout the Odoo interface. This change simplifies the user experience by aligning the terminology with common user expectations and reducing potential confusion. It's a minor improvement focused on usability.
Original PR description
## Description:
Replaced all cancel buttons with discard
Task: [5353199](https://www.odoo.com/odoo/2328/tasks/5353199)
## review checklist
- [ ] feature is organized in plugin, or UI components
- [ ] support of duplicate sheet (deep copy)
- [ ] in model/core: ranges are Range object, and can be adapted (adaptRanges)
- [ ] in model/UI: ranges are strings (to show the user)
- [ ] undo-able commands (uses this.history.update)
- [ ] multiuser-able commands (has inverse commands and transformations where needed)
- [ ] new/updated/removed commands are documented
- [ ] exportable in excel
- [ ] translations (\_t("qmsdf %s", abc))
- [ ] unit tested
- [ ] clean commented code
- [ ] track breaking changes
- [ ] doc is rebuild (npm run doc)
- [ ] status is correct in OdooThis update enhances the visibility of the AI button within the Odoo interface. The contrast and alignment have been adjusted to ensure it's easily noticeable in both light and dark modes, improving the user experience. The button has also been centered on the toolbar for better usability.
Original PR description
This PR optimizes the AI logo's contrast to make it more visible and more consistent with the other WYSIWYG icons in both light and dark mode. It also centres the ai button on the toolbar. | Before | After | |--------|--------| | <img width="246" height="33" alt="wysiwyg-light-before" src="https://github.com/user-attachments/assets/8357ff78-06cc-4bbf-8ed8-ff14cf3e79c9" /> | <img width="261" height="42" alt="Screenshot 2025-11-07 at 15 29 29" src="https://github.com/user-attachments/assets/36cda5b2-7937-4ba0-97d2-4d345cf1a160" /> | | <img width="254" height="43" alt="wysiwyg-dark-before" src="https://github.com/user-attachments/assets/0807c8bd-a18e-4c86-920b-4d83ece31b78" /> | <img width="252" height="39" alt="Screenshot 2025-11-07 at 15 29 12" src="https://github.com/user-attachments/assets/49a67995-bc4a-4a74-9223-b0310e7c25f9" /> | task-5095689 PR-commu: https://github.com/odoo/odoo/pull/232281
This update simplifies receipt printer management within Odoo Enterprise by removing receipt printer logic from the hardware proxy service. This change improves the system's architecture and prepares it for future updates, ensuring smoother operation of point-of-sale systems. It’s part of a broader effort to streamline POS processes.
Original PR description
In order to deprecate the hardware proxy service, we moved the receipt printers logic out of it. see odoo/odoo#238347
This update enhances reporting by adding key performance indicators (KPIs) for social media clicks and online appointment bookings. The changes involve refining calculation methods and supporting cross-company data analysis, ultimately providing better insights into business performance.
Original PR description
[IMP] social: add/improve digests We add the #Social Media Clicks KPIs. Note that we use raw sql queries to calculate it as the field click_count on social.post is computed. [IMP] appointment: add digest KPI We add nbr_of_online_appointment KPI. [IMP] various: improve digest Following the improvement of the method _calculate_company_based_kpi to also support the cross company computation, and we rename its call to _calculate_kpi. Following the introduction of the method _get_kpi_custom_settings, we use it to define the KPI's action and remove the method _compute_kpis_actions. Task-2705154
Resolved issues and error corrections
This update prevents the import process from accidentally changing the names of existing journal codes. Previously, importing data would overwrite journal names, causing confusion and potential data discrepancies. The fix ensures that existing journal names are preserved 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 in the Belgian payroll module (l10n_be_hr_payroll_acerta) related to the error message displayed when an Acerta code is entered incorrectly. The message has been clarified to be more user-friendly and unambiguous, ensuring accurate data entry for Belgian companies. This improves the overall user experience and reduces potential errors.
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 fixes an issue preventing correct XML generation for Colombian e-invoices related to the 'INC Bolsas' plastic bags tax. The changes add a dedicated tax flow and ensure accurate reporting of this tax in the invoice XML, resolving DIAN validation errors and enabling successful invoice submissions.
Original PR description
Before PR: -The plastic bags tax (INC Bolsas) was not handled by a specific flow. -This resulted in incorrect XML generation for Colombian e-invoices, leading to validation errors from the DIAN. After PR: -Dedicated logic flow has been added to correctly handle the INC Bolsas tax. -Generated XML now correctly reports this tax in a separate `TaxTotal` block. -It populates the `BaseUnitMeasure` and `PerUnitAmount` fields with the fixed tax rate per bag. Impact: -Colombian e-invoices that include plastic bags tax are now generated correctly. -Ensures compliance with DIAN's specific requirements for this nominal tax. -Prevents validation errors and allows for successful submission of invoices containing this tax. task-5086926 Forward-Port-Of: odoo/enterprise#100391 Forward-Port-Of: odoo/enterprise#95311
This update resolves a test failure that occurred when the demo data was used. The change ensures the test runs correctly without disrupting the demo environment, preventing potential issues during testing and demonstration of the Odoo Enterprise module.
Original PR description
Some tests were failing when the demo data were installed. This commit fixes the test so that it doesn't interfere with demo data. Related build error: https://runbot.odoo.com/odoo/runbot.build.error/234529 task-5386529
This update fixes an issue where the IoT printer was still being used when both an IoT and ePos printer were set up. Now, the system automatically prioritizes the ePos printer, ensuring the correct printer is selected for the user's workflow. This improves the user experience and prevents errors.
Original PR description
When setting an IoT printer and an ePos printer, a message is displayed to inform the user the ePos printer will be used. However, this is not the case and the IoT printer is still loaded. We now avoid loading if there already is a printer. Forward-Port-Of: odoo/enterprise#101130
This update corrects a reporting issue where payment reports incorrectly included bank accounts with zero allocations. The change ensures that reports only display accounts with positive allocations, providing more accurate and reliable payment information. This improves the clarity and trustworthiness of financial reports.
Original PR description
-In case of creating payment reports for an employee with multiple bank accounts, if one of the accounts has an allocation of 0%, it still appears in the report. -This approach has been changed to include only accounts with positive allocations. Backport for odoo/enterprise#100643 Forward-Port-Of: odoo/enterprise#101080
A bug preventing users from adding salary inputs to payslips has been fixed. This issue arose after a recent update and was caused by an incorrect field reference. The fix utilizes the correct `struct_id` field to link payroll structures, ensuring smooth operation.
Original PR description
Currently, an error occurs when user tries to add a salary input on a payslip. Steps to replicate: - Install `hr_payroll`. - Go to any Employee payslip > Salary Inputs > Add Inputs. Error: `AttributeError: 'hr.payslip' object has no attribute 'structure_id'` Cause: - Error occurs after addition of a new [feature]. - The [code] tries to access `self.structure_id` on a record of `hr.payslip`, but since there’s no field named `structure_id`, it resulted in an error. Solution: - Used the field `struct_id` that keeps the record of linked `hr.payroll.structure()`. [feature]: https://github.com/odoo/enterprise/pull/98151 [code]: https://github.com/odoo/enterprise/blob/eda93203ec8da207768357ae91132a49881a2978/hr_payroll/models/hr_payslip.py#L2159 No ID Forward-Port-Of: odoo/enterprise#100966
This update corrects issues in tax reporting for businesses using multiple companies within a shared tax unit. It ensures that OSS reports and domestic tax returns are correctly linked to the appropriate main company, resolving inconsistencies and improving data accuracy. This enhances compliance and reporting reliability.
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 improves the speed of processing overtime on attendance records. The previous system was slow due to a missing database index, which caused delays when removing existing overtime entries. Adding an index has significantly optimized this process.
Original PR description
Updating the overtime on attendance may take huge time. The issue comes from the lack of index on work entries so it takes a lot of time to unlink an existing overtime line. So we add an index on the work entries (which is mainly null) Forward-Port-Of: odoo/enterprise#101223
This update fixes a previous issue where the AI agent's transcription summaries weren't displayed in the user's preferred language. Now, the agent automatically generates summaries in the language selected for the transcription, ensuring a more natural and user-friendly experience. This change also applies to date formatting within the summaries.
Original PR description
This commit introduces a change that makes the agent produce a summary in the selected language from the transcription tab. It injects a specific prompt using the `currentLanguage` of the transcription the component. Instructing the LLM to generate in the proper language. Forward-Port-Of: odoo/enterprise#101075
This update enhances the bank reconciliation widget to accurately display early payment discounts (EPD) when batch payments are used, particularly with invoices linked to payments. It now correctly handles EPD calculations and displays the discount amount alongside the payment, ensuring accurate reconciliation and reporting of early payment benefits.
Original PR description
In the bank reconciliation widget, it is now possible to have batch payments containing payments linked to only invoice_ids. Such batch payment, once mounted in the widget, should reflect the invoice or move amounts of its payments, and not only the payments amount. In the case of a payment-invoice combo that's elligible for an early payment discount, the early payment discount should also be displayed in the widget. Example: Invoice of 1000$ with possible EPD of 2%. A payment (with no move) is done (paid in the "early" period) for 980$. The payment is then put into a batch payment. Once in the bank rec widget, when mounting the 980$ batch payment to a statement line of 980$, the widget should display it as a batch payment line of 1000$ and add another 20$ Early payment Discount line. task-4681366 Forward-Port-Of: odoo/enterprise#100533 Forward-Port-Of: odoo/enterprise#83077
This update enhances the performance of our reports by streamlining how cached data is handled. The team removed a technical detail that was causing issues with report caching, now managed entirely on the client-side. This results in faster report loading times and a smoother user experience.
Original PR description
This commit is needed by PR https://github.com/odoo/enterprise/pull/96946, which introduces a cache for rpc calls executed by the reports, like the one we use for views. When setting an option filter to value A, then switching to B and finally coming back to A, we'd expect the cache to work, and basically reload the original value computed for A instantly. It did not work because of the loading_call_number key, which was always set with a different value in the options dict. We now entirely remove the loading_call_number from the options, and don't pass it to the server at all. Instead, everything is handled js-side, with function parameters. In the meantime, we address some potential async issues in the reports' js code, essentially by reordering some lines or assigning return values to variables before calling await.
This update resolves a bug where a previously unlinked call continued to appear in the Odoo softphone. The fix ensures that calls are immediately removed from the softphone interface when they are no longer linked, improving the user experience and data accuracy.
Original PR description
A call that was unlinked previously remained visible in the VOIP softphone. This fix ensures that the call is correctly removed from the softphone view as soon as it is unlinked. Task-5262162 Forward-Port-Of: odoo/enterprise#100803 Forward-Port-Of: odoo/enterprise#100036
Features or functions removed from Odoo
This update removes the 'Registerer' component from the VoIP module. This change simplifies the VoIP system and aligns with evolving best practices for user experience. The removal addresses potential complexities and improves the overall stability of the system.
This update removes WebRTC support from the IoT modules, streamlining the system and reducing complexity. With the introduction of LNA for local networks, WebRTC is no longer necessary, and HTTP now provides a reliable alternative without requiring SSL certificates.
Original PR description
Community PR: odoo/odoo#238626 Since the introduction of LNA for communication on local networks, there is not much reason to use WebRTC as HTTP now also works without an SSL certificate. For this reason we remove it to reduce the complexity of the code. task-5386539
10 changes
Resolved issues and error corrections
This update allows Odoo to utilize a broader range of testing VAT numbers provided by our EDI partner, following increased usage of the EDI integration. Previously, we only supported a limited set of VATs, but this change ensures compatibility with the latest testing options offered by our provider. This improves the accuracy of VAT processing when using the EDI feature.
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 the original names, causing confusion and potential data inconsistencies. This fix ensures journal names remain accurate and consistent after importing data.
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 resolves an issue where the website editor could fail to open correctly under certain network conditions. By ensuring the iframe fully loads before the editor initializes, the change makes the website editing process more consistent and reliable for users. This prevents unexpected errors and improves the overall user experience.
Original PR description
In this commit, we fix a non deterministic behavior by ensuring the iframe is loaded before it try to open editor. runbot-232846 Forward-Port-Of: odoo/odoo#238054
This update fixes a confusing error message related to Acerta codes in the Belgian payroll system. The previous message was unclear, leading to potential user confusion. The fix provides a more precise and understandable validation message, ensuring accurate code entry and reducing the risk of errors.
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 fixes an issue where Colombian e-invoices were failing validation due to incorrect tax reporting for plastic bags (INC Bolsas). The changes add specific logic to generate the correct XML format, ensuring compliance with DIAN requirements and allowing invoices with this tax to be successfully submitted.
Original PR description
Before PR: -The plastic bags tax (INC Bolsas) was not handled by a specific flow. -This resulted in incorrect XML generation for Colombian e-invoices, leading to validation errors from the DIAN. After PR: -Dedicated logic flow has been added to correctly handle the INC Bolsas tax. -Generated XML now correctly reports this tax in a separate `TaxTotal` block. -It populates the `BaseUnitMeasure` and `PerUnitAmount` fields with the fixed tax rate per bag. Impact: -Colombian e-invoices that include plastic bags tax are now generated correctly. -Ensures compliance with DIAN's specific requirements for this nominal tax. -Prevents validation errors and allows for successful submission of invoices containing this tax. task-5086926 Forward-Port-Of: odoo/enterprise#100391 Forward-Port-Of: odoo/enterprise#95311
This update fixes inconsistencies in how tax unit reports are generated, particularly for OSS reports. It ensures that multiple companies within a tax unit are correctly consolidated, and that tax returns are always linked to the appropriate main company, leading to more accurate 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 restores automatic follower copying from parent sales orders to subscription renewals and upsells, aligning with expected business processes. Previously, this feature was removed for all users, but now it's specifically enabled for subscription-related orders. This ensures consistent tracking of customer relationships across the sales cycle.
Original PR description
In Odoo 18.2 (Task 4655022), automatic follower addition was removed for all users and limited to internal users. However, for subscriptions, it is logical to automatically copy followers from the parent sale order to renewal and upsell orders. This commit restores that behavior for subscription renewals and upsells while keeping the restriction for other record types. task - 5002181 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
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 template's `email_from` was blank, the email would be sent by the organizer. This change improves email consistency and allows for customized sender addresses for calendar invites.
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 the payroll demo data installation from working correctly at the start of the year. The fix sets a fixed past year for Mitchell Admin's contract, ensuring accurate demo data generation. This resolves a technical error (runbot 234612) and improves the demo's reliability.
Original PR description
Before this commit, the relative date used to generate Mitchell Admin's contract was always at January 1st of the current year, making the payroll demo data install fail when at the start of the year. This commit sets a fixed year in the past for Mitchell's contract. runbot error 234612
An issue was preventing users from uploading attachments during e-learning reviews. This update resolves a bug that occurred after a specific code change, ensuring attachments are properly transmitted with the necessary access tokens. This improves the e-learning review process and prevents upload failures.
Original PR description
Bug === Since bf759408dd63b3d6004d588251acb7bcbd2e2dee when we upload an attachment with portal in a review in e-learning, an error is raised. Task-4687269
15 changes
Enhancements to existing features
This update allows users to include multiple attachments when sending invoices through the Peppol system. These attachments are now embedded within the XML document format, streamlining the process for exchanging supporting documentation. This enhancement improves the efficiency and compliance of Peppol transactions.
Original PR description
[IMP] account: multiple embed files peppol This commit allows user to send multiple attachments through peppol. The attachments will be embedded into the xml under the `AdditionalDocumentReference` tags task-5103539
This update ensures greater clarity and accuracy in Odoo's queries by consistently using fully qualified column names (e.g., `account_move.balance`). This prevents ambiguity when joining tables and avoids potential issues with custom modules, ultimately strengthening data reliability.
Original PR description
Use fully qualified column names when constructing a query, more specifically, include the table that the column is originating from. The rule of thumb is that we always include the table name alongside the column name. In this particular case, the query will do a `JOIN` on `account_move` and there may be ambiguousness as to whether to take the `balance` column from `account_move` or `account_move_line`. The former column used to exist in the past and was likely kept for data retention purposes. Hence, there are still databases in 17.0 where `account_move.balance` exists. Another reason to include the table name is to prevent confusion with columns coming from custom modules. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237181
This update enhances the handling of Chilean electronic invoices by ensuring document folio numbers align with available CAF files. A key change requires a valid owner document (subject_serial_number) for certificates, improving data integrity and compliance with SII regulations. This update focuses on stability and accuracy of Chilean electronic invoice generation.
Original PR description
This pull request introduces improvements to the handling of Chilean electronic document sequences, enforces stricter validation for certificate data, and modernizes string formatting throughout the…
This pull request introduces improvements to the handling of Chilean electronic document sequences, enforces stricter validation for certificate data, and modernizes string formatting throughout the codebase. The most significant changes focus on ensuring that document folio numbers are correctly managed in accordance with available CAFs, making the certificate model more robust, and updating code style for clarity and consistency. This improvement is mostly made because CAFs have expiration dates and fixed folio numbers. If the expiration date is reached but the folios were not fully consumed, the system will try to generate a document with following number in the sequence but an error will be raised because that number belongs to an expired CAF, althought the user had already uploaded a new CAF. To fix this, whenever the system looks for the highest number to set to a document, it previously check if that number is between the folio numbers of a valid CAF file. ### Chilean electronic document sequence management * Added `_get_last_sequence` method to `account_move.py` to ensure that the folio number used for Chilean electronic documents (DTE) is valid and corresponds to an available CAF. If no CAF is available for the current folio, the sequence is reset using the document type's prefix and starting number. ### Certificate model validation * Made `subject_serial_number` a required field in the `Certificate` model, enforcing that every certificate has a valid owner document and improving data integrity. We made this change to prevent the field being empty after loading the certificate in Odoo, since it is required by the SII to validate invoices.
Resolved issues and error corrections
This update fixes a bug that prevented users from creating multiple rental orders with the same serial number. The issue stemmed from an incorrect assumption about stock movements, leading to errors. The fix ensures accurate availability calculations and allows for proper management of rental orders with multiple associated serial numbers.
Original PR description
Steps to reproduce: 1. Go to Rental module > Configuration > Enable Rental Transfer 2. Create a product and Update quantity by assigning "By Unique Serial Number" 3. Create a rental order 4. Unhide…
Steps to reproduce: 1. Go to Rental module > Configuration > Enable Rental Transfer 2. Create a product and Update quantity by assigning "By Unique Serial Number" 3. Create a rental order 4. Unhide the "Reserved Lot" field, select the lot created earlier, and confirm 5. Open the Delivery(Stat button), assign lots to both deliveries 6. Create a second rental order (same or different user), assign the same lot, confirm, and process delivery 7. Create a third rental order, enter the same reserved lot → traceback occurs Issue: - Traceback with error `ValueError: Expected singleton: stock.move(88, 90)`. Cause: - The compute method `_compute_available_reserved_lots` accessed `move_id.date_deadline` directly, assuming a singleton. When multiple stock moves existed for the same lot, it triggered a singleton error. - When the same lot is linked to more than one delivery, the system crashed when checking available reserved lot. Solution: - Handled multiple stock.move.line records per lot by iterating over them instead of assuming a singleton. - Replaced direct access to move_id.date_deadline with an any() check to safely evaluate deadlines. - This prevents singleton errors when the same lot is linked to multiple deliveries and ensures correct availability calculation. opw-4963263 Forward-Port-Of: odoo/enterprise#94299
This update fixes an issue where failed quality checks didn't correctly move stock items to designated failure locations. The fix now triggers a wizard allowing users to confirm the failure and select the correct location, ensuring accurate tracking of quality issues within the stock management system. This improves data integrity and streamlines the process of handling defective products.
Original PR description
## Issue: When you use the Smart button `Quality Checks` on a `stock.move` to validate QC, marking a test as Fail doesn't move the `stock.move` to the failing location even if the QC is now failed…
## Issue: When you use the Smart button `Quality Checks` on a `stock.move` to validate QC, marking a test as Fail doesn't move the `stock.move` to the failing location even if the QC is now failed This affects all quantity-based checks (Measure or Pass/Fail) ## Cause: The `do_fail()` method marks the check as failed but does not call `_move_line_to_failure_location()`, so the move line stays in the original location ## Fix: Trigger the failure wizard when failing a QC via the buttons This allows the user to confirm the failure and select the appropriate failing location if multiple are configured ## Steps to reproduce: - Enable Storage Locations in Settings - Create a Product and a Quality Point (Product: Quality, Operations: Receipt, Control per: Quantity, Type: Measure, Tolerance: 0.0 to 1.0, Failure Locations: WH/Failure) - Create a New Receipt for the Product and Mark as Todo - Open 'Quality Checks' via the Smart button, select the QC, enter a measure value above the tolerance (e.g., 2.0), and click Measure. - The QC should be marked as failed - Before the fix, the details of the line in the Receipt doesn't change to the failing location You can also do the same flow with a QP of type Pass/Fail and the Fail button opw-4920391
This update corrects a bug in the vehicle availability calculations for the Belgian payroll and fleet module. It now accurately excludes vehicles flagged for change (plan_to_change_car or plan_to_change_bike) with a 'False' status, ensuring they are not incorrectly listed as available. This improves the accuracy of vehicle availability 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 fixes a bug that prevented homeworking locations from appearing in the month view calendar. The change ensures that locations are correctly displayed and interactable, mirroring the functionality in week and day views, improving the user experience for scheduling remote work. It also addresses an issue with grouped icons for similar locations.
Original PR description
Description of the issue/feature this PR addresses: After a refactor, the month view no longer displayed homeworking locations as in previous versions. This PR fixes the issue and adapts the…
Description of the issue/feature this PR addresses: After a refactor, the month view no longer displayed homeworking locations as in previous versions. This PR fixes the issue and adapts the component using the updated version of the FullCalendar library. Also fixes a small issue of when different locations with same icons are grouped together when they shouldn't Current behavior before PR: All days in the calendar month view displayed the 'Set location' button, regardless of whether a location record existed for the day or not. Locations of a different type sharing the same icon (Office, Building 1...): <img width="262" height="135" alt="before" src="https://github.com/user-attachments/assets/51745152-5f90-4917-9627-07aa0959eb3d" /> Desired behavior after PR is merged: Locations are shown in the month view, and can be interacted with in the same way as in the week/day views, both for single and multicalendar: <img width="1230" height="504" alt="multicalendar" src="https://github.com/user-attachments/assets/34108f57-2c25-400e-9fbe-106e2233c677" /> <img width="1232" height="382" alt="singlecalendar" src="https://github.com/user-attachments/assets/f4a0cf32-636f-49ce-a4cc-e53a9ac45643" /> Locations of a different type sharing the same icon: <img width="256" height="132" alt="after" src="https://github.com/user-attachments/assets/643dd304-aeeb-48ec-abef-755e3eb5fdf0" /> --- Task ID: 5215931
This update fixes an issue where debit notes in the Uruguayan localization were incorrectly assigned as e-invoices. The fix ensures debit notes automatically use the correct document type (113) instead of 111, streamlining invoice processing for Uruguayan businesses. This improves data accuracy and compliance.
Original PR description
**Steps to reproduce:** * Install and activate the **Uruguayan Localization** for the company. * Create a contact located in Uruguay. * Create an invoice for this customer and set **Document Type =…
**Steps to reproduce:** * Install and activate the **Uruguayan Localization** for the company. * Create a contact located in Uruguay. * Create an invoice for this customer and set **Document Type = 111 (e-Invoice)**. * From the invoice's gear icon, create a **Debit Note**. **Observed behavior:** * The debit note is automatically assigned **Document Type 111 (e-Invoice)**, even though it should use **113 (e-Invoice Debit Note)**. * Attempting to change the document type manually only shows 113 as an option, confirming the debit note should not have been set to 111. **Cause:** * `_compute_l10n_latam_document_type()` applies a rule that assigns Document Type **111** to all Uruguay electronic invoices with RUT identification. * This logic does **not** check whether the move is a **debit note** (`m.debit_origin_id`), and therefore incorrectly overrides the expected debit note document type. * The override prevents the correct selection (internal_type == *debit_note*) from being applied. **Fix:** * Add a condition in the automatic e-Invoice assignment logic. * Debit notes now bypass the e-Invoice assignment and fall through to the parent method, which correctly assigns **Document Type 113**. opw-5154599
This update resolves an error that occurred when creating time off allocations with hourly schedules, specifically when all attendance entries had start and end dates. The fix prevents a division-by-zero error, ensuring time off allocations are created correctly. This addresses a technical issue related to how the system calculates hours for time off.
Original PR description
_ ## Short functional explanation of the error When creating a time off allocation with a time off type expressed in hours, and having start/end dates for every attendance in the corresponding…
_ ## Short functional explanation of the error When creating a time off allocation with a time off type expressed in hours, and having start/end dates for every attendance in the corresponding calendar, an error is raised. ## Reproduction Steps 1. Go to Employees and click on the Configuration tab > Working Schedules. 2. Click on a schedule and click on the button next to Work Entry Type to show the Starting date. 3. Set a starting date for each entry. 4. Go to Time Off. Click on the Configuration tab > Time Off Types. 5. Click on a time off and next to the Take Time Off in, select Hours. 6. Click on the Management tab > Allocations. Click on New. 7. Select an employee that has the schedule you updated earlier. ## Expected behavior The allocation is created. ## Unexpected Behavior A traceback occurs: ``` ZeroDivisionError: float division by zero ``` ## Origin of the issue When setting a start or/and an end date to an attendance, this attendance won't be taken into account for global attendances anymore. This leads to an erroneous computation of hours_per_day, leading to a few issues; one of them is related to time off allocation: When setting a time off with a time off type expressed in hours, if every single attendance in the calendar has a start/end date, there will be no global attendance hours left, leading to a division by 0: https://github.com/odoo/odoo/blob/8097b674a23858ed7692a0b30ca74419b8f890f7/addons/hr_holidays/models/hr_leave_allocation.py#L262 After discussion, we decided that this fix would only fix a symptom, and not the problem itself. _ opw-5340056 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where switching between image and icon types in the HTML editor didn't correctly remove outdated class names. Previously, images could retain invalid classes like 'w-100' when switched to an icon. This fix ensures that the HTML editor consistently removes irrelevant classes, improving the editor's functionality and preventing potential display issues.
Original PR description
Before this commit, switching the media type would not properly remove the classes of the element. For example, images can have the class "w-100" while icons cannot. If an image had the class "w-100", switching to an icon would keep the class "w-100", even though this class isn't valid for icons. This commit fixes the code to properly remove all invalid classes.
This update resolves a problem where the tax upgrade script incorrectly translated strings, leading to errors. The fix ensures consistent translation across different language environments, preventing disruptions during upgrades. This improves the stability and reliability of the tax processing functionality.
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, ensuring reports are generated with the desired layout. This improves report customization options.
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 adding a product with duplicate attribute values to a sales order would cause a system error. The fix ensures correct handling of product variants with multiple attribute selections, preventing crashes and improving order creation stability. This impacts users creating and managing sales orders.
Original PR description
## Versions 18.0 to saas-18.3 Fixed by 7b56a6afda919f3c09d08eb1256416e0a2b4b1d9 introducing a new logic with…
## Versions
18.0 to saas-18.3
Fixed by 7b56a6afda919f3c09d08eb1256416e0a2b4b1d9 introducing a new logic with https://github.com/odoo/odoo/blob/26f9cab34a8cd594192d9e2a844494196b9ca5b6/addons/sale/controllers/product_configurator.py#L329
## Issue
Duplicating an attribute on a product leads to a traceback when adding the product to a SO.
## Steps to reproduce
*Ensure variants are activated in the settings*
- Create a new test product:
- Attributes & Variants (on 2 distinct lines):
- "Brand": 1;
- "Brand": 2 & 3.
- Create a new SO:
- Add the test product.
## Cause
The product has 2 attribute lines referring to the same attribute. As both attribute lines point to the same attribute, `ptals.attribute_id.read()` returns only one value for two ptals. The `zip()` call therefore drops the extra ptal, producing an incomplete mapping. When the configurator later tries to access this missing ptal entry, it crashes https://github.com/odoo/odoo/blob/369ca1e5a154235e80b9ea6af7b3f10442c0939f/addons/sale/controllers/product_configurator.py#L321.
opw-5373672This update fixes an issue where Express Checkout with Stripe wasn't automatically applying the correct tax based on the customer's address. Now, the system correctly identifies and applies the fiscal position, eliminating the need for a page reload to see accurate pricing and taxes for users utilizing this payment method. This ensures consistent and accurate tax calculations for eCommerce transactions.
Original PR description
## Issue: When a fiscal position should apply based on the address provided during Express Checkout, it was not applied automatically The correct fiscal position only appeared after reloading the checkout page This issue affects public users using the eCommerce with Stripe Express Checkout ## Cause: The fiscal position was correctly determined during the `availableCarriers` computation, but it was not propagated to the payment request itself As a result, prices and taxes were only updated after a full page reload ## Steps to reproduce: - Configure Stripe with Express Checkout (e.g., Google Pay) - Create a fiscal position with automatic detection (Country = US, Tax mapping: 15% → 0%) - Create a product using the 15% tax - Go to the website shop and add the product to the cart - Use Express Checkout with a US address - Observe that the fiscal position is not applied unless the page is reloaded opw-5018238 Forward-Port-Of: odoo/odoo#236832
This update prevents the creation of duplicate reversal and deferral entries when generating deferred entries from invoices. The change corrects an issue caused by a recent update to how month calculations are handled, ensuring journal entries are cleaner and more accurate. This improves the overall stability and clarity of financial reporting.
Original PR description
When generating deferred entries from invoice lines, certain scenarios led to the creation of both a reversal and a deferral for the same amounts. These entries would effectively cancel each other out, creating unnecessary noise in the journal entries. This issue primarily occurred when the start date, end date, and accounting date all fell within the same calendar month. The problem was exacerbated by the introduction of the `full_months` computation method in https://github.com/odoo/enterprise/commit/5dca9c0c2691cba2335e110ad63a2dcc8bbf6d57. To correctly handle this method and prevent the erroneous paired entries, the end date must now be adjusted by subtracting one month when calculating the deferral period. opw-5000337 Forward-Port-Of: odoo/enterprise#100507
8 changes
New functionality added to Odoo
This update adds the required ICE (Identifiant Commun de l'Entreprise) number field to invoices issued to Moroccan companies. This ensures compliance with Moroccan regulations and accurately reflects business information for these transactions within the Odoo accounting system. The change was backported from the 18.0 release to maintain compatibility with older versions.
Original PR description
Backport ICE number from 18.0 to 16.0: f9d00e684b3fa395a33ae4b5b795d9fc6e4fcf0e Reason: The ICE (Identifiant Commun de l'Entreprise) is an identification number assigned to businesses and legal entities for various administrative and legal purposes in Morocco. If the partner has one, it must be indicated on the invoice. The ICE number is supposed to be put on all the invoices made to Moroccan companies, whatever the country of the company issuing those invoices. We hence add that directly into the account module. task-4879950 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#237068
Resolved issues and error corrections
This update corrects a display issue in the general ledger report where journal items were incorrectly linked to the wrong account groups. The fix ensures that journal items are accurately associated with the corresponding account group, improving report accuracy and data reliability. This resolves a user-reported problem.
Original PR description
Repro steps: 1. Create account groups 2. Go to general ledger report 3. Click on 'Journal Items' of one of the account groups lines Problem: The journal items shown don't belong to the account group that it should belong to. Fix: This commit fixes this issue by adding the correct action_domain of account_id.group_id. opw-5180867
This update fixes an issue where unnecessary slashes were appearing in Odoo reports due to empty comment fields. The change ensures reports are formatted correctly, removing the extraneous slashes and improving data accuracy. This resolves a minor formatting problem that could potentially cause confusion or errors in report generation.
Original PR description
Since 17.0, we added a / when there was no comment in the comment section of the xml. This is wrong and should be left empty. opw-5242381
This update introduces a command-line option to prevent Odoo from automatically installing modules during upgrades. This addresses a complex issue where outdated databases can cause upgrade failures and business logic problems. The new feature provides greater control over the upgrade process.
Original PR description
In some case, a database can be in a state where some auto install module are not installed - when the user uninstall a module - when module was added in stable and a database was created before the…
In some case, a database can be in a state where some auto install module are not installed - when the user uninstall a module - when module was added in stable and a database was created before the addition. It can lead to issues where an upgrade fails or some business logic does not work as expected because of the missing modules. This is not easy to reproduce and to test, even if uninstalling such module should in theory work and be tested. This pr proposes to add a flag "--skip-auto-install" to the config to be able to disable all auto install of modules. It is open to discussion to change this to a config option, with or without a module list **Initial solution (alternative to avoid a config)** --dev skipautoinstall **Current solutions** (command line param) --skip-auto-install **Maybe in the future but unlikely** (more flexible) --skip-auto-install=all --skip-auto-install=web_enterprise,iap (krma suggestions) --skip-auto-install=* --skip-auto-install=web_*,iap Those two last one could be more flexible but the use case are limited and can be done another way with an explicit -i, maybe no worth the additional complexity (mainly since we need to filter in two different places) Note that this pr uses **get** on the config just in case the config is monkey patched somewhere to make it more robust.
This update fixes an issue where a virtual keyboard would unexpectedly appear when selecting dates or times on mobile devices. The change now hides the keyboard and cursor on small screens, resulting in a smoother and more user-friendly experience for mobile users. This improves usability and reduces frustration.
Original PR description
Steps to reproduce: In a module, add a field with tracking=True on any model Change this field on any record, to force the creation of a tracking value Remove the field from the code Update the…
Steps to reproduce:
In a module, add a field with tracking=True on any model
Change this field on any record, to force the creation of a tracking value
Remove the field from the code
Update the module
Result:
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/service/server.py", line 1313, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-16>", line 2, in new
File "/home/odoo/src/odoo/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/odoo/modules/registry.py", line 114, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/odoo/modules/loading.py", line 536, in load_modules
env['ir.model.data']._process_end(processed_modules)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_model.py", line 2558, in _process_end
self._process_end_unlink_record(record)
File "/home/odoo/custom/odoo/addons/website/models/ir_model_data.py", line 36, in _process_end_unlink_record
return super()._process_end_unlink_record(record)
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_model.py", line 2487, in _process_end_unlink_record
record.unlink()
File "/home/odoo/custom/odoo/addons/mail/models/ir_model_fields.py", line 52, in unlink
'sequence': self.env[field.model_id.model]._mail_track_get_field_sequence(field.name),
File "/home/odoo/custom/odoo/addons/mail/models/models.py", line 181, in _mail_track_get_field_sequence
self._fields[fname], 'tracking',
KeyError: 'field_name'
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes a potential issue where printing failed on Windows systems. By adding a catch-all error handler around the printing process, the system is now more robust and reliable when generating print jobs. This ensures consistent printing functionality for users.
Original PR description
This commit adds the try/except block around print_raw method of the virtual iot box to allow catching exceptions when printing on Windows
This update increases the time allowed for sending log data from the IoT box to the database, resolving previous issues that caused frequent errors. The change extends the timeout to 10 seconds and adjusts the log sending frequency to 12 seconds, ensuring more reliable data transmission and reducing disruptions.
Original PR description
Currently the request to send logs to the db from the iot box is at 0.5s timeout. This leads to many exceptions and failed requests. This commit sets the timeout for such requests to 10s (previously 0 5s) and the frequency of sending logs to every 12s (previously 0.5s)
In the Accounting app (with the *Spain - Veri\*factu* module installed), when a user who is **not** part of the *Accounting / Invoicing* (`account.group_account_invoice`) group would be blocked by an Access Error when trying to open an invoice. Among the Accounting groups, only *Accounting / Read-only* does not inherit from *Accounting / Invoicing*, which means that only the users in *Accounting / Read-only* could not access the invoices. By granting read rights to both *Accounting / Invoici
Original PR description
In the Accounting app (with the *Spain - Veri\*factu* module installed), when a user who is **not** part of the *Accounting / Invoicing* (`account.group_account_invoice`) group would be blocked by an…
In the Accounting app (with the *Spain - Veri\*factu* module installed), when a user who is **not** part of the *Accounting / Invoicing* (`account.group_account_invoice`) group would be blocked by an Access Error when trying to open an invoice. Among the Accounting groups, only *Accounting / Read-only* does not inherit from *Accounting / Invoicing*, which means that only the users in *Accounting / Read-only* could not access the invoices. By granting read rights to both *Accounting / Invoicing* and *Accounting / Read-only*, we ensure that any user belonging to an Accounting group can see the invoices from the Veri\*factu module. ### Steps to reproduce: 1. Install *Accounting* (`accountant`) and *Spain - Veri\*Factu* (`l10n_es_edi_verifactu`). 2. Go to Settings > Users & Companies > Users and select a user. 3. In the *Access Rights* tab, set the user's *Accounting* access right to *"Read-only"*. 4. Log out, then log back in as the user selected in step 2. 5. Go to Accounting > Customers > Invoices and select any invoice. 6. An access error pops up. opw-5343391