Daily updates from Odoo
Navigate
Branch
Monday, February 23, 2026
307 changes
45 changes
New functionality added to Odoo
This update incorporates the National Bank of Kazakhstan as a currency rate provider. This change fulfills regulatory requirements specific to Kazakhstan, ensuring accurate currency conversions for users in that region. It improves the system's compliance and functionality within the Kazakhstan market.
Original PR description
This PR adds the National Bank of Kazakhstan as a provider in order to meet the requirements of the Kazakhstan code. Task-4144725 Forward-Port-Of: odoo/enterprise#107797
Enhancements to existing features
This update replaces a complex caching mechanism with a simpler one for functions without arguments. This change reduces unnecessary overhead and improves the performance of key Odoo modules, leading to faster response times. The update focuses on internal optimizations without impacting user-facing features.
Original PR description
A 0-argument function can definitionally only have one cache entry (at `()`). Not only is a bound entirely useless (`lru_cache` does not do any presizing), using `lru_cache` incurs the full cost of maintaining an LRU's doubly-linked list. Using `cache` (~ `lru_cache(None)`) still allocates and interacts with a dict, but it at least skips the whole LRU.
This update optimizes the Delivery Ups module by replacing a less efficient caching method (`lru_cache`) with a standard cache. This change improves performance, particularly for argument-less functions, leading to faster processing times. It's a routine performance enhancement.
Original PR description
On an argument-less function, `lru_cache` is strictly worse.
This update enhances the AI chat experience by improving the readability and formatting of AI responses. Changes include highlighting code snippets, adjusting message layout for better clarity, and dynamically updating conversation titles to mirror popular AI platforms like ChatGPT.
Original PR description
* = ai_knowledge, ai_livechat, test_full_discuss_enterprise In this commit, we "overhaul" the way that AI messages are rendered. This effort was motivated not just by aesthetics but also to make the…
* = ai_knowledge, ai_livechat, test_full_discuss_enterprise In this commit, we "overhaul" the way that AI messages are rendered. This effort was motivated not just by aesthetics but also to make the AI responses more readable and understandable for users. The first change was to inject boostrap classes to the tables added by the markdown library. By doing that, we make tables render as tables with borders and highlighting, instead of just text. We also added the prism library in the modules assets. Now, if the AI replies with some code snippet, it will be highlighted depending on the language used. We also added different CSS rules in `chat.scss` to changed some of the front end details like the padding and margin between elements in messages. In said file, we also changed some display and width values, to make tables and code segments horizontally scrollable, so information won't get "smushed" in a chat window. We also limit the width to 75% of the AI response in the discuss app because otherwise the information was too spread out - we added a media query to return the width to 100% in smaller screens. We moved the "Expand in Discuss" button, to be inbetween the close button and the minimise button, because the dropdown was confusing users, who imagined that they can switch between agents directly from the chat window. We additionally, made it so conversation titles change based on the user's first query, similarly to how it is done in the web versions of ChatGPT or Gemini. For that, we initial create channels with the name field empty and then we extend the display_name compute method of the discuss channel to add the agent's name in case the name is empty. After the first message we populate the name field which should by extension change the display_name field. We heavily patched the message template to remove the bubble and apply classes for the css rules. We also made it so user messages remain in the right in the discuss app (like in chat windows), increasing visual clarity. Finally, the test_natural_language_query_tour was modified to check for the new descriptive chat window title feature and the test_create_ai_chat was modified to reflect the new way of creating ai chats - with empty name and populated display_name. Task-5164382
This update adds more flexible options for calculating AVS (Additional Voluntary Savings) deductions within Odoo's payroll system for Swiss businesses. The changes improve the system's adaptability to various Swiss tax regulations and reporting requirements. A new test has been implemented to ensure accurate salary rule calculations.
Original PR description
5 more generic AVS is added to l10n_ch_hr_payroll/hr_salary_rule_data and /hr_payroll_input_types. task - 5902593 Forward-Port-Of: odoo/enterprise#107901 Forward-Port-Of: odoo/enterprise#106218
This update allows companies to directly receive KSeF invoices electronically, eliminating the need for traditional postal delivery. This streamlines the invoice process and ensures legally compliant delivery of sales invoices under Poland's KSeF tax system. It improves efficiency and reduces administrative overhead.
Original PR description
If a company sell me something, they can send me an invoice. With KSeF, they do not have to send an invoice to me by post or mail - they can send it directly to KSeF. And it is legally delivered to me. Implement fetching bills from KSeF task-5405257 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247812
This update enables administrators to create API keys programmatically, streamlining the process and reducing manual steps. Previously, API keys needed to be created through a user interface. This change allows for more efficient key management and integration with automated systems.
Original PR description
Previously, API keys could only be created interactively: the method required an interactive session and a recently typed password. This commit adds a new method on `res.users.apikeys` that allows creating an API key when an existing one is provided. Optionally, in the case of a renewal, the new key can replace the old one, and the provided one is unlinked. Forward-Port-Of: odoo/odoo#249528 Forward-Port-Of: odoo/odoo#246118
Resolved issues and error corrections
This update fixes a critical issue in the Australian payroll calculations by ensuring payslips use the correct tax settings for each pay period, based on the employee's contract history. Previously, the system incorrectly used current employee data, leading to inaccurate withholding and tax calculations. This change guarantees historically accurate payroll processing for Australian employees.
Original PR description
Since the introduction of the employee versioning system, using `employee.field_name` in salary rules is no longer accurate for computations involving historical or specific periods. Accessing fields…
Since the introduction of the employee versioning system, using `employee.field_name` in salary rules is no longer accurate for computations involving historical or specific periods. Accessing fields directly on the `employee` record returns the current values. This creates an issue when a future version exists. For example, if a new version is created for February 2026 with an updated Child Support amount, generating a delayed payslip for January 2026 would incorrectly use the February value (current state) instead of the January value (historical state). This commit updates the Python compute logic in the Australian salary rules to use `version.field_name` instead of `employee.field_name`. The `version` object ensures the data used corresponds strictly to the payslip's period. The following rules/fields are updated to use the version object: - Tax Treatment Category - Additional Withholding Amount - Extra Pay - TFN Declaration - Medicare (Reduction, Exemption, and Levy) - Training Loans - NAT 3093 Amount (Tax Offset) - Child Support (Garnishee and Deduction) A test case is added to verify that a payslip correctly retrieves the child support amount from the version valid during the payslip period, ignoring future updates. Task-5002697 Forward-Port-Of: odoo/enterprise#108063 Forward-Port-Of: odoo/enterprise#106550
This update fixes an issue where the builder overlay's position wouldn't refresh when resizing elements within the website builder. The fix prevents the creation of hover overlays for elements already using the builder overlay, ensuring the overlay accurately reflects changes made through resizing. This improves the user experience when making adjustments to website designs.
Original PR description
**Issue:** The builder overlay position was not reliably updating when resizing an element via drag handles. This happened because the hover overlay was also being created for elements that already had an active builder overlay. When `removeHoverOverlay()` ran, it unobserved the element from the ResizeObserver. Active builder overlays rely on that observer to refresh their position and dimensions. Removing it prevented the overlay from updating while resizing. **Fix:** Do not create a hover overlay for elements that already have an active builder overlay. This preserves the ResizeObserver for active overlays, and not showing hover overlays for already active elements also makes functional sense. task-[5955545](https://www.odoo.com/odoo/project/974/tasks/5955545) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue preventing the Hungarian VAT integration from correctly communicating with the NAV system. A change in how the software ID was generated resulted in a shortened string, failing validation. The fix adds padding to ensure the ID is always 18 characters long, resolving the communication error and enabling proper functionality.
Original PR description
**Steps to reproduce:** * Create a **Hungarian** database with **Accounting** or **Invoicing**. * Set a valid **VAT number** on the company. * Configure **NAV credentials** in **production mode**.…
**Steps to reproduce:**
* Create a **Hungarian** database with **Accounting** or **Invoicing**.
* Set a valid **VAT number** on the company.
* Configure **NAV credentials** in **production mode**. (use credentials from ticket)
* Try to save the Settings.
**Observed behavior:**
* Authentication fails with error: `INVALID_REQUEST: Helytelen kérés!`
* NAV returns schema violation: `Value 'BE477472701-19110' is not facet-valid with respect to pattern '[0-9A-Z\-]{18}' for type 'SoftwareIdType'.`
* The softwareId is only 17 characters instead of required 18.
**Cause:**
* The `version` parameter was removed from the module manifest by this [commit](https://github.com/odoo/odoo/commit/717619571d1297d6b299b7c47b728841bcd81e69#diff-d96ba04bb478d9dcbade7b9bf9f07305d42a38ce7a906f3387879271cde35fecL7)
* This change shortened the module version string used to build the `softwareId`.
* Truncating the value to 18 characters therefore produced a string shorter than required.
* The NAV API requires the `softwareId` to be **exactly 18 characters**.
**Fix:**
* Pad the generated `softwareId` to **18 characters** using `ljust(18, '0')`.
* Ensures the value always complies with NAV schema validation rules.
opw-5902414
Forward-Port-Of: odoo/odoo#247737This update ensures that Peppol invoices always include the PDF attachment, resolving an issue where the PDF was missing when sending via Peppol. Previously, the system skipped a necessary step to embed the PDF, leading to incomplete UBL XML files for recipients. This fix guarantees consistent invoice delivery with the complete PDF representation.
Original PR description
**Steps to reproduce:** * Install `Accounting` and `accounting_peppol` modules. * Create Belgium company. * Go to accounting settings and activate PEPPOL under `PEPPOL Electronic Invoicing`. * Create…
**Steps to reproduce:** * Install `Accounting` and `accounting_peppol` modules. * Create Belgium company. * Go to accounting settings and activate PEPPOL under `PEPPOL Electronic Invoicing`. * Create and post a customer invoice. * Click **Send & Print**. * Select only **Email** and click **Send** to generate the PDF. * Click **Send & Print** again. * Select only **Peppol** (partner configured for Peppol). * Click **Send**. **Observed behavior:** * The invoice is sent via **Peppol**, but the generated UBL XML does **not** contain the embedded PDF. * The receiver gets the XML data without the PDF representation. **Cause:** * When a PDF already exists on the invoice, the send flow skips the document post-processing step to avoid regenerating it. * The PDF embedding into the UBL XML relies on this post-processing step. * Sending via Peppol after emailing the invoice therefore bypasses the PDF embedding logic. **Fix:** * When sending via **Peppol**, detect if a PDF already exists on the invoice. * If so, explicitly post-process the UBL XML to embed the existing PDF before sending. * Ensures the PDF is always included in Peppol messages, regardless of when it was generated. opw-5495465 Forward-Port-Of: odoo/odoo#245901
This update fixes an issue where users experienced unexpected behavior when editing file names within the HTML editor. The change now prevents automatic editing and ensures consistent keyboard navigation, providing a smoother and more predictable editing experience. This improves overall usability of the HTML editor.
Original PR description
### Purpose of this PR: - In the static file box, the file name is contenteditable by default, which leads to unexpected caret movement and arrow-key navigation behavior. - Change the behavior so that the file name is contenteditable="false" by default and becomes editable only when the user explicitly clicks on it. The editability is reverted when clicking outside of the file name. - This ensures consistent keyboard navigation while keeping the change limited to the static file box. task-5427329 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249333 Forward-Port-Of: odoo/odoo#241591
This update corrects inaccuracies in the fiscal position data for key markets like the UAE, Oman, and Bahrain. By standardizing the data and removing redundancies, we ensure accurate tax calculations for both local and international customers, improving financial reporting and compliance.
Original PR description
After the changes from 5261836336799076fd8133be943a037f1124b905, several fiscal positions for UAE, Bahrain and Oman were either missing or not fully mapped. So with this PR: - We adapts the fiscal positions and restructures them with a clear country-based split, ensuring taxes are applied correctly for local and non-local customers. - Removes a duplicate sequence column from UAE fiscal position data to avoid confusion and keep the structure consistent. - Cleans up obsolete data in Oman by removing an empty fiscal position row that was previously used for tax source/destination mappings. task-5359829 Forward-Port-Of: odoo/odoo#245383
This update corrects a bug where high-priority applicants weren't displayed correctly in the applicant management system. The issue stemmed from a duplicated setting in the applicant model, which was overriding the intended priority ordering. This change ensures that applicants with the highest priority are now shown first within their stage.
Original PR description
Steps to reproduce: ---------------------------------------- 1. Install the Recruitment module 2. Navigate to Recruitment > Applications > All Applications 3. Go to Kanban view 4. Make any…
Steps to reproduce: ---------------------------------------- 1. Install the Recruitment module 2. Navigate to Recruitment > Applications > All Applications 3. Go to Kanban view 4. Make any application Very High Priority (3 star) 5. Refresh the page Observation: ---------------------------------------- Applications marked as Very High Priority are not displayed on top, Applicants with higher priority should be displayed first within the same stage. Issue: ---------------------------------------- The `_order` attribute on the applicant model is declared twice, causing the intended priority-based ordering to be overridden by `sequence`. https://github.com/odoo/odoo/blob/6fed805389d878558e4139b270ee7a70269af767/addons/hr_recruitment/models/hr_applicant.py#L28-L41 Solution: ---------------------------------------- Reorder the fields in the `_order` attribute so that priority is applied before sequence, ensuring higher-priority applicants are shown first opw-5893371 Forward-Port-Of: odoo/odoo#249712 Forward-Port-Of: odoo/odoo#247779
This update removes an unnecessary parameter ('next_groupby') from Odoo's report engines, improving their performance and reducing complexity. The change was made after consolidating code and eliminating redundant checks, ensuring a more efficient and maintainable system for generating financial reports.
Original PR description
We removed count_rows which used the next_groupby by using a custom engine where they specify their next_groupby directly instead. Since next_groupby isn't used anywhere else in the engines, we can remove this parameter (for the engines)! Also removed redondant calls to _check_groupby_fields in custom engines where it would be called by _compute_formula_batch_with_engine_custom before calling the function. task-5145246
This update enhances the visual presentation of tables inserted into HTML fields by automatically converting `thead` tags to `tbody` and applying a specific styling class. This ensures tables created within Odoo look more professional and consistent. Additionally, changes were made to support AI chat functionality within the discuss thread actions.
Original PR description
Prior to this commit, when inserting a table in an html_field, it would use tags such as `thead` which are not supposed by the table plugin when doing table manipulations. With this commit, we create an insertion handler which changes any thead to tbody and applies the `o_table_header` class to the rows so it visually resembles a thead. Exported some variables for the expand-discuss thread action since we are modifying the thread action registry in the AI module. Specifically we export the sequencegroup and the sequencequick variables since we are changing those for AI chats. Task-5164382
This update adjusts how subchannels are displayed in the sidebar. Previously, opening a subchannel automatically added the user to it. Now, subchannels are temporarily pinned while being viewed, but return to their unpinned state when the user navigates away. This change enhances the user experience by preventing unwanted channel additions.
Original PR description
Backport of https://github.com/odoo/odoo/pull/239480 Before this commit: - Opening a subchannel from the thread list automatically joined the user to the subchannel - if not already a member - Unpinned subchannels were pinned to sidebar when user opened them After this commit: - Opening a subchannel from the thread list no longer joins the user - Unpinned subchannels are only temporarily repinned while being viewed; once the user navigates away, they return to their unpinned state. task-4207854
This update fixes a confusing inconsistency in how the system displays a user's location status. Previously, 'User is at the office' and 'User is at other location' were used. Now, the system consistently uses 'User is at other location' for homeworking status, providing a clearer and more accurate representation of employee availability.
Original PR description
User is at the office -> User is at other location
This update resolves an issue preventing Odoo from starting correctly in version 19.2. The problem stemmed from a missing directory within the IoT drivers module, which caused a critical error during startup. This fix adds the necessary directory structure to ensure the module loads properly.
Original PR description
Currently in saas-19.2 on start of Odoo tim_interface throws an exception and Odoo doesn't start: ``` 2026-02-20 14:15:31,683 10276 CRITICAL ? odoo.modules.module: Couldn't load module iot_drivers…
Currently in saas-19.2 on start of Odoo tim_interface throws an exception and Odoo doesn't start: ``` 2026-02-20 14:15:31,683 10276 CRITICAL ? odoo.modules.module: Couldn't load module iot_drivers 2026-02-20 14:15:31,684 10276 ERROR ? odoo.service.server: Failed to load server-wide module `iot_drivers`. Traceback (most recent call last): File "/home/pi/odoo/odoo/service/server.py", line 1554, in load_server_wide_modules load_openerp_module(m) ~~~~~~~~~~~~~~~~~~~^^^ File "/home/pi/odoo/odoo/modules/module.py", line 488, in load_openerp_module __import__(qualname) ~~~~~~~~~~^^^^^^^^^^ File "/home/pi/odoo/addons/iot_drivers/__init__.py", line 18, in <module> interface_thread().start() ~~~~~~~~~~~~~~~~^^ File "/home/pi/odoo/addons/iot_drivers/iot_handlers/interfaces/tim_interface.py", line 61, in __init__ self.tim_api.six_initialize_manager.argtypes = [ctypes.c_int] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'six_initialize_manager' ``` This is due to a missing 'tim' directory: ``` /home/pi/odoo/addons/iot_drivers/iot_handlers/drivers cp: cannot stat '/home/pi/odoo/addons/iot_drivers/iot_handlers/drivers/tim/libtimapi.so.3.38.0-5308': No such file or directory ``` This PR adds 'tim' directory in unzipping fixing the path --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an error that occurred when setting the accounting period for tax returns in the Invoicing module. The issue stemmed from incorrect initialization of onboarding progress, now corrected to ensure smooth operation of this key accounting function.
Original PR description
Currently, an error occurs when a user tries to set the accounting period. **Step to Reproduce:** 1. Install Invoicing without demo data and log-in as a super user. (from v19.0, no need to log-in as super user) 2. Invoicing > Accounting > Tax Returns. 3. Set an Opening Date in the wizard and try to apply the accounting period. **Error:** `ValueError - Expected singleton: onboarding.progress()` **Cause:** PR 1, added `_initiate_account_onboardings()` in the accountant (**accounting**) module. However, the onboarding progress should be initialized in the account (**invoicing**) module. **Fix:** This commit ensures that `_initiate_account_onboardings()` is called from the `account` module instead of the `accountant` module. [1] - odoo/enterprise#101442 Enterprise PR: https://github.com/odoo/enterprise/pull/107476 sentry-7064593163 Forward-Port-Of: odoo/odoo#248790
This update resolves an issue where setting accounting periods for tax returns would fail when the Invoicing module was also installed. The change ensures that a key setup process is consistently executed, regardless of which modules are used. This improves the reliability of tax return configuration.
Original PR description
To align with the changes introduced in **community PR** [1], this commit moves the `_initiate_account_onboardings()` method in the `account` module to ensure it is executed even when Invoicing is installed. [1] - https://github.com/odoo/odoo/pull/248790 sentry-7064593163 Forward-Port-Of: odoo/enterprise#107476
This update resolves an issue where users could incorrectly drop images into product descriptions, leading to errors. The fix ensures images can only be added in designated drop zones, improving the stability and usability of product listings.
Original PR description
Steps to reproduce the issue: ================================= 1. Go to Website > Products and edit a product. 2. In the product description, add a header using the editor. 3. You can now drop an…
Steps to reproduce the issue: ================================= 1. Go to Website > Products and edit a product. 2. In the product description, add a header using the editor. 3. You can now drop an image in that place, so drop it. 4. Click on the image and try to add an anchor for it. -> Traceback Cause: ====== The reason an image can be dropped in that location is because the editor added an adjacent element, such as a `<p>` or `<h1>`, which is considered a valid drop zone by the drop zone plugin. However, when trying to create a link, the parent element checks if it is valid to have an anchor, but then when adding an anchor the element text is undefined, causing a traceback. Why can an image be dropped in that location after adding the editor? The bug was due to passing `excludeNearParent` as a property name instead of `excludeParent` to the `getSelectorSiblings` function, which always evaluated to false. So it allowed dropping images in invalid locations. Solution: ========= Pass the correct property name. Impact: ======= This fix enforces the intended dropzone behavior where content snippets (like images, buttons with `.o_snippet_drop_in_only`) cannot create dropzones next to elements that are direct children of `.oe_structure` containers. Test Changes Required: ======================= The button tests were failing after the fix because they were testing buttons as direct children of `<div id="wrap" class="oe_structure oe_empty">`. This was only working before due to the bug - `excludeNearParent` was being ignored. The fix wraps the test buttons in a `<div>` container, making them children of a child of `.oe_structure` rather than direct children. opw-5489444 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249707 Forward-Port-Of: odoo/odoo#244324
This update resolves an issue preventing successful processing of Dutch tax (OB) and ICP reports by Digipoort. The report templates have been updated to the final 20251210 NT20 taxonomy, ensuring compliance and accurate data transmission. This change is critical for accurate tax reporting and compliance with Dutch regulations.
Original PR description
Update the Dutch tax (OB) and ICP report templates from the 20251210.a pre-release to the final 20251210 NT20 taxonomy to ensure successful processing by Digipoort. Fixes: https://github.com/odoo/enterprise/commit/5becacff48f1a2490ce2f57a4679020615b6b8c2 opw-5911496 Forward-Port-Of: odoo/enterprise#108126
This update fixes an issue where Italian tax information (like VAT number) wasn't being correctly applied when creating a company record from an Italian ecommerce order. Previously, the system didn't automatically populate the necessary Italian tax fields. This change ensures that all company records created from Italian sales accurately reflect the required tax details, improving compliance and reporting.
Original PR description
**STEP TO REPRODUCE** 1. Create a ecommerce order on a shop page of a italian company. 2. Goes to the checkout page, enter info (company_name, l10n_it_codice_fiscale, l10n_it_pa_index). 3. On the contact created, click on create company. 4. Notice l10n_it fields are not propagated to the company. opw-5477372 Forward-Port-Of: odoo/odoo#248887 Forward-Port-Of: odoo/odoo#246785
This update ensures that timesheet entries, regardless of whether the hours spent are positive or negative, are limited to a maximum of six digits. Previously, users could enter excessively large negative values without any error message. This change improves data accuracy and prevents potential issues with timesheet reporting.
Original PR description
Currently, a user can add a timesheet entry with a negative Hours Spent value `exceeding six digits`. **Steps to reproduce:** - Install the `timesheet_grid` module. - Open the `Timesheets` app and…
Currently, a user can add a timesheet entry with a negative Hours Spent value `exceeding six digits`. **Steps to reproduce:** - Install the `timesheet_grid` module. - Open the `Timesheets` app and click `Add a line`. - Set Hours Spent to a `negative` value with more than six digits (e.g., -1000000). **Observation:** The line is added without any warning, whereas entering a positive value with more than six digits correctly raises an `error`. **Root cause:** At [1], the constraint validates only positive values exceeding six digits. As a result, negative values with more than six digits are not checked and bypass the `UserError validation`. **Fix:** This commit updates the constraint to ensure the six-digit limit applies to both positive and negative values. [1]: https://github.com/odoo/enterprise/blob/660905872909405c0a07a8317b4eb0a42e5854ca/timesheet_grid/models/analytic.py#L46-L49 opw-5909417 Forward-Port-Of: odoo/enterprise#108182 Forward-Port-Of: odoo/enterprise#106781
This update fixes a visual issue where Telugu characters in Odoo's PDF reports were displayed as black squares. By adding a specific font for Telugu, the system now correctly renders Telugu text within these reports, ensuring accurate and consistent reporting for Telugu-speaking users. This resolves a known limitation in the SaaS 19.0 version.
Original PR description
SaaS 19.0 QWeb PDF reports renders Telugu characters as black squares because the default font stack has no Telugu coverage on the server side. While some environments may display Telugu via locally installed fonts, wkhtmltopdf requires explicit webfont coverage to embed the glyphs in the PDF. Add a Noto Sans Telugu @font-face rule with the Telugu unicode range so report rendering can fetch and embed a Telugu-capable font when needed. This mirrors the existing mechanism used for Arabic/Hebrew/Cyrillic. opw-5886157 (related ticket) https://github.com/odoo/odoo/pull/32312 (related PR) I have attached the font files that needs to be uploaded to cdn in NotoSansTelugu.zip. [NotoSansTelugu.zip](https://github.com/user-attachments/files/25395294/NotoSansTelugu.zip) --- Forward-Port-Of: odoo/odoo#249320
This update addresses a potential issue where abrupt system clock changes could disrupt IoT driver jobs, leading to delays in data processing. The system now automatically adjusts job schedules to compensate for these changes, ensuring reliable operation of custom IoT handlers. This improves the stability and accuracy of data collection from IoT devices.
Original PR description
Before this commit: If IoT system clock is wrongly set (happened on a Wi-Fi environment with slow connection). The system clock will abruptly change for a date in the future which will trigger all…
Before this commit:
If IoT system clock is wrongly set (happened on a Wi-Fi environment with slow connection). The system clock will abruptly change for a date in the future which will trigger all `schedule` jobs (which will think they are several days late).
In addition to this oversight, on an IoT on which "custom IoT handlers" configuration is enabled, if the `upgrade.check_git_branch` job is called on IoT boot, it will trigger the following traceback:
```py
2026-02-17 13:53:41,751 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: Exception in thread Thread-4:
2026-02-17 13:53:41,757 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: Traceback (most recent call last):
2026-02-17 13:53:41,758 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: File "/usr/lib/python3.13/threading.py", line 1043, in _bootstrap_inner
self.run()
~~~~~~~~^^
2026-02-17 13:53:41,759 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: File "/home/pi/odoo/addons/iot_drivers/tools/helpers.py", line 50, in run
service.server.restart()
~~~~~~~~~~~~~~~~~~~~~~^^
2026-02-17 13:53:41,759 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: File "/home/pi/odoo/odoo/service/server.py", line 1622, in restart
os.kill(server.pid, signal.SIGHUP)
^^^^^^^^^^
2026-02-17 13:53:41,759 1371 ERROR ? odoo.addons.iot_drivers.exception_logger: AttributeError: 'NoneType' object has no attribute 'pid'
```
Which will prevent the IoT to restart thus to load custom handlers
After this commit:
Brutal time changes (of 10 minutes (in a 3-second loop)) are detected, and jobs schedules are updated to prevent misfire calls
Forward-Port-Of: odoo/odoo#249112This update resolves an issue in Odoo 19.0 where uploading encrypted KSeF certificates caused server crashes. The fix allows users to correctly configure KSeF authentication using encrypted private keys by adding a password argument to the key loading process. This ensures seamless KSeF compliance.
Original PR description
In Odoo 19.0 (Master), the handling of KSeF certificates introduced an issue where uploading an encrypted private key caused a server crash, blocking the configuration of KSeF. This functionality worked correctly in v18 (where keys were often unencrypted). The `XadesSigner` class was not designed to accept a password argument. The `serialization.load_pem_private_key` method would fail with a `TypeError` because the password was not passed to the underlying Updated the `XadesSigner.__init__` method to accept a `private_key_password` argument. Passed this password correctly to `serialization.load_pem_private_key`. 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#248423
This update corrects a display issue where unused coupon IDs were incorrectly shown in order history, leading to user confusion. The fix ensures that coupon IDs are properly removed when rewards are applied or the reward dialog is closed, improving the clarity of loyalty program data. While a full solution requires a view update, the current fix remains stable.
Original PR description
### Issue: Due to this issue, `coupon_ids` which are never used are still shown in loyalty coupons history which is confusing for users. #### Steps to reproduce: 1- Create two promotions: - Promo A:…
### Issue: Due to this issue, `coupon_ids` which are never used are still shown in loyalty coupons history which is confusing for users. #### Steps to reproduce: 1- Create two promotions: - Promo A: 10% discount - Promo B: 20% discount 2- Create a SO and add a line. Then confirm the SO. 3- Click on `Reward` button. 4- A dialog should show both promos. Discard the dialog. 5- Navigate to `Discount and Loyalty`. 6- Open Promo A and B and you can see both have lines with `coupon_id.order_id` = `created SO` which is confusing. `Issue 1` 7- Navigate back to SO. Click on `Reward` and select Promo A, apply. 8- Navigate to Promo B. As you see the the `coupon_id` related to the SO is still there. `Issue 2` ### Cause and Fix: This is due to unlinking `coupon_ids` only in SO confirm action, causing this issue on already confirmed SOs: https://github.com/odoo/odoo/blob/604d07ab324caa5f3aa6f3baa9902c2137ea24db/addons/sale_loyalty/models/sale_order.py#L132-L136 We can fix this issue by `unlinking` the `coupons_ids` when a reward is applied or the dialog is discarded. However there are 2 limitations: 1- The view needs to be updated. Otherwise, `coupon_ids` will not be deleted upon clicking on `discard` button. However the fix is still stable. 2- What if the dialog is closed with the cross button or the tab is closed without selecting a reward? In that case the issue will still persist. To fix these issues, we can show only used `coupon_ids` in `loyalty_coupon_id` list view. However that cannot be done in stable as it requires `use_count` to be stored. NB: With some complex filters this also could be fixed on stable but not worth it. opw-5424753 Forward-Port-Of: odoo/odoo#245534
This update corrects a technical issue related to the transmission of 13th month salaries for Swiss companies using the LPP (Lohn- und Pensionskasse) reporting system. Specifically, the system now correctly includes the 13th month's base amount in the required data transmission, ensuring accurate reporting and compliance with Swiss tax regulations. This ensures proper payroll calculations and reporting for our Swiss clients.
Original PR description
Forward-Port-Of: odoo/enterprise#107913 Forward-Port-Of: odoo/enterprise#107908
This update fixes an issue where multi-employee payslips were defaulting to the language of the first employee. The change ensures that each employee's payslip is printed in their correct, selected language, improving accuracy and user experience. This resolves a previous bug related to date formatting and caching.
Original PR description
Steps to detect the bug: - Install payroll - Create more than one employee with different payslip languages - Add a contract for the employees - Payroll -> Payslip -> Pay run - Create a new payroll for more than one employee - Select all the employees in the pay run - Click 'print' button - Dates for the employees that are not the first one are in the language of the first employee This commit will allow the user to create multiemployee payslips maintaining the correct selected payslip language for each one of them. The issue was caused by a cache dictionary that used only the date and date format as a key, failing to include the user language. This led the system to reuse the first translated date for all subsequent employees. opw-5865260 Forward-Port-Of: odoo/enterprise#107269 Forward-Port-Of: odoo/enterprise#106575
This update fixes an issue where changing the Payment Partner in the accounting system didn't consistently save the new selection. The fix removes a technical restriction that prevented the system from properly updating the Payment Partner Bank record, ensuring changes are saved and reflected after refreshing the record.
Original PR description
**Steps to reproduce:** 1. Install Accounting. 2. Go to Return Type. 3. Create a record and set a Payment Partner Bank. 4. Change the Payment Partner. **Issue:** Changing the Payment Partner creates a log entry but does not update partner on the selected Payment Partner Bank. After refreshing the record the value is reverted to the previous partner. **Cause:** The field payment_partner_id is defined as `readonly` at the model level. As a result, when the ORM attempts to update this field, the write operation is silently ignored. Although the field appears editable in the view due to `readonly="0"`, model-level `readonly=True` still prevents the value from being saved. **Fix:** Make the field writable at the model level so that ORM updates are persisted, This ensures that changes to Payment Partner are properly saved and no longer reverted after refresh. **opw-5423029** Forward-Port-Of: odoo/enterprise#103041
This update fixes a potential issue in how point-of-sale cash rounding is handled. Previously, it only considered cash payments. Now, it correctly accounts for other payment methods like cards, ensuring accurate change calculations when a customer 'deposits' money, regardless of the payment type.
Original PR description
We extract the condition into a getter so we can override it elsewhere. For now, it is overriden in `pos_settle_order`. See below for explanation. `change` is the amount we return to the client, so it's in cash, and therefore, we always round it if `cash_rounding` is true. However, in pos_settle_order, when a client 'deposits money', the order `change` is what we get paid by that client, and he might choose a payment method different than cash (card for e.g.). We change the `shouldRoundChange` logic to count for such cases. opw-5222985 Forward-Port-Of: odoo/odoo#248787
This update ensures that payment rounding is applied accurately when customers deposit money into their accounts, regardless of the payment method used. Previously, rounding was incorrectly applied to deposits, leading to inaccurate amounts. This fix aligns the system with how deposits are handled, ensuring correct calculations for all payment types.
Original PR description
Steps to reproduce: ------------------- 1. Enable cash rounding, only for cash payment method - Rounding method doesn't matter, I tested with 0.05 nearest rounding 2. In PoS, make an order with the…
Steps to reproduce: ------------------- 1. Enable cash rounding, only for cash payment method - Rounding method doesn't matter, I tested with 0.05 nearest rounding 2. In PoS, make an order with the customer account, such that the total amount is not divisible by 0.05, i.e. when rounded, it's not the same amount. For instance, $5.27. 3. Close the session and reopen it, then select that customer, and click settle due 4. Select the Bank payment method, so a NON-Cash payment method. Notice that the amount is being rounded, even though we have only enable rounding for cash methods. If we take my example of step 2, the amount became $5.25 instead of $5.27. That is understandable when we settle with Cash, however, for Bank (non-cash), we should not round. The fix ------- Now when choosing a payment method to settle due, we also round the amount if needed, in `getTotalDueOfPartner`. Before, we always set the exact amount, regardless of the payment method and the rounding settings. We now also apply rounding on the payment screen based on the selected payment method. Previously, the change was always rounded whenever rounding was enabled, ignoring whether rounding was restricted to cash methods. This behavior made sense for normal orders—where change is typically given in cash—but not when settling a due amount, since the customer can pay using any method. During due settlement, the change represents the amount the customer must pay, so rounding must follow the rules of the chosen payment method. opw-5222985 Forward-Port-Of: odoo/enterprise#105368 Forward-Port-Of: odoo/enterprise#100278
This update adds a back button to the combo product configuration screen, making it easier for users to navigate and adjust settings. The change also improves the readability of the code by renaming a method. This enhancement streamlines the user experience for managing combo products.
Original PR description
The goal of this pr was to always have a Back button visible on the combo product configuration. I also change method name to be more readable. task: 5877219 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#245870
This update automatically calculates and transmits the 2050 pension contribution for employees in Switzerland using the Swissdec standard. This ensures accurate and compliant payroll processing, addressing a previous calculation error and improving the reliability of Swiss payroll reporting.
Original PR description
task-5166226 Forward-Port-Of: odoo/enterprise#104140 Forward-Port-Of: odoo/enterprise#103453
This update resolves an issue where imported vendor bills with a product price of $0.00 were incorrectly increasing the product's price unit. The fix ensures that the total imported from the XML invoice accurately matches the Odoo invoice, preventing double-billing. This improves data accuracy for financial reporting.
Original PR description
Whenever a line with price `0.0` with `AllowanceCharge`s got imported, Odoo used to update the `price_unit` to the sum of price, allowance and charges, because of a wrong float comparison condition between this sum and the XML total. So the product price was increased, but the allowances were maintained. The total imported in Odoo became double the one in the XML. Step to reproduce: - Import vendor bill from XML with a product: - price: `0.00` - quantity: `1` - an AllowanceCharge, amount: `0.2` - an AllowanceCharge, amount: `0.1` - `0.0 + 0.2 + 0.1 (sum of price and allowances) != 0.3 (subtotal)` (but `float_compare(0.1 + 0.2, 0.3, precision_digits=4) == 0`) - `price_unit` is updated to `0.3` - Total in Odoo is `0.6` Ticket [link](https://www.odoo.com/odoo/project.task/5499525) opw-5499525 Forward-Port-Of: odoo/odoo#249677 Forward-Port-Of: odoo/odoo#248043
This update resolves an issue where duplicate personal stages (like Inbox) were created in the Project module's demo data. The fix ensures that personal stage definitions are loaded before tasks are created, preventing the automatic stage generation logic from producing duplicates. This improves the consistency of demo data for new users.
Original PR description
Steps to reproduce: -- 1. Install the Project module with demo data enabled. 2. Create a new private task. Issue: -- The personal stages (Inbox, Today, This Week, etc.) are duplicated. Cause: -- In project_demo.xml, some tasks assigned to users (introduced in https://github.com/odoo/odoo/pull/224307) were defined before the personal stage records. Creating these tasks triggered the automatic stage generation logic (_populate_missing_personal_stages) because the personal stages in demo data were not loaded yet. This resulted in a duplicate set of stages being created once the demo data records were processed. Fix: -- The personal stage definitions in project_demo.xml have been moved higher up in the file so they load before any user is assigned to a task. task-5454658 Forward-Port-Of: odoo/odoo#241805
This update resolves an issue where users lacking write permissions on the `ir.sequence` model would encounter an error when generating serial numbers for manufacturing orders. The change simplifies the serial number generation process, eliminating the need for write access and ensuring reliable operation for all users.
Original PR description
## Issue When generating a batch of serial numbers, an AccessError is raised if the user does not have the *Write* access on the `ir.sequence` model. ## Steps to reproduce 1. Install *Manufacturing*…
## Issue
When generating a batch of serial numbers, an AccessError is raised if the user does not have the *Write* access on the `ir.sequence` model.
## Steps to reproduce
1. Install *Manufacturing* (`mrp`)
2. In Settings, enable *Lots & Serial Numbers*
3. Create a Product P
- Tracked *By Unique Serial Number*
- Create a BoM for product P
5. As a user without *Write* access on the `ir.sequence` model:
- Create and confirm a Manufacturing Order for product P - Quantity >= 2
- Click *Generate Serial*, *Generate*, *Apply*
6. **An Access Error is displayed, stating that you are not allowed to modify 'Sequence' records.**
## Cause
Commit https://github.com/odoo/odoo/commit/3ff0f2e3ef4f (and https://github.com/odoo/odoo/commit/9cd0c4affeb1) changed the way the serial sequence was updated by replacing `IrSequence.next_by_id()` with manual incrementation (`IrSequence.number_next_actual += 1`). The former method requires read access but does not require write access, whereas the latter does.
https://github.com/odoo/odoo/blob/8f0a5d31d62ea6fc2a1c94be8501735a01323954/odoo/addons/base/models/ir_sequence.py#L272-L275
Since the write access should not be required to generate serial numbers, the sequence is incremented using `sudo()`.
(related to)
opw-5882578
Forward-Port-Of: odoo/odoo#249778
Forward-Port-Of: odoo/odoo#249662This update fixes an issue where the delivery amount was being incorrectly calculated twice during Stripe express checkout, particularly with Apple Pay and Google Pay. The fix ensures accurate delivery pricing is applied, preventing overcharging and improving the customer experience. This resolves a regression identified in a previous update.
Original PR description
Versions: --- - 17.0+ Issue: --- Delivery amount is doubled in stripe express payment checkout. Steps to reproduce: --- 1- Setup a stripe payment express checkout. (In my client case it is apple pay…
Versions: --- - 17.0+ Issue: --- Delivery amount is doubled in stripe express payment checkout. Steps to reproduce: --- 1- Setup a stripe payment express checkout. (In my client case it is apple pay express checkout but we also reproduced it in google pay) 2- Set fixed price on standard delivery: 10 3- Navigate to website: add a product to cart. Use express checkout. Outcome: The delivery price is calculated twice which is wrong. Cause: --- This regression is due to #238574. Once `/compute_taxes` is called, there is delivery lines included in SO. As a result returning `amount_total` will cause `this.paymentContext['minorAmount']` to include delivery amount. Then we add delivery carrier `minorAmount`: https://github.com/odoo/odoo/blob/469220cde82ecebf4a59451cc1325add6bfc3e69/addons/payment_stripe/static/src/js/express_checkout_form.js#L188-L196 Which cause delivery amount be added twice. Fix: --- We could exclude delivery amount from total amount in `express_checkout_shipping_address_compute_taxes`, which is going to calculate the tax for lines excluding delivery lines. opw-5424398 Forward-Port-Of: odoo/odoo#249551 Forward-Port-Of: odoo/odoo#248415
This update optimizes the process of retrieving tax tags for invoices related to India. By restricting the operation to Indian localization and using faster XMLID resolution, the system now performs more efficiently, reducing unnecessary processing and improving overall speed. This change primarily impacts the l10n_in module.
Original PR description
Before this commit: - `_get_l10n_in_tax_tag_ids()` was executed for moves unrelated to Indian localization, causing unnecessary processing. - Profiling showed repeated `env.ref` lookups (>≈1.6% transactions each) even for a simple invoice flow (create → add products → post). After this commit: - Restrict execution to Indian-specific moves only. - Replace `env.ref` with `_xmlid_to_res_id` for faster XMLID resolution. task-5935607 Forward-Port-Of: odoo/odoo#248960
This update fixes an issue where pick-up point names and days were incorrectly capitalized in the website's 'Click and Collect' feature, particularly when using the Dutch language. The change ensures pick-up point names are displayed correctly and that weekdays are consistently capitalized regardless of the selected language. This improves the user experience and consistency of the pick-up point listings.
Original PR description
Issue: --- In pick-up point list, the case formatting should be: 1- Pick-up point's `name`, `street` and `city` should not be auto-capitalized. 2- Weekdays should must be always capitalized regardless of language. Steps to reproduce: --- 1- Create a second Company named `store`. 2- Create a wh for the created company and add the wh to click-and-collect pick-up points. (There should be more than 1 pick-up points) 3- In the website, add Dutch lang. 4- In website, open a product and, open the `Click and Collect`. Outcome: --- Name is capitalized to `Store` and the days are not capitalized if you switch to dutch lang. Cause: --- Due to CLDR, luxon doesn't capitalize weekdays in some languages. opw-5941830 Forward-Port-Of: odoo/odoo#249600 Forward-Port-Of: odoo/odoo#249078
Features or functions removed from Odoo
This update removes a redundant piece of code within the Spanish localization module (l10n_es) that was impacting performance. This change simplifies the codebase and prepares for future improvements by eliminating a dependency. The removal ensures the Spanish version of Odoo continues to function efficiently.
Original PR description
We want to remove all count_rows since it's the only thing that uses next_groupby which will allow us to remove it as an argument from the engines functions. task-5145246 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update removes a redundant field from the VoIP call data used in the spreadsheet dashboard. The field was added in a separate module and wasn't actually utilized, so it's been removed to streamline the data. This ensures the dashboard remains efficient and focused on relevant information.
Original PR description
`summary` field on `voip.call` is added in `voip_ai` which is not a dependency of `spreadsheet_dashboard_voip`. As the field is not used in the dashboard, this commit removes it. Fixes runbot #240996
Documentation and clarification updates
This pull request updates the Adhoc Corporate Legal Agreement (CLA) membership list. This ensures Odoo continues to comply with legal requirements and protects the company from potential liabilities. The change is purely a legal update and does not affect Odoo's functionality.
Original PR description
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#248642 Forward-Port-Of: odoo/odoo#248286
15 changes
New functionality added to Odoo
This update incorporates the National Bank of Kazakhstan as a currency rate provider. This change is necessary to comply with local regulations in Kazakhstan, ensuring accurate financial reporting and transactions for users in that region. It’s a minor update focused on regional compliance.
Original PR description
This PR adds the National Bank of Kazakhstan as a provider in order to meet the requirements of the Kazakhstan code. Task-4144725 Forward-Port-Of: odoo/enterprise#107797
Enhancements to existing features
This update allows users to process multiple bank statement adjustments simultaneously, streamlining the reconciliation process. Previously, users could only handle one line at a time. This enhancement improves efficiency and reduces the time spent on bank reconciliation tasks.
Original PR description
This commit will allow to do the set account, set partner and apply reco models on multiple lines. To select multiple line you need to use alt + click and then you will have button on top to trigger the actions. - The set partner function was modified to work with multiple statement lines and keep all existing functionality (modify line with same partner_name) - The trigger reconcile model function was also modified to work with multiple statement lines - The set account function was not touched because we use the aml_id of the suspense as a parameter but here we will have multiple suspense line to modify. Since we are doing this change in stable, we created a new function set_account_multiple_bank_statement_line. This function will have the same behavior for reco models as the basic set account. task-5253778 Forward-Port-Of: odoo/enterprise#100316
Resolved issues and error corrections
This update fixes an issue where users could unintentionally edit file names within the HTML editor. The change now prevents automatic editing and requires a user click to modify the file name, ensuring a smoother and more predictable editing experience. This improves usability and prevents unexpected behavior.
Original PR description
### Purpose of this PR: - In the static file box, the file name is contenteditable by default, which leads to unexpected caret movement and arrow-key navigation behavior. - Change the behavior so that the file name is contenteditable="false" by default and becomes editable only when the user explicitly clicks on it. The editability is reverted when clicking outside of the file name. - This ensures consistent keyboard navigation while keeping the change limited to the static file box. task-5427329 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249333 Forward-Port-Of: odoo/odoo#241591
This update resolves an error that occurred when setting the accounting period for tax returns in the Invoicing module. The issue stemmed from incorrect code initialization, which has now been corrected to ensure proper onboarding progress tracking. This prevents a system crash during tax return setup.
Original PR description
Currently, an error occurs when a user tries to set the accounting period. **Step to Reproduce:** 1. Install Invoicing without demo data and log-in as a super user. (from v19.0, no need to log-in as super user) 2. Invoicing > Accounting > Tax Returns. 3. Set an Opening Date in the wizard and try to apply the accounting period. **Error:** `ValueError - Expected singleton: onboarding.progress()` **Cause:** PR 1, added `_initiate_account_onboardings()` in the accountant (**accounting**) module. However, the onboarding progress should be initialized in the account (**invoicing**) module. **Fix:** This commit ensures that `_initiate_account_onboardings()` is called from the `account` module instead of the `accountant` module. [1] - odoo/enterprise#101442 Enterprise PR: https://github.com/odoo/enterprise/pull/107476 sentry-7064593163 Forward-Port-Of: odoo/odoo#248790
This update resolves a problem that could occur when setting up accounting periods, particularly when the Invoicing module is also used. The change ensures that a key process is consistently executed, preventing errors and improving the reliability of accounting configurations. This aligns with recent improvements in the community version of Odoo.
Original PR description
To align with the changes introduced in **community PR** [1], this commit moves the `_initiate_account_onboardings()` method in the `account` module to ensure it is executed even when Invoicing is installed. [1] - https://github.com/odoo/odoo/pull/248790 sentry-7064593163 Forward-Port-Of: odoo/enterprise#107476
This update corrects a bug in the point-of-sale loyalty program where loyalty points were incorrectly recalculated after saving an order. Specifically, points were being added twice, leading to an over-allocation of points. The fix ensures accurate point calculations during order saving, improving the customer experience and data integrity.
Original PR description
Step to reproduce: - have a trusted pos and a loyalty program which gives points per $ spent - start pos and select order and a partner (he should already have some LPs) - notice the loyalty points…
Step to reproduce:
- have a trusted pos and a loyalty program which gives points per $ spent
- start pos and select order and a partner (he should already have some LPs)
- notice the loyalty points assgined
- save the order, you are redirected to new order
- switch back to original order
Observation:
- Notice, the loyalty points are reassigned for example :
- if initially partner's LP = 50, product added is 100$ , LP = 50+100 = 150
- After saving, LP becomes 150 + 100 = 250
Cause:
- LP's are processed after every `sync_from_ui` call from `_postProcessLoyalty` which updates the customer's lp, even before the order is fullfilled or when order is still in `draft` state
Fix:
- Issue is fixed in https://github.com/odoo/odoo/commit/a4b37ec474656c7af23d0134251d589e9a6a61ca
- This commit adds related test for the fix
opw-5609964
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#248184
Forward-Port-Of: odoo/odoo#245400This update fixes an issue where shift previews for employees with flexible schedules didn't show color dots on the calendar. The fix ensures that color dots are consistently displayed for all shift types, regardless of employee scheduling rules, improving the planning visualization for users.
Original PR description
## Short functional explanation of the error When setting a shift spread on multiple days for an employee who has a flexible schedule and previewing the planning of this employee, on the shown…
## Short functional explanation of the error When setting a shift spread on multiple days for an employee who has a flexible schedule and previewing the planning of this employee, on the shown calendar, the color dot doesn't show. Instead, 'null' appears. ## Reproduction Steps 1. Go to planning and create a shift extended on multiple days for an employee who has a flexible schedule. 2. Click Publish and Send. 3. Click on Actions on the left top side and click Preview. 4. Select the employee you just created the shift for. 5. Click on Preview. 6. It opens a window with the employee's planning. On the left top side, click Month. ### Expected behavior A shift spread on multiple days should show, with a color dot on the left of the schedule. ### Unexpected behavior Null appears instead of the color dot. Moreover, the background of the shift has the color of the color dot that should be there. ## Origin of the issue For employees with specified working schedules, multiple-days shifts are limited to their schedule. Thus, these shifts are split on the working hours of the employee. But flexible employees have no specified working hours, so the shifts aren't split. This creates multiple day slots. FullCalendar generates different html codes for such slots, which don't contain class ```fc-daygrid-event-dot```, responsible for the creation of the color dot next to the shift schedule. However, even if this color dot isn't created, we still mention it here: https://github.com/odoo/enterprise/blob/59cec3e8c6a0880178aa93651dca66c367d36841/planning/static/src/js/planning_calendar_front.js#L116 to display shifts. Therefore, we have to create it if it doesn't exist. __ opw-5437257 Forward-Port-Of: odoo/enterprise#104822
This update resolves an issue where formatted text in course quiz descriptions was incorrectly displayed as raw HTML tags after a page refresh. The fix ensures that quiz data, including formatting, is properly stored and retrieved from the cache, resulting in consistent and correctly rendered quiz descriptions for users. This improves the user experience and data presentation.
Original PR description
When a user navigates away from a course quiz page and comes back, the quiz data is retrieved from a local cache to avoid reloading it. However, the caching mechanism stores the field as a String. As a result, when the data is restored from the cache, it escapes the HTML tags, displaying them to the user instead of rendering the formatting. This commit ensures that the markup is re-applied to the description when retrieving the quiz from the cache. Steps to reproduce: 1. Open a Course Slide that has a Quiz with a formatted description (e.g., bold text). 2. Navigate to the next Slide. 3. Navigate back to the previous Slide. 4. The description now displays raw HTML tags (e.g., `<b>text</b>`) instead of the formatted text. Task-5452792
This update fixes an error that prevented users from opening the Tax Returns report. The issue stemmed from a problem with how the system processed journal entries, specifically when generating the Annual Closing Checklist. This change ensures the report functions as expected, allowing users to accurately generate tax returns.
Original PR description
Currently, an error occurs when a user opens the Tax Returns report. **Steps to Reproduce:** - Install the `Accounting` module. - Go to `Journal Entries` and create a journal entry with lines, `Ex:`…
Currently, an error occurs when a user opens the Tax Returns report. **Steps to Reproduce:** - Install the `Accounting` module. - Go to `Journal Entries` and create a journal entry with lines, `Ex:` - One `Receivable` line with a positive debit. - One `Income` line with the same credit. - `Post` the journal entry. - Go to `Accounting > Closing > Tax Returns`. - Set the `date` and click `Apply`. `AssertionError: Invalid falsy real id` When opening the Tax Returns report, it going generates the Annual Closing Checklist. During this process, it tries to get the unknown partner’s account line ID [1]. However, if the line_id does not contain anything related to the target model (account.move.line), the method returns None [2]. Later, it attempts to browse using this None value which raise the error [3]. This commit ensures that only valid ids are added, preventing None values from being browsed. [1]: https://github.com/odoo/enterprise/blob/887fb85cf3ed488187418c03df159af859a4e435/account_reports/models/account_return.py#L2365-L2371 [2]: https://github.com/odoo/enterprise/blob/887fb85cf3ed488187418c03df159af859a4e435/account_reports/models/account_report.py#L2461 [3]: https://github.com/odoo/enterprise/blob/887fb85cf3ed488187418c03df159af859a4e435/account_reports/models/account_return.py#L2399 sentry-7263718845
This update resolves an issue where users could incorrectly drop images into product descriptions, leading to errors. The fix ensures that images can only be added to designated drop zones, maintaining the stability and correct formatting of product pages. This improves the user experience and prevents potential display problems.
Original PR description
Steps to reproduce the issue: ================================= 1. Go to Website > Products and edit a product. 2. In the product description, add a header using the editor. 3. You can now drop an…
Steps to reproduce the issue: ================================= 1. Go to Website > Products and edit a product. 2. In the product description, add a header using the editor. 3. You can now drop an image in that place, so drop it. 4. Click on the image and try to add an anchor for it. -> Traceback Cause: ====== The reason an image can be dropped in that location is because the editor added an adjacent element, such as a `<p>` or `<h1>`, which is considered a valid drop zone by the drop zone plugin. However, when trying to create a link, the parent element checks if it is valid to have an anchor, but then when adding an anchor the element text is undefined, causing a traceback. Why can an image be dropped in that location after adding the editor? The bug was due to passing `excludeNearParent` as a property name instead of `excludeParent` to the `getSelectorSiblings` function, which always evaluated to false. So it allowed dropping images in invalid locations. Solution: ========= Pass the correct property name. Impact: ======= This fix enforces the intended dropzone behavior where content snippets (like images, buttons with `.o_snippet_drop_in_only`) cannot create dropzones next to elements that are direct children of `.oe_structure` containers. Test Changes Required: ======================= The button tests were failing after the fix because they were testing buttons as direct children of `<div id="wrap" class="oe_structure oe_empty">`. This was only working before due to the bug - `excludeNearParent` was being ignored. The fix wraps the test buttons in a `<div>` container, making them children of a child of `.oe_structure` rather than direct children. opw-5489444 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249707 Forward-Port-Of: odoo/odoo#244324
This update fixes a bug where inactive accounts were excluded from key financial reports (P&L, Balance Sheet, Accounts Coverage). The change addresses a shift in how Odoo searches for accounts and adds a context parameter to ensure inactive accounts are properly included in reporting. This ensures more accurate financial reporting.
Original PR description
Purpose: In P&L, Balance Sheet and Accounts Coverage Report, inactive accounts are not considered. Root cause: `deprecated` field on `account.account` is replaced with `active`, and orm search by default returns only active records. Solution: add `active_test=False` in the context. task- 5906024 Forward-Port-Of: odoo/enterprise#106956
This update resolves a crash that occurred when using the pivot table autofill feature with invalid data. The fix ensures that the autofill process itself functions correctly, while preventing subsequent tooltips from causing a system error. This improves the reliability and usability of the pivot table functionality.
Original PR description
If you try to autofill a pivot cell that has an invalid relational id in its domain (eg. `=PIVOT.HEADER(1, "stage_id", 99999999)`), the autofill actually works but the tooltip make everything crash. Task: [5913754](https://www.odoo.com/web#id=5913754&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Forward-Port-Of: odoo/enterprise#107807 Forward-Port-Of: odoo/enterprise#106601
This update resolves an issue where data related to the Colombian Dian accounting system (l10n_co_dian) was being reset. The change ensures that necessary data is properly maintained, preventing disruptions to financial reporting and compliance for users of this module. This is a critical fix for accurate accounting.
Original PR description
task-5500236 Forward-Port-Of: odoo/enterprise#108226
This update addresses a potential issue where printers could become unresponsive if the cover was open during printing. By adding a timeout mechanism, the system now prevents indefinite blocking and ensures that print jobs complete successfully, improving overall print reliability. This resolves a technical problem that could have impacted users' ability to print.
Original PR description
This PR https://github.com/odoo/odoo/pull/244031 added `self.printer._raw` method usage. Behind the scenes it uses "write" which in its turn uses the timeout defined when instantiating `self.escpos_device = printer.Usb()` Since we currently provide no timeout in some situations like when the printer cover is open the `_raw` method would block indefenitely and stop all the other printers detection. This PR fixes it by adding a timeout, ensuring that print jobs which take too long result in a timeout. Forward-Port-Of: odoo/odoo#247055
This update resolves several minor issues impacting printing from our IoT devices. Specifically, it corrects incorrect image printing, ensures a fallback to standard printing when necessary, and reduces a USB timeout issue. These changes enhance the reliability and usability of printing reports and documents from our IoT systems.
Original PR description
This PR fixes a number of small issues we currently encounter with printing 1) The iot box not always printing the images correctly 2) Escpos printing not falling back to raw printing 3) USB timeout of 5 milliseconds instead of 5 seconds Note: changing fragment_height to 100 based on https://github.com/python-escpos/python-escpos/issues/631
5 changes
Resolved issues and error corrections
This update resolves an issue where setting up accounting periods for tax returns would fail when the Invoicing module was also installed. The change ensures that a key setup process is consistently executed, regardless of which modules are used. This improves the reliability of tax return configuration.
Original PR description
To align with the changes introduced in **community PR** [1], this commit moves the `_initiate_account_onboardings()` method in the `account` module to ensure it is executed even when Invoicing is installed. [1] - https://github.com/odoo/odoo/pull/248790 sentry-7064593163 Forward-Port-Of: odoo/enterprise#107476
This update fixes a bug where inactive accounts were excluded from key financial reports (P&L, Balance Sheet, Accounts Coverage). The change adjusts how the system searches for accounts, now correctly including inactive ones in these reports. This ensures more accurate financial reporting.
Original PR description
Purpose: In P&L, Balance Sheet and Accounts Coverage Report, inactive accounts are not considered. Root cause: `deprecated` field on `account.account` is replaced with `active`, and orm search by default returns only active records. Solution: add `active_test=False` in the context. task- 5906024 Forward-Port-Of: odoo/enterprise#106956
This update resolves an issue where users within the 'Planning / User' group couldn't take open shifts. The fix ensures that the 'I Take It' button is displayed correctly for these users, allowing them to seamlessly accept shifts within the Planning app. This improves the usability of the Planning feature for all users.
Original PR description
## Issue In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift. ## Steps to reproduce…
## Issue
In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift.
## Steps to reproduce
1. Install the *Planning* (`planning`) app
2. In the Planning app, as an admin, create and publish an open shift
3. Log in as a *User*, open the *Planning* app, and click on the open shift
4. **The _"I Take It"_ button is not displayed**
When logging in as a user who is **not** part of the *Planning / User* group, the *I Take It* button is displayed.
## Cause
The condition for the *I Take It* button to be displayed is the following:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L282-L283
The condition that makes the button invisible is `not context.get('my_planning_action')`. When the user is part of *Planning / User*, the schedule they see when opening the *Planning* app is the *"Schedule by Resource"*, which has the following context:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L716
When a user who **is not** part of the *Plannig / User* group opens the *Planning* app, they see their own schedule, where the context is different than in the first case:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L636
Because the `my_planning_action` property is in the context (and all the other conditions are respected), the button is displayed.
opw-5451282
Forward-Port-Of: odoo/enterprise#104919This update prevents unnecessary errors from being raised when the CODA/SODA syncing process runs automatically via a scheduled task (cron). Previously, repeated errors would halt the process, even if the servers were functioning again. Now, errors are only reported when manually triggered, ensuring smoother operation.
Original PR description
In case of a failure/downtime from the IAP/Codabox servers, an error is currently being raised. Although this is useful when manually clicking the Fetch button to see what happens, in the context of a CRON it's much less desirable as multiple failures from a CRON will automatically disable it which is not useful as the servers might be back up later on. Now, instead, we only raise if we're not in a CRON environment. opw-5922549 Forward-Port-Of: odoo/enterprise#107798
This update resolves an issue where the global invoice creation wizard was being permanently stored in the database, leading to potential performance slowdowns. By changing the wizard to a 'TransientModel,' the system now efficiently manages resources and avoids unnecessary data storage when creating invoices. This improves the overall speed and stability of the invoicing process.
Original PR description
Change to TransientModel so a wizard is not permanently stored in db when creating a global invoice. Forward-Port-Of: odoo/enterprise#107950 Forward-Port-Of: odoo/enterprise#107244
8 changes
Enhancements to existing features
This update enhances the spreadsheet module by adding logging when exporting large amounts of data, particularly during spreadsheet downloads, copy-pasting, and printing. It also restricts access to downloaded frozen or XLSX spreadsheets to authorized users, improving data security and control.
Original PR description
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#246828 Forward-Port-Of: odoo/odoo#210592
This update enhances the logging process when exporting large amounts of data from Odoo spreadsheets, specifically during XLSX downloads, clipboard copies, and printing. It also restricts access to frozen or XLSX spreadsheets to authorized users, improving data security and control.
Original PR description
Forward-Port-Of: odoo/enterprise#106210 Forward-Port-Of: odoo/enterprise#85888
This update optimizes the creation of global invoices in the Mexican tax reporting module. By changing the wizard's storage method to 'TransientModel', the system no longer permanently stores the wizard data when a global invoice is created. This improves performance and reduces unnecessary database usage.
Original PR description
Change to TransientModel so a wizard is not permanently stored in db when creating a global invoice. Forward-Port-Of: odoo/enterprise#107950 Forward-Port-Of: odoo/enterprise#107244
Resolved issues and error corrections
This update resolves an issue where task descriptions were being duplicated within the project form. The root cause was a default field content being incorrectly appended. This change ensures that task descriptions are displayed accurately and consistently in the project app, improving the user experience.
Original PR description
Steps to reproduce: =================== 1. Go to website > contact us page 2. Submit a new task with description. 3. View the Description in the project app. -> The description field is already shown in the form by default. You will find another time it is repeated. Cause: ====== The default field content is always appended to the form content. Solution: ========= Avoid adding description to the description field content. opw-5868382 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246952
This update resolves an issue where event registration records didn't display attendee information after order processing. The fix ensures that registration answers are correctly linked, allowing attendee details to be accurately recorded in the system. This improves the accuracy of event attendance tracking.
Original PR description
Currently when event only have questions of type text, the field `registration_answer_ids` is empty after the order is synced to the backend. Steps to reproduce: ------------------- * Create an event…
Currently when event only have questions of type text, the field `registration_answer_ids` is empty after the order is synced to the backend. Steps to reproduce: ------------------- * Create an event for which you anloy have questions of type text: name, phone, email * Open a shop * Sell a ticket for the event and answer all 3 questions * Validate order * Check event registrations > Observe that although attendee's corresponding fields have been populated, the question' list is empty. Why is the issue happening: --------------------------- In the model EventRegistration there are two fields `registration_answer_ids` and `registration_answer_choice_ids`. Those two fields share the same relation table. https://github.com/odoo/odoo/blob/7c93b869a97f30a5b75d603b5973bf37b91bd63e/addons/event/models/event_registration.py#L83-L84 The registration is created here: https://github.com/odoo/odoo/blob/ef92cf5b33a3e55e801feea71bdbdd212da59adb/addons/pos_event/static/src/app/screens/product_screen/product_screen.js#L246 For context, when calling the create method `registration_answer_ids` has 3 values and `registration_answer_choice_ids` is empty (since no selection question). During the creation process we call the `_update` function. We first see what's happening with `registration_answer_ids`. Since there are some values we'll use the `create` part. https://github.com/odoo/odoo/blob/ef92cf5b33a3e55e801feea71bdbdd212da59adb/addons/point_of_sale/static/src/app/models/related_models/index.js#L394-L398 The `_connect` method will call itself on the inverse of the field. https://github.com/odoo/odoo/blob/ef92cf5b33a3e55e801feea71bdbdd212da59adb/addons/point_of_sale/static/src/app/models/related_models/index.js#L684 We'll finally try to get the inverse of this inverse. The first problem can be seen here because the inverse of the inverse points toward `registration_answer_choice_ids`. When we look at the field `registration_answer_choice_ids` since it is empty it will use the `clear` method. This also end up calling the `_connect` method on its inverse. Since the inverse of the inverse of `registration_answer_choice_ids` also points out to `registration_answer_choice_ids` thus it deletes the records that were added with `registration_answer_ids` This all happens because in the inversMap bot fields point toward the same value but the inverse of this value can only point to one value. In this case, ´registration_answer_choice_ids`. Why the fix: ------------ Touching the inverseMap or the related model is too risky at this point. So instead we focus on avoiding to clear all records. This can be achieved by creating the record empty of the two fields and creating the records for `registration_answer_ids` and `registration_answer_choice_ids` separately to link them later. opw-58966712
This update resolves an issue where users within the 'Planning / User' group couldn't take open shifts. The fix ensures that the 'I Take It' button is consistently displayed for this group, allowing them to seamlessly accept shifts within the Planning app. This improves the usability of the Planning feature for all users.
Original PR description
## Issue In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift. ## Steps to reproduce…
## Issue
In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift.
## Steps to reproduce
1. Install the *Planning* (`planning`) app
2. In the Planning app, as an admin, create and publish an open shift
3. Log in as a *User*, open the *Planning* app, and click on the open shift
4. **The _"I Take It"_ button is not displayed**
When logging in as a user who is **not** part of the *Planning / User* group, the *I Take It* button is displayed.
## Cause
The condition for the *I Take It* button to be displayed is the following:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L282-L283
The condition that makes the button invisible is `not context.get('my_planning_action')`. When the user is part of *Planning / User*, the schedule they see when opening the *Planning* app is the *"Schedule by Resource"*, which has the following context:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L716
When a user who **is not** part of the *Plannig / User* group opens the *Planning* app, they see their own schedule, where the context is different than in the first case:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L636
Because the `my_planning_action` property is in the context (and all the other conditions are respected), the button is displayed.
opw-5451282
Forward-Port-Of: odoo/enterprise#104919This update prevents unnecessary errors from being triggered when the Codabox sync process (CRON) encounters temporary issues. Previously, repeated errors would halt the process, even if the servers were later restored. Now, errors are only reported when manually triggering the sync, ensuring a smoother and more reliable operation.
Original PR description
In case of a failure/downtime from the IAP/Codabox servers, an error is currently being raised. Although this is useful when manually clicking the Fetch button to see what happens, in the context of a CRON it's much less desirable as multiple failures from a CRON will automatically disable it which is not useful as the servers might be back up later on. Now, instead, we only raise if we're not in a CRON environment. opw-5922549 Forward-Port-Of: odoo/enterprise#107798
This update resolves an issue where accrual plans were incorrectly blocking the ability to take future leave, even with remaining balances below the cap. The fix prevents the system from over-calculating accrued leave, ensuring users can accurately plan and take future leave as intended. This improves the usability of the time-off management feature.
Original PR description
Accrual plan for leave days gets blocked, even when the remaining leave balance is below the cap. As a result, no additional leaves are accrued beyond a certain point, even though they should be. #…
Accrual plan for leave days gets blocked, even when the remaining leave balance is below the cap. As a result, no additional leaves are accrued beyond a certain point, even though they should be.
# Steps to reproduce:
Go to time off app
* Create a new leave type.
* Create a new accrual plan with:
- one milestone :
- 2 days accrued per month
- Cap: 10 days
- start accruing 1 days after
- No expiration
- Carry over: All
* Create and validate a leave allocation
- 1 year ago
- new leave type
- new accrual plan
* Take the maximum number of leaves available.
* Advance the computer calendar by 1 year.
* Again, take the maximum number of leaves.
* Advance the computer calendar by another year.
* Try to take a future leave.
-> Issue: It’s not possible to take a future leave, the number of accrued days has stopped increasing. The accrual plan appears blocked.
Objective : The accrual plan should continue to allocate leave days even if leaves have been consumed regularly, as long as the remaining leaves are under the cap.
## Issue
Before going further: the property `leaves_taken` of the `hr.leave.allocation` is supposed to contain the number of leaves this allocation cover until "today".
In the `_test_get_allocation_future_leaves1` added test, in the last line of the test :
`assert_virtual_leaves_equal(self, leave_type_day, 2, self.employee_emp, date='2023-02-01')`
When calling `get_allocation_data` with a `target_date` set in the future, the result is wrong. Here is how it works :
`get_allocation_data`
...
.....`_get_consumed_leaves` (1)
...........`_get_future_leaves_on` (2)
...............`_process_accrual_plans` (3)
....................`_compute_leaves` (4)
.........................`_get_consumed_leaves` (5)
..............................`get_future_leaves_on` (6)
...................................`process_accrual_plans` (7)
**A)** The method **(2)** try to calculate the added number of days each allocation will have on `target_date`. So it creates a copy of the allocation in memory using the 'new' method:
`fake_allocation = self.env['hr.leave.allocation'].with_context(default_date_from=accrual_date).new(origin=self)`
It will then update it to `target_date` using `_process_accrual_plans` and will return the difference of days between the
updated `fake_allocation` and the current allocation (`self`)
**B)** Before iterating over each accrual date, the `_process_accrual_plans` **(3)** will get the `leaves_taken` property which is a computed field. It will trigger `_compute_leaves`.
**C)** The method **(4)** will call `_get_consumed_leaves`, and so the nightmare begins.
**D)** The method **(6)** will create a second `fake_allocation` based on the origin of the first `fake_allocation` (see **A)**).
**E)** This time, `_process_accrual_plans` **(7)** will also look at the `leaves_taken`, but won't trigger the `_compute_leaves` probably because the current allocation is a `fake_allocation` of a `fake_allocation`, and one property of the `new` method is that `Two new records with the same origin record are considered equal.`. Therefore, the `leaves_taken` is considered to be already computed (but it's not).
So `_process_accrual_plans` read the `leaves_taken` which is 0 (probably the default value of `leaves_taken`), but it should be 20 !
**F)** As the value of `leaves_taken` is wrong, the fake_allocation n°2 is also wrong, and its `number_of_day` is 10 but the `number_of_days` of the origin allocation is 20. So `get_future_leaves_on` **(6)** will return -10 which makes no sense, and all the previous calls computations will be wrong. And the final `virtual_remaining_leaves` value will be 0 instead of 2.
## Source of the issue
In the `_process_accrual_plans` method, for each allocation, `leaves_taken` is only computed once at the start of the loop over the allocation "important" dates (see `nextcall` property of `hr.leave.allocation`). At this moment, the method calculates the `leaves_taken` the allocation will have on the `accrual_date` parameter. Yet, this property can change depending on the date the allocation is on (`nextcall` property) which leads to some issues in the computation of the `allocation.number_of_days`.
## Solution
For each allocation, compute the `leaves_taken` at every iteration trough the values of `nextcall`. BUT, this can trigger an infinite loop as computing `leaves_taken` calls `_get_consumed_leaves` which calls `_get_future_leaves_on`, which calls `_process_accrual_plans` ... To avoid this, this PR add the context variable `precomputed_allocations` (will be converted into a function parameter in master) which will prevent `_get_consumed_leaves` from calling `_get_future_leaves_on` for the allocations already up to date (contained by this very `precomputed_allocations` context variable).
opw-4934391
opw-5226806
Forward-Port-Of: odoo/odoo#239836
Forward-Port-Of: odoo/odoo#249190
Forward-Port-Of: odoo/odoo#2438121 change
Resolved issues and error corrections
This update resolves an issue where users within the 'Planning / User' group couldn't take open shifts. The fix ensures that the 'I Take It' button is consistently displayed for these users, allowing them to seamlessly accept shifts within the Planning app. This improves usability for a key group of users.
Original PR description
## Issue In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift. ## Steps to reproduce…
## Issue
In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift.
## Steps to reproduce
1. Install the *Planning* (`planning`) app
2. In the Planning app, as an admin, create and publish an open shift
3. Log in as a *User*, open the *Planning* app, and click on the open shift
4. **The _"I Take It"_ button is not displayed**
When logging in as a user who is **not** part of the *Planning / User* group, the *I Take It* button is displayed.
## Cause
The condition for the *I Take It* button to be displayed is the following:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L282-L283
The condition that makes the button invisible is `not context.get('my_planning_action')`. When the user is part of *Planning / User*, the schedule they see when opening the *Planning* app is the *"Schedule by Resource"*, which has the following context:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L716
When a user who **is not** part of the *Plannig / User* group opens the *Planning* app, they see their own schedule, where the context is different than in the first case:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L636
Because the `my_planning_action` property is in the context (and all the other conditions are respected), the button is displayed.
opw-5451282
Forward-Port-Of: odoo/enterprise#10491916 changes
New functionality added to Odoo
This update incorporates the National Bank of Kazakhstan as a currency provider, aligning with local regulations. This change ensures Odoo Enterprise can accurately handle financial transactions within Kazakhstan, meeting compliance requirements. It’s a necessary step for businesses operating in that region.
Original PR description
This PR adds the National Bank of Kazakhstan as a provider in order to meet the requirements of the Kazakhstan code. Task-4144725 Forward-Port-Of: odoo/enterprise#107797
This update adds a visual icon for the AI app within the Odoo platform. This ensures consistent branding and improves the user experience across Odoo.com and other Odoo applications. It’s a small, cosmetic change that enhances visual clarity.
Original PR description
Adding svg icon to ai app in order to use it on odoo.com task-5431654 Forward-Port-Of: odoo/enterprise#107302
This update adds high-resolution icons for various Odoo apps, enhancing the visual appearance of the /brand-assets page on the Odoo.com website. These new icons provide a more polished and professional look for each app, improving the overall user experience.
Original PR description
Adding new icons formats to apps for the /brand-assets page on odoo.com Forward-Port-Of: odoo/enterprise#103024
Enhancements to existing features
This update adds five new, more generic deduction types to the Odoo Enterprise payroll system for China (l10n_ch_hr_payroll). This improves the system's flexibility and accuracy in calculating employee salaries, particularly for diverse deduction scenarios. A new test has been implemented to ensure these deductions are correctly calculated.
Original PR description
5 more generic AVS is added to l10n_ch_hr_payroll/hr_salary_rule_data and /hr_payroll_input_types. task - 5902593 Forward-Port-Of: odoo/enterprise#106218
This update enhances the functionality of global filters by now explicitly including the operator within default values. It also prevents users from changing the operator without providing a value, ensuring data consistency and reducing potential errors. This improves the overall reliability of global filter configurations.
Original PR description
## Description of the issue/feature this PR addresses: Current behavior before PR: - Global filters could store default values, but the operator was not explicitly handled or preserved. Desired behavior after PR is merged: - Global filter default values now include an operator. - Changing the operator without values is prevented with a validation message. Task: [5850422](https://www.odoo.com/odoo/project/2328/tasks/5850422)
Resolved issues and error corrections
This update resolves an issue where setting up accounting periods for tax returns would fail when the Invoicing module was also installed. The change ensures the necessary setup process runs correctly regardless of which modules are used, improving the reliability of accounting configurations. This prevents potential errors and ensures a smoother setup experience.
Original PR description
To align with the changes introduced in **community PR** [1], this commit moves the `_initiate_account_onboardings()` method in the `account` module to ensure it is executed even when Invoicing is installed. [1] - https://github.com/odoo/odoo/pull/248790 sentry-7064593163 Forward-Port-Of: odoo/enterprise#107476
This update fixes an issue where changing the Payment Partner in the accounting system didn't correctly update the associated bank partner. The fix removes a restriction preventing the system from saving these changes, ensuring that payment partner selections are reliably saved and reflected after refreshing records.
Original PR description
**Steps to reproduce:** 1. Install Accounting. 2. Go to Return Type. 3. Create a record and set a Payment Partner Bank. 4. Change the Payment Partner. **Issue:** Changing the Payment Partner creates a log entry but does not update partner on the selected Payment Partner Bank. After refreshing the record the value is reverted to the previous partner. **Cause:** The field payment_partner_id is defined as `readonly` at the model level. As a result, when the ORM attempts to update this field, the write operation is silently ignored. Although the field appears editable in the view due to `readonly="0"`, model-level `readonly=True` still prevents the value from being saved. **Fix:** Make the field writable at the model level so that ORM updates are persisted, This ensures that changes to Payment Partner are properly saved and no longer reverted after refresh. **opw-5423029** Forward-Port-Of: odoo/enterprise#103041
A bug was causing the total time displayed in the Timesheets list view to be formatted incorrectly after a page refresh. This update ensures the total time is always displayed in the correct time format, regardless of whether the user is viewing the data in a list or grid view. This improves the accuracy and usability of the Timesheets feature.
Original PR description
# Steps to reproduce - Open Timesheets - Go to list view - Refresh page - Total is formatted as regular float instead of time # Cause of the issue The list view uses the `timesheet_uom_timer` widget…
# Steps to reproduce - Open Timesheets - Go to list view - Refresh page - Total is formatted as regular float instead of time # Cause of the issue The list view uses the `timesheet_uom_timer` widget for the `unit_amount` field. While the row entries were formatted correctly since the widget is added to the fields registry in `timesheet_uom_timer.js`, the aggregate (total sum) is not formatted in the same way because the formatters registry is missing that particular widget. Switching to the grid view and going back to the list view would solve the formatting. That is because the `timesheet_uom_timer` widget is added to the formatters registry when loading the grid view (in `timesheet_grid_uom_service.js`). We ensure the formatter is registered globally by patching the `timesheetGridUOMService` outside the grid view context, ensuring consistent aggregate formatting in list view, even after a page refresh. task-5907954 Forward-Port-Of: odoo/enterprise#107203 Forward-Port-Of: odoo/enterprise#107006
This update ensures Odoo's Mexican payroll system accurately reflects the latest Social Security Law regulations. Specifically, it handles scenarios where employee earnings are at or below the minimum wage, correctly zeroing out related deductions and ensuring accurate XML generation for compliance. This update is crucial for accurate reporting and adherence to Mexican tax laws.
Original PR description
According to the Mexican Social Security Law, when an employee's total monthly earnings (including bonuses and commissions) are equal to or less than the monthly minimum wage (l10n_mx_daily_min_wage…
According to the Mexican Social Security Law, when an employee's total monthly earnings (including bonuses and commissions) are equal to or less than the monthly minimum wage (l10n_mx_daily_min_wage * 365 / 12), they are exempt from social security contributions and income tax, also they lost the subsidy benefit. - The next rules are zeroed out when the gross salary is equal or less than the minimum wage: - IMSS_EMPLOYEE: IMSS Total (Employee) - ISR: ISR (Income Tax) - SUBSIDY: Used Subsidy - IMSS_EMPLOYEE and ISR are omitted from the generated XML. - As the ISR is zero, the `totalDeducciones` attribute on the `nomina12:Nomina` node should be removed. - The SUBSIDY should be present in the `SubsidioCausado` attribute on the `nomina12:SubsidioAlEmpleo` node, but the `Importe` attribute on the `nomina12:OtroPago` node should be 0.0. This change requires updates to existing standard tests, as some previous test cases used amounts lower than the minimum wage. target: 19.0 task-5226971 Forward-Port-Of: odoo/enterprise#104668
This update fixes a problem preventing the correct automated sending of wage statements for Swiss payroll. The issue was resolved by correcting a process within the HR payroll module, ensuring accurate and timely delivery of these important documents. This ensures compliance and provides employees with the necessary financial information.
Original PR description
Forward-Port-Of: odoo/enterprise#107827
This update addresses a recent finding that the SAT now accepts accented characters in tax documents. Previously, the system removed accents to comply with SAT standards. This PR temporarily allows the 'É' character, acknowledging ongoing SAT acceptance of accented names, and will be re-evaluated as needed.
Original PR description
An improvement in September (PR #95207) began removing accents from names in documents sent to the SAT, in order to comply with their own practices. In recent months, it has become clear that the SAT…
An improvement in September (PR #95207) began removing accents from names in documents sent to the SAT, in order to comply with their own practices. In recent months, it has become clear that the SAT does accept accents sometimes. First with umlauts on the `ü` in October (PR #96043), then all umlauts in February (PR #106557). As this PR has found another accepted accented character `É`, it may be necessary to undo the original improvment entirely. The [Anexo 20 Guía de llenado de los comprobantes fiscales digitales por Internet](http://omawww.sat.gob.mx/tramitesyservicios/Paginas/documentos/Anexo_20_Guia_de_llenado_CFDI.pdf), pg 17, indicates that accented characters are maintained in legal names. At least, `Í` is allowed. At this point in time I only added the exception for `É`. Steps to reproduce are [on the ticket](https://www.odoo.com/mail/message/999357619), as it requires a real person's tax information. [opw-5915515](https://www.odoo.com/odoo/project.task/5915515) ---- *Edit: Miguel (mial) confirmed that names are not always sanitized, but that we expect them to be.* Forward-Port-Of: odoo/enterprise#107677
This update resolves a problem where salary inputs needed manual triggering, hindering the correct calculation of advance salary recovery. The changes improve the clarity and functionality of salary structure data files, ensuring accurate salary calculations and recovery processes. This fix addresses a technical detail impacting payroll accuracy.
Original PR description
Purpose: the salary inputs have to be manually triggered, which causes issues when it comes to populating the salary input for the advance salary recovery. Fix: moved the function `update_properties_definition_domain` to each salary structure data file to be more obvoius and removed `l10n_tr_hr_payroll_data` as the file wasn't in the manifest task-id: 5912475 Forward-Port-Of: odoo/enterprise#106576
This update prevents users from accidentally selecting multiple accounts during the account synchronization process. Previously, clicking on one account could lead to unintended selections, causing confusion and potential errors. This change enhances the stability and user experience of the account synchronization feature.
Original PR description
Before this commit, it was possible to click on multiple card when doing the account selection from the wizard. This commit will add a disable feature so that when clicking on the card, other account cannot be clicked. task-5943474 Forward-Port-Of: odoo/enterprise#107637
This update fixes an issue where the system incorrectly rounded amounts when settling customer deposits (payments made via methods other than cash). Previously, rounding was always applied, regardless of the payment method. Now, the system respects cash rounding configurations and only rounds the deposit amount if the chosen payment method requires it, ensuring accurate accounting for all payment types.
Original PR description
Steps to reproduce: ------------------- 1. Enable cash rounding, only for cash payment method - Rounding method doesn't matter, I tested with 0.05 nearest rounding 2. In PoS, make an order with the…
Steps to reproduce: ------------------- 1. Enable cash rounding, only for cash payment method - Rounding method doesn't matter, I tested with 0.05 nearest rounding 2. In PoS, make an order with the customer account, such that the total amount is not divisible by 0.05, i.e. when rounded, it's not the same amount. For instance, $5.27. 3. Close the session and reopen it, then select that customer, and click settle due 4. Select the Bank payment method, so a NON-Cash payment method. Notice that the amount is being rounded, even though we have only enable rounding for cash methods. If we take my example of step 2, the amount became $5.25 instead of $5.27. That is understandable when we settle with Cash, however, for Bank (non-cash), we should not round. The fix ------- Now when choosing a payment method to settle due, we also round the amount if needed, in `getTotalDueOfPartner`. Before, we always set the exact amount, regardless of the payment method and the rounding settings. We now also apply rounding on the payment screen based on the selected payment method. Previously, the change was always rounded whenever rounding was enabled, ignoring whether rounding was restricted to cash methods. This behavior made sense for normal orders—where change is typically given in cash—but not when settling a due amount, since the customer can pay using any method. During due settlement, the change represents the amount the customer must pay, so rounding must follow the rules of the chosen payment method. opw-5222985 Forward-Port-Of: odoo/enterprise#105368 Forward-Port-Of: odoo/enterprise#100278
This update prevents discounts from being incorrectly reset when an upsell is added to a subscription order. Previously, an upsell would erase the original subscription discount. This change ensures that discounts are accurately applied across the entire order lifecycle, improving the accuracy of pricing and subscription revenue.
Original PR description
Before this commit, the discount of recurring lines in a sub would be reset in the following case: 1) create a sub, add a discount on recurring line 2) invoice the sub 3) create an upsell, add quanitty on the recurring product, change the start date of the upsell to trigger computation 4) confirm the upsell The discount of the parent order was reset. task-5886270 Forward-Port-Of: odoo/enterprise#105750
This update fixes a bug where inactive accounts were excluded from key financial reports (P&L, Balance Sheet, Accounts Coverage). The change adjusts how the system searches for accounts, now considering both active and inactive ones. This ensures all accounts are accurately reflected in financial reporting.
Original PR description
Purpose: In P&L, Balance Sheet and Accounts Coverage Report, inactive accounts are not considered. Root cause: `deprecated` field on `account.account` is replaced with `active`, and orm search by default returns only active records. Solution: add `active_test=False` in the context. task- 5906024 Forward-Port-Of: odoo/enterprise#106956
6 changes
Enhancements to existing features
This update optimizes the creation of global invoices in the Mexican EDI module. By changing the wizard to a 'TransientModel,' it prevents unnecessary data storage in the database, improving performance and reducing storage requirements. This change ensures a smoother and more efficient invoice creation experience.
Original PR description
Change to TransientModel so a wizard is not permanently stored in db when creating a global invoice. Forward-Port-Of: odoo/enterprise#107950 Forward-Port-Of: odoo/enterprise#107244
Resolved issues and error corrections
This update corrects a problem where creating new contract templates in California (CA) was blocked due to an incorrect state filing status validation rule. The fix ensures the validation is correctly applied to the employee record, resolving the issue and allowing users to properly set up payroll for US companies with California operations. This change impacts the l10n_us_hr_payroll module.
Original PR description
### Impacted versions: 19.0 and later ### Steps to reproduce: - Install l10n_us_payroll - Select California (CA) as the address for US company - Try to create new contract template ### Current behavior: state_filing_status should be validated in hr.employee instead of hr.version Task: [5458566](https://www.odoo.com/odoo/project/49/tasks/5458566)
This update resolves an issue where setting up accounting periods for tax returns would fail when the Invoicing module was also installed. The change ensures that a necessary setup process is always executed, regardless of which modules are used. This prevents disruptions during the initial accounting setup.
Original PR description
To align with the changes introduced in **community PR** [1], this commit moves the `_initiate_account_onboardings()` method in the `account` module to ensure it is executed even when Invoicing is installed. [1] - https://github.com/odoo/odoo/pull/248790 sentry-7064593163 Forward-Port-Of: odoo/enterprise#107476
This update fixes a bug where inactive accounts were excluded from key financial reports (P&L, Balance Sheet, Accounts Coverage). The change adjusts how the system searches for accounts, now correctly incorporating inactive ones into these reports. This ensures more accurate financial reporting.
Original PR description
Purpose: In P&L, Balance Sheet and Accounts Coverage Report, inactive accounts are not considered. Root cause: `deprecated` field on `account.account` is replaced with `active`, and orm search by default returns only active records. Solution: add `active_test=False` in the context. task- 5906024 Forward-Port-Of: odoo/enterprise#106956
This update prevents unnecessary errors from being raised when the Codabox sync process (CRON) encounters a temporary issue. This change improves the reliability of the Codabox integration by avoiding automatic disabling of the process due to repeated errors, ensuring smoother operation when servers are back online.
Original PR description
In case of a failure/downtime from the IAP/Codabox servers, an error is currently being raised. Although this is useful when manually clicking the Fetch button to see what happens, in the context of a CRON it's much less desirable as multiple failures from a CRON will automatically disable it which is not useful as the servers might be back up later on. Now, instead, we only raise if we're not in a CRON environment. opw-5922549 Forward-Port-Of: odoo/enterprise#107798
This update resolves an issue where users within the 'Planning / User' group couldn't take open shifts. The fix ensures that the 'I Take It' button is consistently displayed for these users, allowing them to seamlessly accept shifts within the Planning app. This improves usability and efficiency for shift scheduling.
Original PR description
## Issue In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift. ## Steps to reproduce…
## Issue
In the Planning app, users within the *Planning / User* groups could not take open shifts. The button *"I Take It"* would not be displayed when clicking on the shift.
## Steps to reproduce
1. Install the *Planning* (`planning`) app
2. In the Planning app, as an admin, create and publish an open shift
3. Log in as a *User*, open the *Planning* app, and click on the open shift
4. **The _"I Take It"_ button is not displayed**
When logging in as a user who is **not** part of the *Planning / User* group, the *I Take It* button is displayed.
## Cause
The condition for the *I Take It* button to be displayed is the following:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L282-L283
The condition that makes the button invisible is `not context.get('my_planning_action')`. When the user is part of *Planning / User*, the schedule they see when opening the *Planning* app is the *"Schedule by Resource"*, which has the following context:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L716
When a user who **is not** part of the *Plannig / User* group opens the *Planning* app, they see their own schedule, where the context is different than in the first case:
https://github.com/odoo/enterprise/blob/301e3c40c3272a6ae89a1eb4387d7d244e1dc52c/planning/views/planning_views.xml#L636
Because the `my_planning_action` property is in the context (and all the other conditions are respected), the button is displayed.
opw-5451282
Forward-Port-Of: odoo/enterprise#1049193 changes
Resolved issues and error corrections
This update fixes a problem where image uploads would fail and cause errors, leading to a confusing user experience. Now, uploads can be safely aborted, preventing interruptions and ensuring a clean exit when the user discards the upload dialog. This improves stability and user satisfaction.
Original PR description
Steps to Reproduce: 1. Open the website module. 2. Open the media upload dialog to upload an image by either double-clicking the logo or replacing the existing image. 3. Upload a large file. 4. Abort…
Steps to Reproduce: 1. Open the website module. 2. Open the media upload dialog to upload an image by either double-clicking the logo or replacing the existing image. 3. Upload a large file. 4. Abort the upload before it finishes by clicking the 'Discard' button in the media dialog box. After performing these steps, a traceback is observed. Before this commit: - Image upload failures would throw uncaught exceptions. - These exceptions would interrupt the flow and result in a poor user experience with no clear feedback. - Even after clicking the discard button the image was still getting uploaded. After this commit: - Uploads can be safely aborted when the media dialog is discarded. - Ongoing XHR requests and RPC calls are properly cancelled. - The upload loop stops immediately when an abort is triggered with no traceback. - Users get a predictable and clean exit instead of a broken state. - Files are no longer uploaded after clicking Discard. ### task-4752497 Forward-Port-Of: odoo/odoo#219081
This update resolves a crash in the Delivery Slip report when printed in languages other than English. The issue stemmed from the report using English text labels within its data fields. The fix now correctly targets technical fields, ensuring the report functions smoothly across all supported languages.
Original PR description
Steps to reproduce: 1. Switch the partner language to Spanish. 2. Print the Delivery Slip. 3. The report crashes due to translated XPath anchors. Cause: XPath targeted hardcoded English strings 'Tracking Number' and 'Total Weight'. Solution: Target technical fields o.carrier_tracking_ref and o.shipping_weight instead of text labels. opw-5493498
This update resolves a technical issue within the Point of Sale module that was causing errors and preventing certain functions from working correctly. The fix adds a necessary parameter to a key module process, ensuring stability and proper data loading. This improves the overall reliability of the Point of Sale experience.
Original PR description
This fixes an issue introduced in commit 282a667b, by adding a `config_id` parameter to `IrModuleModule._load_pos_data_fields()` method, as used elsewhere in PoS modules. An invocation in `_load_pos_data()` is also fixed. The missing parameter caused invocations of these methods to fail, for instance when `PosSession.load_data()` got an `AccessError` (as demonstrated in OCA/pos#1429). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
1 change
Resolved issues and error corrections
This update fixes a bug that occurred when the VIES service returned invalid XML, causing errors in VAT number validation. By catching a broader range of exceptions from the 'zeep' library, the system now handles these errors gracefully, preventing tracebacks and ensuring accurate VAT checks. This resolves an issue impacting OCR invoice refresh functionality.
Original PR description
Catch all `zeep` exceptions instead of only `zeep.Fault`. On 14th of February 2026, the VIES service wasn't working properly, they were returning invalid XML in their response. This caused the `check_vies` call to raise a `zeep.XMLSyntaxError` which wasn't caught, causing a traceback every time VIES was used to validate a VAT number. opw-5938723 (OCR couldn't be refreshed on an invoice because it tried to create a partner from its VAT number and it couldn't be checked with VIES).