Daily updates from Odoo
Thursday, February 19, 2026
53 changes · saas-19.1
New functionality added to Odoo
This update adds a new module to automatically send CFDI XML and PDF documents with payslips to employees in Mexico. This fulfills a requirement for compliant payroll reporting, streamlining the process and ensuring accurate record-keeping for Mexican businesses using Odoo Enterprise.
Original PR description
Introduce a new module to enable sending CFDI XML with payslips. task: 5114611 Forward-Port-Of: odoo/enterprise#102692
This update introduces support for JoFotara's Point of Sale (POS) system within Odoo. It allows for the generation of electronic invoices (UBL format) directly from POS orders, streamlining the invoicing process for JoFotara businesses. This enhances integration and simplifies compliance with local regulations.
Original PR description
This commit adds support to JoFotara for pos.order model. task-4213323 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243844
This update adds a custom SVG icon for the AI app within Odoo. This improves the visual representation of the AI app on odoo.com, enhancing brand consistency and user experience. It's a small, cosmetic change that improves the overall presentation.
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 refreshes the icons used for Odoo apps on the new /brand-assets page of odoo.com. These updated icons improve the visual presentation and branding of Odoo's applications, enhancing the user experience for potential customers.
Original PR description
Adding new icons formats to apps for the new /brand-assets page of odoo.com Forward-Port-Of: odoo/odoo#241599
This update enhances the visual appearance of Odoo apps by adding high-resolution icons for use on the /brand-assets page of odoo.com. This improves the overall user experience and branding consistency across all Odoo applications. The changes are focused on improving the visual presentation of apps.
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 adjusts the Spanish reporting module to reflect a recent change in account naming conventions within Odoo. This ensures accurate financial reporting for Spanish businesses using the Odoo Enterprise solution. The change is a minor update to maintain data consistency.
Original PR description
Forward-Port-Of: odoo/enterprise#106698
This update adds five new, more generic AVS (Additional Voluntary Savings) deduction options within the l10n_ch_hr_payroll module. This improves the flexibility and accuracy of payroll calculations for Swiss businesses by allowing for a wider range of savings plans. A new test has been implemented to ensure these deductions are correctly applied.
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
Resolved issues and error corrections
This update optimizes the MPS report to handle large production schedules more efficiently. By reducing the amount of data fetched and minimizing unnecessary queries, the report now runs significantly faster and consumes less memory, preventing potential errors. This improves the overall responsiveness of the system for users generating these reports.
Original PR description
Problem: When running the MPS report on a large number of production schedules, if the associated number of stock moves is high, the _get_moves_and_date method can cause a memory error. Solution: We…
Problem:
When running the MPS report on a large number of production schedules, if the associated number of stock moves is high, the _get_moves_and_date method can cause a memory error.
Solution:
We will fetch only the necessary fields to reduce queries and memory usage and set prefetch_fields=False to further reduce memory usage.
Benchmarks:
Run locally on a dupe of customer's db.
Time/queries measured by requests to /get_mps_view_state Memory measured using memray on method get_production_schedule_view_state()
<table>
<tr>
<th rowspan="2"># of Production Schedules</th>
<th colspan="3">Before</th>
<th colspan="3">After</th>
</tr>
<tr>
<th>Time</th>
<th># of Queries</th>
<th>Memory usage</th>
<th>Time</th>
<th># of Queries</th>
<th>Memory usage</th>
</tr>
<tr>
<td>20</td>
<td>22.846s</td>
<td>1,379</td>
<td>882.0MB</td>
<td>8.046s</td>
<td>1,180</td>
<td>103.4MB</td>
</tr>
<tr>
<td>300</td>
<td>41.098s</td>
<td>6,297</td>
<td>1.0GB</td>
<td>43.694s</td>
<td>5,732</td>
<td>363.5MB</td>
</tr>
<tr>
<td>1000</td>
<td>N/A (MemoryError)</td>
<td>N/A (MemoryError)</td>
<td>>2GB</td>
<td>88.416s</td>
<td>22,629</td>
<td>1.1GB</td>
</tr>
</table>
Average memory usage reduction: 75%
opw-5225472
Forward-Port-Of: odoo/enterprise#106392This update resolves an issue where the version history comparison displayed incorrectly when using toggle blocks within Knowledge articles. The fix corrects a flaw in the HTML generation process, ensuring accurate comparisons are shown. This prevents potential confusion and ensures data integrity within the system.
Original PR description
There is an issue with the history dialog in very specific scenarios where a toggle (or any similar block) is involved, resulting in an incorrect "comparison" being displayed. How to reproduce: -…
There is an issue with the history dialog in very specific scenarios where a
toggle (or any similar block) is involved, resulting in an incorrect
"comparison" being displayed.
How to reproduce:
- create a new Knowledge article, and replace the title with a toggle block
- in the "content" section of the toggle, write a word, e.g. "word" in the
paragraph.
- exactly below the toggle block, write the exact same word ("word") in a
paragraph.
- save the article
- open the version history
- click on the oldest entry (there should be 2 of them), and click "view
comparison"
Issue:
- the paragraph below the toggle is not shown.
Technical explanation:
- There is an incomplete constraint in `generate_comparison`, which is related
to a trade-off (see `test_replace_nested_divs`), which was supposed to ignore
identical successive `opening` tags. However, it also ignores `closing` tags,
which it shouldn't do (it causes this issue).
- This issue produces invalid html which could also cause owl crashes (in
addition to the incorrect comparison), if embedded components were present in
the invalid html part.
task-5933410
Forward-Port-Of: odoo/odoo#249184This update resolves a minor issue where the website tour wasn't functioning correctly after the initial loading screen refreshed. By waiting for the loading screen to disappear before checking for the 'editor_enable' class, the tour now flows seamlessly for users. This ensures a smoother and more reliable experience.
Original PR description
When the iframe reloading starts, the builder can still have the class `editor_enable`, which breaks the flow of the tour, as the next step is waiting for that class, so we should wait for the loading screen to disappear first, and only then check for the `editor_enable` class. runbot-234504 Forward-Port-Of: odoo/odoo#245688
This update resolves an issue preventing some iPhone users (particularly the iPhone 13 Pro) from correctly focusing on barcodes when scanning. A temporary workaround – a zoom slider – has been implemented to address this limitation, ensuring consistent barcode scanning functionality across all mobile devices. This improves the mobile sales process by allowing users to reliably scan barcodes.
Original PR description
This commit resolves an issue where certain mobile devices with multiple lenses (notably iPhone 13 Pro) failed to focus on barcodes at close range. Since the Web API does not allow direct manual focus control in Safari iOS, a zoom slider has been added as a workaround to help the camera sharpen the image. Note: While Chrome on Android supports direct focus adjustment, this zoom-based solution provides a consistent fix for all mobile users. Steps to reproduce: * Open Odoo on Mobile * Go to Sale app * Create a new SO * Add a product * Select the barcode icon to open the modal * Try to scan a barcode (Object is near the phone) => Bug opw-5870885 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249292
This update resolves an issue preventing standard payroll users from accessing the 'One-time payments' feature within Swiss company contracts. The fix allows payroll officers and managers to open this functionality, ensuring they can correctly manage elm transmissions. This improves usability for payroll operations.
Original PR description
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll…
Steps to reproduce: ------------------- 1. Install l10n_ch_hr_payroll_elm_transmission. 2. Switch to a Swiss company and create a new employee. 3. Create a new internal user with Payroll Officer/Manager access. 4. Log in as that user, create a contract, and click on "One-time payments". Issue: --------- A Traceback with AccessError: ```You are not allowed to access 'Action Window' (ir.actions.act_window) records.``` Cause: ---------- https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/l10n_ch_hr_payroll_elm_transmission/models/hr_contract.py#L195 The code attempts to call `.read()` on an `ir.actions.act_window` record. Standard users typically do not have read access to window action records, resulting in an **AccessError** even if they have rights to the payroll data. Solution: ------------- Use [_for_xml_id](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L187) to return action content for the provided xml id in a safe way by doing [sudo](https://github.com/odoo/odoo/blob/93bd4d018d815b5f98d1eaaac3ae613aefbdba56/odoo/addons/base/models/ir_actions.py#L205) internally to bypass the access restriction. opw-5491467 Forward-Port-Of: odoo/enterprise#107628 Forward-Port-Of: odoo/enterprise#106598
This update resolves an issue where cron jobs would repeatedly fail after exceeding a timeout threshold. The fix ensures that the cron job counter is correctly reset after a timeout, preventing the job from getting stuck and failing indefinitely. This improves the stability and reliability of automated tasks within Odoo.
Original PR description
CronJobs timed_out_counter is not getting reset when reaching the CONSECUTIVE_TIMEOUT_FOR_FAILURE due to a transaction rollback. This commit introduces a fix to ensure only records with an actual…
CronJobs timed_out_counter is not getting reset when reaching the CONSECUTIVE_TIMEOUT_FOR_FAILURE due to a transaction rollback. This commit introduces a fix to ensure only records with an actual exception tuple pass through in method: 'method_direct_trigger'. Description of the issue/feature this PR addresses: When a cron job reaches the timeout threshold (timed_out_counter >= 3), method_direct_trigger crashes because the ListLogHandler filter matches log records that have exc_info = None. But the original filter only checked hasattr(lr, 'exc_info') which is true for all LogRecord objects. This caused a TypeError when attempting to unpack exc_info (None) on the next line, which rolled back the transaction and prevented timed_out_counter from being reset. Current behavior before PR: Clicking "Run Manually" on a timed-out cron (timed_out_counter >= 3) raises TypeError: cannot unpack non-iterable NoneType object, rolling back the transaction. The timed_out_counter is never reset, leaving the cron permanently stuck. Desired behavior after PR is merged: The filter correctly skips log records where exc_info is None (i.e., non-exception errors like timeouts). method_direct_trigger returns True, the transaction commits, and timed_out_counter is properly reset to 0. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248978
This update adjusts the size of the 'RedirectWarningDialog' in the Odoo web interface. Previously, the dialog was too large, consuming unnecessary screen space. This change ensures a cleaner and more user-friendly experience by aligning the dialog's size with established styling guidelines.
Original PR description
Currently `RedirectWarningDialog` are using `xl` size which is way too big for the content it displays. Dialog sizes were reviewed in commit[1], the RedirectWarning should follow the same styling. task-5477287 [1]: odoo/odoo@01741aa2619998078bd19aca848146ac75c027fc --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where clicking links to specific messages in chatter wouldn't highlight the message correctly. The fix removes a redundant check that was preventing the auto-highlight feature from working when the targeted message wasn't among the initial 30 loaded. This ensures message links function as expected.
Original PR description
PR #223362 removes the early return for checking the origin thread in `highlightMessage()` while PR #234659 adds it again through the FW ports of a fix intended for mailbox (which has not been needed from 19.0 onwards). Since the auto-highlight of message is triggered when the thread is 1st loaded, i.e. has loaded 30 most recent messages, if the targeted message to highlight is not in the loaded messages, then the `highlightMessage()` call would be mistakenly and silently ignored by this early return. This trigger of `highlightMessage()` is done only once, hence the failed attempt to highlight the message. This PR removes reliance on the origin thread. Steps to reproduce the bug: - Send more than 30 messages in a chatter. - Copy the first message link and paste it into the browser to go to the message as a highlighted one. - Thread doesn't jump to the targeted message. task-5929780 Forward-Port-Of: odoo/odoo#249062
This update adjusts the Swiss tax reports to accurately include account 2970, which represents the 'Annual profit or annual loss' account. The change ensures correct reporting for Swiss tax compliance. This fix resolves a discrepancy in the account selection process.
Original PR description
This recent commit: odoo/enterprise@d223f826eaafa3189846b555af16b240f91936ba changed the formula for `account_financial_report_line_ch_290_a_balance` from: ```py [('account_id.code', '>=', '290'),…
This recent commit:
odoo/enterprise@d223f826eaafa3189846b555af16b240f91936ba
changed the formula for `account_financial_report_line_ch_290_a_balance` from:
```py
[('account_id.code', '>=', '290'), ('account_id.code', '<', '2991'), ('account_id.account_type', '!=', 'equity_unaffected')]
```
to:
```py
[('account_id.code', '>=', '290'), ('account_id.code', '<', '2970')]
```
The main goal of the commit was to remove the unaffected earnings account from the CH reports. While doing so, the formula was also modified by replacing `account_id.code = 2991` with `account_id.code = 2970`.
However, since the condition uses the `<` operator, the account with `code = 2970` is not taken into account. Account `2970` is the last account that should be considered before `Annual profit or annual loss`. see:
https://github.com/odoo/odoo/blob/19.0/addons/l10n_ch/data/template/account.account-ch.csv#L106
Ticket [link](https://www.odoo.com/odoo/project.task/5387092)
opw-5387092
Forward-Port-Of: odoo/enterprise#102247This update fixes an issue where tables copied from the Knowledge editor were only partially copied, resulting in incomplete table structures when pasted elsewhere. The change ensures that tables are fully copied, regardless of whether the content is editable or locked, providing a consistent user experience. This improves the usability of the Knowledge feature for creating and sharing tables.
Original PR description
Problem: In Knowledge, when adding a clipboard block and inserting a table inside it, clicking on the copy button only copies the text inside the table instead of the full table structure. Cause: In `html_viewer`, the copy logic clones only the deepest selected node. In contrast, `html_editor` (via `clipboard_plugin`) copies the entire selection range. This difference causes inconsistent behavior between editable and locked content. Solution: Align the behavior by copying the full selection in `html_viewer`, ensuring tables and other complex structures are copied entirely and consistently. Steps to reproduce: - Open Knowledge. - Add a clipboard block. - Insert a table inside the block. - Lock the content. - Click the copy button. - Paste into any editable field. - Observe that only the text (not the table) is pasted. opw-5476320 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247930
This update resolves an issue where grouped tax reports were generating incorrect results when invoices included both positive and negative tax amounts. The fix ensures that all tax line amounts, including negative ones, are correctly considered during report generation, preventing errors and ensuring accurate tax reporting.
Original PR description
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous…
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous commit](https://github.com/odoo/odoo/commit/48d60151254045768d5aac1b29c5acf84b70cef2) modified the query responsible for the construction of the grouped reports. It only keeps the base lines of type entry which have a balance of the same sign as the tax line. Yet in our case, the CABA move is of type 'entry'. It has only one tax line with a positive amount because the taxes amounts on each line are added. But the balance of the negative line is negative. So the query will only consider the positive line hence the error. So now, the logic is only considering lines with the same sign to avoid entries where the invoice lines and the refund lines are both there. This is why it only checks for moves of type 'entry'. We also ignore the check for CABA moves, i.e. moves where `tax_cash_basis_origin_move_id` is defined. Steps to reproduce: - Activate Cash Basis in the Settings - Create a tax based on payment - Create an invoice with two lines: - One with a negative amount, an income account and the created tax - One with a positive amount big enough to compensate the previous line, a different income account and the same tax - Confirm - Click "Pay", validate the payment - In the Dashboard > Bank journal > Create a reconciliation of the amount of the invoice - Reconcile it with the invoice - Accounting > Reporting > Tax Return - Select "Group By: Account tax" Ticket [link](https://www.odoo.com/odoo/project.task/5089790) opw-5089790 Forward-Port-Of: odoo/odoo#249099 Forward-Port-Of: odoo/odoo#239081
This update resolves an issue where grouped tax reports were generating incorrect results when invoices included both positive and negative tax amounts. The fix ensures that all tax lines, including those with negative balances (CABA moves), are properly considered during report generation. This improves the accuracy of tax reporting.
Original PR description
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous…
The grouped tax reports are broken if an invoice is created with 2 lines on 2 different income accounts. [A previous commit](https://github.com/odoo/odoo/commit/48d60151254045768d5aac1b29c5acf84b70cef2) modified the query responsible for the construction of the grouped reports. It only keeps the baselines of type 'entry' which have a balance of the same sign as the tax line. But in our case, the CABA move is of type 'entry'. It has only one tax line with a positive amount because the taxes amounts on each line are added. But the balance of the negative line is negative. So the query will only consider the positive line hence the error. So now, the logic of the only considering lines with the same sign is to avoid entries where the invoice lines and the refund lines are both there. This is why it only checks for moves of type 'entry'. We also ignore the check for CABA moves, i.e. moves where `tax_cash_basis_origin_move_id` is defined. Steps to reproduce: - Activate Cash Basis in the Settings - Create a tax based on payment - Create an invoice with two lines: - One with a negative amount, an income account and the created tax - One with a positive amount big enough to compensate the previous line, a different income account and the same tax - Confirm - Click "Pay", validate the payment - In the Dashboard > Bank journal > Create a reconciliation of the amount of the invoice - Reconcile it with the invoice - Accounting > Reporting > Tax Return - Select "Group By: Account tax" Community PR: odoo/odoo#239081 Ticket [link](https://www.odoo.com/odoo/project.task/5089790) opw-5089790 Forward-Port-Of: odoo/enterprise#107707 Forward-Port-Of: odoo/enterprise#101601
This update corrects a visual inconsistency in Odoo's note-taking feature. Previously, checklists and bullet lists had different indentation levels, leading to a misaligned appearance. This change ensures all list types are consistently formatted for improved readability and a more polished user experience.
Original PR description
The checklist has different indents than bullet list and numbered list. It should not be the case. This commit removes the extra indent from checklist entries. Steps to reproduce: - Go to a "To do" note - Create a checklist with indented items - Create a bullet list with indented items => Both list were not aligned task-5916723 Forward-Port-Of: odoo/odoo#249149 Forward-Port-Of: odoo/odoo#247568
This update resolves an issue where tooltips would unexpectedly disappear when a user moved between a parent and child element within the Odoo interface. Previously, the tooltip would be terminated, now it persists as long as the user remains within the parent element's area. This ensures a smoother and more intuitive user experience.
Original PR description
Have a tooltip on a parent. Hover on a child of that parent. Now, leave the child but stay in parent. Before this commit, the tooltip would be killed and never respawn. After this commit, the tooltip is not even killed if we stayed within the parent's physical space. task-5346498 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#248857
A recent update to the appointment module caused installation issues due to a problem with how the system checks template data. This fix prevents errors during reinstallations by temporarily skipping the generation of invitation URLs, ensuring the module installs correctly. This resolves a previous installation failure.
Original PR description
Reinstalling the appointment module fails during mail template validation. ### Reproduction Steps 1. Install the `appointment_hr_recruitment` module. 2. Uninstall `appointment`. 3. Reinstall…
Reinstalling the appointment module fails during mail template validation. ### Reproduction Steps 1. Install the `appointment_hr_recruitment` module. 2. Uninstall `appointment`. 3. Reinstall `appointment`. → A template parsing error appears. ### Cause The global `request.env` is bound to the registry active at the start of the request. When reinstalling a module, this registry becomes stale and does not include the models being re-added. During installation, the `mail.template` model performs a test render to validate its XML data. One of the templates calls `_get_interview_invite_url`, which invokes a controller that looks up the `appointment.type` model using `request.env`. Because the registry is stale and does not contain this model, the lookup raises a KeyError and the installation fails. ### Fix Rationale Skip invite URL generation when `install_mode` is set to avoid using the stale `request.env`. opw-5898780 Forward-Port-Of: odoo/enterprise#107650
This update resolves an issue where DHL shipping rate calculations failed when requested for dates outside of DHL's business hours. Adding a 'next business day' flag ensures rates are accurately calculated, preventing errors and ensuring reliable shipping options for our customers. This addresses a previous error causing 'Product not found' issues.
Original PR description
Before this commit, there was an issue when trying to get the rates for DHL shipping late in the day. The issue happened because `plannedShippingDate` fell outside of the working hours. This commit adds the nextBusinessDay flag for the rating request to avoid the error. Error: ``` Product not found 996: The requested product(s) not available for the requested pickup date. Process ID associated for this transaction') ``` opw-5393684 Forward-Port-Of: odoo/enterprise#107153
This update clarifies the visibility of specific fields within the Belgian payroll and fleet modules. Previously, generic fields were consolidated across all countries, but this change restores the original design, keeping BE-specific fiscal logic contained within the Belgian module. This ensures accurate reporting and compliance for Belgian businesses.
Original PR description
This branch only hides BE-specific fields in l10n_be_hr_payroll_fleet (they remain defined/used there and are invisible for non‑BE companies). On master (19.3) those generic fields (can_be_requested, default_car_value) were refactored into hr_payroll_fleet so payroll+fleet consumers across all countries can use them; BE fiscal logic stays in l10n_be_hr_payroll_fleet task-5906656 Forward-Port-Of: odoo/enterprise#106456
This update resolves an issue where the onboarding tour incorrectly targeted disabled calendar slots in the yearly holiday calendar. The fix excludes 'disabled' calendar cells, ensuring the tour reliably selects the first available Thursday, regardless of the server date (specifically impacting years 2027/2028).
Original PR description
Before, the tour attempted to click the “first Thursday” by selecting the first .fc-day-thu element in the DOM. The yearly calendar sometimes renders an initial “empty”/disabled weekday cell (when Jan 1 is Fri/Sat/Sun), so the first .fc-day-thu can be a disabled slot with no actionable element. That makes firstChild de-facto empty and the tour fails (seen reproducibly when the server date is set to years like 2027/2028, for example). Excluding .fc-day-disabled makes the selector target the first real Thursday cell task-5930501 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248275
This pull request reverts a previous change related to how contract templates were being generated. The issue stemmed from a problem with triggering compute fields, which wasn't a critical bug. This change ensures the contract template functionality is working correctly and will be addressed fully in the main version.
Original PR description
This reverts commit 1d5e75900c0326f7b5293ad4cdafcc32d0f662fc. The problem was due to compute fields not triggered. It'll be fixed in master as this is not really a bug. task-5948571 Forward-Port-Of: odoo/enterprise#107791
This update resolves an issue where payroll warnings weren't being properly reflected or updated within the Odoo system. The fix ensures that warning messages are now reliably displayed and can be updated, leading to more accurate and timely payroll reporting. This improves the reliability of financial data.
Original PR description
Forward-Port-Of: odoo/enterprise#107792
This update resolves a technical issue preventing notifications from the signature field. The notification service was missing a necessary declaration, causing an error. This fix ensures that signature field notifications are now correctly processed, improving the user experience.
Original PR description
The notification service is later used in this [method](https://github.com/odoo/odoo/blob/04f3473da52ec74f3955cadd58eb016537497d44/addons/web/static/src/views/fields/signature/signature_field.js#L120), but it was never declared so it was causing an error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248602
This update fixes a potential issue where global invoices sent from the POS in Mexico could fail due to timeouts when interacting with the SAT portal. Increasing the read timeout for these requests helps prevent duplicate invoice submissions and ensures accurate data transmission, improving the reliability of tax filing.
Original PR description
**Fix:** Increase the read timeout for POST requests to SW sapien PAC. It may prevent timeout issue when sending a global invoice from the POS with a lot of POS orders that could lead to duplicated documents on the SAT portal when retrying to send the global invoice again. opw-5347962 Forward-Port-Of: odoo/enterprise#107735
This update simplifies the accounting setup for Spanish businesses within Odoo. Previously, there were separate account configurations for sales within Spain, intra-community transactions, and exports. This change removes this unnecessary complexity, aligning with Spanish tax regulations and streamlining the accounting process. It ensures a more straightforward and accurate representation of financial data.
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#247543
This update resolves an issue where test runs were repeatedly generating unnecessary assets, slowing down the testing process. By adding a specific asset bundle to the pregeneration list, we've streamlined test execution and improved overall efficiency. This change ensures tests run faster and more reliably.
Original PR description
During tests runs, lazy loaded assets are generated on the fly, and eventually multiple hundred of times (i.e. +/- 150 times on runbot). This commit adds the `web_studio.studio_assets` bundle to the pregeneration list to avoid regenerating during tests runs. Forward-Port-Of: odoo/enterprise#107147
This update optimizes how Odoo retrieves related data, preventing performance slowdowns that can occur when fetching large amounts of information. By deduplicating data during the fetching process, the system now responds more quickly, especially when accessing multiple related records. This results in a smoother and faster user experience.
Original PR description
Various improvements to avoid non-linear growth of returned values when iterating over prefetches. Traversing a relational field introduces a duplication factor in the returned values. `records |=…
Various improvements to avoid non-linear growth of returned values when iterating over prefetches. Traversing a relational field introduces a duplication factor in the returned values. `records |= more` is syntactic sugar for `records = records | more`, which does not modify the recordset in place but makes one from scratch. Therefore the time complexity is not `O(len(more))` but `O(len(records) + len(more))`, which is what makes it quadratic when used in a loop. Since refactor in https://github.com/odoo/odoo/pull/229057, this quadratic complexity is introduced in the prefetching, too. Changes: - Keep same prefetch when accessing a single key as when iterating over a recordset. Small gain and more consistent results. - When iterating over prefetches, deduplicate at source. Without this, the overhead of the generator can be huge for each returned value, since the same value might be returned many times. In less trivial cases (like traversing two relational fields and making unions with it), the time speedup is several orders of magnitude.
This update resolves a problem where salary inputs needed to be manually triggered, preventing accurate calculations for advance salary recovery. The update clarifies the process by moving a key function to each salary structure file and removing a redundant file, ensuring correct salary data population.
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
This update corrects a problem preventing wage statements in Switzerland to be properly sent out. The fix addresses an error in the HR payroll module, ensuring accurate and timely delivery of these important financial documents. This improves compliance and reduces potential delays for employees.
Original PR description
Forward-Port-Of: odoo/enterprise#107827
This update significantly speeds up the salary simulation process within the HR system. By adding an index and avoiding unnecessary image calculations, the simulation now runs much quicker – nearly five times faster. This improves the user experience and reduces the time spent configuring employee salaries.
Original PR description
Description ----------- Add missing index on `hr.expense.employee_id` as it's used in a few places as a transitive dependency. Avoid computing images for new employee versions during simulation, as it's loading external dependencies, incurring a performance cost. Benchmark --------- On a staging database, opening the salary configurator and clicking on 'Simulation' when selecting a new car took: | Timings for | Before | After | Speed up | |--------------------|--------|--------|----------| | `onchange_benefit` | ~750ms | ~160ms | 4.6x | | `update_salary` | 2.3s | 1.1s | 1.9x | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241901
This update streamlines the process of generating salary simulations by introducing a standardized context manager. This ensures consistent setup and teardown of necessary operations, reducing potential errors and improving the reliability of the simulation process. It also enforces correct usage of required context keys.
Original PR description
Description ----------- Getting an `hr.version` from an `offer` during simulation is done in a savepoint, preceded and followed with flushing of the environment and some post-cleanup. This is verbose…
Description ----------- Getting an `hr.version` from an `offer` during simulation is done in a savepoint, preceded and followed with flushing of the environment and some post-cleanup. This is verbose and error-prone, as it's done at each call site of `hr.contract.salary.offer._get_version` and `hr.version._generate_salary_simulation_payslip` (or any other future method that may require such a savepoint). These methods have a comment that mentions *requiring* a savepoint to be called, but nothing is enforcing it, so a bug due to oversight is bound to happen. Context keys are also injected a bit everywhere like `salary_simulation` and `tracking_disable`, without much consistency, and adding to the visual clutter. This commit introduces a little context manager called `hr_version_context` that manages the creation of the savepoint, the setup and teardown necessary, and the setting of the keys in the context. It's accompanied by a decorator `@requires_hr_version_context` that will fail if the caller didn't use `hr_version_context` before invoking the marked method. This ensures: - Correct creation of the savepoint and its related pre-/post-operations - Apply context keys consistently - Ensure methods that require such setup *cannot* be called without it. Forward-Port-Of: odoo/enterprise#103187
This update resolves an issue where closing a POS session would fail if the partner's address (street or postal code) was missing. Previously, an empty address caused an error, now the system gracefully handles this situation, ensuring POS sessions can be completed without interruption. This improves the reliability of the German POS certification process.
Original PR description
Before this commit, if a POS order was created with a partner that had an empty street or postal code, the system would raise an error when closing the POS session. opw-5897334 Forward-Port-Of: odoo/enterprise#106300
This update fixes a discrepancy in accounting calculations within the Point of Sale (POS) for Mexican tax reporting (l10n_mx_edi_pos). Previously, the POS wasn't correctly processing assets, leading to inaccurate amounts. This change ensures that POS transactions align with the calculations performed in Python, guaranteeing accurate financial reporting.
Original PR description
Before this commit, the needed assets were not correctly loaded in the POS, which caused the amounts to be different from the ones computed in python. opw-5935191 Forward-Port-Of: odoo/enterprise#107657
This update ensures that orders are accurately synchronized across our system after a payment (online or terminal) is added or removed. Previously, removing an online payment didn't properly update the server, leading to inconsistencies. This fix resolves that issue, guaranteeing accurate order data.
Original PR description
Before this commit, if an order had a terminal payment and an online payment was added accidentally, and then get removed, the terminal payment would get removed from server, while it won't be removed from the UI, resulting in a mismatch between the server and the UI, and the order would no be synced correctly. opw-5911699 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248430
This update resolves several issues impacting the Odoo Profiler's reliability, specifically related to thread management and data collection. The fixes ensure the profiler consistently collects accurate data without errors or delays, improving debugging and performance monitoring.
Original PR description
Multiple fixes for the Profiler. Issues: - Python throws cannot join current thread when using the entry count with memory and traces async profilers. - The periodic profilers were waiting the full amount of the sleep before ending. - When using the entry_count, the memory profiler was throwing a non serializable object error - Sometimes the memory collector throws an error that the tracemalloc needs to be started so that it collects. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232551
This update resolves an issue where Odoo was incorrectly including an UETR tag in ISO 20022 payment files, causing rejection by strict banks. The change ensures compliance with SEPA regulations, preventing errors and guaranteeing successful payment processing for our European users. This improves compatibility with major banking systems.
Original PR description
In Odoo 18.0, when a user selects the pain.001.001.09 format (ISO 20022), Odoo systematically includes the <UETR> (Unique End-to-end Transaction Reference) tag for every transaction. While valid under the general ISO 20022 XML schema, the <UETR> tag is not authorized by the EPC (European Payments Council) within the standard SEPA Credit Transfer (SCT) Rulebook. Strict banks (e.g., UBS, German banks) reject the entire file with errors such as: "No child element is expected at this point" when an UETR is detected in a domestic or intra-SEPA flow. Task: 5871528 Forward-Port-Of: odoo/enterprise#106537 Forward-Port-Of: odoo/enterprise#105518
This update ensures the checksum for the l10n_eu_iot_scale_cert module remains consistent with recent changes in the core Odoo system. This alignment is a routine maintenance task to guarantee data integrity and proper functionality of this specific certification process. It's a minor adjustment that doesn't impact users directly.
Original PR description
This PR merely adapts the l10n_eu_iot_scale_cert checksum to align with the changes in the PR https://github.com/odoo/odoo/pull/248855
This update prevents users from selecting multiple accounts simultaneously during the online synchronization process. Previously, users could inadvertently select multiple accounts, leading to potential data inconsistencies. This change ensures accurate and reliable account selection, streamlining the synchronization workflow.
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
This update resolves an error that occurred when opening 'Sales Order Items' from projects without a linked customer. The fix prevents the system from crashing by disabling the creation of sales orders in these scenarios, ensuring smoother project management workflows.
Original PR description
Currently, an assertion error is raised when opening "Sales Order Items" from a project without a customer. **Steps to Reproduce:** - Install `sale_project` module with demo data. - Create a new project using "Sale Order" project template. - Do not set a customer on project. - Project > Task (Kanban) > Show _Top Menu_ > Show _Sales Order Items_. - Click "**Sales Order Items**". Video Ref: https://drive.google.com/file/d/1xgYHZBvIt5Ep9Gt-wALGIb9f7mj4NPh_/view?usp=drive_link Error: AssertionError **Cause:** The sale order line depends on `default_partner_id` from the context to create a sale order when none exists. When the project has no customer set, this value is missing, causing an assertion failure. **Fix:** This commit returns the list view of SOLs and disables the creation when no partner is set for the project. sentry-7220116560
This update resolves a bug where vertical videos would lose their orientation after a page was saved and reloaded. The fix ensures that the correct video layout (vertical) is maintained when a video is set to vertical and the page is saved. This improves the user experience for video content on our website.
Original PR description
Problem: When setting a video to vertical and saving the page, the alignment is not preserved after reload. Cause: `generateVideoIframe` always sets the `media_iframe_video_size` class, even for vertical videos. As a result, the vertical configuration is lost after saving. Solution: Apply `media_iframe_video_size_for_vertical` when the video is marked as vertical, so the correct layout is preserved after saving. Steps to reproduce: - Drop a Video snippet on a page. - In the selector, enable the vertical option. - Add the video. - Save the page. - Observe that the video is no longer vertical. opw-5941900 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a bug that occurred when attempting to cancel a Point of Sale order with no items. The fix ensures the system handles empty orders gracefully, preventing errors and improving the user experience. The button to cancel orders is now disabled when no items are present.
Original PR description
Steps: --- - Open a Restaurant session. - Open a table with no order. - Click the control button and click Cancel Order. Issue: --- - A traceback occurs when cancelling an order. Cause: -- - The order is cancelled first, and then `isSelectedLineCombo` tries to access the current order, which is already null. Fix: --- - Safely check for the selected order before accessing combo data. - Disable the Cancel Order button when there are no order lines. task-5934004 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update addresses an error that occurred when creating invoices with negative tax factors. The issue stemmed from a filtering process within the accounting module that resulted in an empty list, causing a system error. To ensure smooth invoice creation, we've reverted the recent changes that introduced this problem.
Original PR description
Steps to reproduce: - Install `account` module - Taxes > open any existing tax > Set `factor_percent(%)` of repartition lines to negative(eg:…
Steps to reproduce: - Install `account` module - Taxes > open any existing tax > Set `factor_percent(%)` of repartition lines to negative(eg: [Image](https://www.awesomescreenshot.com/image/58851592?key=ce0017bb467a583ad020f33d21d4d8ba)) - Create a Invoice and add tax in move line and save Traceback: `IndexError: list index out of range` We are getting `factors` as empty because `target_factors` from `_add_accounting_data_to_base_line_tax_details` is empty. This happens because, in `tax_reps`, we are filtering repartition lines with a `factor` greater than `0`. However, when the `factor` is less than `0`, `tax_reps` becomes empty, which leads to the error. We are reverting this PR: https://github.com/odoo/odoo/pull/234334 because it prevents the validation error from being raised when there is a negative value in the repartition lines. [factors]: https://github.com/odoo/odoo/blob/de056cc784a3bbe2575fd3c9e81ca62e73c362d4/addons/account/models/account_tax.py#L1641 [tax_reps]: https://github.com/odoo/odoo/blob/de056cc784a3bbe2575fd3c9e81ca62e73c362d4/addons/account/models/account_tax.py#L2429-L2431 sentry-7102210210 Forward-Port-Of: odoo/odoo#249220
This update ensures Odoo's Mexican payroll (l10n_mx_hr_payroll) correctly complies with Mexican Social Security Law regarding minimum wage deductions for IMSS, ISR, and subsidies. The changes automatically adjust payroll XML output to accurately reflect these exemptions, improving payroll accuracy and reducing potential compliance risks.
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 minor error in the account return processing logic. The incorrect configuration of check codes was resolved, preventing unintended record processing. While previously shielded by a safeguard, this change ensures accurate return handling going forward.
Original PR description
the check codes to ignore was wrongly defined, leading to contain records instead of 'code', plus having the exact opposite of what it was supposed to contains, i.e. codes that aren't supposed to be run at the current state of the return. However, it didn't have any impact functionally because it was "protected" by the function _should_run_checks(), which might disapear in the future. Forward-Port-Of: odoo/enterprise#107158
This update resolves an issue where formatting links in the HTML editor would create duplicate links and incorrectly apply styles. The fix ensures links are treated as single units, wrapping selected text in a `<font>` tag for formatting, and addresses related issues with color classes and block splitting to improve formatting consistency.
Original PR description
Before this commit: when formatting partially a link, the link is split at the selection and formatted. This causes duplicated links. After this commit: we consider links are unsplittable, thus…
Before this commit: when formatting partially a link, the link is split at the selection and formatted. This causes duplicated links. After this commit: we consider links are unsplittable, thus formatting on links will wrap the selected part in a <font> tag. commit 2: [FIX] html_editor: solve infinite loop of links with color class Before this commit: we have a fix https://github.com/odoo/odoo/commit/96bc421d30f34a8bfc10dde93c2f283809a8a3e3 which to be able to remove the style classes in the link element After this commit: We don't consider the style class in the link element as `hasColor`, because the style classes come from the template code, which is hard-coded xml. Removing them, the user won't be able to add it back. For example, on a product page, edit the `Terms and conditions` link, do nothing and save, the muted color is forced removed. Note that another fix https://github.com/odoo/odoo/commit/f5fc55f19f89041c8391ff81b127ffce0898f89f is also removed cause it was a fix for https://github.com/odoo/odoo/commit/96bc421d30f34a8bfc10dde93c2f283809a8a3e3. The tests belonging to https://github.com/odoo/odoo/commit/96bc421d30f34a8bfc10dde93c2f283809a8a3e3 are adapted, and those of https://github.com/odoo/odoo/commit/f5fc55f19f89041c8391ff81b127ffce0898f89f are kept as future safeguards of list coloring. commit 3: [FIX] html_editor: extra check on targetnode when splitting blocks Before this commit: we only check if the current block to be split is splittable, but not the target node. After this commit: if the current block is splittable but the current target node is not, we won't split the block but insert a <br> commit 4: [FIX] html_editor: properly fill inlineAncestors when formatting Before this commit: when the parent node of the current node is unsplittable, the `inlineAncestors` stays empty. After this commit: we handle this case and push the parent node in the list when the parent node is fully selected. We also add a fully selected predicate in link_plugin for the case when the selection includes all the content (except for zws) of a non-button link task-5244810 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#249294 Forward-Port-Of: odoo/odoo#241871
This update fixes a visual issue where Telugu characters in Odoo's PDF reports appeared 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 technical limitation related to PDF generation.
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 technical issue related to the transmission of Swiss payroll data (LPP). Specifically, it ensures the correct inclusion of the 13th month salary component in the reporting calculations, aligning with updated Swiss tax regulations. This ensures accurate and compliant reporting for our Swiss clients.
Original PR description
Forward-Port-Of: odoo/enterprise#107908
This update resolves an issue where the DeviceSelect button's styling was inconsistent, preventing it from correctly reflecting its state. The fix adds a standard styling class to ensure the button's appearance aligns with the rest of the application and provides a more polished user experience.
Original PR description
This PR fixes an issue related to a custom border applied on the `<DeviceSelect>` button. Prior to this commit, the buttons used a custom border handled via `border border-secondary` which will prevent the default border that comes with our buttons to be applied. The visual result is a default button but with a custom border which won't change according to the state. While fixing this, we also add a `.btn-secondary` class on these buttons to improve consistency and ensure they get styled correctly. task-5921830 X-original-commit: [256de110fc73ce9dec640db8b6e73a9d519ee5ec](https://github.com/odoo/odoo/commit/256de110fc73ce9dec640db8b6e73a9d519ee5ec) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr